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もバージョンが上がれば出来るようになるかもしれませんが、
別の方法を考えているのが現状です。
記事編集 編集
ページの上に移動
件名 スレッドをトップへソート
名前
メールアドレス
URL
暗証キー
画像認証 (右画像の数字を入力) 投稿キー
コメント


- WEB PATIO -