2016-09-07 3 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

확인란은 userform. 이 코드는 내가 찾는 것과 같습니다. 단, 각 시트 체크 박스에 시트 이름이 자동으로 표시됩니다. 이것은 "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이 될 때까지 가능한 모든 옵션을 실행하는 루틴이 필요합니다. (더 추가해야하지만 문제는 없습니다). 코드는 사용자 폼에서 실행됩니다. –