- ベストアンサー
エクセルVBAで一つ上の階層を指定して保存したい
お世話になります。 VBA初心者なりにマクロの自動記録などで作業しておりますが、自動記録でできない作業を一つ教えてください。 現在作業しているフォルダは、Activeworkbook.Pathなどで指定できますが、その一つ上の階層に保存したいという場合、どう指定すればよいのでしょうか? 自動保存だと"Documentos and Settinng~"などから始まるファイルパスになりますが、ファイルを保存するフォルダは各人によってまちまちですので、自分が保存したフォルダの一つ上という指定をしたいのです。そのような方法があれば教えてください。 よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
回答番号:No.5 merlionXXです。 > プロシージャの呼び出しが不正と出ます。 それは、ActiveWorkbook.Path が取得できない、つまりまだ保存前の新規BOOKで実行したせいではないかと思います。 エラーを回避するようにしてみました。 If ActiveWorkbook.Path = "" Then x = "" Else x = Left(ActiveWorkbook.Path, InStrRev(ActiveWorkbook.Path, "\") - 1) End If ActiveWorkbook.SaveAs Filename:=x & "\test.xls"
その他の回答 (5)
- merlionXX
- ベストアンサー率48% (1930/4007)
> Msgboxでは、確かに一つ上の階層が取得できています。しかし、そこに保存させるところができません。 #2 merlionXXです。 取得できれば保存は簡単だと思いますが・・・・。 ActiveWorkbook.SaveAs Filename:=Left(ActiveWorkbook.Path, InStrRev(ActiveWorkbook.Path, "\") - 1) & "\test.xls"
補足
んー、残念ながらうまくいきません。 プロシージャの呼び出しが不正と出ます。 何か、根本的な間違いをしているのでしょう。折角教えていただいたのに申し訳ないです。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>の前に上記の記述をしただけではいけないのでしょうか?。 だめです。 保存先を指定する場合は、ファイル名の前にパス名も一緒に指定します。 Dim TmpPath As String TmpPath = ThisWorkbook.Path If InStrRev(TmpPath, "\") <= 3 Then TmpPath = Left(TmpPath, 2) Else TmpPath = Left(TmpPath, InStrRev(TmpPath, "\")) End If ActiveWorkbook.SaveAs Filename:=TmpPath & "\test.xls"
お礼
たびたびのご回答ありがとうございました。 無事、目的のものができました。 自分でも作れるように、精進していきます。 本当にありがとうございました。
- marbin
- ベストアンサー率27% (636/2290)
こんなのでも。 Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") MsgBox FSO.getparentfoldername(ThisWorkbook.Path) Set FSO = Nothing
- merlionXX
- ベストアンサー率48% (1930/4007)
Sub test() MsgBox Left(ActiveWorkbook.Path, InStrRev(ActiveWorkbook.Path, "\") - 1) End Sub で取得できました。
補足
早速のご回答ありがとうございます。 Msgboxでは、確かに一つ上の階層が取得できています。しかし、そこに保存させるところができません。 上記のあとに ActiveWorkbook.SaveAs Filename:="test.xls", FileFormat _~ を書くだけではだめなんでしょうね。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>どう指定すればよいのでしょうか? 取得したパスから文字列関数を使って必用な文字列を取出します。 Dim TmpPath As String TmpPath = ThisWorkbook.Path Debug.Print TmpPath If InStrRev(TmpPath, "\") <= 3 Then TmpPath = Left(TmpPath, 2) Else TmpPath = Left(TmpPath, InStrRev(TmpPath, "\")) End If Debug.Print TmpPath
補足
早速のご回答ありがとうございます。 試してみましたが、ドライブの最初の階層に保存されてしまいます。私が基本的なことが分かっていないからだと思いますが。 ActiveWorkbook.SaveAs Filename:="test.xls", FileFormat _ の前に上記の記述をしただけではいけないのでしょうか?。
お礼
なるほど、まだ保存前のBookじゃActiveWorkbook.Pathが取得できないはずですね。さすがのご指摘、ありがとうございます。 しかしエラー回避のコードでやってみましたが、X=""の時、testファイルはドライブの一番上の階層に保存されてしまいました。 そこで、最初に ChDir Left(ActiveWorkbook.Path, InStrRev(ActiveWorkbook.Path, "\") - 1) でPathを取得しといてから作業するとうまくいきました。 わずか1行で取得できたので、こちらの記述を使用したいと思います。 おせわになりました。ありがとうございました。