TOP PAGE > 記事閲覧
EXCELのVBAを使った文字取得について
投稿日 | : 2016/06/13(Mon) 18:59 |
投稿者 | : アルサポ |
参照先 | : |
今回は、文字(図形の情報)の取得が思うようにいかず、前回の投稿から間隔をあけてしまいました。
とりあえず、現段階まででわかっている事を投稿しようと思います。
内容は、選択した文字の内容をEXCELに送る事とCAD上で選択した文字の内容をEXCELに入力してある
文字に変更するというプログラムを作成しました。
結果を言うと、取得するプログラムを2種類、変更するプログラムを1種類作成しました。
AutoCADを利用する場合であればすべて成功しましたが、JDrafの場合では、取得するプログラム
の方がどちらも失敗しました。
実際にEXCELのプログラムを作成する場合には
まず、文字の内容を列挙する為にA列を利用します。
シート上に「文字を取得1」、「文字を取得2」、「文字を編集」の3種類のボタンを作成し、
次に投稿するAutoCAD対応、JDraf対応それぞれのプログラムソースと組み合わせて下さい。
Re: AutoCAD対応の場合
投稿日 | : 2016/06/13(Mon) 19:04 |
投稿者 | : アルサポ |
参照先 | : http://r-support.org/bbs/tmp/sample04(ACAD2013).xlsm |
Option Explicit
Dim app As AcadApplication 'アプリケーションオブジェクト
Dim doc As AcadDocument 'アクティブなドキュメント
'文字を取得1
Private Sub CommandButton1_Click()
On Error Resume Next
'AutoCADを取得
If getDocument Then Exit Sub
Dim sstext As AcadSelectionSet
Dim FilterType(3) As Integer
Dim FilterData(3) As Variant
Set sstext = doc.SelectionSets.Add("SSTEXT")
FilterType(0) = -4: FilterData(0) = "<or"
FilterType(1) = 0: FilterData(1) = "TEXT"
FilterType(2) = 0: FilterData(2) = "MTEXT"
FilterType(3) = -4: FilterData(3) = "or>"
sstext.SelectOnScreen FilterType, FilterData
Dim enttxt As Variant
Dim n As Long
n = Range("A65536").End(xlUp).row + 1
For Each enttxt In sstext
Range("A" & n) = enttxt.TextString
n = n + 1
Next enttxt
doc.SelectionSets.Item("SSTEXT").Delete
Set app = Nothing
Set doc = Nothing
End Sub
'文字を取得2
Private Sub CommandButton2_Click()
On Error Resume Next
'AutoCADを取得
If getDocument Then Exit Sub
'テキスト選択
Dim objEntity As AcadEntity
Dim p As Variant
Dim AcMText As AcadMText
Dim AcText As AcadText
Dim n As Long
n = Range("A65536").End(xlUp).row + 1
'作図ウィンドウ上で図形を選択し、そのAutoCADクラス名を表示する。
Call doc.Utility.GetEntity(objEntity, p, "文字を選択: ")
If Err Then Exit Sub
If objEntity.ObjectName = "AcDbMText" Then
Range("A" & n) = objEntity.TextString
ElseIf objEntity.ObjectName = "AcDbText" Then
Range("A" & n) = objEntity.TextString
End If
End Sub
'文字を編集
Private Sub CommandButton3_Click()
On Error Resume Next
'AutoCADを取得
If getDocument Then Exit Sub
'テキスト選択
Dim objEntity As AcadEntity
Dim p As Variant
Dim AcMText As AcadMText
Dim AcText As AcadText
'作図ウィンドウ上で図形を選択し、そのAutoCADクラス名を表示する。
Call doc.Utility.GetEntity(objEntity, p, "文字を選択: ")
If Err Then Exit Sub
If objEntity.ObjectName = "AcDbMText" Then
objEntity.TextString = ActiveCell
ElseIf objEntity.ObjectName = "AcDbText" Then
objEntity.TextString = ActiveCell
End If
ActiveCell.Offset(1, 0).Activate
End Sub
'AutoCADを取得
'VBA ウィンドウのツールメニューの参照設定から
'「AutoCAD 2013 Type Library」を選択する必要がある(バージョンによって違う)
Private Function getDocument() As Boolean
On Error Resume Next
Set app = GetObject(, "AutoCAD.Application.19") '実行中のAutoCADを取得する
'実行中のAutoCADがなく、取得できないとき
If app Is Nothing Then
MsgBox "AutoCADを起動して、再度実行して下さい。"
getDocument = True
Exit Function
End If
'アクティブな図面オブジェクトを取得
Set doc = app.ActiveDocument
getDocument = False
End Function
Re: JDraf対応の場合
投稿日 | : 2016/06/13(Mon) 19:05 |
投稿者 | : アルサポ |
参照先 | : http://r-support.org/bbs/tmp/sample04(JDraf).xlsm |
Option Explicit
Dim app As AcadApplication 'アプリケーションオブジェクト
Dim doc As AcadDocument 'アクティブなドキュメント
'文字を取得1
Private Sub CommandButton1_Click()
On Error Resume Next
'AutoCADを取得
If getDocument Then Exit Sub
Dim sstext As AcadSelectionSet
Dim FilterType(3) As Integer
Dim FilterData(3) As Variant
Set sstext = doc.SelectionSets.Add("SSTEXT")
FilterType(0) = -4: FilterData(0) = "<or"
FilterType(1) = 0: FilterData(1) = "TEXT"
FilterType(2) = 0: FilterData(2) = "MTEXT"
FilterType(3) = -4: FilterData(3) = "or>"
sstext.SelectOnScreen FilterType, FilterData
Dim enttxt As Variant
Dim n As Long
n = Range("A65536").End(xlUp).row + 1
For Each enttxt In sstext
Range("A" & n) = enttxt.TextString
n = n + 1
Next enttxt
doc.SelectionSets.Item("SSTEXT").Delete
Set app = Nothing
Set doc = Nothing
End Sub
'文字を取得2
Private Sub CommandButton2_Click()
On Error Resume Next
'AutoCADを取得
If getDocument Then Exit Sub
'テキスト選択
Dim objEntity As AcadEntity
Dim p As Variant
Dim AcMText As AcadMText
Dim AcText As AcadText
Dim n As Long
n = Range("A65536").End(xlUp).row + 1
'作図ウィンドウ上で図形を選択し、そのAutoCADクラス名を表示する。
Call doc.Utility.GetEntity(objEntity, p, "文字を選択: ")
If Err Then Exit Sub
If objEntity.ObjectName = "AcDbMText" Then
Range("A" & n) = objEntity.TextString
ElseIf objEntity.ObjectName = "AcDbText" Then
Range("A" & n) = objEntity.TextString
End If
End Sub
'文字を編集
Private Sub CommandButton3_Click()
On Error Resume Next
'AutoCADを取得
If getDocument Then Exit Sub
'テキスト選択
Dim objEntity As AcadEntity
Dim p As Variant
Dim AcMText As AcadMText
Dim AcText As AcadText
'作図ウィンドウ上で図形を選択し、そのAutoCADクラス名を表示する。
Call doc.Utility.GetEntity(objEntity, p, "文字を選択: ")
If Err Then Exit Sub
If objEntity.ObjectName = "AcDbMText" Then
objEntity.TextString = ActiveCell
ElseIf objEntity.ObjectName = "AcDbText" Then
objEntity.TextString = ActiveCell
End If
ActiveCell.Offset(1, 0).Activate
End Sub
'JDrafを取得
'VBA ウィンドウのツールメニューの参照設定から
'「PCAD_AC_X Type Library」と「PCAD_DB_X 3.09 Type Library」を選択する必要がある
Private Function getDocument() As Boolean
On Error Resume Next
Set app = GetObject(, "PCAD_AC_X.AcadApplication") '実行中のJDRAFを取得する
'実行中のJDRAFがなく、取得できないとき
If app Is Nothing Then
MsgBox "JDrafを起動して、再度実行して下さい。"
getDocument = True
Exit Function
End If
'アクティブな図面オブジェクトを取得
Set doc = app.ActiveDocument
getDocument = False
End Function
Re:JDraf版の現状について
投稿日 | : 2016/06/13(Mon) 19:13 |
投稿者 | : アルサポ |
参照先 | : |
それぞれのCADを取得するソース以外はAutoCAD版、JDraf版
同じ内容になっています。
しかし、JDraf版の方では一部動かないプログラムがあります。
「文字を取得1」については、文字を選択して(選択は出来るが右クリックで決定ができなくEnterキーで決定する)、
内容を取得できますが、JDrafが閉じてしまいます。
「文字を取得2」については、実行した時にJDrafが閉じてしまいます。
「文字を編集」については問題なく(A列に文字列を入力してあれば)実行できるようです。
問題としては、オブジェクトの選択が個人的に上手く出来ていません。
AutoCADでは出来るようなので、今後JDrafもバージョンが上がれば出来るようになるかもしれませんが、
別の方法を考えているのが現状です。