フォルダ内の全ファイルを自動的に呼び込んでPDFに保存するマクロ VBA

ソリッドワークスはVBAが使える。VBAはExcelで使ったことがあるのでなんとなくわかるがSolidWorksのオブジェクトの使い方を探さないといけない。使い方よりサンプルだ。 これ、相当以前からやりたかっがやっとでき … “フォルダ内の全ファイルを自動的に呼び込んでPDFに保存するマクロ VBA” の続きを読む

ソリッドワークスはVBAが使える。
VBAはExcelで使ったことがあるのでなんとなくわかるがSolidWorksのオブジェクトの使い方を探さないといけない。使い方よりサンプルだ。

これ、相当以前からやりたかっがやっとできた。
あるフォルダにある全図をPDFにできるようになった。うれしい。

で、
何をしてできたのかというと、googleしたのだが、
・マクロの操作を保存する方法
・ソリッドワークスのライブラリのヘルプ場所、サンプル探し
・ファイル一覧の方法
思い出せないので随時。

準備
ツールのユーザー定義で以下のダイアログを表示し、マクロにチェックを入れる。
1845ce89.png
マクロにチェックを入れると以下が見えるようになる。
99d222fe.png

—————————————————————-
全部自分でプログラムを書くのは面倒なのでやりたいことを操作してプログラムを作れせる。
適当なSLDDRW拡張子のファイルを呼び込んでおく。
Image.pngを押して、同じ名前でPDFファイルを保存する。(余計なこと、関係ないことをマウスで操作しないこと!!!。プログラムが煩雑になる)
以下が出来上がった。bdd88b78.pngを押すとマクロのファイルを指定して呼び出すことができる。
Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = _
Application.SldWorks

Set Part = swApp.ActiveDoc
Part.ViewZoomtofit2
longstatus = Part.SaveAs3(“C:\Users\tanaka\Desktop\図面1\maru1.PDF”, 0, 0)
End Sub

!!注意、フォントの関係で\は¥のこと。!!!!!
この中で”C:\Users\tanaka\Desktop\図面1\maru1.PDF”の文字列が作れればほぼ完成している。

ついでに、ツールの参照設定でsolidworks????あたりを参照しておくと、コードを書くときに変数宣言時やイミディエイトでメソッドの使い方を教えてくれたり、メンバを一覧表示してくれたりする。
83ab1822.png
やらなくても動くが、やっておこう。

—————————————————————–
今呼び込んでいる図面をPDFで保存するマクロは以下です。ファイル名の拡張子SLDDRWをPDFに変えるだけ。
Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

  Set swApp = _
  Application.SldWorks

  Set Part = swApp.ActiveDoc
  Part.ViewZoomtofit2
  ss = Part.GetPathName’今呼び込んでいる図面のパス名+ファイル名をssに入れる
  kk = Split(ss, “.”)’.文字で区切って、各文字列を配列に入れる。kkは配列になる。UBound(kk)で配列の個数
  ‘拡張子を取り外し。パス+ファイル名(拡張子なし)がssに入る
  ss = Left(ss, Len(ss) – Len(kk(UBound(kk))) – 1)
  longstatus = Part.SaveAs3(ss & “.PDF”, 0, 0)’拡張子はPDFとして保存
End Sub

この中で厄介なので現在の呼び込んでいるファイル名やパス名を取り出す方法。
これはマクロ記憶ではできない。
GetPathNameメソッドを探すのには苦労した。APIのドキュメントで見つけることができたが、使い方がわからず、サンプルを探して
Part.GetPathName がやっと見つかった。
あとは、
文字列の操作/処理。
http://www.geocities.jp/cbc_vbnet/function/mojireyu_function.html#instr
イミディエイトに入れながらすると文字列処理はなんとかなる。VBAの編集でイミディエイトが見えない場合は、Ctrl+d。

—————————————————————-
今、呼び込んでいる図面のパスにある全SLDDRWのファイルを順番に呼び込んでPDFで保存する。
Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

    Set swApp = _
    Application.SldWorks
   
    Set Part = swApp.ActiveDoc
    Part.ViewZoomtofit2
    ss = Part.GetPathName ‘今呼び込んでいる図面のパス名+ファイル名をssに入れる
     ‘.文字で区切って、各文字列を配列に入れる。kkは配列になる。UBound(kk)で配列の個数
    kk = Split(ss, “.”) 

     ‘拡張子を取り外し。パス+ファイル名(拡張子なし)がssに入る
    ss = Left(ss, Len(ss) – Len(kk(UBound(kk))) – 1) 
     ‘ssの確認。イミディエイトのウィンドウにssのデータが書かれる。イミディエイトが見えない場合は、Ctrl+d
    Debug.Print ss
    jj = Split(ss, “\”) ‘\文字で区切って、各文字列を配列に入れる。
     ‘ファイル名の取り出し。最後の配列のデータをfnameに入れる。jj(0)が先頭のデータ。
    fname = jj(UBound(jj)) 
    pname = Left(ss, Len(ss) – Len(fname)) ‘パスの文字列、最後の¥も含む
    Debug.Print fname
    Debug.Print pname
    nn = Dir(pname)’1つ目のファイル名を取り出す。nnにファイル名が入る
    Do Until nn = “” ‘Dir()は全ファイルを取り出し終えたら””を返す
        If InStr(nn, “.SLDDRW”) Then ‘ファイル名に.SLDDRWを含む場合
            Debug.Print TypeName(nn), nn ‘TypeName関数はカッコ内のデータの型を返す
             ‘open_savePDF  sub/サブルーチンを呼び出す。サブルーチンにパス名+ファイル名を渡す
             open_savePDF pname & nn  ‘open_savePDFは自作のサブルーチン(関数のようなもの)
        End If
        nn = Dir()’次のファイル名を取り出す。
    Loop
End Sub

‘引数はパス名+ファイル名を受け取る。これは自作サブルーチン。ほとんどがマクロ記憶で
Sub open_savePDF(pf) 

    Set swApp = _
    Application.SldWorks
   
    Set Part = swApp.ActiveDoc
   ‘受け取ったpfパス名+ファイル名で開く
    Set Part = swApp.OpenDoc6(pf, 3, 0, “”, longstatus, longwarnings) 
    Set Part = swApp.ActiveDoc
    Dim myModelView As Object
    Set myModelView = Part.ActiveView
    myModelView.FrameLeft = 0
    myModelView.FrameTop = 21
    Set myModelView = Part.ActiveView
    myModelView.FrameState = swWindowState_e.swWindowMaximized
‘    swApp.ActivateDoc2 “maru3.kotae – シート1”, False, longstatus

    ss = Part.GetPathName ‘今呼び込んでいる図面のパス名+ファイル名をssに入れる
     ‘.文字で区切って、各文字列を配列に入れる。kkは配列になる。UBound(kk)で配列の個数
    kk = Split(ss, “.”) 
    ‘拡張子を取り外し。パス+ファイル名(拡張子なし)がssに入る
    ss = Left(ss, Len(ss) – Len(kk(UBound(kk))) – 1) 

    Debug.Print ss
    longstatus = Part.SaveAs3(ss & “.PDF”, 0, 0)
   
    Set Part = swApp.ActiveDoc
    Set Part = Nothing
    swApp.CloseDoc pf ‘パス名でも終了指定できる
End Sub

dir(パス名)を一度するれば、dir()とカッコ内になにも入れないと次のファイルを得ることができる。
closedocの引数がパスでもいいのが分かったのがこれ。

https://forum.solidworks.com/thread/33487

(Visited 3,219 times, 6 visits today)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です