2016-08-17 6 views
1

別のプログラムにインポートする前にExcelでBOMを作成し、これらのリストをプレフィックスページ番号1-200、デバイスタイプA- ZZ、そのページのデバイス番号(ID)、デバイスAZの一部を表す文字(そのデバイスが複数の部分で構成されている場合)が続きます。私はそれが、その後のページでは、デバイスID、デバイスの一部で、その後、デバイスタイプA-ZZによって最初にソートしたい
VBAを使用したExcelでの英数字ソート

1Q1 
1S6 
1S7 
1T1 
1VENT 
1X1 
1X2 
1Y1 
1Z1-A 
1Z1-B 
2A1-A 
2A1-B 
2A1-C 
22M1 
2QF1 
2RB1 
2Z1-A 
2Z1-B 
13A1-A 
13A1-B 
13A1-C 
3A2-A 
3A2-B 
3A2-C 


はここRefDesの例です。

1A1A 
.... 
1A1Z 
1A2A 
.... 
1A2Z 
2A1A 
.... 
2A1Z 
.... 
200A99Z 
1B1A 
.... 
200ZZ99Z 

上記のリストは、次のようにソートされるように:それから、1A-1zzが:

2A1-A 
2A1-B 
2A1-C 
3A1-A 
3A1-B 
3A1-C 
13A1-A 
13A1-B 
13A1-C 
22M1 
1Q1 
2QF1 
2RB1 
1S6 
1S7 
1T1 
1VENT 
1X1 
1X2 
1Z1-A 
1Z1-B 
2Z1-A 
2Z1-B 

これまでのところ私は、デバイスの種類によって、ページでソートすることができましたし、でもそれは間違って並べ替えます1xA-1xZZ、2A-2ZZ、2xA-2xZZなど... BOMを構築すると、ダッシュ( - )を取り除くことができます。

+2

:また、あなたがこの順にソートしたいの結果ではなく、あなたが記事で言及した順序を取得しますこのようなものを作るとき、私は4つの部分すべてを自分の細胞に入れます。次に、必要な順番で列を並べ替えることができます。単一のセル出力が必要な場合は、列を連結することができます。それは4つの部分にデータを解析して並べ替える必要があるためです。 –

+0

1VENTはどのようにあなたのパターンに合っていますか? –

+0

1VENTは異常です。デバイスタイプはVE、シートは1とソートされます。 – MaxK

答えて

2

これが最も効率的な方法であるかどうかはわかりませんが、BOMの構築方法に基づいて、データを一時列に分割してソートしてから削除する方が簡単かもしれません。

あなたのソート要件と注文は、私が知っている他のやり方をするには複雑すぎるようです。

Sub SortBOMS() 
Dim workingRange As Range 
Dim workingCell As Range 
Dim pageNumber As String 
Dim deviceType As String 
Dim deviceID As String 
Dim devicePart As String 
Dim i As Integer 

Application.ScreenUpdating = False 

'Obtains the full list. (Assumes you have no data after the 1millionth row) 
Set workingRange = Range("A1:A" & Range("A1000000").End(xlUp).Row) 

For Each workingCell In workingRange.Cells 

    'Builds the page number 
    pageNumber = "" 
    For i = 1 To 3 'Used 3 since 200 is 3 characters 
     If IsNumeric(Mid(workingCell.Text, i, 1)) Then 
      pageNumber = pageNumber & Mid(workingCell.Text, i, 1) 
     Else   
      Exit For 'Exits as soon as encounters a letter 
     End If 
    Next i 
    'Writes the value after converting it to an integer 
    Range("B" & workingCell.Row).Value = CInt(pageNumber) 

    'Builds the device type 
    deviceType = "" 
    For i = 1 To 2 'Used 2 since ZZ is 2 characters 
     If Not (IsNumeric(Mid(Split(workingCell.Text, pageNumber)(1), i, 1))) Then 
      deviceType = deviceType & Mid(Split(workingCell.Text, pageNumber)(1), i, 1) 
     Else 
      Exit For 'Exits as soon as encounters a number 
     End If 
    Next i 
    'Writes the value 
    Range("C" & workingCell.Row).Value = deviceType 

    'Builds the device ID 
    deviceID = "" 
    For i = 1 To 2 'Used 2 since 99 is 2 characters 
     If IsNumeric(Mid(Split(workingCell.Text, pageNumber & deviceType)(1), i, 1)) Then 
      deviceID = deviceID & Mid(Split(workingCell.Text, pageNumber & deviceType)(1), i, 1) 
     Else  
      Exit For 'Exits as soon as encounters a letter or a dash 
     End If 
    Next i 
    'Writes the value after converting it to an integer 
    On Error Resume Next 
    Range("D" & workingCell.Row).Value = CInt(deviceID) 
    On Error GoTo 0 

    'Builds the device part 
    devicePart = "" 
    If InStr(1, workingCell.Text, "-", vbTextCompare) > 0 Then 
     devicePart = Split(workingCell.Text, "-")(1) 
    End If 
    'Writes the value 
    Range("E" & workingCell.Row).Value = devicePart 
Next workingCell 

'Clean up 
Application.ScreenUpdating = True 
Set workingRange = Nothing 
Set workingCell = Nothing 
End Sub 

これが実行されたら、希望の方法で並べ替えることができます。

  1. デバイスタイプ
  2. ページ番号
  3. デバイスID
  4. 素子部
+1

私は物事をスピードアップするために配列を使用したが、基本的に同じことをやっただろう。 –

+0

これは私が手動でやっていることだし、デバイスのIDと部品を壊す必要もないので、私は3つの列しか持たない。私はタイプ別にソートして動作します。ありがとう、これは物事を大幅にスピードアップします。 – MaxK

+0

@MaxK問題ありません。これがあなたが探していたものであれば、チェックマークをクリックして質問を閉じるだけです。 – TheGuyOverThere

関連する問題