一致したファイル名を先頭に抽出させる方法

このQ&Aのポイント
  • 指定の商品番号と同じ商品番号の名前になっているサブフォルダ名のファイル名をK列以降に抽出するvbaプログラムです。
  • ファイル名の順番に関係なく、同じ名前のファイルがあった場合は先頭の列に抽出されるようにしたいです。
  • 具体的な例として、商品番号が123で、サブフォルダ名が123であるとし、ファイル名が001.jpg, 002.jpg, 003.jpg, 123.jpgの不規則な順番のファイルがある場合、123.jpgを先頭に抽出したいです。
回答を見る
  • ベストアンサー

一致したファイル名を先頭に抽出させる方法

Sub Sample() sPath = "C:\Users\Owner\Downloads\base\setting_000002016\" nRow = 2 sSubFol = Cells(nRow, 1).Text Do While sSubFol <> "" nCol = 11 sFileName = Dir(sPath & sSubFol & "\*.jpg") Do While sFileName <> "" Cells(nRow, nCol) = sFileName sFileName = Dir() nCol = nCol + 1 Loop nRow = nRow + 1 sSubFol = Cells(nRow, 1).Text Loop End Sub こちらは、指定の商品番号と同じ商品番号の名前になっているサブフォルダ名のファイル名をK列以降に抽出するというvbaでつくられたプログラムです。 実際の例で説明いたします。 商品番号が123、サブフォルダ名123だとして、 ファイル名が001.jpg,002.jpg.003.jpg,123.jpgという不規則なファイル名があったとします。 上記のプログラムはファイル名の順番問わず K列から順番に001.jpg,002.jpg.003.jpg,123.jpgに抽出されるようになっております。 しかし、仮名のファイルですが、123.jpgというファイル名が最初の列に抽出されたほうがこちらとしましても都合がいいので、同じ名前のファイルがあったら先頭に抽出できるようにしたいのですがどのようにしたらよろしいでしょうか?

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

>こちらはどのような処理をしているのでしょうか? 大きな変更箇所は貴方が提示されたコードに下記を加えたぐらいですね サブフォルダーにサブフォルダー名.jpg ファイルの有無を確認します If objFSO.FileExists(sPath & sSubFol & "\" & sSubFol & ".jpg") Then   有れば転記する列を12列から始めます。(11列にはsSubFol & ".jpg"を入れます)   nCol = 12 Else   sSubFol & ".jpg"が無いので転記する列を11列から始めます   nCol = 11 End If 以上のことを踏まえてステップインで実行して変数の変化などを観察しながら 行うと勉強になりますよ

saya100111
質問者

お礼

ご回答ありがとうございます。

その他の回答 (3)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

NO1です。 >商品番号が123、サブフォルダ名123だとして、 勘違いしていました。 サブフォルダ名と同じ商品番号が有れば先頭に表示するのですね Sub Test2()   Dim objFSO As Object   Dim sPath As String, sSubFol As String, sFileName As String   Dim nRow As Long, nCol As Long   Set objFSO = CreateObject("Scripting.FileSystemObject")   sPath = "C:\Users\Owner\Downloads\base\setting_000002016\"   nRow = 2   sSubFol = Cells(nRow, 1).Text   Do While sSubFol <> ""     nCol = 11     sFileName = Dir(sPath & sSubFol & "\*.jpg")     If objFSO.FileExists(sPath & sSubFol & "\" & sSubFol & ".jpg") Then       nCol = 12     Else       nCol = 11     End If     Do While sFileName <> ""       If sFileName = sSubFol & ".jpg" Then         Cells(nRow, 11) = sFileName       Else         Cells(nRow, nCol) = sFileName         nCol = nCol + 1       End If       sFileName = Dir()     Loop     nRow = nRow + 1     sSubFol = Cells(nRow, 1).Text   Loop   Set objFSO = Nothing End Sub

saya100111
質問者

お礼

ご回答ありがとうございます。

saya100111
質問者

補足

こちらはどのような処理をしているのでしょうか? 勉強のため詳しく教えていただけないでしょうか?

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.2

こんなコードはいかがでしょうか。 Sub Sample()    Dim sPath As String  Dim nRow As Integer  Dim nCol As Integer  Dim sFileName As String  Dim sSubFol As String  Dim FSO As Object    sPath = "C:\Users\Owner\Downloads\base\setting_000002016\"  nRow = 2  sSubFol = Cells(nRow, 1).Text  Set FSO = CreateObject("Scripting.FileSystemObject")    Do While sSubFol <> ""      nCol = 11   sFileName = Dir(sPath & sSubFol & "\*.jpg")      Do While sFileName <> ""    If FSO.GetBaseName(sFileName) = sSubFol Then     Cells(nRow, nCol) = sFileName     nCol = nCol + 1    End If    sFileName = Dir()   Loop      sFileName = Dir(sPath & sSubFol & "\*.jpg")   Do While sFileName <> ""    If FSO.GetBaseName(sFileName) <> sSubFol Then     Cells(nRow, nCol) = sFileName     nCol = nCol + 1    End If    sFileName = Dir()   Loop   nRow = nRow + 1      sSubFol = Cells(nRow, 1).Text     Loop      Set FSO = Nothing End Sub

saya100111
質問者

お礼

ご回答ありがとうございます。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

参考に Sub Test()   Dim objFSO As Object   Dim sPath As String, sSubFol As String, sFileName As String   Dim nRow As Long, nCol As Long   Set objFSO = CreateObject("Scripting.FileSystemObject")   sPath = "C:\Users\Owner\Downloads\base\setting_000002016\"   nRow = 2   sSubFol = Cells(nRow, 1).Text   Do While sSubFol <> ""     nCol = 11     sFileName = Dir(sPath & sSubFol & "\*.jpg")     If objFSO.FileExists(sPath & sSubFol & "\123.jpg") Then       nCol = 12     Else       nCol = 11     End If     Do While sFileName <> ""       If sFileName = "123.jpg" Then         Cells(nRow, 11) = sFileName       Else         Cells(nRow, nCol) = sFileName         nCol = nCol + 1       End If       sFileName = Dir()     Loop     nRow = nRow + 1     sSubFol = Cells(nRow, 1).Text   Loop End Sub

saya100111
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

  • 画像ファイル名抽出マクロが機能しない

    mt2015様 以前 https://okwave.jp/qa/q9432826.html で質問させていただいたものです。 当時に作っていただいた Sub Sample()   sPath = "C:\Users\Owner\Downloads\通販素材\tsuhan_jp_5028_2018-02-26\setting_000002016\"   nRow = 2   sSubFol = Cells(nRow, 1).Text   Do While sSubFol <> ""     nCol = 10     sFileName = Dir(sPath & sSubFol & "\*.jpg")     Do While sFileName <> ""       Cells(nRow, nCol) = sFileName       sFileName = Dir()       nCol = nCol + 1     Loop     nRow = nRow + 1     sSubFol = Cells(nRow, 1).Text   Loop End Sub のマクロが当時は問題なく動いていたのですが、急にファイル名が抽出されなくなったのですが、どのような原因が考えられますでしょうか?

  • 画像ファイル名をパス付きで表示

    Sub Test2() Dim objFSO As Object Dim sPath As String, sSubFol As String, sFileName As String Dim nRow As Long, nCol As Long Set objFSO = CreateObject("Scripting.FileSystemObject") sPath = "C:\Users\Owner\Downloads\base\setting_000002016\" nRow = 2 sSubFol = Cells(nRow, 1).Text Do While sSubFol <> "" nCol = 11 sFileName = Dir(sPath & sSubFol & "\*.jpg") If objFSO.FileExists(sPath & sSubFol & "\" & sSubFol & ".jpg") Then nCol = 12 Else nCol = 11 End If Do While sFileName <> "" If sFileName = sSubFol & ".jpg" Then Cells(nRow, 11) = sFileName Else Cells(nRow, nCol) = sFileName nCol = nCol + 1 End If sFileName = Dir() Loop nRow = nRow + 1 sSubFol = Cells(nRow, 1).Text Loop Set objFSO = Nothing End Sub こちらは商品番号とサブフォルダの名前が一致したらフォルダ内のファイル名を抽出するというマクロですが、これをパス付で表示という動作をするにはどこをいじればよろしいでしょうか?

  • マクロ IF条件分岐 疑問

    マクロ初心者です。いろいろ参考に以下のマクロを作ってみたのですが、最初、私はnBold >0になると思いましたが、nBold < 0が正解のようですね。どうして0以下というふうにするのですか? Sub AからF列に太字あればJ列に◎() For nRow = 1 To 7 nBold = 0 For nCol = 1 To 6 nBold = nBold + Cells(nRow, nCol).DisplayFormat.Font.bold Next nCol If nBold < 0 Then Cells(nRow, 7) = "◎" Else Cells(nRow, 7) = "" End If Next nRow End Sub

  • 複数のサブフォルダー内のファイル名を抽出したい

    分かりやすく完成形のイメージをキャプチャーしたのでご覧ください。 ネットショップで商品を一括登録する際に添付画像のように J~N列に画像ファイル名を記載する必要がございます。 キャプチャー画像では一つのアイテム番号を例にしておりますが、この番号がサブフォルダー名になっており C:\Users\Owner\Downloads\通販素材\tsuhan_jp_5028_2018-02-26\setting_000002016 に保存されております。 実際に説明いたします。 アイテム番号111621のファイル名がもし111621.jpg,111621-1.jpg,111621-2.jpg であればエクセルの関数でも対応できるのですが、 000033340_0001.jpg、000033340_0002.jpg、000033340_0003.jpgのように不規則になっているので、このような場合の画像ファイル名を抽出させるにはどのようにすればよろしいでしょうか?

  • ファイル名が8文字のものを抽出したい。

    ファイル名が8文字(拡張子を含めると12文字)のものを抽出しようと思い、 Dir ????????.jpg /S としたら、8文字以下のものも抽出されました。 ジャスト8文字のものを抽出するいい方法はありますか。 方法はコマンドプロンプトでなくてもいいです。(コマンドプロンプト以外に文字数の指定方法を知らないから使っただけ) サブフォルダも抽出したいです。 最終的には、いるものだけバックアップを取って、消したいです。(8文字以外のものは消えたら困る) 消す方法もお願いします。 なお、プログラムが必要ならいりません。手作業の方が早いと思われるので。

  • DIR関数を使ったファイル名の取得

    おはようございます。 txtファイル名とdocファイル名を取得したく、以下のコードを作成してみました。 DIR関数を使って、ファイルリストボックスのPatternプロバディのように、複数の形式のファイル名を同時に取得する方法はあるのでしょうか? 是非、教えてください。よろしくお願いします。 ----------------------------- Private Sub Form_Load() Dim MyName MyName = Dir("C:\My Documents\*.txt") Do While MyName <> "" MsgBox MyName MyName = Dir Loop MyName = Dir("C:\My Documents\*.doc") Do While MyName <> "" MsgBox MyName MyName = Dir Loop End End Sub -------------------------------------

  • csv内にサブフォルダー内のファイル名を抽出する方

    csvのA列にアイテム番号が記載されております。 また、とあるフォルダーにアイテム番号になった名前のサブフォルダーが複数ございます。 しかし、フォルダ内の画像ファイル名が不規則となっているので、アイテム番号とサブフォルダ名が一致したらb列以降に抽出したいのですが、どのようにしたらよろしいでしょうか?

  • 実行時エラー 5 ファイル名の書き出し

    これはどういう意味のエラーなのでしょう? Const FolderName As String = "C:\Users" Sub ファイル名を書き出す() Dim myFile As String myFile = Dir(FolderName & "\*.*", vbDirectory) Do While myFile <> "" Debug.Print myFile myFile = Dir Loop End Sub このようにしてフォルダの中のファイル名を書き出していますが ある特定のファイル名になると、myFile = Dirの部分で、 実行時エラー 5 プロシージャーの呼び出し、または引数が不正 が発生します。 ファイル名をただ読み込んでるだけなのに、どうしてエラーが発生するのでしょうか?

  • マクロ IF分岐 結果がうまく表示されない

    I列J列、M列N列、Q列R列の、それぞれ2列ともに水色と紫色のフォントが両方あったら、U、V、W列に、う、キ、ち、とそれぞれ入力する、というマクロを作ってみたのですが、入力結果が指定した列に表示されません。添付のように「キ」がU列にきたり、「ち」がU列にきたりしています。何をどうすればいいでしょうか? Sub test() ' For nRow = 7 To 233 If Cells(nRow, 9).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 10).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 21) = "う" ElseIf Cells(nRow, 10).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 9).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 21) = "う" Else Cells(nRow, 21) = "" End If Next nRow For nRow = 7 To 233 If Cells(nRow, 13).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 14).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 21) = "キ" ElseIf Cells(nRow, 14).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 13).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 22) = "キ" Else Cells(nRow, 22) = "" End If Next nRow For nRow = 7 To 233 If Cells(nRow, 17).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 18).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 21) = "ち" ElseIf Cells(nRow, 18).DisplayFormat.Font.ColorIndex = 33 And Cells(nRow, 17).DisplayFormat.Font.ColorIndex = 47 Then Cells(nRow, 23) = "ち" Else Cells(nRow, 23) = "" End If Next nRow End Sub

  • EXCELで一致する文字列を抽出する方法

    EXCELに関する質問です。 ファイル1に売上デ-タがあります。    A    B   C   D 1 商品名 品番 単価 個数 2  あ    A1  100   3 3  い    A2  110   10 4  う    A3   120   5 5  は    A4  130   3 6  ひ    A5  140   7 7  ふ    A6  150   11 8  へ    A7  160   6 9  ほ    A8  170   3 ファイル2に特定の商品名のリストがあります。   A    B   C 1 商品名 2  い 3  ろ 4  は 5  に 6  ほ 7  へ 8  と 9  ち 10  り 11  ぬ ファイル1のSHEET2に    A    B  C  D 1 商品名 品番 単価 個数 2  い    A2  110  10 3  は    A4  130   3 4  へ    A7  160   6 5  ほ    A8  170   3 の様に抽出する方法ですが、商品名が単純な文字列のときは フィルタ-の詳細設定で出来ますが、 商品名が  [8/1発売] 20%OFF  い A2 の様なキャッチコピ-付の文字列の場合、抽出することが出来ません。 (ファイル1・2共にキャッチコピ-付の商品名です。) この場合でも抽出できる方法をご教授いただけないでしょうか? 宜しくお願い致します。

専門家に質問してみよう