Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Pro : Excel 2021)
改善すべき箇所を指摘ください
投稿日時: 24/04/28 08:39:10
投稿者: Nubo

ネット情報を頼りに継ぎ足しながらどうにかコードを作成しました。
エラーは出ませんが、修正した方が良い所があると思われます。
 
改善すべき箇所を指摘ください。
 
Sub test()
 
      'サブフォルダー内の映画名を取得
     
      ' 指定フォルダーのパスを設定
      Dim TopFolder As String
      TopFolder = "G:\映画別"
     
      '「Microsoft Scripting Runtime(実行時バインディング)
      ' 指定フォルダー内のサブフォルダーを取得
      Dim subfolder As Object
      Set subfolder = CreateObject("Scripting.FileSystemObject").GetFolder(TopFolder)
     
      ' サブフォルダー名を表示
      Dim SerchfolderPath As String
      Dim SerchfolderName() As String
      Dim j As Long
     
      ' サブフォルダーの数を取得
      Dim subfolderCount As Long
      subfolderCount = subfolder.SubFolders.Count
 
      ' 配列をサブフォルダーの数に合わせてリサイズ
      ReDim SerchfolderName(1 To subfolderCount)
       
      j = 1
      For Each subfolder In subfolder.SubFolders
            SerchfolderPath = subfolder.Path
            SerchfolderName(j) = subfolder.Name
            j = j + 1
      Next subfolder
 
      '----------------------------------------------------------
      '指定フォルダー内のファイル名を取得(階層フォルダーを含めたファイルリスト : 再帰処理)
      Dim aryFile() As String 'ファイル名を格納する動的配列
      Dim cnt As Long '検出ファイルのカウント
      Const pathFolder As String = "L:\#おこのみ"
 
      cnt = 0
      f_getFileArray pathFolder, aryFile, cnt
       
      Dim i As Long, ii As Long
      ii = 1
      For i = 2 To cnt
            ' anyFile()の中にSerchfolderName()と同じ文字列が存在するかチェック
            For j = 1 To subfolderCount
                  If InStr(1, aryFile(ii), SerchfolderName(j), vbTextCompare) > 0 Then
                        ' 同じ文字列が存在する場合、シートに書き出す
                        Cells(i, 1) = SerchfolderName(j)
                        Cells(i, 2) = aryFile(ii)
                        Exit For
                  End If
            Next j
            ii = ii + 1
      Next i
 
      '空白行のみを削除(A1000は適当)
      Range("A2:A1000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
       
End Sub
 
 
Function f_getFileArray(aPath As String, aryFile() As String, cnt As Long)
 
      '要参照設定: Microsoft Scripting Runtime
      Dim oFS As New FileSystemObject
      Dim oFile As File
      Dim oFolder As Folder
 
      'サブフォルダーの処理: 再帰呼び出し
      For Each oFolder In oFS.GetFolder(aPath).SubFolders
            f_getFileArray oFolder.Path, aryFile, cnt
      Next
 
      'ファイルの処理: サイズ1MB以上のファイルを配列に追加
      For Each oFile In oFS.GetFolder(aPath).Files
            If oFile.Size > 1000000 Then
                  cnt = cnt + 1
                  ReDim Preserve aryFile(1 To cnt)
                  aryFile(cnt) = oFile.Path
            End If
      Next
 
      Set oFile = Nothing
      Set oFolder = Nothing
      Set oFS = Nothing
End Function

回答
投稿日時: 24/04/28 13:24:48
投稿者: WinArrow

コードは読んでいません。
一般論で書きます。
 
コードだけで、
「改善しあ方がよいところを探せ」
は、無謀すぎます。
 
誰でも継ぎ足しはやるでしょう・・・・
それは、不具合(操作しにくいなど)があるからです。
 
じっくり〜じっくり〜時間を掛けてご自由に
 

回答
投稿日時: 24/04/28 14:00:54
投稿者: simple

既に指摘がありましたように、処理の概要を説明してください。
 
ざっと見て気づくのは、
・filesystemobjectは一つを使いまわせばよいのでは?
  しかも違う方式を使う意味もないと思います。early bindingでよいと思います。
・Range("A2:A1000").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
  を必要としないロジックにできるはず
と言う点です。検討してみてください。

投稿日時: 24/04/28 14:10:16
投稿者: Nubo

回答が感謝します。
 
ご自由にとありますので自己で何とかします。