2016-07-24 5 views
1

ich mehrere benannte Bereiche für einen boolean True/False Wert überprüfen möchten. Ich muss die 1-Zelle Validierungsbereiche überprüfen (in der Reihenfolge) und wenn das Ergebnis True ist, muss ich .Select den entsprechenden benannten Bereich (dh den benannten Bereich ohne das entsprechende "validation_" Präfix und das Unterprogramm zu verlassen. Der folgende Code funktioniert, aber es ist nicht DRYLooping durch mehrere benannte Bereiche und gehen ähnlich benannten Bereich VBA

Hier ist ein Ausschnitt den Kern der Frage zu erhalten, aber diese If-ElseIf weiterhin für viele andere benannte Bereiche:.

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... 

Moeglichkeiten/Fragen:

  • Ich glaube, ich entweder ein Array von benannten Bereichen und eine Reihe Bereiche resultierenden „go-to“ genannt nutzen könnte?
  • Vielleicht könnte ich stattdessen eine collection verwenden?
  • Nicht sicher, ob eine for Schleife oder eine while Schleife besser wäre?
+0

Wenn Sie die Zellen in einem Bereich untersuchen, Sie wollen, wenn testen ** jede ** Zelle enthält * TRUE * oder wenn ** alle ** Zellen enthalten * TRUE * ??? –

+0

@ Gary'sStudent Es gibt einen separaten benannten Bereich, der prüft, ob ** irgendeine ** Zelle enthält * True * - dieses Problem wird im Voraus behandelt. Dann muss ich * diese Validierungen überprüfen, damit ich zur ersten fehlerhaften Zelle gehen kann; bearbeitete Frage zur Klärung. Denken Sie daran, ein Formular auszufüllen und dann den Benutzer an den * ersten Fehlerpunkt * zu senden. – JasonAizkalns

Antwort

3

einige „extra trocken“

Codes
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

Ich mag den Range.Find-Ansatz. Die Union kann wahrscheinlich auf 'Set r = Range ("validation_date, validation_name, validation_subcategory, validation_category") verkürzt werden' – Slai

+0

@Slai, das würde nicht funktionieren – user3598756

+0

@ user3598756 für mich in Excel 2007. In Excel arbeitet Bereiche Komma ist die Vereinigung und Raum ist Schnittpunkt. Dies hat auch funktioniert 'Setzen Sie r = [IF (Validierungsname, Name, IF (Validierungskategorie, Kategorie, A1))] – Slai

3

Ich gehe davon aus, dass diese 1-Zellbereiche. Wenn ja, sollten folgende Arbeiten:

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

Sie können mit Schleife durch alle genannten Bereiche so etwas wie:

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 

oder geben Sie sie wie diese

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

aktualisieren

Entschuldigung, ich habe die ganze Frage nicht gelesen. Scheint, als ob Sie irgendeine Art von Schlüssel verwenden - Wert Sammlung

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

aber auf diese Weise sind Sie nicht sicher, den _first_ benannten Bereich, dessen Wert ist "True" – user3598756

+0

Ich stimme mit @ user3598756, der erste Ansatz hat wahrscheinlich unbeabsichtigte Folgen und garantiert nicht die * erste * Übereinstimmung. Außerdem gibt es andere "validation _ \ *" Namen, die ich * nicht * zusammenbringen möchte. Dennoch ist es ein interessanter Ansatz für andere Fälle. – JasonAizkalns

Verwandte Themen