1

年と名前の 2 つの入力データが別々の 2 つの配列にあります。最初に両方の配列値を並べ替える必要があり、時系列 (年) に並べ替える必要があります。次に、年情報が繰り返される場合は、配列をアルファベット順に並べ替えます。

私は年と名前の両方でソートを完了します。Wordbasic.sortarrayコマンドの使用

入力: (ソート前)

SDF 1997
ELS 1986
PJK 1983
WKL 1995
EFD 1986

出力: (ソート後)

PJK 1983
EFD 1986
ELS 1986
WKL 1995
SDF 1997

Wordで印刷すると、次のように印刷されました。

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
4

1 に答える 1

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

サンプルテスター

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

お役に立てれば。

于 2012-06-13T10:00:56.660 に答える