2017-07-21 5 views
2

Ich habe diese sechs Arbeitsblätter in Form von zwei Arrays benannt, um ihre Aufgaben unabhängig voneinander zu erledigen. Darf ich wissen, warum dieser Code nicht richtig läuft?VBA Arbeitsblätter im Array auswählen

Der Fehler war in Sheets(i).Select, sagen, dass die Methode zum Auswählen der Arbeitsblattklasse fehlgeschlagen ist. Ich habe versucht, zu .Activate zu ändern, aber der Code scheint nicht zu laufen.

MyArray = Array("CPWAEB", "CPWAFB", "CRRTPN", "CRRTQN") 
MyArray1 = Array("ACM", "GMRTR") 

For Each i In MyArray 
    Sheets(i).Select 
    Range("G12").GoalSeek Goal:=0, ChangingCell:=Range("G7") 
Next i 

For Each j In MyArray1 
    Sheets(j).Select 
    ActiveSheet.Calculate 
Next j 
+0

Was ist Ihr Ziel? Was versuchst du zu machen? Was sollte der Code tun? – Wernerson

+0

'Sheets (MyArray (i))' – FunThomas

+0

@FunThomas es zeigt Typ nicht übereinstimmen. –

Antwort

2

Sie können wie folgt über die Arbeitsblätter in Ihrer Arbeitsmappe iterieren:

For Each i In MyArray 
    With ThisWorkbook.Worksheets(i) 
     .Range("G12").GoalSeek Goal:=0, ChangingCell:=.Range("G7") 
    End With 
Next i 

For Each j In MyArray1 
    With ThisWorkbook.Worksheets(j) 
     .Calculate 
    End With 
Next j 

Achten Sie darauf, alle Zellen (G12) in ihnen eine Formel haben, sonst GoalSeek fehl.

3

So sollte es nach einer guten Übung aussehen. Vermeiden Sie entweder Auswählen oder Aktivieren, was eine schlechte Übung ist.

Option Explicit 'Very first line ensures that every variable is declared properly. 

Public Sub MySub() 
    Dim MyArray() As Variant, MyArray1() As Variant 
    Dim i As Long 

    MyArray = Array("CPWAEB", "CPWAFB", "CRRTPN", "CRRTQN") 
    MyArray1 = Array("ACM", "GMRTR") 

    For i = LBound(MyArray) To UBound(MyArray) 
     With Worksheets(MyArray(i)) 
      .Range("G12").GoalSeek Goal:=0, ChangingCell:=.Range("G7") 
     End With 
    Next i 

    For i = LBound(MyArray1) To UBound(MyArray1) 
     Worksheets(MyArray1(i)).Calculate 
    Next i 
End Sub 

Wenn Sie Fehler führen in sicherstellen, dass alle Arbeitsblatt-Namen in dem Feld wirklich als ein Arbeitsblatt existieren.

0
Sub test() 
    Dim MyArray, i 
    MyArray = Array("CPWAEB", "CPWAFB", "CRRTPN", "CRRTQN") 

    For Each i In MyArray 
     ' Sheets(i).Select => This won't work when Sheets(i) is not active one 
     Sheets(i).Activate ' First activate 
     Range("G12").GoalSeek Goal:=0, ChangingCell:=Range("G7") ' Then use the Range on active sheet 
    Next i 

    ' When not necessary to activate the sheets 
    ' you can use Sheets with array as parameter 
    Dim sh As Worksheet 
    For Each sh In Sheets(MyArray) 
     sh.Range("G12").Value = sh.Name 
    Next sh 
End Sub 
Verwandte Themen