VBA를 사용한 Excel 사용자 양식의 프레임에 컨트롤 추가
라벨과 단추를 동적으로 만든 다음 사용자 양식 내의 프레임에 추가해야 합니다.이거 어떻게 해요?그것은 실제보다 더 쉬울 것 같습니다.
다음 코드는 컨트롤을 사용하여 사용자 양식의 프레임을 동적으로 채우는 방법을 보여줍니다.
제가 사용한 양식에는 Frame1이라는 프레임 컨트롤이 있어서 UserForm_에 있습니다.프레임 1을 초기화합니다.컨트롤.프레임에 컨트롤을 포함하려면 추가합니다.UserForm 코드 모듈에서 정의한 WithEvents 컨트롤 변수로 반환되는 컨트롤을 설정하여 원하는 컨트롤에 대한 이벤트에 응답할 수 있습니다.
이 방법을 사용하면 생성한 컨트롤에 대해 원하는 이벤트 코드를 미리 작성해야 합니다.
또한 상단, 왼쪽, 너비 및 높이 속성이 반드시 지능적으로 나타나지 않더라도 컨트롤을 배치하고 크기를 조정할 수 있습니다.
Private WithEvents Cmd As MSForms.CommandButton
Private WithEvents Lbl As MSForms.Label
Private Sub UserForm_Initialize()
Set Lbl = Frame1.Controls.Add("Forms.Label.1", "lbl1")
Lbl.Caption = "Foo"
Set Cmd = Frame1.Controls.Add("Forms.CommandButton.1", "cmd1")
End Sub
Private Sub Cmd_Click()
Cmd.Top = Cmd.Top + 5
End Sub
Private Sub Lbl_Click()
Lbl.Top = Lbl.Top + 5
End Sub
위의 주제에 대한 나의 변주.이것은 단지 4x4 배열의 버튼만을 위한 것입니다.사용자 양식을 만들어 코드에 추가합니다.레이블과 동일한 개념을 사용할 수 있습니다(또는 이전 답변 참조).
Private cmdLots(20) As MSForms.CommandButton
Private Sub UserForm_Initialize()
For i = 1 To 4
For j = 1 To 4
k = i + (4 * j)
Set cmdLots(k) = UserForm2.Controls.Add("Forms.CommandButton.1", "cmd1")
With cmdLots(k)
.Top = i * 25
.Left = (j * 80) - 50
.BackColor = RGB(50 * i, 50 * j, 0)
.Caption = "i= " & i & " j= " & j
End With
Next j
Next i
End Sub
그Add
방법
사용자 양식 또는 프레임에 컨트롤을 추가하려면 메소드를 사용합니다.
SetControl = object.Add(ProgID [, Name [, Visible ]] )
첫번째 인수는 어떤 종류의 컨트롤을 추가할 것인지를 언급할 것이고, 그것은ProgID
다음과 같이 정의됩니다.
프로그램 식별자.개체 클래스를 식별하는 공백이 없는 텍스트 문자열입니다.Prog의 표준 구문아이디는...에이프로그ID는 CLSID(Class Identifier)
기능적 해결책
이 과정을 보다 쉽게 하기 위해 열거형을 사용하여 다양한 컨트롤을 관리해 보겠습니다.
' List of all the MSForms Controls.
Public Enum MSFormControls
CheckBox
ComboBox
CommandButton
Frame
Image
Label
ListBox
MultiPage
OptionButton
ScrollBar
SpinButton
TabStrip
TextBox
ToggleButton
End Enum
이 열거형을 사용하면 이제 쉽게 Prog를 얻을 수 있는 함수를 만들 수 있습니다.모든 컨트롤에 대한 ID 문자열입니다.
' Gets the ProgID for each individual control. Used to create controls using `Object.add` method.
' @see https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/add-method-microsoft-forms
Public Function GetMSFormsProgID(control As MSFormControls) As String
Select Case control
Case MSFormControls.CheckBox: GetMSFormsProgID = "Forms.CheckBox.1"
Case MSFormControls.ComboBox: GetMSFormsProgID = "Forms.ComboBox.1"
Case MSFormControls.CommandButton: GetMSFormsProgID = "Forms.CommandButton.1"
Case MSFormControls.Frame: GetMSFormsProgID = "Forms.Frame.1"
Case MSFormControls.Image: GetMSFormsProgID = "Forms.Image.1"
Case MSFormControls.Label: GetMSFormsProgID = "Forms.Label.1"
Case MSFormControls.ListBox: GetMSFormsProgID = "Forms.ListBox.1"
Case MSFormControls.MultiPage: GetMSFormsProgID = "Forms.MultiPage.1"
Case MSFormControls.OptionButton: GetMSFormsProgID = "Forms.OptionButton.1"
Case MSFormControls.ScrollBar: GetMSFormsProgID = "Forms.ScrollBar.1"
Case MSFormControls.SpinButton: GetMSFormsProgID = "Forms.SpinButton.1"
Case MSFormControls.TabStrip: GetMSFormsProgID = "Forms.TabStrip.1"
Case MSFormControls.TextBox: GetMSFormsProgID = "Forms.TextBox.1"
Case MSFormControls.ToggleButton: GetMSFormsProgID = "Forms.ToggleButton.1"
End Select
End Function
그리고 마지막으로, 새로운 기능을 사용하여 형태나 프레임에 추가하는 기능을 만들어 보겠습니다.
' Easly add control to userform or a frame.
' @returns {MSForms.control} The control that was created
Public Function AddControl(userformOrFrame As Object _
, control As MSFormControls _
, Optional name As String = vbNullString _
, Optional visable As Boolean = True _
) As MSForms.control
Set AddControl = userformOrFrame.Controls.Add(GetMSFormsProgID(control), name, visable)
End Function
이와 같이 enum을 사용하는 것의 장점은 이제 모든 컨트롤에 대한 지능을 갖추고 모든 컨트롤을 기억할 필요가 없다는 것입니다.
데모
그것을 시연하기 위해, 우리는 열거를 루프함으로써 빈 사용자 양식에 모든 컨트롤을 추가할 수 있습니다.
Private Sub UserForm_Initialize()
demoAddingControlsToUserform
End Sub
Private Sub demoAddingControlsToUserform()
' Offset used to prevent controls
' overlapping as well as provide
' a height for the scrollbars
Dim offsetHeight As Double
' Add each control to the userform
' and set top to make sure they are not overlapping
' (Although this looks odd, you can actually loop enums this way.)
Dim control As MSFormControls
For control = CheckBox To ToggleButton
With AddControl(Me, control)
.Top = offsetHeight
offsetHeight = offsetHeight + .Height
End With
Next
' Show scrollbars and adjust the height to show
' all the added controls.
With Me
.ScrollBars = fmScrollBarsVertical
.ScrollHeight = offsetHeight + 20
End With
End Sub
언급URL : https://stackoverflow.com/questions/563972/adding-controls-to-a-frame-in-an-excel-userform-with-vba
'programing' 카테고리의 다른 글
사용자 지정 파워셸 함수 목록을 가져오는 방법은? (0) | 2023.09.17 |
---|---|
PHP MySQL(MariaDB) 쿼리 끊기 (0) | 2023.09.12 |
파워쉘 앱.구성 (0) | 2023.09.12 |
널 포인터 해제 (0) | 2023.09.12 |
시뮬레이터의 Xcode 오류: 이 플랫폼에서는 MGIsDeviceOfType이 지원되지 않습니다. (0) | 2023.09.12 |