2011-12-31 2 views
4

PixPathはjpgのフォルダへの完全なパスです。次のようなコードを使って各jpgを処理しています。Dirを使用してファイルシステムの順番でフォルダからファイルを返す

fileName = Dir(PixPath) 
Do Until fileName = "" 
    If Right$(fileName, 4) = ".jpg" Then 
     fileName = Dir() 

     <process this jpg> 

    End If 
Loop 

これは、ファイルが英数字順で返され、ファイルが表示される順にフォルダに表示されていない以外正常に動作します。これを回避する方法はありますか?

+0

ファイルはどのようにフォルダに表示されていますか(日付変更など) – brettdj

+0

ファイル名はすべて数字で構成されています。 "1"、 "2"などとなり、ファイルは "1.jpg"などとなり、各フォルダには数字が無制限に上がる可能性があります。これらのファイルは、Windowsエクスプローラで "1.jpg"、 "2.jpg"、 "3.jpg"などの順序で並べ替えられますが、Dirは "1.jpg"、 "10.jpg"などを返します。 – Roy

+0

先行ゼロのファイルに名前を付けることでこれを回避しました。 – EFH

答えて

4

Dirとすることはできません。 .jpg Sを比較するために、配列X

  • 使用Valにすべての.jpgファイルにディレクトリ内のすべてのファイル
  • 読むにアクセスするために

    • 使用FileSystemObject

      選択肢がにあります値によって昇順に並べ替えます。

    • 最終配列Xが含まれているソートされたファイル

      Sub Test() 
      Dim objFSO As Object 
      Dim objFolder As Object 
      Dim objFiles As Object 
      Dim objFile As Object 
      Dim X 
      Dim lngFileCnt As Long 
      Dim lngCnt As Long 
      Dim i As Long 
      Dim j As Long 
      Dim strBuffer1 As String 
      Dim strFolder As String 
      
      Set objFSO = CreateObject("Scripting.fileSystemObject") 
      strFolder = "C:\temp" 
      Set objFolder = objFSO.getFolder(strFolder) 
      Set objFiles = objFolder.Files 
      lngFileCnt = objFiles.Count 
      ReDim X(1 To lngFileCnt) 
      
      'grab all jpg files   
      For Each objFile In objFiles 
          If Right$(objFile.Name, 3) = "jpg" Then 
           lngCnt = lngCnt + 1 
           X(lngCnt) = objFile.Name 
          End If 
      Next 
      
      'resize array to number of jpg files 
      ReDim Preserve X(1 To lngCnt) 
      
      'sort array by numeric value 
      For i = 1 To lngCnt 
          For j = (i + 1) To lngCnt 
           If Val(X(i)) > Val(X(j)) Then 
            strBuffer1 = X(j) 
            X(j) = X(i) 
            X(i) = strBuffer1 
           End If 
          Next 
      Next 
      MsgBox Join(X, ";") 
      End Sub 
      

      FileSystemObjectを使用しての詳細はhereを参照してください。

  • 2

    brettdjからの答えは(お礼をbrettdj)うまく機能し、おそらく私が使用します方法ですが、私も動作し、それが他の状況で利点を提供するかもしれない何かを発見しました。 1つは、Dirを使用してフォルダをループするという極端な単純さを保持していることです。

    Excel 11では、Dir(質問に記載)を使用して、各フォルダ(一度に1つのフォルダ)からjpgファイルのリストを作成し、Col Aの英数字でソートします。次に、カスタムリストCol Aを(偽の)数値ソートでソートするので、jpgをシリアル順に処理できます。 Col Aをクリアし、次のフォルダを繰り返します。

    カスタムリストを生成するには、次の作業列の行1で

    =ROW() & ".jpg" 
    

    を入力して、どんなスーツにダウン記入してください。私のケースでは、カスタムリストに1000個のアイテムを使用しました。これは、どのフォルダでもjpgの最大数だからです。

    カスタムリストは、カスタムリストとしてインポートする前に、新しく生成された数式リストをテキストに変換する必要があるため、[貼り付け>特殊>値]を使用してテキストに変換する必要があります。リストの各項目は、予想されるファイル名の1つです。

    1.jpg 
    2.jpg 
    3.jpg 
    … 
    … 
    1000.jpg 
    

    私は私の新しいカスタムリスト([ツール]> [オプション]> [カスタムリスト]> [インポート])をインポートした後、それがデータ>ソート>オプションのドロップダウンメニューで利用可能な選択になり>まず:最後のカスタムリストは次のようになりますキーのソート順。

    あなたは、ここにVBAでこの種をやっている場合はレコーダーが提供するものです:最初の5つのカスタムリストをExcelに組み込まれている

    Range("A:A").Select 
    Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ 
        OrderCustom:=6, MatchCase:=False, Orientation:=xlTopToBottom, _ 
        DataOption1:=xlSortNormal 
    

    、そうOrderCustom:= 6は、新しいカスタムリストです。通常のソートを行う場合は、これをOrderCustom:= Falseに戻してください。カスタムリストは、削除されるまで作成されたWkbに添付されたままです。

    +0

    このような包括的なフォローアップパスを投稿することにお困りのことをありがとう。私はVBA内部の並べ替えにExcelを使用することを簡単に検討していましたが、Excelの並べ替えも[必要調整](http://www.eggheadcafe.com/microsoft/Excel/32870327/special-sorting-need-advice.aspx)から作業。あなたのカスタムリストが素晴らしい解決策(+1 btw)を提供しているようです。 – brettdj

    +0

    小さな修正。設定OrderCustom:= False上記の私の答えで示唆されるエラーを生成します。 OrderCustomでなければならない:= 1 – Roy