ファイルパスの汎用性について教えてください!

このQ&Aのポイント
  • 一覧表をつくりそこをダブルクリックするとハイパーリンクを設定するマクロを組んだのですが、ファイルパスに汎用性がなく困っています。
  • コード中のpathの部分を可変にする方法を教えてください。
  • 例えば、pathをこのコードが書かれているエクセルの特定のセルから取得することはできますか?
回答を見る
  • ベストアンサー

ファイルパスの汎用性について教えてください!

ファイルパスの汎用性について教えてください! 一覧表をつくりそこをダブルクリックするとハイパーリンクを設定するマクロを組んだのですが、ファイルパスに汎用性がなく困っています。以下のコードはどう直せばいいですか? Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal target As Range, Cancel As Boolean) Dim h As Range Dim path As String Dim s As String For Each h In Range("M4:V4") If h.Value <> "" Then path = "C:\Documents and Settings\marsh\デスクトップ\特殊\1111\02\01/チェックシート\" s = Dir(path & h & "*.*") ActiveSheet.Hyperlinks.Add Anchor:=h, address:=path & s End If Next h End Sub 上記コードでpathの部分を可変にしたいんです。例えばpath = "C:\Documents and Settings\marsh\デスクトップ\特殊\・・・以降をこのコードが書いてあるエクセルのA1から拾ってくるとかしたいんです。できますでしょうか?よろしくご教授ください。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

別なブック、別なシートで使う場合に、 パスが違っても使えるようにというのは分かりますが、 その時、一覧表の範囲(M4:V4)は同じなんでしょうか? 範囲が違えばそれも汎用的でないと片手落ちになりますよね。 と、それは置いといて、パスだけA1の内容を使う場合。 '------------------------------------------   Path = Range("A1").Value '------------------------------------------- それから、ダブルクリックしたセルが (1)範囲(M4:V4)以外の時はジャンプ (2)範囲のときは、ダブルクリック通常処理(セル編集)のキャンセル の処理も必要でしょうね。 それには、For Each の前に次の2行を追加 '--------------------------------------------------- If Intersect(target, Range("M4:O4")) Is Nothing Then Exit Sub   Cancel = True '--------------------------------------------------- 更にいえば、File Not Foundの処理も。。。 恐らく、 s = Dir(path & h & "*.*") これでやろうとしているのでしょうが。。 "*.*"の部分がちょと気になる。。(^^;;; 以上です。  

その他の回答 (3)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.4

何をしたいのか良く分からんが ?thisworkbook.path とか ?environ("userprofile") をイミディエイトウィンドウで実行してみてくださいまし。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

回答2、myRangeです。 セル範囲にミスあり。。。 >If Intersect(target, Range(●"M4:O4"●)) Range("M4:V4") 以上です。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

>でpathの部分を可変にしたいんです の意味が良く説明されて無いと思うが。 独断でやると Option Explicit Sub test01() Dim h As Range Dim path As String Dim s As String Dim i As Integer i = 1 For Each h In Range("B1:B3") If h.Value = "" Then path = "C:\Documents and Settings\XXX\My Documents" 's = Dir(path & h & "*.*") ActiveSheet.Hyperlinks.Add Anchor:=h, Address:=path & "\" & Range("A" & i) i = i + 1 End If Next h End Sub ーー 内容からシートのイベントにする必要を感じないので、標準モジュールに入れて実行するようにした。 ハイパーリンクはB1:B3のセルに対し設定している。 セルのA1:A3にRange("B1:B3")に対応したブック名を入れた。 例A1:A3 01化X.xls 01化Y.xls 01化Z.xls ーー 私の場合は上記の名前のブックが "C:\Documents and Settings\XXX\My Documents" に存在する。 ーーー 実行するとB1 セルに C:\Documents and Settings\XXX\My Documents\01化X.xls がブルーの文字で入り、クリックすると01化X.xlsガ開く。 B2,B3も同様に01化Y.xls 、01化Z.xlsの分がセットされた。 これでは見当はずれですか。

marsh_village
質問者

補足

すみません。説明不足で・・・。プログラムを流用したいということです。このプログラムをコピーして作りは同じだがファイル名が違うデータに貼り付けて使いたいんです。そうするにはファイルパスが固定だとハイパーリンクの参照先が変わらないので、コピペしても自動で使えるようなプログラムにしたいんです!

関連するQ&A

  • ファイルパスと互換性

    VB.NETを用いてあるEXEファイルを作っています。 EXEファイルのディレクトリは http://dobon.net/vb/dotnet/vb6/apppath.html のやり方により帰ってくることがわかります 今私が使っているのはDirectX 9でほぼWindows専用なのであまり関係ないのですが、将来、DirectX 9部をOpenGL.NETだとかで書き換えたりして他のCLI環境でも使えるようにするかもしれません。 その中でコード中に相対パスを埋め込もうと思っています。 Module MainModule Dim str As String ="\images\himajin\image.png" Shared Function GetAppPath() As String Return System.IO.Path.GetDirectoryName( _ System.Reflection.Assembly.GetExecutingAssembly().Location) End Function Sub Main 'GetAppPath() & strの文字列を引数に取り、ファイルを読み込む。ちょっとソースが思いつかないので省略 End Sub End Module ・・・ただ・・・、ディレクトリの区切りが「\」ではないと思うんで、これで認識はしないかもしれず。 Dim str As String = System.IO.Path.DirectorySeparatorChar & "images" System.IO.Path.DirectorySeparatorChar & "himajin" & System.IO.Path.DirectorySeparatorChar & "image.png" という面倒くさい書式をとることになるのかなあと思っています。(まぁこれは俺自身がImportを使いたがらないということもあるんですが) このパス記述が複数あったら全部書き換えることになるんだろうかと思うと・・・恐ろしくて。 何かいい方法はないでしょうか?

  • 配列のメリットは?

    下記のコードは同じ動作をします。 Sub 普通() Dim moji1 As String Dim moji2 As String moji1 = Range("a1").Value moji2 = Range("a2").Value MsgBox moji1 & moji2 End Sub --------------------------------------------- Sub 配列() Dim moji(2) As String moji(1) = Range("a1").Value moji(2) = Range("a2").Value MsgBox moji(1) & moji(2) End Sub こういう場合は配列を使ったほうがいいのでしょうか? それとも配列は避けたほうがいいのでしょうか?

  • VBAでExcelのセルの一覧からファイル名の変更が

    こんにちは。会社で大量のファイル名を変更していますが、Excelで一覧からを変更できれば能率的なので作っていますが、困っています。下記のものです。 Sub リネーム() Dim i As Long  Dim NEWファイル As String  Dim OLDファイル As String  Dim パス As String For i = 1 To Range("B65536").End(xlUp).Row パス = Cells(2, 1).Value OLDファイル = パス & Cells(i, 2).Value NEWファイル = パス & Cells(i, 3).Value If Dir(OLDファイル) <> "" Then Name OLDファイル As NEWファイル End If Next i End Sub ※A2にはC:\Documents and Settings\M.Co,\デスクトップ\リネームと入っています。B1には変更前の001.jpg、C1には変更するa-1.jpgとファイル名が入っています。実行してもファイル名は変更されません。エラーもでません。よろしくお願いします。

  • 変数の型の色の違い

    Sub test() Dim a As String Dim i As Range End Sub とすると 変数の型のが 「String」と「Range」の色が違いますがなぜでしょう?

  • Excel シートにボタンを作成するVBA

    ExcelシートのA列にWAVEファイルのフルパス名が書かれている状態で、 このWAVEファイルを再生するボタンをC列に作成するVBAを作りたいのですが、 ボタンが押されたときに実行されるプロシージャに引数がないときは、 コード1のようにすればできますが、 ボタンが押されたときに実行されるプロシージャに引数があるときは、 コード2のように記述してもエラーになりますが、 どのように記述すればよいのでしょうか。(Windows10,Excel2010) '-----------------コード1------------------------------------------ Sub test()  Dim row As Integer  Dim wave_file_path As String  row = 1  wave_file_path = ThisWorkbook.Worksheets("Sheet1").Cells(row, 1).Value  Call 再生ボタン作成(row, wave_file_path) End Sub Sub 再生ボタン作成(ByVal row As Integer, ByVal wave_file_path As String)  Dim cell_loc As String  cell_loc = ThisWorkbook.Worksheets("Sheet1").Cells(row, 3).Address  ThisWorkbook.Worksheets("Sheet1").Select  With ActiveSheet.Buttons.Add(Range(cell_loc).Left, _   Range(cell_loc).Top, _   Range(cell_loc).Width, _   Range(cell_loc).Height)   .name = "ボタン_" & cell_loc   .OnAction = "WAVE_PLAY"   .Characters.Text = "再生"  End With End Sub Sub WAVE_PLAY()  Dim wave_file_path As String  wave_file_path = "Z:\Document\4_Data\CD_DVD_USB\USB_20200222\REC\JBP001\JBP00101.WAV"  If Dir(wave_file_path) = "" Then   MsgBox wave_file_path & vbCrLf & "がありません。", vbExclamation   Exit Sub  End If  Shell "C:\Program Files\Windows Media Player\wmplayer.exe /play /close " & wave_file_path End Sub '------------------------------------------------------------------- '-------------------コード2---------------------------------------- Sub test()  Dim row As Integer  Dim wave_file_path As String  For row = 1 To 100   wave_file_path = ThisWorkbook.Worksheets("Sheet1").Cells(row, 1).Value   Call 再生ボタン作成(row, wave_file_path)  Next row End Sub Sub 再生ボタン作成(ByVal row As Integer, ByVal wave_file_path As String)  Dim cell_loc As String  cell_loc = ThisWorkbook.Worksheets("Sheet1").Cells(row, 3).Address  ThisWorkbook.Worksheets("Sheet1").Select  With ActiveSheet.Buttons.Add(Range(cell_loc).Left, _   Range(cell_loc).Top, _   Range(cell_loc).Width, _   Range(cell_loc).Height)   .name = "ボタン_" & cell_loc   .OnAction = "WAVE_PLAY " & wave_file_path ' <==== ◆ここでエラーになります◆   .Characters.Text = "再生"  End With End Sub Sub WAVE_PLAY(ByVal wave_file_path As String)  If Dir(wave_file_path) = "" Then   MsgBox wave_file_path & vbCrLf & "がありません。", vbExclamation  Exit Sub  End If  Shell "C:\Program Files\Windows Media Player\wmplayer.exe /play /close " & wave_file_path End Sub '-------------------------------------------------------------------

  • 変数の宣言(s As String)で良い理由

    vbaについてしつもんです。 標準モジュールで Option Explicit Dim s As String Sub test1() Call test2("qqq") End Sub Sub test2(s As String) MsgBox s End Sub としたのですが、もしかしてDim s As Stringって必要ないのでしょうか? あってもなくても動きます。 (s As String)があるからDim s As Stringは不要なのですか? だとしたら、(s As String)に dim や publicをつけなくて良い理由を教えてください。

  • マクロのマスター検索のルーチンで困ってます

    下記のようなフローを作成し、下記のマクロを組んでみたのですが、エラーで困ってます。どなたか教えてください。 (フローを貼り付けられないので、ごめんなさい) Sub Macro() '必要なファイルを読み込む Workbooks.Open Filename:="C:\Documents and Settings\Administrator\My Documents\売上げデーター\seihin_m.xls" Workbooks.Open Filename:="C:\Documents and Settings\Administrator\My Documents\売上げデーター\s0708.xls" Dim g_book As String Dim m_book As String g_book = "s0708.xls" m_book = "seihin_m.xls" '検索用変数 Dim M_cc As String 'マスター製品コード Dim g_cc As String '月次製品コード Windows(g_book).Activate Range("A4").Select g_cc = ActiveCell Windows(m_book).Activate Range("A2").Select M_cc = ActiveCell 'If g_cc <> "" Then  '月次データーがスペースなら、END Do While M_cc <> g_cc     ※この行と次の行でエラー M_cc Offset(1, 0).Select Loop M_cc = ActiveCell.Value Windows("売上推移.xls").Activate Range("B1").Value = g_cc Range("A1").Value = M_cc '次の月次データーコードを読み込みマスターと検索に戻る End Sub

  • Excel VBA 引数が2個のマクロの呼び出し方

    ExcelのVBAで、 シート上のボタンがクリックされた時に呼び出す マクロ(プロシージャ)の引数が1個の時は、 コード1のようにできましたが、 引数が2個ある時は、コード2のように記述しても、 ボタンをクリックするとエラーになりますが、 【?】の部分をどのように記述すればよいのでしょうか。 (Windows10,Excel2010) -------------------コード1---------------------------------------- Sub test1()  Dim row As Integer  Dim wave_file_path As String  For row = 1 To 2   wave_file_path = ThisWorkbook.Worksheets("Sheet1").Cells(row, 1).Value   Call ボタン作成(row, wave_file_path)  Next row End Sub Sub ボタン作成(ByVal row As Integer, ByVal wave_file_path As String)  Dim cell_loc As String  cell_loc = ThisWorkbook.Worksheets("Sheet1").Cells(row, 3).Address  ThisWorkbook.Worksheets("Sheet1").Select  With ActiveSheet.Buttons.Add(Range(cell_loc).Left, _   Range(cell_loc).Top, _   Range(cell_loc).Width, _   Range(cell_loc).Height)   .name = "ボタン_" & cell_loc   .OnAction = "'WAVE_PLAY """ & wave_file_path & "" & "'"   .Characters.Text = "再生"  End With End Sub Sub WAVE_PLAY(ByVal wave_file_path As String)  If Dir(wave_file_path) = "" Then   MsgBox wave_file_path & vbCrLf & "がありません。", vbExclamation   Exit Sub  End If  Shell "C:\Program Files\Windows Media Player\wmplayer.exe /play /close " & wave_file_path End Sub ------------------------------------------------------------------- -------------------コード2---------------------------------------- Sub test2()  Dim row As Integer  Dim wave_file_path As String  For row = 1 To 2   wave_file_path = ThisWorkbook.Worksheets("Sheet1").Cells(row, 1).Value   Call ボタン作成(row, wave_file_path)  Next row End Sub Sub ボタン作成(ByVal row As Integer, ByVal wave_file_path As String)  Dim cell_loc As String  cell_loc = ThisWorkbook.Worksheets("Sheet1").Cells(row, 3).Address  ThisWorkbook.Worksheets("Sheet1").Select  With ActiveSheet.Buttons.Add(Range(cell_loc).Left, _   Range(cell_loc).Top, _   Range(cell_loc).Width, _   Range(cell_loc).Height)   .name = "ボタン_" & cell_loc   .OnAction = "'WAVE_PLAY """ & wave_file_path & "" & "," & row & "'" <==【?】   .Characters.Text = "再生"  End With End Sub Sub WAVE_PLAY(ByVal wave_file_path As String, ByVal row As Integer)  If Dir(wave_file_path) = "" Then   MsgBox wave_file_path & vbCrLf & "がありません。", vbExclamation   Exit Sub  End If  Shell "C:\Program Files\Windows Media Player\wmplayer.exe /play /close " & wave_file_path  ThisWorkbook.Worksheets("Sheet1").Cells(row, 4).Value = "再生済" End Sub -------------------------------------------------------------------

  • セルの先頭文字のアポストロフィーが認識されない

    Sub t() Dim s As String Range("A1").Value = "'あああ" s = Left(Range("A1").Value, 1) Debug.Print Asc(s) End Sub を実行すると、「あ」の文字コードの-32096が返ってきます。 「‘」に対する39が返ってきてほしいのですが Range("A1").Value = "''あああ" こういう状態でセルに値が入ってないと無理なのでしょうか? シングルコーテーションが1つ入ってても それを一文字として認識させたいのですがエクセルでは不可能ですか?

  • 変数の使い方の注意点なんですが・・・?

    Windows XP Home Edition Excel 2002 当方は、まだ基本がしっかり頭に入っていないので、 勝手な疑問が出てきているようでございます。 まだまだ勉強中ですが、 下記コードの場合、動作はしますが、 変数 c の使い方は間違っているのではないですか? 4は、 同プロシージャ内なので、 変数 c と r というように、区別して記述しないといけないのではないかと思って いるのですが。 3は、 プロシージャが違うので問題はないと思っております。 Dim r As Range, s As Range と記載してもいいのでしょうか?   つまり、曖昧に、ごっちゃ混ぜにしてしまうと、エラー等、PCに支障をきたすことになって しまうのではないかと心配でございます。 また、こんな記述だと、エラー等、PCに支障をきたすことになって しまうという例を 1つか2つ(又はHP等) 教えて頂けると有り難いです。 初歩的な例で結構です。 全くの初歩的な(ざっくりな)お答えで結構ですのでよろしくお願い致します。 Sub てす1() Dim r As Range, s As Range   Set s = Cells(1, 1)   s.Select  MsgBox " A1 です " End Sub '------------------------ Sub てす2() Dim r As Range, s As Range   Set s = Cells(1, 2)   s.Select  MsgBox " A2 です " End Sub '------------------------ Sub てす3() Dim r As Range, s As Range   Call てす1   Call てす2  MsgBox "  A1とA2 です " End Sub '------------------------ Sub てす4() Dim r As Range, s As Range   Set s = Cells(1, 1)   s.Select  MsgBox " A1 です "   Set s = Cells(1, 2)   s.Select  MsgBox " A2 です "  MsgBox " A1とA2 です " End Sub

専門家に質問してみよう