2014-06-12 1 views
1

체크리스트 인 Excel 파일을 만들고 있는데 현재 열 D에 73 개의 확인란이 있습니다. 열 E에서는 옵션 필드의 사용자 이름을 기반으로 사용자 이름을 채 웁니다.일반 Checkbox_Click VBA 코드 만들기

현재 내가 코드를 가지고 다음과 같은 : 그것은 작동하지만 지금은 다른 일 동안 열로 F, H, J, L을 열 D를 복제 할 필요가 않습니다 D. 열의 각 확인란에 대한

Sub CheckBox1_Click() 
If ActiveSheet.CheckBoxes("Check Box 1").Value = 1 Then 
    Range("E3").Value = Application.UserName 
    Else: Range("E3").Value = "" 
End If 
End Sub 
Sub CheckBox2_Click() 
If ActiveSheet.CheckBoxes("Check Box 2").Value = 1 Then 
    Range("E4").Value = Application.UserName 
    Else: Range("E4").Value = "" 
End If 
End Sub 

일주일에 한 번 더 빨리 할 수있는 방법이 있다면 호기심이 생기고 긴 목록 대신이 작업을 수행하는 더 깨끗한 방법이 있습니다.

답변

2

다음과 같이 시도해보십시오. 각 체크 박스의 서식을 지정하고이 매크로를 포맷 | 매크로 지정 옵션.

Sub Generic_ChkBox() 
Dim cbName As String 
Dim cbCell As Range 
Dim printValue as String 

cbName = Application.Caller 

Set cbCell = ActiveSheet.CheckBoxes(cbName).TopLeftCell 

Select Case cbCell.Column 
    Case 4 
     'prints the username in column E 
     printValue = Application.UserName 
    Case 6 
     'prints "Something else" in column G 
     printValue = "Something else" 
    Case 8 
     'prints "etc..." in column I, etc. 
     printValue = "etc..." 
    Case 10 
     printValue = "etc..." 
    Case 12 
     printValue = "etc..." 
End Select 

If ActiveSheet.CheckBoxes(cbName).Value = 1 Then 
    cbCell.Offset(0, 1).Value = printValue 
Else 
    cbCell.Offset(0, 1).Value = vbNullString 
End If 

End Sub 
+0

활동 WorkShee에서 아래의 코드는 그냥 명확성을 위해, 당신은 모든 체크 박스를 선택하고 다음 한 행동 모두에 매크로를 지정 업데이트하시기 바랍니다. – Rory

+1

'Application.Caller'는 실제로 여러번 반복되는 동작에 유용합니다. 나를 여러 번 구해주었습니다. – bmgh1985

+1

@DavidZemens 그것은 질문이 아니 었습니다. 관찰이었습니다. – Rory

1

사용자 이름 값을 CheckBox의 다음 셀에 할당한다고 가정했습니다. D4에 체크 박스가있는 경우 값은 E4가됩니다.

Sub ProcessAllCheckBox() 
Dim ws As Worksheet, s As Shape 
Sheets("Sheet1").Columns("A:Z").ClearContents 
    Set ws = ActiveSheet 
    For Each chk In ActiveSheet.CheckBoxes 
    If chk.Value = 1 Then 
    Set s = ws.Shapes(chk.Caption) 
    Sheets("Sheet1").Range(Cells(s.TopLeftCell.Row, s.TopLeftCell.Column + 1), Cells(s.TopLeftCell.Row, s.TopLeftCell.Column + 1)).Value = Application.UserName 
    End If 
Next 

최종 하위

Private Sub Worksheet_Activate() 
For Each chk In ActiveSheet.CheckBoxes 
    chk.OnAction = "ProcessAllCheckBox" 
Next 
ProcessAllCheckBox 
End Sub 
+0

D3의 경우 D3의 경우 E3 등을 업데이트합니다. 이 오류가 발생하지만 400 오류가 발생합니다. 변경된 사항은 해당 위치에서 sheet1에서 sheet5까지 변경된 것입니다. –