2017-11-09 4 views
0

루프에 문제가 있습니다. 워크 시트를 만들고 인쇄하고 (아직 작성하지 않은 채, 어떻게 작동하는지) 삭제 한 다음 삭제하고 싶습니다. 그 후 같은 일을하기 위해 다음 j로 진행하십시오. 그러나 그것은 j = 1에서 1로 되돌아 가고 있으므로 "print"라는 두 번째 워크 시트를 만들려고하고 있지만 불가능합니다.VBA for 루프가 작동하지 않습니다.

이름이 CheckBox1, CheckBox2, CheckBox'j '인 체크 박스가 있습니다. CheckBox1로 시작하고 CheckBox25로 끝내고 싶습니다. 그것이 사실이라면 시트를 인쇄하십시오.

는 내가 들어 처음 없애 필요가 있다고 생각 : Me.Controls
에서 각 Ctrl 키를 들어
그러나 나는 방법을 모른다. 변수 'j'를 지정해야하기 때문에.

Private Sub PrintKnop_Click() 

    Dim ctrl As MSForms.Control 
    For Each ctrl In Me.Controls 
     If TypeName(ctrl) = "CheckBox" And Left(ctrl.Name, 8) = "CheckBox" Then 
      Dim j As Integer 
      j = Mid(ctrl.Name, 9, 2) 

      For j = 1 To 1 
      'it should be possible to adjust the range. 
       If ctrl.Value = True Then 
        Dim ws As Worksheet 
        With ThisWorkbook 
        Worksheets("Veiligheid").Copy _ 
        before:=ActiveWorkbook.Sheets("Data") 
        Set ws = ActiveSheet 
        ws.Name = "print" 
        End With 

        'Application.DisplayAlerts = False 
        'Sheets("print").Delete 
        'Application.DisplayAlerts = True 
        'These shouldn't be comments, but if I uncomment it, it won't show the failures. 

       End If 
      Next 

      For j = 2 To 4 
       If ctrl.Value = True Then 
        With ThisWorkbook 
        Worksheets("Veiligheid").Copy _ 
        before:=ActiveWorkbook.Sheets("Data") 
        Set ws = ActiveSheet 
        ws.Name = "printen" 
        End With 

        'Application.DisplayAlerts = False 
        'Sheets("printen").Delete 
        'Application.DisplayAlerts = True 
       End If 
      Next 
     End If 
    Next 

End Sub 
+2

바로 다음 행에서 for 루프의 인덱스로'j'를 사용한다면'j = Mid (ctrl.Name, 9, 2)'의 점은 무엇입니까? 어떤 경우에도'For j = 1 To 1 '은 한 번만 실행될 것이지만 아마 여러 번 실행될 수있는 더 큰 루프에 포함됩니다. 나는 그 질문이 아주 불분명하다고 본다. 코드를 한 번만 실행하려면 루프에 넣지 마십시오. –

+0

그 값을 찾고자 할 경우 다음 대신에 대문자 선택을 사용하고 싶습니다. https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/select-case- statement # example – Clyde

답변

0

당신은 if j =

for j =For j = 루프를 혼동 할 수는 귀하의 변수를 동일하게 설정됩니다 값 다음에

선택 사례 j 문을 사용하면 더 편리 할 것입니다.

Private Sub PrintKnop_Click() 
    Dim ctrl As MSForms.Control 
    For Each ctrl In Me.Controls 
     If TypeName(ctrl) = "CheckBox" And Left(ctrl.Name, 8) = "CheckBox" And ctrl.Value = True Then 
      Dim j As Integer 
      j = Mid(ctrl.Name, 9, 2) 
      Select Case j 
       Case 1 
        'it should be possible to adjust the range. 
        Dim ws As Worksheet 
        With ThisWorkbook 
         Worksheets("Veiligheid").Copy _ 
         before:=ActiveWorkbook.Sheets("Data") 
         Set ws = ActiveSheet 
         ws.Name = "print" 
        End With 
        'Application.DisplayAlerts = False 
        'Sheets("print").Delete 
        'Application.DisplayAlerts = True 
        'These shouldn't be comments, but if I uncomment it, it won't show the failures. 
       Case 2 To 4 
        With ThisWorkbook 
         Worksheets("Veiligheid").Copy _ 
         before:=ActiveWorkbook.Sheets("Data") 
         Set ws = ActiveSheet 
         ws.Name = "printen" 
        End With 
        'Application.DisplayAlerts = False 
        'Sheets("printen").Delete 
        'Application.DisplayAlerts = True 
      End Select 
     End If 
    Next 
End Sub 
2

루프에서 작업을 반복하고 스위치 같은 작동을 찾고있는 것처럼 보입니다. Checkbox의 수를 변수 j으로 파싱한다는 의미입니다. 이 루프의 나머지 부분은 다음과 같습니다.

... Prepare variables for this loop round ... 

    If j = 1 Then 
     ... do something ... 
    Else 
     ... do something else ... 
    End If 

    ... Put here the part that stays the same regardless the j value ... 

아니요.이 섹션에는 루프가 필요하지 않습니다.

+1

또한 [사례 선택] (https://www.techonthenet.com/excel/formulas/case.php) – Vegard

+0

을 참조하십시오. 많은 경우가있을 경우 Select Case를 선택해야합니다. –

3

하나의 문제는 변수 j를 여러 번 사용하고 있다는 것입니다.

j = Mid(ctrl.Name, 9, 2) 
... 
For j = 1 to 1 
... 
For j = 2 to 4 
... 

선 J = 중간 (ctrl.Name, 9, 2) J 는 몇 가지 값을 할당한다.

j = 1에서 1까지의 줄은 j = 1로 설정하고 한 번 반복합니다.

J에 대한 행 = 2 각 루프를 J = 2 증가 J를 설정합니다 4

당신은 1 개 루프 = J의 경우에 루핑 및 단지로 이동되지 확신 (세 번 실행) 두 번째 루프?

Sub test() 

j = 2 + 3 
Debug.Print j 

For j = 99 to 99 
Debug.print j 
Next 

For j = 2 to 4 
Debug.print j 
Next 

End Sub 

이 값 (5), 출력 (99), 2, 3, 4

값은 숫자 순서를 벗어난 때 더욱 명백 할 것이다. 당신이 다른 J 값에 대한 코드 다른 일을해야 할 경우 당신은 같은 J. 2 개 루프를

+0

j = 1에서 25까지 반복하고 싶습니다. 그러나 j = 1에서 1로하면 뭔가해야합니다. j = 2 ~ 4 일 때 나는 뭔가 다른 것을 원합니다. 등 – Steffie

+0

@Steffie j = 1에서 25까지 반복하려면 일부 if 문을 포함하는 단일 루프가 있어야합니다. –

+0

하지만 if 문을 25 개 만들고 싶지 않습니다. – Steffie

0

,이 솔루션은 도움이 될 생각 :

ja = ja&"|"&Mid(ctrl.Name, 9, 2) 
j = split(ja,"|") 
for i = 0 to uBound(j) 
if cInt(j(i))=1 then do something 
if j(i)>1 AND j(i)<5 then do something 'j=2,3,4 
if j(i)>4 AND j(i)<26 then do something 'j=5-25 
next 

하지만Mid(ctrl.Name, 9, 2) 당신이 가진 의미 기호가 있고 CheckBox1의 경우 "x1", "1"이 아닙니다. 즉, 코드 jx1입니다.이것은 당신은 단지 1을 가질 수 있습니다

j = Mid(ctrl.Name, 9, 2) 
IF LEFT(j,1)="x" then j=RIGHT(j,1) 
For j = 1 to 25 
if j = 1 then.... 
if j >1 then... 
next 

: 당신은 당신이 한 줄 더 추가 할 수 있습니다, "확인란 0 1"과 같은 두 자리 인덱스에

당신의 체크 박스 이름을 변경해야하는 OR

1 개 에서 편집 다만, "CheckBox1을"의 길이 당신은 체크 박스 NUM을 얻을 필요가 있습니다 9.입니다 발견 BER 바로이 문자에서 :

j = RIGHT(ctrl.Name,2) 

그리고, "X"를 제거 :

IF LEFT(j,1)="x" then j=RIGHT(j,1)