親フォルダを取得する方法

このQ&Aのポイント
  • Excel VBAを使用して、アクティブブックの親フォルダを取得する方法について教えてください。
  • ActiveWorkbook.Pathを使用すると、アクティブブックのファイル名以外のパスが取得できますが、ActiveWorkbook.Parent.Pathを使用すると不正なパスが返されます。
  • 正しいコードを教えていただけると助かります。
回答を見る
  • ベストアンサー

親フォルダを取得したい

Sub test1() Dim mystr As String mystr = ActiveWorkbook.Path End Sub これだと、現在のアクティブブックのファイル名以外のパスが取得できるのですが、 mystr = ActiveWorkbook.Parent.Path にすると、なぜか C:\Program Files (x86)\Microsoft Office\Office14 が返ります。 ActiveWorkbook.Path の返り値が C:\新しいフォルダー だとしたら、 C: のみが取得されるコードが知りたいのですが、 ActiveWorkbook.Parent.Path ではダメなようなので、正しいコードを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.3

wixdwxvwrwbfqさん はじめまして。 親パスを取得するのに文字列で対応しても良いですが、できればMicrosoftが提供するクラスライブラリ等を利用した方が、安全で楽かと思います。 mystr = CreateObject("Scripting.FileSystemObject").GetParentFolderName(ActiveWorkbook.Path) でできるかと思います。 注)ルートフォルダは「C:」ではなく「C:¥」になりますが… お試し下さい。

wixdwxvwrwbfq
質問者

お礼

ありがとうございました。

その他の回答 (2)

  • riveron77
  • ベストアンサー率48% (180/370)
回答No.2

#1様の方が全然スマートなんですが。 対抗して長ったらしくしてみました(意味不明) 変数名とか一部おかしなことになってますが気にせず。 上司にコードレビューされたら高評価間違い無しっ -------------------------- Option Explicit Private Type Similars AmuroRay As String '自パスを格納用 TemRay As String '親パス格納用 End Type Sub EFSF() Dim RX78 As Similars Dim vPath As Variant 'Dir毎にDirの名前を格納する配列 Dim iYenCounter As Integer '自パスの「\」を数えるカウンタ Dim i As Integer 'ループ用カウンタ '自パス取得 RX78.AmuroRay = ActiveWorkbook.Path '「\」を数える iYenCounter = UBound(Split(RX78.AmuroRay, "\")) '自パスをDir毎にDirの名前を配列に格納 vPath = Split(RX78.AmuroRay, "\") '自パス配列を親Dirまでループさせて親パス作り For i = 0 To iYenCounter - 1 '親Dirだったら"\"は付けない If i = iYenCounter - 1 Then RX78.TemRay = RX78.TemRay & vPath(i) '親Dirでなければ"\"を付ける If i < iYenCounter - 1 Then RX78.TemRay = RX78.TemRay & vPath(i) & "\" Next 'とりあえずMsgBoxで親パスを出して誤魔化してみるw MsgBox "自パスは" & RX78.AmuroRay & "です" & vbCrLf & "親パスは" & RX78.TemRay & "です" End Sub

wixdwxvwrwbfq
質問者

お礼

ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

たとえば msgbox left(activeworkbook.path, instrrev(activeworkbook.path, "\") - 1) とか。

wixdwxvwrwbfq
質問者

お礼

ありがとうございました。

関連するQ&A

  • サブフォルダの親フォルダを変えたい

    フォルダの中のサブフォルダを取得してくて、 http://officetanaka.net/excel/vba/tips/tips95.htm の --------------------------------------------------------- Sub Sample4() Dim buf As String, msg As String buf = Dir("*.*", vbDirectory) Do While buf <> "" If InStr(buf, ".") = 0 Then msg = msg & buf & vbCrLf buf = Dir() Loop MsgBox msg End Sub --------------------------------------------------------- をやってみたら、サブフォルダを取得できたのですが、 上記のコードを実行すると 元々のフォルダのパスが「C:\Users」で、 「C:\Users」のサブフォルダが取得されてしまいます。 でも上記のコードでは、「C:\Users」は指定してないと思うのですが、 なぜ「C:\Users」のサブフォルダが取得されてしまうのでしょうか? 例えば 「C:\Users」ではなく、「C:\Program Files」のサブフォルダを取得するには、 どのようにコードを書き換えればいいのでしょうか? ご教授よろしくお願いします。

  • 数値かどうかを取得したい IsNumberではダメ

    Sub Macro2() Dim mystr As String mystr = "1" If IsDate(mystr) = False Then MsgBox "NO" End If End Sub これなら日付型かどうかを取得できるのに、 Sub Macro1() Dim mystr As String mystr = "1" If IsNumber(mystr) = False Then MsgBox "NO" End If End Sub だと、IsNumberがコンパイルエラーになります。 変数に入っている値が数値として評価できるかを取得する方法を教えてください。

  • エクセルのフルパスをvbaで取得

    当方エクセル2003で、 エクセルのフルパスは C:\Program Files\Microsoft Office\OFFICE11\ EXCEL.EXE です。 それをVBAで取得するにはどうすればいいですか? Sub サンプル() Debug.Print 'オフィスがインストールされているフォルダのパスの取得 End Sub のようにして、 C:\Program Files\Microsoft Office\OFFICE11\ EXCEL.EXE を返したいです。 VBAコードをご教示ください。

  • 返ってくる値が違う

    VBAでフォルダの中のファイルの個数を取得するコードなのですが Sub test1() Dim i As Long, buf, Path As String Path = ActiveWorkbook.Path & "\" buf = Dir(Path & "*.*") Do While buf <> "" i = i + 1 buf = Dir() Loop MsgBox "「" & ActiveWorkbook.Path & "」には、全部で" & i & "個のファイルがあります。" End Sub Sub test2() Dim Path As String Dim i As Long, FSO As Object, f As Object Path = ActiveWorkbook.Path & "\" Set FSO = CreateObject("Scripting.FileSystemObject") MsgBox "「" & ActiveWorkbook.Path & "」には、全部で" & FSO.GetFolder(Path).Files.Count & "個のファイルがあります。" Set FSO = Nothing End Sub Test1とtest2では返ってくる値が違うのですが なぜでしょうか? Test2はフォルダの個数も取得されてるのですか?

  • 変数の中の特定の文字の出現回数を取得したい。

    Sub test01() Dim mystr As String mystr = "a1a2a3" Debug.Print WorksheetFunction.CountA(mystr, "a") End Sub のようなコードを作りました。 mystrの中に3つの「a」があります。 なので、CountA関数を使えば、3が返ると思ったのですが、2が返りました。 なぜ3ではなく2が返るのでしょうか? CountA関数でなくてもいいので、 変数の中の特定の文字の出現回数を取得するコードを教えてください。

  • 値渡し?参照渡し?をやりたい

    「#00B7EF」を「&HEFB700」にする関数を作ってるのですが 初心者のため躓いてしまいました。 コードは ++++++++++++++++++++++++++++++++++++++++++++++++++++ Sub 色コード() myStr = "#00B7EF" Debug.Print 色コード変換(myStr) End Sub Function 色コード変換() Dim myStr1 As String Dim myStr2 As String Dim myStr3 As String myStr1 = Mid(myStr, 2, 2) myStr2 = Mid(myStr, 4, 2) myStr3 = Mid(myStr, 6, 2) 色コード変換 = "&H" & myStr3 & myStr2 & myStr1 End Function ++++++++++++++++++++++++++++++++++++++++++++++++++++ を作ったのですが、 End Functionを過ぎてから 実行時エラー_型が一致しません。(Error13) になります。 Sub 色コード()の時に、型を宣言してないからでしょうか? しかし、 Function 色コード変換(as String) にすると赤くなってしまいます。 ご教授よろしくお願いします。

  • 角カッコが含まれてるかどうかをlikeで取得

    したいのですが、どうやらエラーになるようです。 Sub test() Dim mystr As String mystr = "[test]" If mystr Like "*[*" Then MsgBox "[が含まれます" End If End Sub だと、実行時エラー93 パターン文字列が不正ですになります。 こういうように各カッコが含まれてるかどうかを取得するにはどうすればいいですか?

  • 配列 変数の宣言 VBA

    こんばんは。 Sub test() Dim myStr(200) As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_") End Sub のようなコート゛を作成し、 アクティブシートのA列の最終行までを取得し、一つにまとめたいのですが 「Dim myStr(200) As String」の部分で 最終行を取得することは不可能でしょうか? 今回は200行なので大丈夫なのですが 場合によっては1行~65536行までさまざまです。 なので Dim myStr(Cells(Rows.Count, 1).End(xlUp).Row) As String としたらエラーになりました。 最初から Dim myStr(65536) As String とするべきでしょうか? しかしそうすると myStrの最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

  • 変数の中身がアルファベットだけなのか取得するには

    変数がアルファベットだけか取得するには? Sub test() Dim mystr As String mystr = "abc" If ??? Then MsgBox "アルファベットだけです" End If End Sub のように、変数の中身がアルファベットだけなのか取得するにはどうすればいいでしょうか? ひらがな、カタカナ、漢字、記号を含んでいるかどうかを評価したいです。

  • VBA 複数の文字のコードを一気に返すには

    Sub test1() Dim myStr As String myStr = "abc" Debug.Print Asc("a") Debug.Print Asc(myStr) End Sub このコードは、どちらも97が返るのですが、 myStrは3文字です。 3文字全ての文字コードを返すには、 Sub test2() Dim myStr As String myStr = "abc" Debug.Print Asc(Mid(myStr, 1, 1)) & Asc(Mid(myStr, 2, 1)) & Asc(Mid(myStr, 3, 1)) End Sub のようにするしかないのでしょうか?

専門家に質問してみよう