2016-08-17 4 views
1

다른 프로그램으로 가져 오기 전에 Excel에서 BOM (Bill of Materials)을 사용하고이 목록을 프리픽스 페이지 번호 1-200으로 구성된 참조 지정으로 정렬하려고합니다. 장치 유형 A- ZZ, 해당 페이지 1-99의 장치 번호 (ID), 장치 AZ의 일부를 나타내는 문자 (해당 장치가 여러 부분으로 구성된 경우) 등이 있습니다. I는 그 다음 페이지에서 다음 장치 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

: 또한, 결과를 얻을 당신이 순서 당신이 게시물에 언급되지 순서로 정렬하려면 이와 같은 것을 만들 때 네 부분을 모두 자신의 셀에 넣을 것입니다. 그런 다음 원하는 순서로 열을 기준으로 정렬 할 수 있습니다. 단일 셀 출력을 원할 경우 열을 연결할 수 있습니다. 데이터를 네 부분으로 파싱 한 다음 정렬해야합니다. –

+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

관련 문제