2016-07-24 9 views
1

に行く私はブールTrue/False値に対して複数の名前付き範囲をチェックしたいと思います。私は1セルの検証範囲(の順番で)を確認し、結果がTrueなら、.Select対応する名前付き範囲(つまり対応する"validation_"のない名前付き範囲)をサブルーチンを終了する必要があります。動作しますが、それはDRYではありません。ここ は、複数の名前付き範囲をループと類似した名前付き範囲VBA

が質問の主旨を取得するスニペットですが、この If-ElseIfは、他の多くの名前付き範囲のために続けて:。

If Range("validation_name") = True Then 
    Range("name").Select 
    Exit Sub 
ElseIf Range("validation_category") = True Then 
    Range("category").Select 
    Exit Sub 
ElseIf Range("validation_subcategory") = True Then 
    Range("subcategory").Select 
    Exit Sub 
' ... and many more... 

可能性/質問:

  • 私は名前付き範囲の配列と「行く-し、」名前付き範囲を結果の配列のいずれかを利用することができると思いますか?
  • おそらく、私が代わりにcollectionを使用することができますか?
  • forループまたはwhileループが良いだろう場合はわかりませんか?
+0

あなたは範囲内のセルを検討している場合は、あなたがどうかをテストしたいです**任意の**セルに* TRUE *が含まれている場合、または**すべての**セルに* TRUE *が含まれている場合 –

+0

@ Gary'sStudent **任意の**セルに* True *が含まれているかどうかをチェックする別の名前付き範囲があります。その問題は先に処理されます。次に、私が最初に失敗したセルに行くことができるように、*これらのバリデーションをチェック*する必要があります。明確にするために編集された質問。フォームに記入し、ユーザーを*失敗の最初のポイント*に送信してください。 – JasonAizkalns

答えて

3

いくつかの「エクストラドライ」のコードは、

Sub main() 
    Dim a As Variant 
    For Each a In Array("name", "category", "subcategory") 
     If Range("valid_" & a).Value = True Then 
      Range(a).Select 
      Exit Sub 
     End If 
    Next a 
End Sub 

Sub main2() 
    Dim r As Range, f As Range   
    Set r = Union(Range("validation_date"), Range("validation_name"), Range("validation_subcategory"), Range("validation_category")) 
    Set f = r.Find(what:="true", LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False) 
    If Not f Is Nothing Then Range(Replace(f.name.name, "validation_", "")).Select 
End Sub 
+0

私はRange.Findアプローチが好きです。連合はおそらく 'Set r = Range(" validation_date、validation_name、validation_subcategory、validation_category ")' – Slai

+0

@Slaiに短縮されます。 – user3598756

+0

@ user3598756はExcel 2007で動作します。コンマは、交差する。これはまた 'Set r = [IF(validation_name、name、IF(validation_category、category、A1))]' – Slai

3

私は、これらが1セルの範囲であることを前提としています。その場合は、次のように動作するはずです:

次のようなものを持つ名前付き範囲のすべてをループすることができます
Sub SelectRange() 
    Dim i As long, A As Variant 
    A = Array("validation_name", "validation_category", "validation_subcategory") 
    For i = 0 To UBound(A) 
     If Range(A(i)).Value = True Then 
      Range(Split(A(i),"_")(1)).Select 
      Exit Sub 
     End If 
    Next i 
End Sub 
2

Dim xlName As Name 
For each xlName In ActiveWorkbook.Names 
    If xlName.Name Like "validation_*" And Range(xlName.Name) = True Then 
     Application.Goto Replace(xlName.Name, "validation_", ""), True 
     Exit Sub 
    End If 
Next 

またはこの

For each strName In Split("name category subcategory") 
    If Range("validation_" & strName) = True Then 
     Application.Goto strName, True 
     Exit Sub 
    End If 
Next 

のようにそれらを指定するアップデート

申し訳ありませんが、私は、全体の質問を読んでいません。あなたは、キーのいくつかの種類を使用することができますように思える - 値のコレクションは

pairs = Array(Array("validation_name", "name"), _ 
       Array("validation_category", "category"), _ 
       Array("validation_subcategory", "subcategory")) 

For each pair In pairs 
    If Range(pair(0)) = True Then 
     Application.Goto pair(1), True 
     Exit Sub 
    End If 
Next 
+0

しかし、その値が "True"の_first_名前付き範囲を取得することがわからない場合 – user3598756

+0

私は@ user3598756に同意します。最初の方法は意図しない結果を招く可能性があり、*最初の*一致を保証しません。さらに、私が*一致させたくない他の "検証_ \ *"名前があります。それにもかかわらず、他の場合には考慮すべき面白いアプローチです。 – JasonAizkalns

関連する問題