エクセルVBAに関する質問です。配列に保存してあるデータにソートをかけることは簡単にできるのでしょうか?

一度シートに展開しないとだめなのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/02/26 18:42:39
  • 終了:2010/02/26 20:43:31

回答(2件)

id:km1967 No.1

km1967回答回数541ベストアンサー獲得回数402010/02/26 18:55:39

ポイント35pt

簡単にできる。

ソートのアルゴリズムは色々あるが、下記のサンプルが一番簡単

http://d.hatena.ne.jp/Cassiopeia/20070501/1178045569

id:heke2mee No.2

heke2mee回答回数162ベストアンサー獲得回数432010/02/26 19:49:52

ポイント35pt
Private Function TestQuickSort() As Long
    Dim WorkAry     As Variant
    WorkAry = Uniq_Random(50000)

    'QuickSort
    Call QuickSort(WorkAry, LBound(WorkAry), UBound(WorkAry)) 
End Function


Private Function QuickSort(ByRef WorkAry As Variant, _
                           ByVal MinIndex As Long, _
                           ByVal MaxIndex As Long) As Long
 
    Dim Index           As Long
    Dim Left            As Long
    Dim Right           As Long
    Dim Key             As Long
    Dim Center          As Long
    Dim Temp            As Variant
 
    Left = MinIndex
    Right = MaxIndex
 
    '中央の値を取得
    Center = WorkAry((MinIndex + MaxIndex) \ 2)
 
    Do While True
 
        '中央から左側を精査
        For Left = Left To MaxIndex
            If WorkAry(Left) >= Center Then
                Exit For
            End If
        Next
 
        '中央から右側を精査
        For Right = Right To MinIndex Step -1
            If WorkAry(Right) <= Center Then
                Exit For
            End If
        Next        
 
        'Break
        If Left >= Right Then
            Exit Do
        End If
 
        '要素を交換
        Temp = WorkAry(Left)
        WorkAry(Left) = WorkAry(Right)
        WorkAry(Right) = Temp
 
        Left = Left + 1
        Right = Right - 1
 
    Loop
 
    '左側の再精査
    If (MinIndex < Left - 1) Then
        Call QuickSort(WorkAry, MinIndex, Left - 1)
    End If    
 
    '右側の再精査
    If (MaxIndex > Right + 1) Then
        Call QuickSort(WorkAry, Right + 1, MaxIndex)
    End if
 
End Function

【注意点】

文字列データの比較方法はOption Compareステートメントで設定します。

既定値はBinary モードです。バイナリ文字コードのコード順によって行われます。

文字コードはUnicodeで表現されるので、結果はUnicodeのコード順によって決まります。

Textモードでは、50音順で、大文字と小文字、カタカナとひらがなを区別しない。

(OSの国別情報の設定が日本の場合)

http://q.hatena.ne.jp ダミー

id:kaiketsu

簡単な関数はないんですね。。。。

2010/02/26 20:43:27
  • id:SALINGER
    そう。関数が無いのです。
    ADOを使ったりArrayListを使ったりする方法がありますが、
    ワークシートを使うと遅いようで実際は早かったりします。
    http://chotosplus.sakura.ne.jp/wordpress/2009/07/16/

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません