2016-11-05 10 views
0

アルゴリズムベースツールで作業中です。親切にも、以下の問題について私を助けてください。Excel VBA対応範囲の最小値から最大値に基づいて範囲内のセルアドレスを検索

1.最初に、1つの基準(ダイナミック)に基づいて行番号が見つかりました。私は列番号を見つける必要がある:(F1 B1)

3.Then数値を持つヘッダた:(F5 B5)

Set FindRow = SearchRange.Find(Sheet1.Cells(xRow, 2).Text, LookIn:=xlValues, lookat:=xlWhole)  
MyRow = FindRow.Row 

2.I行数は5であり、それは、より価値が設定されていると仮定つまり、MyColは(B1:F1)の最小値セルの列番号です

4.テストした結果、If Cells(MyRow,MyCol)="ABC" Thenテストで1つの条件が満たされなかった場合は、もう一度検索してください。(B1:F1)と列番号の最小値、すなわちMyCol、条件を満たすまで。

私は配列を試しましたが、私は解決策を見つけることができません、どんな助けも大歓迎です。事前に感謝します。

+0

あなたのアプローチからコードを投稿してください。 – Limak

答えて

0

私が正しく理解していれば、必要なものはインデックス付きの並べ替えです。多くの言語では、索引ソートが標準機能として提供されています。 VBAにはソートもインデックス付きソートも標準ではありません。

従来の配列ソートの場合、値は配列内でソートされます。例えば:私はソートにその配列を渡す場合

A  D  B  E  C 

、それは次のように返されます:

A  B  C  D  E 

しかし、時にはあなたは配列をソートすることはできません、私は値を持つ配列があるとします。あなたの場合、配列は列見出しの範囲です。これらの見出しは列に属しているため、並べ替えることはできません。列の順序は何かを意味するので、実際には不可能でおそらく容認できない列を並べ替える必要があります。

は、これらの両方の配列は変わらないキーを出てソートするソートに渡され
Keys A  D  B  E  C 
Indices 1  2  3  4  5 

指標が与える:インデックス付きソートして

は、あなたは配列のキーとインデックスを作成して

Indices 1  3  5  2  4 

通常の並べ替えでは、並べ替えられたエントリにArray(1)としてアクセスします。 Array(2)など。インデックス付きソートでは、ソートされたエントリにArray(Indices(1))としてアクセスします。 Array(Indices(2))など。

ソートされたエントリを取得するためにインデックスを使用することは、最初は分かりにくいことがあります。間違いなく、ソース配列に直接行くことは間違いありません。

以下、私はあなたにインデックス付き挿入ソートを与えました。挿入ソートは簡単で分かりやすいですが、エントリ数が多い場合は遅いです。ソートするエントリは5つしかないため、パフォーマンスは許容されます。 "Insertion Sort"のWikiエントリーを見て、それがどのように機能するかの絵デモンストレーションをしてください。

マクロDemoSortColumnHeadingsは、並べ替えの使い方と列見出しへのアクセス方法を示しています。私はこれがDemoSortColumnHeadingsをより理解しやすくすると信じているので、Keysの代わりにColHeadsColNumsの代わりにIndicesの名前を使用しました。ソートされたColNumsには、必要なシーケンス内の列番号が含まれています。ソート後、配列ColHeadsは必要なくなりました。

最後の1つです。 VBAは、配列の下限と上限を指定できる唯一の言語です。ほとんどの言語では、下限はゼロにする必要があります。私はこれを利用して、配列の次元を(2〜6)と定義し(0〜4)定義しませんでした。このため、配列ColNumsの値は列番号です。ほとんどの言語では、列番号を取得するためにColNums(N)+2が必要でした。

Option Explicit 
Sub DemoSortColumnHeadings() 

    Const ColFirst As Long = 2 ' Column B = column 2 
    Const ColLast As Long = 6 ' Column F = column 6 

    Dim ColCrnt As Long 
    Dim ColNums() As Long 
    Dim InxColNum As Long 
    Dim ColHeads() As String 

    With Worksheets("Test data") 

    ReDim ColHeads(ColFirst To ColLast) 
    ReDim ColNums(ColFirst To ColLast) 

    For ColCrnt = ColFirst To ColLast 
     ColHeads(ColCrnt) = .Cells(1, ColCrnt).Value 
     ColNums(ColCrnt) = ColCrnt 
    Next 


    Debug.Print "Initial sequence" 
    Debug.Print "|"; 
    For ColCrnt = ColFirst To ColLast 
     Debug.Print .Cells(1, ColCrnt).Value & "|"; 
    Next 
    Debug.Print 

    Call InsertionSort(ColNums, ColHeads) 

    Debug.Print "Final sequence" 
    Debug.Print "|"; 
    For InxColNum = LBound(ColNums) To UBound(ColNums) 
     ColCrnt = ColNums(InxColNum) 
     Debug.Print .Cells(1, ColCrnt).Value & "|"; 
    Next 
    Debug.Print 

    End With 


End Sub 
Public Sub InsertionSort(ByRef Indices() As Long, ByRef Keys() As String) 

    Dim Found As Boolean 
    Dim I As Long 
    Dim InxIFwd As Long 
    Dim InxIBack As Long 

    For InxIFwd = LBound(Indices) + 1 To UBound(Indices) 
    I = Indices(InxIFwd) ' Save value of current entry in Indices 
    ' Find first entry back, if any, such that Keys(I) >= Keys(Indices(InxIBack)) 
    ' If Keys(I) < Keys(Indices(InxIBack)), set Indices(InxIBack+1) to 
    ' Indices(InxIBack). That is move indices for keys greater that Keys(I) down 
    ' Indices leaving a space for I nearer the beginning. 
    Found = False 
    For InxIBack = InxIFwd - 1 To LBound(Indices) Step -1 
     If Keys(I) >= Keys(Indices(InxIBack)) Then 
     ' Keys(I) belongs after Keys(Indices(InxIBack)) 
     Indices(InxIBack + 1) = I 
     Found = True 
     Exit For 
     End If 
     Indices(InxIBack + 1) = Indices(InxIBack) 
    Next 
    If Not Found Then 
     ' Insertion point for I not found so it belongs at beginning of Indices 
     Indices(LBound(Indices)) = I 
    End If 
    Next 

End Sub 
+0

トニーありがとう! – Manish

+0

@Manish。どういたしまして。注:同じテクニックを使用するクイックソートの実装があります。ほとんどの場合、クイックソートは最も速いソートですが、理解するのがもっと難しい**です。私の実装では、54,000行のワークシートのキーとインデックスを作成し、1.5秒でインデックスをソートできます。大きな配列にソートされたインデックスが必要な場合は、これを覚えておいてください。 –

関連する問題