Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

VBA

VBAで画像を分類に応じて適切なフォルダに仕分けるプログラム

投稿日:2019年5月26日 更新日:

(0)目次&概説

(1) マクロ概要
(2) 使用方法
(3) アルゴリズム概要
(4) プログラム

(1) マクロ概要

本マクロは画像ファイルを適切なフォルダに仕分けるためのマクロです。前提として、正常動作には以下の情報が必要です。
①フォルダの中に格納された任意の画像ファイル

②各画像毎に「画像名」と「画像の分類」の情報をペアで保持する「リスト」

上記①に格納されている画像ファイル名について、②のリストに存在するかのチェックを行い、もしも存在する場合は、該当の分類名のフォルダに配信を行います。この処理をファイル数分、繰り返し行います。

目次にもどる

(2) 使用方法

(1)一時保存フォルダ(配信前フォルダ)に画像を格納します。
(2)各画像毎に「画像名」と「画像の分類」の情報をペアで保持する「リスト」の準備を行います。
 →新規シートを作成して”Distribute”と命名し、そのシート上にリストを用意します
(3)「配信開始行」と「配信終了行」の情報を付与します
 →新規シートを作成して”Controller”と命名し、そのシートの(4行,C列)に「配信開始行」を記載し、(5行,C列)に「配信終了行」を記載します。
(例)

(4) 上記が完了した状態で以下の「フォルダ配信」ボタンを押下します。
 (※ボタンを作成後「DistributeImage」メソッドをボタンに割り当てたら準備完了です)

目次にもどる

(3) アルゴリズム概要

(3-1) 変数定義

変数の定義は以下の通りです。

No 変数名 説明
1 RowStart Integer リストの読み込み開始行を指定
2 RowEnd Integer リストの読み込み終了行を指定
3 ImageName String リストに記載してある「画像名」(画像のファイル名)
4 ClsfResult String リストに記載してある「画像の分類」(画像をどのフォルダに配信するか?)
5 Dist Worksheet シートを指定するための変数
6 Fso FileSystemObject 以下の用途で定義。
・GetFolderメソッド
・GetFolderメソッド→Subfoldersプロパティ
7 fl Folder フォルダでループするための変数
8 f File ファイルでループするための変数
9 InFolder String 画像の入力先フォルダ
10 OutFolder String 画像の出力先フォルダ

(3-2) 処理フロー

処理フローは以下の通りです。

Lv. 処理概要
1 リストの最初~最後までループ 
 2  ∟”i”番目の画像の「画像名」と「分類名」を取得 
  3   ∟INPUTフォルダ内の画像を1件ずつループ 
   4    ∟INPUTフォルダ内の現在の画像が、リストの画像と一致しているかをチェック 
    5     ∟画像をOUTPUTフォルダ内にある「分類名」の名前のフォルダに作成
  3   ∟INPUTフォルダ内のサブフォルダを1件ずつループ
   4    ∟INPUTフォルダ内のサブフォルダ内の画像を1件ずつループ 
    5     ∟INPUTフォルダ内の現在の画像が、リストの画像と一致しているかをチェック
     6      ∟画像をOUTPUTフォルダ内にある「分類名」の名前のフォルダに作成

 

工夫した点としては、INPUTフォルダ直下のループと、INPUTフォルダ配下のサブフォルダのループを分けた点です。両方用意する事により、画像がINPUT直下に配置された場合でも、さらに1階層下の子フォルダに配置された場合でも配信されるようになっています。しかし、VBA初心者が組んでいるコードなので、改善点等あればご指摘頂けると嬉しいです。

目次にもどる

(4) プログラム

Sub DistributeImage()

    '変数定義
    Dim RowStart As Integer: RowStart = Sheets("Controller").Cells(4, 3).Value  '# 読取開始 行
    Dim RowEnd As Integer: RowEnd = Sheets("Controller").Cells(5, 3).Value      '# 読取終了 行
    
    Dim ImageName As String         '# tiffファイル名
    Dim ClsfResult As String        '# 書類分類結果
    
    Dim Fso As FileSystemObject     '# ファイル移動用のオブジェクト
    Set Fso = New FileSystemObject
       
    Dim Dist As Worksheet           '# ワークシートの変数
    Set Dist = Sheets("Distribute")
    
    Dim fl As Folder                '# フォルダの変数
    Dim f As File                   '# ファイルの変数
    
    Dim InFolder As String          '# INPUT画像のフォルダ
    InFolder = "[任意のファイルパス]\INPUT_2\"
    Dim OutFolder As String         '# OUTPUT画像のフォルダ
    OutFolder = "[任意のファイルパス]\OUTPUT\"
    
    'ForループStart
    ' ○列目の○行目以降の「画像名」&「分類」の値を順番に読む
     For i = RowStart To RowEnd
    
        '「画像名」および「分類」の値を取得
        ImageName = Dist.Cells(i, 1)
        ClsfResult = Dist.Cells(i, 2)
        Debug.Print "Distributeリストの " & i & "番目のImageName: " & ImageName & " , ClsfResult: " & ClsfResult
       
            'INPUTフォルダのサブフォルダ内にある全ファイルを一つずつチェックする
            For Each f In Fso.GetFolder(InFolder).Files
                Debug.Print " ∟探索 フォルダ名: " & Fso.GetFolder(InFolder).Name
                Debug.Print "  ∟探索 画像名: " & f

                'INPUTフォルダ内の画像とリストの画像名が一致しているかチェックする
                If f.Name = ImageName Then
                    Call f.Copy(OutFolder & ClsfResult & "\" & ClsfResult & "_" & ImageName)
                    Debug.Print "   ∟Distributeリストの " & i & "番目の画像でフォルダ内画像と「一致」が発見されました。コピー先は: " & OutFolder & ClsfResult & "\" & ClsfResult & "_" & ImageName
                End If
            Next
       
       
        'INPUTフォルダ内のサブフォルダを順番にチェックする
        For Each fl In Fso.GetFolder(InFolder).SubFolders

            Debug.Print " ∟探索 サブフォルダ名: " & fl

            'INPUTフォルダのサブフォルダ内にある全ファイルを一つずつチェックする
            For Each f In fl.Files

                Debug.Print "  ∟探索 画像名: " & f

                'サブフォルダ内の画像とリストの画像名が一致しているかチェックする
                If f.Name = ImageName Then
                    Call f.Copy(OutFolder & ClsfResult & "\" & ClsfResult & "_" & ImageName)
                    Debug.Print "   ∟Distributeリストの " & i & "番目の画像でフォルダ内画像と「一致」が発見されました。コピー先は: " & OutFolder & ClsfResult & "\" & ClsfResult & "_" & ImageName
                End If
            Next
        Next

    'ForループEnd
    Next i
    
    'ファイルシステムオブジェクトの後処理
    Set Fso = Nothing

End Sub

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-VBA

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

VBAによる郵便番号の正規表現マッチ確認関数&置換関数の作成

  (0)目次&概説 (1) 正規表現とは (2) 正規表現はどのような場面で利用される? (3) VBAによる正規表現の簡易チェックツール  (3-1) 郵便番号を抽出したい  (3-2) …

VBAで「実行時エラー ‘429’:ActiveXコンポーネントはオブジェクトを生成できません」が出た時の対処記録

  <目次> (1) VBAで「実行時エラー ‘429’:ActiveXコンポーネントはオブジェクトを生成できません」が出た時の対処記録  (1-1) 発生状況・エラーメッセージ  (1-2 …

VBAでマウスを自動操作する方法~自動打鍵を目指して~

<目次> (1) VBAでマウスを自動操作する方法  (1-1) マウス操作のために利用する仕組み  (1-2) 構文(HelloWorld)  (1-3) サンプルプログラム (1) VBAでマウス …

VBAでシートをループする方法について

  <目次> (1) VBAでシートをループする方法について  (1-1) 構文  (1-2) サンプルプログラム (1) VBAでシートをループする方法について VBAの処理でブック内の「 …

VBAで処理と処理の間に一定時間を空けて実行する方法

今回はVBAで処理と処理の間に一定時間を空けて実行する方法について、備忘も兼ねて記載します。 (0)目次&概説 (1) Application.wait (2) サンプルプログラムソース (3) サン …

  • English (United States)
  • 日本語
Top