2013-07-15 2 views
3

Excel VBA에서 내 체크 박스를 회색으로 표시하고 싶습니다. Checkbox.Enabled = False을 사용할 때 확인란은 편집 할 수 없지만 회색이 아닙니다. 회색으로 빛나는 효과를 얻으려면 어떻게해야합니까?VBA 회색 확인란

Excel 2010에서 양식 컨트롤 사용. 개발자 탭을 통해 Excel 워크 시트에 직접 삽입되었습니다. VBA 사용자 양식에는 사용되지 않습니다.

감사합니다.

+0

@ mehow 그 대답은 모든 체크 박스의 선택을 해제하는 방법을 보여줍니다. 회색으로 표시하거나 비활성화하는 것은 아닙니다. – steventnorris

+0

체크 박스를 반복하는 방법을 보여줍니다. ActiveX 체크 박스 또는 폼 컨트롤에 대해 이야기하고 있습니까? '회색을 쓴다 '는 것은 무엇을 의미합니까? 그러한 속성이 없다는 것을 보여 주거나 예제를 보여줍니다. –

+0

@mehow 체크 박스를 반복하는 방법을 알고 있습니다. 양식 컨트롤을 사용하고 있습니다. 양식의 필드를 회색으로 표시하는 것은 공용 영역으로 필드를 비활성화하고 거의 회색으로 표시되며 거의 유령으로 간주됩니다. 일반적으로 이것은 양식을 사용할 때 자동 기능이며 컨트롤을 사용할 수 없습니다. – steventnorris

답변

7

누구나 "불가능합니다"라고 말할 때마다 내 고집스런 조흔에 부딪칩니다. 그래서 나는 당신에게 선물 할 수 있습니다 : "불가능한".

"가시"및 활성화 확인란 :

enter image description here

은 "사용 안 함"확인란을 (당신이 커버 모양의 두 색상 및 투명도에 대한 코드 값을 변경하여 가시성의 정도를 조정할 수) :

enter image description here

기본 아이디어 : 당신이 체크 박스를 통해 반 투명 형태를 배치하고 그것에 더미 매크로를 할당합니다. 이제 체크 상자의 값을 변경할 수 없습니다. "토글 (Toggle)"버튼은 상태를 변경하기위한 것입니다 - 도형을 배치하거나 제거하십시오. 전역 변수를 사용하여 현재 상태를 추적합니다.

마지막으로 반복 할 컬렉션을 수정하면 안되기 때문에 모양을 삭제하거나 추가 할 때는 For Each을 사용할 수 없습니다. 나는 단순한 "카운트 셰이프 (count shapes)"를 우회하여 숫자 인덱스로 거꾸로 반복했다.

해킹입니까? 내기! 그것은 당신이 요구 한대로합니까? 예!

Dim checkBoxesVisible As Boolean 
Option Explicit 

Sub toggleIt() 
' macro assigned to "Toggle visibility" button 
    checkBoxesVisible = Not checkBoxesVisible 
    toggleCheckboxes checkBoxesVisible 
End Sub 

Sub grayOut(cb) 
' put a "cover" shape over a checkbox 
' change the color and transparency to adjust the appearance 
    Dim cover As Shape 
    Set cover = ActiveSheet.Shapes.AddShape(msoShapeRectangle, cb.Left, cb.Top, cb.Width, cb.Height) 
    With cover 
    .Line.Visible = msoFalse 
    With .Fill 
     .Visible = msoTrue 
     .ForeColor.RGB = RGB(255, 255, 255) 
     .Transparency = 0.4 
     .Solid 
    End With 
    End With 
    cover.Name = "cover" 
    cover.OnAction = "doNothing" 
End Sub 

Sub doNothing() 
' dummy macro to assign to cover shapes 
End Sub 

Sub unGray(cb) 
' find the cover shape for the checkbox passed as the argument 
' and delete it 
' "correct shape" has the name "cover" and is properly aligned with top left 
    Dim sh As Shape 
    For Each sh In ActiveSheet.Shapes 
    If sh.Name = "cover" And sh.Left = cb.Left And sh.Top = cb.Top Then 
     sh.Delete 
     Exit For 
    End If 
    Next sh 
End Sub 

Sub toggleCheckboxes(onOff) 
    Dim s As Shape 
    Dim n As Integer, ii As Integer 

    n = ActiveSheet.Shapes.Count 
    ' loop backwards over shapes: if you do a "For Each" you get in trouble 
    ' when you delete things! 

    For ii = n To 1 Step -1 
    Set s = ActiveSheet.Shapes(ii) 
    If s.Type = msoFormControl Then 
     If s.FormControlType = xlCheckBox Then 
     If onOff Then 
      unGray s 
     Else 
      grayOut s 
     End If 
     End If 
    End If 
    Next ii 

End Sub 
+0

+1 내가 생각하기로는 추가/삭제 대신에 –

+0

앞에오고 싶다/뒤로 보내기 – robotik

+0

@robotik 좋은 생각 - 나는 이것을 (3 년 전에 ...) 썼을 때 생각하지 않았다. – Floris

2

약간의 해킹 -하지만 다음은 작동합니다. 내가 버튼을 클릭하면

Private Sub DisableButton_Click() 

    CheckBox1.Enabled = Not (CheckBox1.Enabled) 
    If CheckBox1.Enabled Then 
    CheckBox1.ForeColor = RGB(0, 0, 0) 
    Else 
    CheckBox1.ForeColor = RGB(128, 128, 128) 
    End If 

End Sub 

, 체크 박스가 회색으로 표시되고 사용할 수 없게되었습니다 정기적 체크 박스 (CheckBox1), 나는 다음과 같은 코드로 "DisableButton을"이라는 버튼 - 나는 두 개의 컨트롤과 간단한 사용자 정의 폼을 만들었습니다. 그것을 다시 클릭하면 "인생을 되찾았습니다". 나는 이것이 당신이 찾고 있던 효과라고 생각합니다. 그것이 아니라면 - 그게 주석을위한 것입니다. 여기

는 모습입니다 : 나는 당신이 워크 시트 내에서 무엇을하려고 불가능 두려워

enter image description hereenter image description here

+1

그게 내가 원하는거야,하지만 코드가 작동하지 않습니다. forecolor 사용할 때 "개체가이 속성 또는 메서드를 지원하지 않습니다."오류가 발생합니다. 명확하게하기 위해 확인란은 개발자 탭을 사용하여 VBA의 작성된 사용자 양식이 아닌 Excel 워크 시트에 직접 삽입됩니다. 어쩌면이 오류의 원인입니까? – steventnorris

+0

@steventnorris 스프레드 시트에서 해당 작업을 수행 할 수 없습니다. –

+0

@ mehow 체크 박스를 추가 할 수 없거나 회색으로 변경할 수 없습니다. – steventnorris

1

. 사용자 정의 폼을 사용하고 있다면 Floris의 대답을 참조 할 수 있습니다.
(양식/워크 시트) 확인란의 속성에 대한 자세한 내용은 MSDN

+0

FormBox의 CheckBox 워크 시트의 속성과 메서드 만 사용하여 "불가능합니다". 그러나 Excel에서도 가능합니다. 내 두 번째 대답을 참조하십시오. – Floris

0

어쩌면 이것이 원하는 것일 수 있습니다.

개인 서브 CheckBox1_Click() CheckBox1을 선택하면 checkbox2이 비활성화되어 있는지

If CheckBox1.Value = True Then 
    CheckBox2.Value = False 
    CheckBox2.Enabled = False 
    CheckBox2.ForeColor = rgbBlue 

Else 
    CheckBox2.Visible = True 
    CheckBox2.ForeColor = rgbAntiqueWhite 
    CheckBox2.Enabled = True 

End If 

코드 다세대; 검사하지 않고 전 치환기를 변경합니다. 색상은 원하는 것일 수 있습니다. 엑셀 워크 시트의 확인란과 직접 비교하십시오.

0

플로리스 'idea 기준.

코드는 모든 컨트롤이 ActiveSheet에 있다고 가정하고 CheckBox1 및 CheckBox2라고하며, 그렇지 않으면 적절하게 변경합니다.

CheckBox1을 클릭 할 때이를 호출 할 수 있으며 선택적인 체크 상태 (참/거짓)로 다른 하위에서 호출하여 CheckBox1을 선택 또는 선택 취소 할 수 있습니다.

CheckBox2 위에 물체를 그리고 그 이름을 "마스크"(당신은 그것을 다른 어떤 이름을 지정할 수 있지만, 당신은 그에 따라 코드를 변경해야 할)

가지 적어 당신의 배경 색상과 불투명도와 같은 채우기 색상을 마스크 약 50 %의

Public Sub CheckBox1_Click(Optional ticked As Variant) 
    Application.ScreenUpdating = False 
    ActiveSheet.Unprotect 
    If Not IsMissing(ticked) Then 
     If ticked = True Then ActiveSheet.Shapes("CheckBox1").OLEFormat.Object.Value = 1 Else ActiveSheet.Shapes("CheckBox1").OLEFormat.Object.Value = -4146 
    End If 
    If ActiveSheet.Shapes("CheckBox1").OLEFormat.Object.Value > 0 Then 
     ActiveSheet.Shapes("mask").OLEFormat.Object.ShapeRange.ZOrder msoSendToBack 
    Else 
     ActiveSheet.Shapes("mask").OLEFormat.Object.ShapeRange.ZOrder msoBringToFront 
    End If 
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True 
    Application.ScreenUpdating = True 
End Sub 

은 이제 CheckBox1을 틱마다, 마스크 CheckBox2을 숨길 앞에 와서 당신이 그것을을 선택 취소 할 때 마스크를 숨기기를 취소 할 백업 간다. 불투명하기 때문에 회색 효과가 나타나며 활성화/비활성화에 대해 걱정할 필요조차 없습니다.

사용자가 실수로 마스크를 이동하거나 편집 할 수 없도록 워크 시트를 보호해야하지만 SendToBack/BringToFront이 작동하려면 보호되지 않아야하므로 코드에서 수행해야합니다. Application.Protect 부분에서 보호 설정을 확인하십시오.