• ベストアンサー

(Excel)VBA ファイルパスからファイル名を求める

Excel97のVBAで  f-name = Application.GetOpenFilename() とするとf-nameにはオープンしたファイルのパスを含めたファイル名が代入されます。 これをそのまま  Workbooks(f-name).close とすると、パス部分が余分なのかエラーになります。 そこで、このf-nameからファイル名(ブック名)だけ切り出す方法があれば教えてください。 もしくはこのオープンからクローズまでの流れとして良いやり方があれば教えてください。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

Excel97の場合は、最後の『\』を探しにいく必要があると思います。下記は処理例です。 キャンセルした時のf-nameは別途処理してください。 Public Function myFileName(flName As String)   Dim L As Integer   For L = Len(flName) To 1 Step -1     If Mid(flName, L, 1) = "\" Then       myFileName = Right(flName, Len(flName) - L)       Exit For     End If   Next End Function

smatsuz
質問者

お礼

回答ありがとうございます。 ばっちり動きました。 元々UNIX屋なので(マクロの様に用意されていて)もっと簡単にできるかと思っていました。

その他の回答 (2)

  • wtnb_h
  • ベストアンサー率35% (14/40)
回答No.3

EXCEL2000でですが、GetOpenFilenameの後に、 Dim ファイル名 As String ファイル名 = Dir(CurDir() & "\*.*") とすると、選んだファイル名のみ、ファイル名に格納されました。 EXCEL97で出来るか判りませんが、試してみてはいかがでしょうか?

smatsuz
質問者

お礼

回答ありがとうございます。 残念ながらExcel97ではうまく行きませんでした。 でもなんとなくDir()とCurDir()の組み合わせでGetOpenFilename()の選択ファイルが認識できるとは思えないんですが......

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 以下の関数を作成しました。 参考になりますか。 では。 ' フルパスからファイル名を取り出す Public Function MakeFileName(fileName As String) As String   Dim z0 As Long   z0 = InStrRev(fileName, "\")   If z0 <> 0 Then     MakeFileName = Mid(fileName, z0 + 1)   Else     MakeFileName = fileName   End If End Function

smatsuz
質問者

お礼

回答ありがとうございます。 残念ながらInStrRev()がundefineになってしまします。 私の環境がおかしいか、Excel97にはないのかもしれませんね。

関連するQ&A

  • Excel2007VBAファイルの表示について

    ●質問の主旨 開いたダイアロボックス内のファイルについてエクセルファイル(.xlsxのみ)を 対象としたいと考えています。 下記コードをどのように書き換えればよいでしょうか? ご存知の方ご教示願います。私はVBA初心者です ●質問の補足 作成した下記のコードでは 「実行時エラー1004:GetOpenFilenameメソッドに失敗しました」 と表示されます。 参考書2冊読んで全くその通りに引用していて、なぜエラー表示に なるのかよく分かりません。 またTarget = Application.GetOpenFilename("Excelブック,*,xlsx")を Target = Application.GetOpenFilename()にするとダイアロボックスは 表示され、その中にあるエクセルファイルは表示されます。 ●コード Sub Sample3() Dim Target As String Target = Application.GetOpenFilename("Excelブック,*,xlsx") If Target <> "False" Then Workbooks.Open Target Else MsgBox "キャンセルされました" End If End Sub

  • WorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】

    よろしくお願いします。 今あるブックにあるシートを別のブックにコピーしたいのですが、今考えているのは ここから//////// 'ブックを開く Workbooks.Open コピー元のブックのパス 'シートをコピー Worksheets.Item(コピーするシート名).Copy _ after:=Workbooks(コピー先のブック名).Sheets(1) 'ブックを閉じる Application.DisplayAlerts = False Workbooks.Item(コピー元のブック名)Close True Application.DisplayAlerts = True ここまで//// なのですが、コピーものとのブックが複数ある時、画面がチラチラしてしまいます。ブックをオープンさせずにシートを他ブックにコピーさせる方法ってないでしょうか。 ご存知の方がいらっしゃいましたら、ご教授お願いします。

  • VBAに関して

    VBA初心者のものです。あるプログラムを作成するために後で簡単に呼び出すことができるよう、始めにいくつかのブックのパス名をべつのものに置き換えたいのですが、例えば Dim i As Integer, v As Integer i = Application.InputBox("コピーしたいファイル数を記入してください", Type:=1) For v = 1 To i Dim wb(v) As Workbook OpenFilename = Application.GetOpenFilename("Microsoft Excelブック,*.xls") Workbooks.Open fileName:=OpenFilename Set wb(v) = ActiveWorkbook wb(v).Close Next v こんな風に書くとwb()が配列なのでエラーになってしまいます。分かりにくい説明ですが、何か良い方法はないでしょうか?

  • vbaについて勉強中です

    以下の構文を実行しました。 結果、Bファイルにはsheet(仮)が挿入されましたがAファイルのsheet1がコピーされません。 どこがどのように間違っているのかわかりません。 どなたかご教授ください。 Sub コピー() Dim sc '貼り付け先ファイルのシート数 Dim scn '貼り付け先ファイルのシート名 Dim F_T '貼り付け先ファイル名 Dim F_0 'コヒー元ファイル名 Dim cc 'コピー元のシート数 Dim ccn 'コピー元のシート名 On Error GoTo ed 'エラーの場合の処理 F_T = Application _ .GetOpenFilename("エクセルファイル(C:\Users\***\Desktop\B\B.xlsx),C:\Users\***\Desktop\B\B.xlsx", _ , "貼り付け先ファイルを開く") If F_T = False Then GoTo ed Workbooks.Open F_T F_T = ActiveWorkbook.Name sc = Workbooks(F_T).Sheets.Count '作業用の仮シートの追加 ActiveWorkbook.Sheets.Add After:=Worksheets(sc) ActiveSheet.Name = "仮" F_0 = Application _ .GetOpenFilename("エクセルファイル(C:\Users\***\Desktop\A\A.xlsm),C:\Users\***\Desktop\A\A.xlsm", _ , "コピー元ファイルを開く") If F_0 = False Then GoTo ed Workbooks.Open F_0 F_0 = ActiveWorkbook.Name cc = Workbooks(F_0).Sheets.Count 'このブックのシート名のすべてを繰り返し For f = sc To 1 Step -1 scn = Workbooks(F_T).Sheets(f).Name 'コピー元のブックのシート名を繰り返し For T = 1 To cc ccn = Workbooks(F_0).Sheets(T).Name 'もし、シート名が同じなら If scn = ccn And Workbooks(F_T).Sheets.Count > 1 Then 'シートの削除 Application.DisplayAlerts = False Workbooks(F_T).Worksheets(ccn).Delete Application.DisplayAlerts = True Else End If Next T Next f 'コピー元のブックのシート名を繰り返し For T = cc To 1 Step -1 ccn = Workbooks(F_0).Sheets(T).Name 'シートのコピー Workbooks(F_0).Worksheets(ccn).Copy _ Before:=Workbooks(F_T).Worksheets(1) Next T '作業用の仮シートの削除 Application.DisplayAlerts = False Workbooks(F_T).Worksheets("仮").Delete Application.DisplayAlerts = True Workbooks(F_0).Close SaveChanges:=False Exit Sub ed: MsgBox "エラーが発生したため、処理を取り消しました" End Sub

  • VBAでのファイルの開き方について

    いつもお世話になっております。(エクセル2010を使用) エクセルVBAを学習中の者です。 ダイアログボックスを表示してファイルを開く・・・というコードを記述しているのですが、分からない点があるためご指導をお願いします。 Sub Sample1() Dim openFileName As String openFileName = Application.GetOpenFilename filefilter:="Microsoft Excelブック,*.xls?" Workbooks.Open Filename:=openFileName End Sub を実行するとコンパイルエラーの構文エラーが表示されます。 Sub Sample2() Dim openFileName As String openFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") Workbooks.Open Filename:=openFileName End Sub を実行すると正常に動作します。 私の現在の知識ではSample1も正常に動作するはずなんですが・・・ (※コードはVBEをコピペしています) 両者の違いはなんでしょうか?(※スペルの間違いは無いとは思いますが・・・) どうぞよろしくお願いいたします。

  • VBAでファイルOPEN ダイアログを使用したいです

    現在、指定したファイルを開くVBAを書いているのですが、 ↓こんなの ----------------------------------------------------------- Dim vntFileName As Variant 'ファイルを開くダイアログを開きます vntFileName = _ Application.GetOpenFilename( _ FileFilter:="エクセルファイル(*.xls),*.xls" & _ ",CSVファイル(*.csv),*.csv" _ , FilterIndex:=1 _ , Title:="開けゴマ" _ , MultiSelect:=False _ ) 'ファイルが選択されているときは '選択したファイルをWorkbooks.Openメソッドで開きます If vntFileName <> False Then Workbooks.Open Filename:=vntFileName End If ---------------------------------------------------------------- あらかじめ開くディレクトリを、ネットワーク上のフォルダに指定したいのですが、どこにパスを書いたらいいのか、わかりません。 教えていただけますでしょうか。

  • VBAでエクセルからエクセルのファイルを開くには?

    D:\に db1.mdb Book1.xls があります。 db1.mdbのフォームのコマンドボタンをクリックして Book1.xlsを開きたいのですが VBAコードをご教授いただけますか? (マクロではなくVBAコードが知りたいです) エクセルからエクセルのファイルを開くなら Workbooks.Open ファイルのフルパス で出来ました。 ご回答よろしくお願いします。

  • EXCEL VBA のブック操作

    完全に自己流でEXCEL2000のVBAを作成しています。 とても単純な操作なのですが、思い通り動きません。 どうかご教授ください。 よろしくお願いします。 Main ファイルとSubファイルがあります。【パス名とファイル名は指定済み】 ブック内のシートの構成は全く同じになっています。 (MainファイルのVBAを実行後Subファイルが作成されます ファイル名は作成日を入れて保存していっています。) それで以前作成したデータを利用するために、 MainファイルのVBAを実行中にSubファイルを開き参照したいシートを Mainファイルにコピーし、Subファイルを閉じたいのですが フォーカスがうまくいかず、Mainファイルが閉じてしまいます。 何がおかしいのでしょうか? Workbooks.Open Filename:=SubFile Sheets("Sheet1").Select Worksheets("Sheet1").Name = "ASheet" Sheets("ASheet").Copy After:=Workbooks(MainFile).Sheets(TotalSheet) Workbooks(SubFile).Activate ActiveWorkbook.Close Workbooks(MainFile).Activate Sheets(TsumSheet).Select オープンしてコピーまではできているのですが・・・

  • 【VBA】ファイルを開く→シートをコピー→保存

    VBAを使って、複数ファイルを一気に編集したいです。 あるフォルダ内に、複数のエクセルブックと VBAを登録したブックが入っています。 VBAの内容としては、 (1)フォルダ内のエクセルファイルをすべて開く (2)各ファイル1ページ目のシートを複製(コピー)する (3)上書き保存して閉じる (4)VBAを登録したブックを閉じる です。 下記のように書いてみたのですが、まったく動かないので どこが間違っているかのアドバイスをいただければと思います。 ----------------------------------------------------- Sub test() Dim Myfile, Filepath As String Filepath = ThisWorkbook.Path 'フォルダ名取得 Myfile = Dir(Filepath & "\") 'フォルダ内のファイル名取得 Do While Myfile <> "" Workbooks.Open Filename:=Filepath & "\" & Myfile Workbooks(Myfile).Activate Sheets(1).Select Sheets(1).Copy after:=Sheets(1) Workbooks(Myfile).Close SaveChanges:=True Myfile = Dir() Loop ThisWorkbook.Close SaveChanges:=True End Sub ----------------------------------------------------- よろしくお願いいたします。

  • VBA for Excel でファイルを条件付きで開く

    VBA for Excel で、開いているか開いていないか判らないファイルを開きたいと思い(ファイルは2つ、名前はGRT と GTATNO という変数に入っている)、下記のように書いてみましたが、Excel2000 ではエラーが起きるようです。 Sub ファイルを開く Dim hbook As Workbook AP = ActiveWorkbook.Path 'ファイルが開いていたら何もしない For Each hbook In Workbooks If hbook.Name <> GRT Then Workbooks.Open (AP & "\" & GRT) End If If hbook.Name <> GTANTO Then Workbooks.Open (AP & "\" & GTANTO) End If Next End Sub 原因は、そのときゲットした開いているファイル名(hbook.Name)がたまたま一致しないときにファイルを開こうとしてしまう、ということは判りました。 こうなると「2重に開こうとしている。開いて良いか?」のメッセージが表示され、それにNoと答えるとマクロがエラーを表示し、利用者は困ってしまうのですが、 どうしたらうまく動くマクロになるのかがわからず、悩んでいます。 ほとんど「組んでちょーだい」状態ですが、よろしくお願いいたしますm(_ _)m また職場でネットしているため、解答いただいた時間によってはお礼が8日(月)になってしまいますことを、予めお断りしお詫びしておきます。

専門家に質問してみよう