2012-06-13 5 views
1

저는 Year와 Name의 입력 데이터가 두 개의 별도 배열에 있습니다. 배열 값을 먼저 정렬해야합니다. 연대순으로 (연도) 정렬해야하고 연도 정보가 반복되면 배열을 알파벳순으로 정렬합니다.VBA를 사용하여 정렬 된 배열을 단어로 인쇄하는 방법은 무엇입니까?

필자는 올해와 그 다음 이름을 모두 정렬합니다. 내가 단어를 인쇄 할 경우

PJK 1983 
EFD 1986 
ELS 1986 
WKL 1995 
SDF 1997 

는이 같은 인쇄 (정렬 후) :

SDF 1997 
ELS 1986 
PJK 1983 
WKL 1995 
EFD 1986 

출력 (정렬하기 전에) :

명령 Wordbasic.sortarray 입력를 사용

PJK 1983, ELS 1986, EFD 1986, WKL 1995, SDF 1997. 

다음은 데이터 인쇄용 코드입니다. 아무도 이걸 들여다 보면서 나를 실수하게 만들었습니까?

WordBasic.sortarray SortyearArray() 

코드 :

Dim I As Integer 
Dim J As Integer 
Dim K As Integer 
Dim N As Integer 
Dim Counter As Integer 
COUNTER1 = 1 

i1 = 1 
J1 = 5 

For I = 0 To UBound(SortyearArray()) 
    Counter = 1 
    For J = I + 1 To UBound(SortyearArray()) 
     If SortyearArray(I) = SortyearArray(J) Then 
      Counter = Counter + 1 
      MsgBox (Counter) 
     End If 
     COUNTER1 = Counter + COUNTER1 
    Next J 
    If Counter = 1 Then 
     For N = i1 To J1 
      If SortyearArray(I) = Year(N) Then 
       Selection.TypeText Text:="(" & AuthorName(N) & Year(N) & ")" 
      End If 
     Next N 
    End If 
Next I 
+0

"SDF", "ELS"가 포함 된 어레이에 중복 된 연도가있는 두 번째 어레이와 같은 중복이 있습니까? –

+0

ELS와 EFD는 같은 해입니다. 왜냐하면 EFD는 ELS의 중복 가치이기 때문입니다. 나는 이것을 인쇄 할 필요가있다. PJK 1983, EFD 1986, ELS 1986, WKL 1995, SDF 1997. – DeeGo

+0

나는 그것을 이해한다. 제 말은 제 1 어레이에 중복이 있을까요? 즉 첫 번째 배열에 두 개의 "SDF"가있을 것입니까? –

답변

2

입력

SDF 1997 
ELS 1986 
PJK 1983 
WKL 1995 
EFD 1986 

핵심 기능 :

Public Function QuickSort(ByRef array2check() As String, min As Long, max As Long) As Boolean 
Dim lo As Long, hi As Long 
Dim lo0 As Long, hi0 As Long 
Dim midPos As String 

    lo = min: hi = max 
    lo0 = lo: hi0 = hi 
    midPos = array2check((lo0 + hi0)/2) 
    DoEvents 
    While (lo <= hi) 
     While ((lo < hi0) And (array2check(lo) < midPos)) 
      lo = lo + 1 
     Wend 
     While ((hi > lo0) And (array2check(hi) > midPos)) 
      hi = hi - 1 
     Wend 
     If lo <= hi Then 
      Call swap(array2check, lo, hi) 
      lo = lo + 1 
      hi = hi - 1 
     End If 
    DoEvents 
    Wend 

    If lo0 < hi Then Call QuickSort(array2check, lo0, hi) 
    If lo < hi0 Then Call QuickSort(array2check, lo, hi0) 

    QuickSort = True 

End Function 

Private Sub swap(arr() As String, idx1 As Long, idx2 As Long) 
Dim tmp As String 
    tmp = arr(idx1) 
    arr(idx1) = arr(idx2) 
    arr(idx2) = tmp 
End Sub 
이 도움이 3,691,363,210

샘플 테스터

Public Sub sample_test() 
    Dim test_arr() As String 
    test_arr = Split("SDF 1997" & vbCrLf & "ELS 1986" & vbCrLf & "PJK 1983" & vbCrLf & "WKL 1995" & vbCrLf & "EFD 1986", vbCrLf) 
    If QuickSort(test_arr, LBound(test_arr), UBound(test_arr)) = True Then 
     'Debug.Print Join(test_arr, vbCrLf) 
     MsgBox Join(test_arr, vbCrLf) 
    End If 
End Sub 

[결과

EFD 1986 
ELS 1986 
PJK 1983 
SDF 1997 
WKL 1995 

희망.

+0

감사합니다. 너 실렌이야. – DeeGo

+0

+1하지만 모든 DoEvents는 무엇입니까? –

+0

@ Jean-FrançoisCorbett : 배열이 꽤 큰 경우 사용자 컴퓨터가 멈추지 않습니다. – Cylian

관련 문제