Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
ファイルパス取得について
投稿日時: 21/02/22 10:32:15
投稿者: F@NKS

あるエクセルファイルをシート毎にセーブするアドインを作成しております。
エクセルファイルと同じパス(場所)にシートを保存したいのですが、
『ThisWorkbook.Path』を指定するとaddinsの格納パスを指してしまいます。
エクセルファイル自身のパスを取得する方法はありませんか?
 
For Each SheetName In Worksheets
    SheetName.Copy
    ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & SheetName.Name
    ActiveWorkbook.Close
Next SheetName

回答
投稿日時: 21/02/22 11:20:26
投稿者: simple

>あるエクセルファイルをシート毎にセーブする
 
そのエクセルファイルは、どのようにしてそこにあるんでしょうか?

(1)既存のファイルを開いたものなのか、
(2)templateを指定してWorkbooks.Addを使って新たに作成したファイルなのか、
といった状況によるでしょう。(たいていは(1)でしょう。(2)も無くはないのかも知れない)
 
(1)なら素直にActiveWorkbook.Pathとすれば、そのパスが得られます。
(2)なら、ActiveWorkbook.Pathが "" を返します。
   その場合は、カレントフォルダ(CurDir)にそのまま保存してしまうか、
   別途、フォルダを指定させるかでしょう。
 
コードにすれば、こんな感じですか?
Sub test()
    Dim ws As Worksheet
    Dim strPath As String
    
    If ActiveWorkbook.Path = "" Then
        strPath = CurDir
        '別途フォルダを指定させてもよいでしょう。
    Else
        strPath = ActiveWorkbook.Path
    End If

    For Each ws In Worksheets
        ws.Copy
        ActiveWorkbook.SaveAs strPath & "\" & ws.Name
        ActiveWorkbook.Close
    Next
End Sub
なお、xlsx形式のブックに保存する前提です。

回答
投稿日時: 21/02/22 11:33:45
投稿者: K.Hiwasa
投稿者のウェブサイトに移動

ThisWorkbook.Pathでは実行しているブックのパスになります。
ThisWorkbook.Pathの部分をActiveWorkbook.Pathとすると、
ActiveWorkbookはコピー後のブックになっていて未保存のため、パスを取得できません。
予めパスを取得しておかない場合は、SheetNameのブックのパスということで、
ThisWorkbook.Pathの部分をSheetName.Parent.Pathにすると元ブックのパスを取得できます。
 
※未保存ブックに対しては別途対策が必要です。

投稿日時: 21/02/22 13:00:23
投稿者: F@NKS

K.Hiwasaさん、ありがとうございます。
『SheetName.Parent.Path』があるのですね。解決しました。