2016-06-15 2 views
1

토론 주제의 고유 ID를 생성하려고합니다. 데이터는과 같이 될 것입니다 :Excel VBA 고유 ID 생성기

Status ID  Topic Commentary 
Open  FIL-1  FILM  
Open  FIL-2  FILM 
Closed LAN-1  LANG. 
Open  LAN-2  LANG. 

아이디어는 관계없이 위 또는 마지막 고유 ID의 아래에 추가되었는지 여부의 새 행에 내가 사용할 때 VBA 다음 ID를 찾을 수 있다는 것입니다. 위의 예에서 맨 위에 LANG이라는 주제로 다른 행을 추가하는 경우입니다. LAN-2가 가장 최근의 ID이고 +1이 LAN-3이 될 것입니다.

주제 아래 코드를 모두 동일 때이 작업을 얻었다

는 (주제는 모두 "FIL"했다하지만 지금은 여러 항목이 있습니다) :

Private Function getNextID() As String 

Dim row As Integer 
Dim currentID As Integer 

currentID = 0 

' Loop round rows 
For row = MIN_ROW To MAX_ROW 

    ' Only use rows which are not blank 
    If Worksheets(DISCUSS).cells(row, ID).Value <> "" Then 
     If Mid$(Worksheets(DISCUSS).cells(row, ID).Value, InStr(3, Worksheets(DISCUSS).cells(row, ID).Value, "-") + 1) > currentID Then 
      currentID = Mid$(Worksheets(DISCUSS).cells(row, ID).Value, InStr(3, Worksheets(DISCUSS).cells(row, ID).Value, "-") + 1) 
     End If 
    End If 

Next row 

getNextID = "FIL" & "-" & currentID + 1 

End Function 

이 사람이 내가 배열을 설정할 수있는 방법을 알고 있나요 ID에 사용 된 주제 약어를 사용하고 배열의 약어를 사용하여 동일한 프로세스를 반복하기 위해 이미 작성한 코드를 사용하여 특정 주제에 대한 다음 ID를 추가 할 수 있습니까?

답변

0

나는이 필요한 경우이 자동화 될 수있다, 당신이 당신의 프로 시저에 당신이 ID를 요청하는 항목의 이름을 전달해야합니다 의미합니까, 당신은 당신이 필요 같은 배열을 포함했다 코드를 조정 내가이 프로그램을 실행할 때, 그러나 항목을 무시하고 단지 전체 행을 계산하는 것 - 답장을

Private Function getNextID(ByVal StrTopic As String) As String 
Static AryTopics(2, 1)  As String 
Dim row      As Integer 
Dim currentID    As Integer 
Dim LngCounter    As Long 
currentID = 0 

'By having the array declared static and being a fixed size, it will only get built once 
'then rememebered 
If AryTopics(0, 0) = "" Then 
    AryTopics(0, 0) = "FILM" 
    AryTopics(0, 1) = "FIL" 
    AryTopics(1, 0) = "LANG." 
    AryTopics(1, 1) = "LAN" 
    AryTopics(2, 0) = "GEOG." 
    AryTopics(2, 1) = "GEO" 
End If 

'The topic must be passed into the proce to know what to get the ID for 
'This gets the related topic code from the array 
For LngCounter = 0 To UBound(AryTopics, 1) 
    If AryTopics(LngCounter, 0) = Trim(UCase(StrTopic)) Then 
     StrTopic = AryTopics(LngCounter, 1) 
     Exit For 
    End If 
Next 

' Loop round rows 
For row = MIN_ROW To MAX_ROW 

    ' Only use rows which are not blank 
    If Worksheets(DISCUSS).Cells(row, ID).Value <> "" Then 

     'This checks to see if the ID starts with the related topic code we care about, if it does then we keep checking 
     If Left(Trim(UCase(Worksheets(DISCUSS).Cells(row, ID).Value)), Len(StrTopic) + 1) = StrTopic & "-" Then 

      If Mid$(Worksheets(DISCUSS).Cells(row, ID).Value, InStr(3, Worksheets(DISCUSS).Cells(row, ID).Value, "-") + 1) > currentID Then 
       currentID = Mid$(Worksheets(DISCUSS).Cells(row, ID).Value, InStr(3, Worksheets(DISCUSS).Cells(row, ID).Value, "-") + 1) 
      End If 

     End If 
    End If 

Next row 

'Output include the topic code 
getNextRiskID = StrTopic & "-" & currentID + 1 

End Function 
+0

정확히 내가 뭘 하려는지. 건배 게리! – Raabot

0

이 코드는 어떤 이유로 든 첫 번째 항목을 제외하고는 속임수를 사용합니다 (평가 수식 단추는 작동하지만 끝에는 0으로 값을 바꿉니다).

그래서 첫 번째 ID를 수동으로 추가 한 다음 3 행에서 마지막 행까지 코드를 실행하십시오. 빈 행을 무시하는 코드도 추가해야합니다.

Public Sub Test() 

    Dim x As Long 

    For x = 3 To 7 
     AddID ThisWorkbook.Worksheets("Sheet1").Cells(x, 2) 
    Next x 

End Sub 

Public Sub AddID(Target As Range) 

    'Formula using A1 style: 
    '=LEFT($C7,3) & "-" & COUNTIF($B$2:INDEX($B:$B,ROW()-1),LEFT($C7,3) & "*")+1 

    'Relative column (ID is 1 column left of Topic). 
    Target.FormulaR1C1 = "=LEFT(RC[1],3) & ""-"" & COUNTIF(R2C:INDEX(C,ROW()-1), LEFT(RC[1],3) & ""*"")+1" 
    'Absolute column (ID is column B, Topic is column C) 
    'Target.FormulaR1C1 = "=LEFT(RC3,3) & ""-"" & COUNTIF(R2C2:INDEX(C2,ROW()-1), LEFT(RC3,3) & ""*"")+1" 
    Target = Target.Value 

End Sub 
+0

감사합니다 - :하지만 하드는 더 큰 그림이 그렇게 프로젝트 나는이로 남아있는 위해 무엇인지 알고 점령 즉, 내 질문에 테이블에 LANG 주제를 추가하고 그것 LAN - 5 레이블. 그것이 잘못되어가는 것을 볼 수는 없습니다. – Raabot

+0

이상 하네. C6에서'Lang.'으로'AddID ThisWorkbook.Worksheets ("Sheet1"). Range ("B6")'행을 실행하면'Lan-5'가 아닌'Lan-3 '을 B6에 추가합니다. 그래도 작동하는 솔루션을 찾았으므로 모두 좋습니다. :) –