VBAでORを使ったファイル名の取得方法

このQ&Aのポイント
  • VBAを使用して指定したフォルダーに保存されているエクセルファイルの名前を取得する方法について教えてください。
  • ファイル名の取得条件として、AとJPから始まるファイルを取得したいと考えていますが、エラーが発生しています。
  • どのように修正すれば、指定した条件に合致したファイル名を取得することができるのでしょうか?
回答を見る
  • ベストアンサー

VBAでのORの使い方

以下のようなVBAがあります。指定したフォルダーに保存されているエクセルのファイル名を取得するものです。 ここでやりたいのは、AとJPから始まるファイルを取得したいのですがうまくいきません。これですのコンパイルエラーが出ます。 どう変更すべきかご教示願います。 Sub ファイル名取得() Const SEARCH_DIR As String = "\\SOGKF01.JP.TakataCorp.com\XXXXXXXX\YYYYY" Const SEARCH_FILE As String = "AS*.xlsm" Or Const SEARCH_FILE As String = "JP*.xlsm" Dim tmpFile As String Dim strCmd As String Dim buf() As Byte Dim FileList() As String Dim myArray() As String Dim cnt As Long, pt As Long, i As Long 続く

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.4

No3の他には以下のような感じでもいけると思います。 Sub ファイル名取得Test() Const SEARCH_DIR As String = "\\zzzz\xxxx\yyyy" Dim Serch_File() As Variant Dim tmpFile As String Dim strCmd As String Dim buf() As Byte Dim FileList() As String Dim myArray() As String Dim cnt As Long, pt As Long, i As Long Serch_File = Array("AS*.xlsm", "JP*.xlsm") 'Dirコマンドの結果を出力する一時ファイル tmpFile = Environ("TEMP") & "\Dir.tmp" For i = 0 To UBound(Serch_File) 'Dirコマンド用の文字列を編集 strCmd = "Dir """ & SEARCH_DIR & "\" & Serch_File(i) & _ """ /b/s/a:-d >> """ & tmpFile & """" 'WSHでDirコマンドを実行 ---------------(1) With CreateObject("Wscript.Shell") .Run "cmd /c" & strCmd, 7, True End With Next '該当ファイルの存在チェック If FileLen(tmpFile) < 1 Then MsgBox "該当するファイルがありません" Exit Sub End If 'Dirコマンドの結果を出力した一時ファイルを読み込み Open tmpFile For Binary As #1 ReDim buf(1 To LOF(1)) Get #1, , buf Close #1 Kill tmpFile FileList() = Split(StrConv(buf, vbUnicode), vbCrLf) 'Dirコマンドの出力件数 cnt = UBound(FileList) 'ワークシート書き出し用の配列 ---------(2) ReDim myArray(1 To cnt, 1 To 2) For i = 1 To cnt pt = InStrRev(FileList(i - 1), "\") myArray(i, 1) = Left(FileList(i - 1), pt) 'パス myArray(i, 2) = Mid(FileList(i - 1), pt + 1) 'ファイル名 Next i '配列の値をワークシートに出力 'A,B列クリアー Range("A2:B10000").Select Selection.ClearContents Range("A1").Value = "パス" Range("B1").Value = "ファイル名" Range("A2").Resize(cnt, 2).Value = myArray End Sub

ticktak
質問者

お礼

皆様どうもありがとうございました。大感謝です! 1名にしかベストアンサーを選べないのが残念です。 今後もどうぞよろしくお願いします。

その他の回答 (5)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.6

もうひとつおまけです。 CmdでDirをループするという手もあるようなので以下のようにしてもいける感じです。 Const SEARCH_FILE1 As String = "AS" Const SEARCH_FILE2 As String = "JP" strCmd = "for %x in (" & SEARCH_FILE1 & "," & SEARCH_FILE2 & ") do Dir /b/s/a:-d " & SEARCH_DIR & "\" & "%x*.xlsm >>" & tmpFile

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.5

おまけです。 strCmd = "Dir """ & SEARCH_DIR & "\" & "*.xlsm" & _ """ /b/s/a:-d > """ & tmpFile & """" にして myArray(i, 2) = Mid(FileList(i - 1), pt + 1) 'ファイル名 If myArray(i, 2) Like SEARCH_FILE1 Or myArray(i, 2) Like SEARCH_FILE2 Then セル書き込み用の配列= myArray(i, 2) End If というのもありだと思いますが、SEARCH_FILEの増減があったときに直すのが面倒そうです。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

今のコードを生かして簡単だと思える変更方法です。 Testを実行してください。 Sub Test() Const SEARCH_DIR As String = "\\zzzz\xxxx\yyyy" Const SEARCH_FILE1 As String = "AS*.xlsm" Const SEARCH_FILE2 As String = "JP*.xlsm" 'A,B列クリアー Range("A2:B10000").ClearContents Range("A1").Value = "パス" Range("B1").Value = "ファイル名" Call ファイル名取得(SEARCH_DIR, SEARCH_FILE1) Call ファイル名取得(SEARCH_DIR, SEARCH_FILE2) End Sub Sub ファイル名取得(ByVal SEARCH_DIR As String, ByVal SEARCH_FILE As String) Dim tmpFile As String Dim strCmd As String Dim buf() As Byte Dim FileList() As String Dim myArray() As String Dim cnt As Long, pt As Long, i As Long Dim LastRow As Long '追加 以下 '配列の値をワークシートに出力まで変更なしで 変更なしの部分は略 '配列の値をワークシートに出力 'ここから変更 LastRow = Cells(Rows.Count, "A").End(xlUp).Row Cells(LastRow + 1, "A").Resize(cnt, 2).Value = myArray End Sub 他の方法の場合はこちらのサイトを参考にしてください。 ファイルを検索する http://officetanaka.net/excel/vba/tips/tips36.htm フルパスをパスとファイル名に分ける http://officetanaka.net/excel/vba/tips/tips78.htm

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.2

Const SEARCH_FILE1 As String = "AS*.xlsm" Const SEARCH_FILE2 As String = "JP*.xlsm" にして(以下のFileNameは適当です) If FileName Like SEARCH_FILE1 Or FileName Like SEARCH_FILE2 Then 一致したときの処理 End If で試してみてください。

ticktak
質問者

補足

早速どうもありがとうございます。しかし無知の私には事はそんなに簡単ではありませんでした。 以下が全てのコードす。どこにどう挿入したらいいのでしょうか? Sub ファイル名取得() Const SEARCH_DIR As String = "\\zzzz\xxxx\yyyy" Const SEARCH_FILE1 As String = "AS*.xlsm" Const SEARCH_FILE2 As String = "JP*.xlsm" Dim tmpFile As String Dim strCmd As String Dim buf() As Byte Dim FileList() As String Dim myArray() As String Dim cnt As Long, pt As Long, i As Long 'Dirコマンドの結果を出力する一時ファイル tmpFile = Environ("TEMP") & "\Dir.tmp" 'Dirコマンド用の文字列を編集 strCmd = "Dir """ & SEARCH_DIR & "\" & SEARCH_FILE & _ """ /b/s/a:-d > """ & tmpFile & """" 'WSHでDirコマンドを実行 ---------------(1) With CreateObject("Wscript.Shell") .Run "cmd /c" & strCmd, 7, True End With '該当ファイルの存在チェック If FileLen(tmpFile) < 1 Then MsgBox "該当するファイルがありません" Exit Sub End If 'Dirコマンドの結果を出力した一時ファイルを読み込み Open tmpFile For Binary As #1 ReDim buf(1 To LOF(1)) Get #1, , buf Close #1 Kill tmpFile FileList() = Split(StrConv(buf, vbUnicode), vbCrLf) 'Dirコマンドの出力件数 cnt = UBound(FileList) 'ワークシート書き出し用の配列 ---------(2) ReDim myArray(1 To cnt, 1 To 2) For i = 1 To cnt pt = InStrRev(FileList(i - 1), "\") myArray(i, 1) = Left(FileList(i - 1), pt) 'パス myArray(i, 2) = Mid(FileList(i - 1), pt + 1) 'ファイル名 Next i '配列の値をワークシートに出力 'A,B列クリアー Range("A2:B10000").Select Selection.ClearContents Range("A1").Value = "パス" Range("B1").Value = "ファイル名" Range("A2").Resize(cnt, 2).Value = myArray End Sub

回答No.1

Sub ファイル名取得() Const SEARCH_DIR As String = "\\SOGKF01.JP.TakataCorp.com\XXXXXXXX\YYYYY" Const SEARCH_FILE1 As String = "A*.xlsm" Const SEARCH_FILE2 As String = "JP*.xlsm" End Sub これならOKっぽい。

関連するQ&A

  • EXCEL VBA データのある範囲の特定が悪い?  

    アンケート調査票を簡単につくために、下のようなマクロを教えていただいたのですが、もとデータ項目の参照範囲がセルのB5より上にあるもの(空白の場合も)も項目としてしまっているようなので、どこを手直しすればいいのか、すみませんが教えてください。 Sub test() '定数の設定 Const strInputSheet As String = "Sheet1" Const lngInputRow As Long = 5 Const lngInputCol As Long = 2 Const strOutputSheet As String = "Sheet2" Const lngOutputCol As Long = 3 Const lngOutputRow As Long = 4 Const strMessageA As String = " は " Const strMessageB As String = " に対してどの位影響があると思いますか?" '定義 Dim lngMaxRow As Long Dim lngCountA As Long Dim lngCountB As Long Dim strA As String Dim strB As String Dim lngRow As Long '項目数を把握 Sheets(strInputSheet).Select Cells(ActiveSheet.Rows.Count, lngInputCol).Select Selection.End(xlUp).Select lngMaxRow = Selection.Row 'B列のデータ最終行を取得 lngRow = lngOutputRow '出力開始行の設定 '項目Aをなめる For lngCountA = lngInputRow To lngMaxRow  strA = Cells(lngCountA, lngInputCol).Value '項目Aの取得  '項目Bをなめる  For lngCountB = 1 To lngMaxRow   If lngCountA <> lngCountB Then '項目Aと項目Bが同じときはここは処理しない    strB = Cells(lngCountB, lngInputCol).Value '項目Bを取得    Sheets(strOutputSheet).Cells(lngRow, lngOutputCol).Value = strA & strMessageA & strB & strMessageB '文字列を結合    lngRow = lngRow + 1 '改行する   End If  Next lngCountB Next lngCountA End Sub

  • エクセルVBA:perlで作成したexeが失敗する

    VBAプログラムで詰まってしまったので質問します。 perlにて自作したexeファイルをexcelのボタンから開きたいのですが、 実行の途中で止まってしまうようなのです。 止まってしまうexeファイルは、自分でダブルクリックして起動すると正常動作する為、 原因がわかりません。 'Declare Function ShellExecute Lib "shell32.dll" _ 'Alias "ShellExecuteA" ( _ 'ByVal hwnd As Long, _ 'ByVal lpOperation As String, _ 'ByVal lpFile As String, _ 'ByVal lpParameters As String, _ 'ByVal lpDirectory As String, _ 'ByVal nShowCmd As Long) As Long 'lRet = ShellExecute(0, "open", sPASS, vbNull, vbNull, SW_NORMAL) 'With CreateObject("Wscript.Shell") ' .Run "***********************", 5 'End With 'MsgBox "vbCrLf & CurDir & vbCrLf" 'Shell "**********************", 1 'With CreateObject("Wscript.Shell") ' .Run "..************", 5 'End With 'Dim ret As Long 'With CreateObject("Wscript.Shell") ' ret = .Run("*************", 7, True) 'End With 'If ret <> 0 Then MsgBox "失敗しました": Exit Sub 'Shell "*****************************" 'Dim WSH 'Set WSH = CreateObject("Wscript.Shell") 'WSH.Run "*************************", 3 'Set WSH = Nothing 'Dim file As Variant 'file = Application.GetOpenFilename 'file = "****************** " + file 'Shell (file) 'On Error GoTo errline 'ret = ShellExecute(0, "open", "***************", "", Path, 1) 'errline: 'Err = 0 'Dim ファイルのあるフォルダ As String 'Dim ファイルの名前 As String 'Dim プログラムのパス As String 'Dim 拡張子 As String 'ファイルのあるフォルダ = Worksheets("Sheet1").Cells(1, 1) 'ファイルの名前 = Worksheets("Sheet1").Cells(2, 1) 'プログラムのパス = Worksheets("Sheet1").Cells(3, 1) '拡張子 = Worksheets("Sheet1").Cells(4, 1) 'Dim ファイルのパス As String 'ファイルのパス = ファイルのあるフォルダ & "\" & ファイルの名前 & "." & 拡張子 'Dim AppFp As String 'AppFp = プログラムのパス & " """ & ファイルのパス & """" '前の""はスペース空ける '「"」が特殊文字であるため、スキップするための文字(エスケープ文字)「"」を前につける 'Dim a As Integer 'a = Shell(AppFp, vbNormalFocus) '上記プログラム全部× Const vbHide = 0 'ウィンドウを非表示 Const vbNormalFocus = 1 '通常のウィンドウ、かつ最前面のウィンドウ Const vbMinimizedFocus = 2 '最小化、かつ最前面のウィンドウ Const vbMaximizedFocus = 3 '最大化、かつ最前面のウィンドウ Const vbNormalNoFocus = 4 '通常のウィンドウ、ただし、最前面にはならない Const vbMinimizedNoFocus = 6 '最小化、ただし、最前面にはならない 'Dim objWShell 'Set objWShell = CreateObject("WScript.Shell") 'できたが×途中で終了している模様 'フォルダ「C:\happy」を開きます 'objWShell.Run "rundll32.exe url.dll" & _ ' ",**************", vbNormalFocus, False 'WScript.Echo "**********を実行しました!" 'Set objWShell = Nothing どうにかVBAから起動したいのですが、方法は無いでしょうか??

  • エクセルVBAでのエラー

    おはようございます。 昨日ここでいろいろ教えていただき、300のエクセルファイルから特定の範囲のデータ抽出方法を書いてみたのですが、セルが多すぎて実行できません、というエラーがでてしまいます。 これはどのように解消すればよろしいのでしょうか? Sub Test() Dim FPath1 As String, FPath2 As String Dim FName As String, myBook As String Const startROW As Long = 14, lastROW As Long = 20 Const startCOL As Long = 8, lastCOL As Long = 10 Const shtNAME As String = "sheet1" Application.ScreenUpdating = False FPath1 = "D:\MR5567\" FPath2 = "D:\New Microsoft Excel Worksheet\" Workbooks.Add myBook = ActiveWorkbook.Name FName = Dir$(FPath1 & "*.xls") Do While FName <> "" Workbooks.Open Filename:=FPath1 & FName ActiveWorkbook.Sheets.Select Sheets(1).Activate Sheets.Copy After:=Workbooks(myBook).Sheets(Sheets.Count) Workbooks(FName).Activate Application.DisplayAlerts = False ActiveWorkbook.Close FName = Dir$ Loop ActiveWorkbook.SaveAs Filename:=FPath2 & "Renketsu.xls", FileFormat:=xlNormal ActiveWorkbook.Close Application.ScreenUpdating = True End Sub

  • 【VBA】 ファイル名の取得

    23歳OLです。 会社でマクロを組んでいるのですが、 できないところがあったのでご相談させてください。 ▼やりたいこと ================================================ ・フォルダを自分で指定して、選択したファイルの名前をシートに書き込む 1.txt 2.log 3.xls とフォルダに入っていたら 1.txt 2.log 3.xls とシートに名前を書き込んでほしいです。 ・ファイルの種類はいろいろある。(txt.logなど) ================================================ ▼現在書いてみたコード ======================== Sub Sample1() Dim buf As String, cnt As Long Const Path As String = "" buf = Dir(Path & "*.*") Do While buf <> "" cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Loop End Sub ======================== これだと、初めから指定したフォルダしか取得することができないらしいです。 そもそもConst Path As String = "このぶぶん" このぶぶんにフォルダを指定しても動きませんでした。? どこが原因なのでしょうか? ご教示お願いします。

  • VBAのwav操作ついて!!

    エクセルのVBAでプログラムを作っているのですが、wavを操作することに関してわからないことがあります。 (general)に -------------------------------------------------------- Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long Private Const FILE001_NAME As String = "C:\001.wav" Private Const FILE002_NAME As String = "C:\002.wav" ・・・ ------------------------------------------------------- というのを入れていまして、音を出したいところで Call mciSendString("play """ & FILE○_NAME & """", "", 0, 0) という方式でwavを再生させようと思っています。 ここで、FILEのあとをワークシート1上のA1セル上の数字に変えたいと思います。つまり、A1セル内の数(乱数で1~100のいずれかを表示させています)を○のところに入れるにはどうすればいいでしょうか? どなたかおわかりになる方、教えてください。お願いいたします。

  • (VBA)RegDeleteKeyがエラー

    RegDeleteKeyについて教えてください ○削除するレジストリHKEY_LOCAL_MACHINE\SOFTWARE\XTSEGRSCESK\AAA ○ソース Public Const HKEY_LOCAL_MACHINE = &H80000002 Dim lRootKey As Long Dim sSubKey As String Dim lRet As Long lRootKey = HKEY_LOCAL_MACHINE sSubKey = "SOFTWARE\XTSEGRSCESK\AAA" lRet = RegDeleteKey(lRootKey, sSubKey) ○結果 RegDeleteKeyの戻り値が2 どこが悪いか教えてください お願いします

  • VBAでCSVファイルを読み込もうとしていますが、

    VBAでCSVファイルを読み込もうとしていますが、 「ファイルが見つかりません」とエラーが表示されます。 どのように対処していいのかわかりません。 教えてくください。 Sub readCsv() Dim csvFile As String Dim ch As Integer Dim csvStr As String Dim str() As String Dim i As Integer Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "フォルダ選択", 1) targetFolder = oFolder.Items.Item.Path Set fso = CreateObject("Scripting.FileSystemObject") Set fileList = fso.GetFolder(targetFolder).Files For Each file In fileList csvFile = file.Name ch = FreeFile Open csvFile For Input As #ch i = 1 Do While Not EOF(1) Line Input #ch, csvStr Close #ch str = Split(csvStr, ",") Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str i = i + 1 Loop Next End Sub

  • フォルダ内にあるファイル名を取得するVBA

    エクセル2010を使用しています。 VBA(マクロ)で以下の作業を実行したいと考えていますが、 初心者につき、ご教示いただけますでしょうか。 「マクロ」ファイルにある「実行」Sheetというにある「実行」ボタンで L2に入力したパス内にあるファイル(.xlsや.xlsmや.xlsbが混在しますが、基本的には全てエクセルファイル)のファイル名を K8から下へ取得したいのですが・・ 参考にしたコードでは うまく動作しませんでした。 以下では、L2のパスを参照するのも組めていないため、コード内に直接パスを書き込んでいますが 実際は、パスを変動させて使いたいので、L2を参照できるようになると助かります。 ※パスは、質問用に仮置きで「パス」としています。 Sub Sample() Dim buf As String, cnt As Long Const Path As String = "パス" buf = Dir(Path & "*.*") Do While buf <> "" cnt = cnt + 8 Cells(cnt, 11) = buf buf = Dir() Loop End Sub また、このコードでは 実行ファイル自体のファイル名も取得してしまうようなので、 実行ファイル以外のファイル名を取得したいです。 ご指導のほど、よろしくお願い致します。

  • excelのVBAでアドバイスお願いします

    excel2000を利用しています。 ■状況 ・「実験フォルダ」という名前のフォルダがあります ・「実験フォルダ」の中に「差し込み表示.xls」という名前のファイルがあります ・「実験フォルダ」の中に「実験データ.xls」という名前のファイルがあります。 ■やりたいこと ・「実験データ.xls」のファイルデータを参照して、「差し込み表示.xls」のファイルにデータを表示させたい。 ・検索するキーは日付(「実験データはB列、差し込み表示はE5セル」です。 ■状況 自分で作ったコードだと値がみつかりません、となって、うまくデータを転記して表示してくれません。 ■お願いしたいこと コードの修正アドバイス、もしくは、他にもっといいプログラムがあるなどのアドバイスがあればいただけるとありがたいです。 ■うまくいかないコード Option Explicit Sub datatyuusyutu() On Error Resume Next Const sashikomiDisplay As String = "差し込み表示.xls" Const dataFile As String = "実験データ.xls" Dim i As Long Dim j As Long Dim k As Long Dim objectionrow As Long Dim lastRow As Long Dim targetDate As String Dim targetTime As String Dim data(1 To 43) As Double Dim dataFindFlag As Boolean Dim 対象フォルダ As String '検索する年月日を取得 targetDate = Range("E5").Value MsgBox targetDate 対象フォルダ = ThisWorkbook.Path & "\" Workbooks.Open 対象フォルダ & dataFile lastRow = Cells(Rows.Count, "B").End(xlUp).Row 'B列の最終行を得る MsgBox lastRow '年月日で検索 For i = 2 To lastRow If Cells(i, 2) = targetDate Then Cells(i, 2).Select dataFindFlag = True For k = 1 To 43 data(k) = Cells(i - 1, k) Next k Exit For End If Exit For Next i Windows(sashikomiDisplay).Activate With Workbooks("実験データ.xls") If dataFindFlag = True Then Cells(1, 2) = data(1) Cells(12, 3) = data(4) Cells(14, 6) = data(5) MsgBox "実行しました" Else MsgBox "データがありません" End If End With Workbooks(dataFile).Close savechanges:=False End Sub

  • VBAでPDFをテキスト出力する時のエラー

    PDFをテキスト出力するVBA実行時、Acrobatから「ファイルを開けません」とエラーメッセージが表示されます。何のファイルなのかわからないので教えてください。 下記VBAで、最終行の「objJs.SaveAs txtFilePath, "com.adobe.acrobat.plain-text"」でPDFは読み込まれて画面表示されますが、同時に「ファイルを開けません」というメッセージが表示されます。PDFは正常に読み込まれていると思われるので、ほかに何が必要なのか教えてください。 AcrobatとMicrosoftScriptingRuntimeは組み込んでいます。 -------------------------------------------- 'PDFのデータをExcelに読み込むメイン処理 Sub Main() 'PDFファイルをテキストに変換するための定数を用意 Const fileName = "テストファイル" Const folderPath = "C:\Data\" Const pdfFilePath = folderPath & fileName & ".pdf" Const txtFilePath = folderPath & fileName & ".txt" 'PDFファイルをテキストに変換 Call convPDFtoText(fileName, folderPath, pdfFilePath, txtFilePath) End Sub 'PDFファイルをテキスト変換する処理 Sub convPDFtoText(fileName As String, folderPath As String, pdfFilePath As String, txtFilePath As String) 'Acrobat操作用の変数を宣言 Dim objAcrobatApp As New Acrobat.AcroApp Dim objAcrobatAVDoc As New Acrobat.AcroAVDoc Dim objAcrobatPDDoc As Acrobat.AcroPDDoc Dim AcrobatId As Long Dim objJs As Object 'Acrobatアプリを起動 AcrobatId = objAcrobatApp.Show 'PDFファイルを開く AcrobatId = objAcrobatAVDoc.Open(pdfFilePath, "") 'PDDocオブジェクトを取得 Set objAcrobatPDDoc = objAcrobatAVDoc.GetPDDoc() 'Acrobat JavaScriptオブジェクトを作成 Set objJs = objAcrobatPDDoc.GetJSObject 'PDFをテキストで保存 objJs.SaveAs txtFilePath, "com.adobe.acrobat.plain-text"

専門家に質問してみよう