2017-06-24 6 views
1

フォルダからファイル名を読み取るマクロがあります。問題は、ファイル名が、この画像のように、A1、A2 ..... A200.pdf、などのシリーズにあるとき:それはA1、A10、A100、A101として、Excelで読み込む エンドで数値を使用してExcelの値をソートする方法

enter image description here

この画像のように..... A109、A11、A110 ..... A119、A20、:

enter image description here

Excelの値は、フォルダ、ファイルなどと同じくるようにどのように私はこれを並べ替えることができます名前、または私はExcel自体で並べ替えることができる方法はありますか?

答えて

2

これをExcelでヘルパー列で並べ替えることができます。新しい列を作成し、 "= LEN(A1)"でファイル名の長さを計算します。次に、2レベルソートを使用してファイル名をソートします。データ - >ソート:第1レベルの長さと第2レベルのファイル名を使用します。

1

これは、これらの両方の場合(WindowsエクスプローラとExcel)の異なる並べ替えアルゴリズムが理解しているため、Refer to this articleが原因で発生しています。

問題を解決する方法の1つは、別のセル(たとえば列B)のファイル名の数値部分のみを取り出し、それらの数値に基づいてソートすることです。

ファイル名のパターンがAXXX.pdf、つまり1文字のA、次に数字、4文字のファイル拡張子であると仮定できます。もし

この機能を使用することができる= VALUE(MID(A1,2、LEN(A1)-5))

をこれは、文字列間での文字のいくつかの数を引き出すことによって機能します。前提条件として、2番目のパラメータが2番目の理由から2番目のパラメータが2であることがわかります。次に、Aを1文字、 )番号を作る。だから、名前全体の長さをとり、5文字を減らしてください。あなたはあなたのソートできるあなたの番号の部分を取得します。

これはあなたの結果になります: enter image description here

+0

ありがとうございます@ YowE3K今修正されました – nitigyan

0

最良の方法は、先行ゼロを持つようにExcelのリスト内のファイル名を変更することです。 A19の代わりにファイルをA019と参照すると、正しくソートされます。この数式をヘルパー列で使用してファイル名を変換します。

=Left($A2, 1) & Right("000" & Mid($A2, 2, 3), 3) 

3のゼロとストリング長はすべて互いに関連していることに注意してください。 4桁の固定長の数字を作成するには、4つのゼロを使用して、両方の文字列の長さを4に増やしてください。

行2から最後まで数式を下にコピーします。ヘルパー列をコピーしてValuesを貼り付け、すべてが完璧なときは元の列をヘルパーに置き換えます。

数字に続く固定桁数に対応するために、上記の式を調整することができます。以下の式は、数字の後に続く4つの余分な文字、たとえば ".pdf"(ピリオドを含む)に対応します。

=Left($A2, 1) & Right("000" & Mid($A2, 2, 7), 7) 
+0

数式が間違っています。 Midは3つの引数を持つ必要があり、あなたがしたいことを完全には見ない – nitigyan

+0

@nitigyanはい、そうです。 Excelでは、Mid関数にはlength引数が必要です。これを指摘していただきありがとうございます。論理的には、長さは、プレフィックス内のゼロの数と等しくなければならない桁数と等しくなければならない。したがって、OPが4桁の数字を必要とする場合、式の2番目の部分は 'Right(" 0000 "&Mid($ A2、2、4)、4)' – Variatus

+0

@ YowE3Kのようになります。質問のタイトルが示唆しているように、OPが本当に "最後に"数字を並べ替えることを望んでいないことを指摘するのは正しいです。私の提案は、すべての拡張が同じ長さである限り、機能します。そうでない場合は、長さの異なる拡張に対応するように変更することができます。これらはすべて、先行ゼロを使用する提案の要点を変更しません。 – Variatus

1

別のオプションは、ファイル名内の「キャプチャ」数字を抽出するためにRegExオブジェクトを使用することができます。

Option Explicit 

Sub SortFileNames() 

Dim i As Long 

With Sheets("Sheet1") ' replaces "Sheet1| with your sheet's name 
    For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row 
     .Range("B" & i).Value = RetractNumberwithRegex(.Range("A" & i)) ' call the Regex function 
    Next i 
End With 

End Sub 

'======================================================================== 

Function RetractNumberwithRegex(Rng As Range) As String 
    ' function uses the Regex object to substract the Numeric values inside 

    Dim Reg1 As Object 
    Dim Matches As Object 

    Set Reg1 = CreateObject("vbscript.regexp") 
    With Reg1 
     .Global = True 
     .MultiLine = True 
     .IgnoreCase = False 
     .Pattern = "[0-9]{1,20}" ' any size numeric string (up to 20 digits length) 
    End With 

    Set Matches = Reg1.Execute(Rng.Value2) 
    If Matches.Count <> 0 Then 
     RetractNumberwithRegex = Matches.Item(0) 
    End If 

End Function 
関連する問題