2016-09-07 7 views
-1

こんにちは私はvbaでかなり新しいので、私のコードを撮影しないでください:-)。 私はリペアコードのセットを持っています。私は、このコードを単純化するために、コードネームを増やして使用することをお勧めします。私はそれを実行することができません。誰かがこの道を行くために少しでも私を助けてくれる? 私は何をしようとしています。ループでコードを簡略化

Sub Sheet1() 
If SheetCheckBox1.Visible = False Then Exit Sub 
If SheetCheckBox1.value = True Then 
    Sheets("Item_1").Select 
    Call Finalize 
End If 
End Sub 

Sub Sheet2() 
If SheetCheckBox2.Visible = False Then Exit Sub 
If SheetCheckBox2.value = True Then 
    Sheets("Item_2").Select 
    Call Finalize 
End If 
End Sub 

Sub Sheet3() 
If SheetCheckBox3.Visible = False Then Exit Sub 
If SheetCheckBox3.value = True Then 
    Sheets("Item_3").Select 
    Call Finalize 
End If 
End Sub 

あなたがこれを見ることができるようにすべきである: 第二のブロックは、現在のコードの一部である

Sub sheet41() 
Dim i As Integer 
Dim chkname As Integer 
chkname = "SheetCheckBox" & i 
i = 1 
Do 
    i = i + 1 
    If chkname.Visible = False Then Exit Sub 
    If chkname.value = True Then 
    Sheets("Item_" & i).Select 
    Call Finalize 
    End If 
Loop Until i = ThisWorkbook.Worksheets.Count 
End Sub 

これは古いコードである(それだけの数を増やし、同じコードの40個のブロックをです)私はasumeをきれいにすることができます。

+0

'chkname'は単なる文字列である、あなたはそれが参照する実際の制御を取得する必要があります - なぜあなたは整数としてchknameを定義していますか..? – stuartd

+1

@VladNeacsuコードレビューは作業コード用です。これは確かに – stuartd

+0

ではありません。また、処理の最初のシートはSheet2です。ループの開始時にiをインクリメントし、初期値は1です。 – stuartd

答えて

0

シート上のチェックボックスは、ActiveXコントロールしている場合は、チェックボックスにアクセスするためにこれを使用することができます:

Sheets("sheet1").OLEObjects("chkTest").Object 

チェックボックスの値を変更したい場合は、このようにそれを使用します。

Sheets("sheet1").OLEObjects("chkTest").Object.Value = True 

今、あなたの実際のシート名と"sheet1"を交換し、あなたの文字列chkname

だからあなたの完全なCへ"chkTest"を変更odeは次のようになります。

Dim i As Integer 
Dim sheetname As String 
Dim chkname As String 

sheetname = "YOUR SHEETNAME HERE" 

For i = 1 To ThisWorkbook.Worksheets.Count Step 1 

    chkname = "SheetCheckBox" & i 

    If Sheets(sheetname).OLEObjects(chkname).Object.Visible = False Then Exit Sub 

    If Sheets(sheetname).OLEObjects(chkname).Object.Value = True Then 

     Sheets("Item_" & i).Select 
     Call Finalize 
    End If 
Next i 
+0

チェックボックスはユーザーフォーム。このコードは、私が探しているもののように見えます。シート名はマークされた各チェックボックスで自動的に表示されます。これは、 "Item_1" "Item_2"などのチェックボックスのような範囲です。 –

+0

チェックボックスがuserformにある場合は、 'Sheets(sheetname)'をあなたのFormnameに置き換えることができます。あなたが同じワークシートを何度も何度も繰り返し使用している場合に備えてです – gizlmo

1

これはそうする必要があります。 finalizeがワークシートで呼び出されていない場合は、理由がイミディエイトウィンドウに印刷されます。

enter image description here

Sub ProcessWorkSheets() 

    Dim check As MSForms.CHECKBOX 
    Dim i As Integer 
    For i = 1 To Worksheets.Count 

     On Error Resume Next 
     Set check = Worksheets(i).OLEObjects("SheetCheckBox" & i).Object 
     On Error GoTo 0 
     If check Is Nothing Then 
      Debug.Print Worksheets(i).Name; " - Checkbox not found" 
     Else 
      If check.Visible And check.Value Then 
       Worksheets(i).Select 
       Call Finalize 
      Else 
       Debug.Print Worksheets(i).Name; " - Checkbox", "Visible", check.Visible, "Value:", check.Value 
      End If 
     End If 

     Set check = Nothing 
    Next 

End Sub 
+0

このコードを使用することができれば幸いです。基本的には、ボックスを印刷する必要はありませんが、最大シート数が40になるまで可能なすべてのオプションを実行するルーチンが必要です。(さらに追加する必要がありますが問題ありません)。コードは途中でユーザーフォーム上で実行されます。 –