如何使用多个命令按钮 (OLEObject) 创建一个新的 sheet?
How can I create a new sheet with multiple command buttons(OLEObject)?
我正在编写具有两个命令按钮的代码:
1) 用户输入
2) 执行
单击后,用户输入按钮会显示一个用户窗体。根据 UserForm 输入,worksheet 格式调整,用户在提示时将数据输入到 worksheet。 “执行”按钮执行计算并填写 sheet 的其余部分,然后绘制结果图表或打开一个新的 sheet,然后包含相同的两个按钮。
我可以创建新的 sheet,但是 sheet 只包含一个命令按钮。我的代码如下:
Dim obj As Object
Dim Code As String
Dim obj2 As Object
Dim code2 As String
With Sec_Delay
Set obj = .OLEObjects.Add(classType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=279, _
Top:=210.75, Width:=109.5, Height:=24)
obj.Name = "ButtonTest"
obj.Object.Caption = "USER INPUT"
Code = "Sub ButtonTest_Click()" & vbCrLf & _
"UF_input.Show" & vbCrLf & _
"End Sub"
Set obj2 = .OLEObjects.Add(classType:="Forms.CommandButton.2", _
Link:=False, DisplayAsIcon:=False, Left:=277.5, _
Top:=236.25, Width:=111, Height:=24)
obj2.Name = "Execute2Test"
obj2.Object.Caption = "Execute"
code2 = "Sub Execute2Test_Click()" & vbCrLf & _
"Cells(8,1) = 1" & vbCrLf & _
"End Sub"
With .Parent.VBProject.VBComponents(.CodeName).CodeModule
.insertlines .CountOfLines + 1, Code
End With
End With
此代码在我创建新 sheet 的子程序中。新的 sheet 称为 "Sec_Delay",它只有一个命令按钮。我从 Whosebug 上的其他地方提取了第一个命令按钮的代码,所以我不熟悉最后一部分的内容:
With .Parent.VBProject.VBComponents(.CodeName).CodeModule
.insertlines .CountOfLines + 1, Code
End With
但我基本上了解 OLEObject 的工作原理。我只是不知道如何为新 sheet.
创建第二个命令按钮
如何创建第二个命令按钮?为什么 "Forms.CommandButton.2" 什么都不做? “.1”到底是什么意思?是否可以在同一个 sub 中有两个 OLEObjects?
你快完成了...
"Forms.CommandButton.1" 是控件的 类名:它决定创建什么类型的控件,您不应该更改值或 excel不会认的。
代码的最后一部分将按钮的事件处理程序添加到 sheet 的代码模块:创建 sheet 后,您可以在 VB 中查看代码编辑.
Dim obj As Object
Dim Code As String
Dim obj2 As Object
Dim code2 As String
With Sec_Delay
Set obj = .OLEObjects.Add(classType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=279, _
Top:=210.75, Width:=109.5, Height:=24)
obj.Name = "ButtonTest"
obj.Object.Caption = "USER INPUT"
Code = "Sub ButtonTest_Click()" & vbCrLf & _
"UF_input.Show" & vbCrLf & _
"End Sub"
'edit: use "Forms.CommandButton.1" again
Set obj2 = .OLEObjects.Add(classType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=277.5, _
Top:=236.25, Width:=111, Height:=24)
obj2.Name = "Execute2Test"
obj2.Object.Caption = "Execute"
code2 = "Sub Execute2Test_Click()" & vbCrLf & _
"Cells(8,1) = 1" & vbCrLf & _
"End Sub"
With .Parent.VBProject.VBComponents(.CodeName).CodeModule
.insertlines .CountOfLines + 1, Code
.insertlines .CountOfLines + 1, code2 '<< added
End With
End With
编辑:如果您想从常规模块调用位于 sheet 模块中的代码,则需要在调用中包含模块名称。
Sub TestCall()
Sheet1.Tester
End Sub
...并确保您使用的是 sheet 的代号,而不是选项卡名称:
我正在编写具有两个命令按钮的代码:
1) 用户输入
2) 执行
单击后,用户输入按钮会显示一个用户窗体。根据 UserForm 输入,worksheet 格式调整,用户在提示时将数据输入到 worksheet。 “执行”按钮执行计算并填写 sheet 的其余部分,然后绘制结果图表或打开一个新的 sheet,然后包含相同的两个按钮。
我可以创建新的 sheet,但是 sheet 只包含一个命令按钮。我的代码如下:
Dim obj As Object
Dim Code As String
Dim obj2 As Object
Dim code2 As String
With Sec_Delay
Set obj = .OLEObjects.Add(classType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=279, _
Top:=210.75, Width:=109.5, Height:=24)
obj.Name = "ButtonTest"
obj.Object.Caption = "USER INPUT"
Code = "Sub ButtonTest_Click()" & vbCrLf & _
"UF_input.Show" & vbCrLf & _
"End Sub"
Set obj2 = .OLEObjects.Add(classType:="Forms.CommandButton.2", _
Link:=False, DisplayAsIcon:=False, Left:=277.5, _
Top:=236.25, Width:=111, Height:=24)
obj2.Name = "Execute2Test"
obj2.Object.Caption = "Execute"
code2 = "Sub Execute2Test_Click()" & vbCrLf & _
"Cells(8,1) = 1" & vbCrLf & _
"End Sub"
With .Parent.VBProject.VBComponents(.CodeName).CodeModule
.insertlines .CountOfLines + 1, Code
End With
End With
此代码在我创建新 sheet 的子程序中。新的 sheet 称为 "Sec_Delay",它只有一个命令按钮。我从 Whosebug 上的其他地方提取了第一个命令按钮的代码,所以我不熟悉最后一部分的内容:
With .Parent.VBProject.VBComponents(.CodeName).CodeModule
.insertlines .CountOfLines + 1, Code
End With
但我基本上了解 OLEObject 的工作原理。我只是不知道如何为新 sheet.
创建第二个命令按钮如何创建第二个命令按钮?为什么 "Forms.CommandButton.2" 什么都不做? “.1”到底是什么意思?是否可以在同一个 sub 中有两个 OLEObjects?
你快完成了...
"Forms.CommandButton.1" 是控件的 类名:它决定创建什么类型的控件,您不应该更改值或 excel不会认的。
代码的最后一部分将按钮的事件处理程序添加到 sheet 的代码模块:创建 sheet 后,您可以在 VB 中查看代码编辑.
Dim obj As Object
Dim Code As String
Dim obj2 As Object
Dim code2 As String
With Sec_Delay
Set obj = .OLEObjects.Add(classType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=279, _
Top:=210.75, Width:=109.5, Height:=24)
obj.Name = "ButtonTest"
obj.Object.Caption = "USER INPUT"
Code = "Sub ButtonTest_Click()" & vbCrLf & _
"UF_input.Show" & vbCrLf & _
"End Sub"
'edit: use "Forms.CommandButton.1" again
Set obj2 = .OLEObjects.Add(classType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=277.5, _
Top:=236.25, Width:=111, Height:=24)
obj2.Name = "Execute2Test"
obj2.Object.Caption = "Execute"
code2 = "Sub Execute2Test_Click()" & vbCrLf & _
"Cells(8,1) = 1" & vbCrLf & _
"End Sub"
With .Parent.VBProject.VBComponents(.CodeName).CodeModule
.insertlines .CountOfLines + 1, Code
.insertlines .CountOfLines + 1, code2 '<< added
End With
End With
编辑:如果您想从常规模块调用位于 sheet 模块中的代码,则需要在调用中包含模块名称。
Sub TestCall()
Sheet1.Tester
End Sub
...并确保您使用的是 sheet 的代号,而不是选项卡名称: