2017-02-13 3 views
0

列Aには、列内で一意の同じ値のリストが含まれています。このリストの長さはわかりません。リストの上限と下限を決める最も効果的な方法は何ですか?値のリストの上限と下限を決定する

A | B | C | ... 
-------------------------- 
... | 
AAA | 
AAA | 
AAA | 
AAA | 
AAA | 
AAA | 
... | 

もちろん、これは、最初の位置から別の値に達するまでリストを反復することで解決できます。しかし、大きなリストでは、これは良い解決策ではないかと疑います。このシナリオで使用できる組み込みのExcel機能があれば、パフォーマンス上の利点がありますか?ここで

+0

ユーザーがリストをクリックすると、その長さにどのように影響するでしょうか?それは単に無関係のようです。問題の内容をより明確に説明できますか? –

+0

True @John Coleman、私はこれを削除しました。それは、関数をトリガするイベントです。私は問題を解決することができます。これは組み込みのExcel機能でこれが解決できるかどうかというパフォーマンス上の問題です。 – snflurry

+0

各「同じ値のリスト」は列に沿ってユニークですか?または、2つ(またはそれ以上)の「AAA」リストが存在する可能性がありますか? – user3598756

答えて

0

、次のようにあなたが

Function GetArea(rng As Range) As String 
    With rng.EntireColumn 
     .AutoFilter field:=1, Criteria1:=rng.Value 'ActiveCell.Value 
     GetArea= .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Areas(1).address 
     .Parent.AutoFilterMode = False 
    End With 
End Function 

はあなたの「メイン」のコードで悪用されるには、この小さなVBA機能を検討することもでき:

Sub Main() 
    MsgBox getarea(Range("A12")) '<--| get the bound of the list one element of which is cell A12 
End Sub 
0

は、あなたが適応できるいくつかのサンプルコードです:

Sub TheOuterLimits() 
    Dim r As Long, v As Variant 
    Dim a1 As String, a2 As String 
    Dim i As Long, c As Long 
    r = ActiveCell.Row 
    c = ActiveCell.Column 
    v = ActiveCell.Value 
    a1 = "" 
    a2 = "" 
    For i = r To 1 Step -1 
     If Cells(i, c).Value <> v Then 
      a1 = Cells(i, c).Address(0, 0) 
      Exit For 
     End If 
    Next i 

    For i = r To Rows.Count 
     If Cells(i, c).Value <> v Then 
      a2 = Cells(i, c).Address(0, 0) 
      Exit For 
     End If 
    Next i 

    MsgBox a1 & vbCrLf & a2 
End Sub 

enter image description here

パターンが始まり、どこで終わるところのコードがわかります。コメントでスコットCranerで指摘したように、Excelの組み込み関数以外の

関連する問題