2017-07-21 19 views
2

2つの配列の形式で6つのワークシートに名前を付けて、それぞれのタスクを独立して実行しました。なぜこのコードが正しく動作しないのか分かりますか?VBAワークシートを配列で選択する

エラーはSheets(i).Selectであり、ワークシートクラスを選択する方法が失敗したことを示しています。 .Activateに変更しようとしましたが、コードが実行されていないようです。

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

あなたの目標は何ですか?あなたは何をしようとしているのですか?コードは何をすべきですか? – Wernerson

+0

'Sheets(MyArray(i))' – FunThomas

+0

@FunThomasそれは型の不一致を示します。 –

答えて

2

あなたは、このようなあなたのワークブックのワークシートを反復処理することができます。

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 

は、すべてのセル(G12)は、それらの数式を持っていることを確認し、そうでない場合GoalSeekは失敗します。

3

これは、良い習慣のように見える方法です。 SelectやActivateの使用は避けてください。これは悪い習慣です。

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 

エラーが発生した場合は、配列内のすべてのワークシート名が実際にワークシートとして存在することを確認してください。

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 
関連する問題