質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

937閲覧

AutoCAD VBAで「プロシージャの呼び出し、または引数が不正です。」エラー

koridentetsu

総合スコア27

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/08/05 00:40

状況

AutoCAD VBAに関する質問です。
「1つのdwgファイル内で、1つのモデルから複数のペーパー(レイアウト)があるDWGファイルを、1つのペーパーだけを持つファイルにそれぞれ別名保存する」ということをVBAで実現したいと思っています。
例えば、A.dwgというファイルが、「レイアウト1」から「レイアウト10」まで10個のレイアウトを持っているとして、
・「A-レイアウト1.dwg」を別名保存して、レイアウトは「レイアウト1」だけを残して、それ以外の9つのレイアウトは削除する
・「A-レイアウト2.dwg」を別名保存して、レイアウトは「レイアウト2」だけを残して、それ以外の9つのレイアウトは削除する

・「A-レイアウト10.dwg」を別名保存して、レイアウトは「レイアウト10」だけを残して、それ以外の9つのレイアウトは削除する
というように、10個全て別名保存したファイルを作るという作業を、自動化したいと思っています。

なお、実際にはこのようなdwgファイルが数百個あり、レイアウトの数は常に10と決まっているわけではなく、ファイルによって異なります。

そこで、作業の時短とミス防止を目的に、以下のようなコードをAutoCAD VBAで書いたのですが、後述するエラーが起こっています。

該当のソースコード

VBA

1Public Sub test1() 2 Dim i As Long, j As Long 3 Dim FileName As String 4 Dim PaperCount As Long 5 Dim PaperName() As String 6 Dim ModelPaperN As Long 7 Dim Path As String, FullFileName As String 8 Dim 残すレイアウト名 As String 9 Dim DWG1 10 Dim Paper1 As AcadLayout 11 12 Set DWG1 = ActiveDocument 13 14 FileName = DWG1.Name 15 Path = DWG1.Path '図面の保存パス 16 FullFileName = Path & "\" & FileName 17 18 FileName = Replace(FileName, ".dwg", "") 19 FileName = Replace(FileName, ".DWG", "") 20 'ファイル名を取得してから、拡張子を除去したファイル名を取得 21 22 PaperCount = DWG1.Layouts.Count - 1 'レイアウトの総数を数え上げる。「モデル」も数えられるのでレイアウト数+1になるから、1を引く 23 24 ReDim PaperName(PaperCount) As String 25 26 For i = 0 To PaperCount 27 PaperName(i) = DWG1.Layouts(i).Name 28 Debug.Print (i & " " & PaperName(i)) 29 Next 30 31 For i = 0 To PaperCount 32 If i > 0 Then 33 Application.Documents.Open (FullFileName) 34 Set DWG1 = ActiveDocument 35 End If 36 37 PaperName(i) = DWG1.Layouts(i).Name 38 'Debug.Print (PaperName(i)) 39 If PaperName(i) = "Model" Then 40 ModelPaperN = i 41 Else 42 DWG1.SaveAs (Path & "\" & FileName & "-" & PaperName(i) & ".dwg") 43 For j = 0 To DWG1.Layouts.Count - 1 44 Debug.Print (j & " " & DWG1.Layouts(j).Name) 45 If DWG1.Layouts(j).Name <> "Model" And DWG1.Layouts(j).Name <> PaperName(i) Then 46 DWG1.Layouts(j).Delete 47 Debug.Print ("削除") 48 End If 49 Next 50 End If 51 DWG1.Save 52 DWG1.Close 53 Next 54 55End Sub

発生している問題・エラーメッセージ

ループでi=0, j=6のとき、
Debug.Print (j & " " & DWG1.Layouts(j).Name)
の部分でエラーが起こり、

実行時エラー '5' プロシージャの呼び出し、または引数が不正です。

というエラーが発生します。
どのようにすれば改善するでしょうか?

補足

  • AutoCAD VBAは、Civil 3D 2022から使用しています。
  • 動作テストに使用したdwgファイルには8個のレイアウトがあります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

以下のようなコードに直すとエラーが生じなくなりました。

vba

1Public Sub test2() 2 Dim i As Long, j As Long 3 Dim FileName As String 4 Dim PaperCount As Long 5 Dim PaperName() As String 6 Dim ModelPaperN As Long 7 Dim Path As String, FullFileName As String 8 Dim 残すレイアウト名 As String 9 Dim DWG1 10 Dim Paper1 As AcadLayout 11 12 Set DWG1 = ActiveDocument 13 14 FileName = DWG1.Name 15 Path = DWG1.Path '図面の保存パス 16 FullFileName = Path & "\" & FileName 17 18 FileName = Replace(FileName, ".dwg", "") 19 FileName = Replace(FileName, ".DWG", "") 20 'ファイル名を取得してから、拡張子を除去したファイル名を取得 21 22 PaperCount = DWG1.Layouts.Count - 1 'レイアウトの総数を数え上げる。「モデル」も数えられるのでレイアウト数+1になるから、1を引く 23 24 ReDim PaperName(PaperCount) As String 25 26 For i = 0 To PaperCount 27 PaperName(i) = DWG1.Layouts(i).Name 28 Debug.Print (i & " " & PaperName(i)) 29 Next 30 31 32 For i = 0 To PaperCount 33 If i > 0 Then 34 Application.Documents.Open (FullFileName) 35 Set DWG1 = ActiveDocument 36 End If 37 38 PaperName(i) = DWG1.Layouts(i).Name 39 'Debug.Print (PaperName(i)) 40 If PaperName(i) = "Model" Then 41 ModelPaperN = i 42 Else 43 DWG1.SaveAs (Path & "\" & FileName & "-" & PaperName(i) & ".dwg") 44 For j = 0 To UBound(PaperName) 45 If PaperName(j) <> "Model" And PaperName(j) <> PaperName(i) Then 46 ActiveDocument.Layouts(PaperName(j)).Delete 47 Debug.Print (PaperName(j) & ".削除") 48 End If 49 Next 50 End If 51 DWG1.Save 52 DWG1.Close 53 Next 54End Sub

投稿2022/08/05 02:11

koridentetsu

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問