创建 ActiveX 控件并在同一个 Sub 中设置值
Create ActiveX Control and set Value in same Sub
我正在以编程方式创建一个 Excel 工作簿,我需要在其中使用 VBA.
在第一次打开工作簿时创建一些滚动条
我还需要同时设置ScrollBars的值
下面是一些示例代码:
Private Sub Workbook_Open()
Call Add_Scroll
Call Set_Scroll
End Sub
Sub Add_Scroll()
Sheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ScrollBar.1", Link:=False, _
DisplayAsIcon:=False, Left:=159.75, Top:=77.25, Width:=290.25, Height _
:=36.75).Name = "Scroll_1"
End Sub
Sub Set_Scroll()
Sheets("Sheet1").Scroll_1.Value = 32767
End Sub
Sub Add_Set_Scroll()
Sheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ScrollBar.1", Link:=False, _
DisplayAsIcon:=False, Left:=159.75, Top:=77.25, Width:=290.25, Height _
:=36.75).Name = "Scroll_1"
Sheets("Sheet1").Scroll_1.Value = 32767
End Sub
现在,如果我 运行 Add_Scroll
然后手动 Set_Scroll
,我会创建一个 ScrollBar,然后设置它的值。
但是在打开工作簿时,或者 运行ning Add_Set_Scroll
我得到:
除非我注释掉对 Set_Scroll
的调用
这几乎就像代码 运行 对底层进程来说太快了,并试图在正确创建滚动条之前设置它的值。
我试过添加任意延迟,或者使 Add_Scroll
成为一个函数并在调用 Set_Scroll
之前评估 return(即确保它等待),全部失败有用
搜索没有任何帮助,如果有人能对此有所了解,我将不胜感激
上面弗里曼的评论让我走上了正确的轨道,所以谢谢...
问题出在我设置值的方式上:
Sheets("Sheet1").Scroll_1.Value = 32767
应该是:
Sheets("Sheet1").OLEObjects("Scroll_1").Object.Value = 32767
来自Using ActiveX Controls on Sheets [Excel 2003 VBA Language Reference]
我想当控件被创建时,它会立即被注册为一个 OLEObject,但它必须花费一些时间才能被显式注册为工作表的 属性,因此如果我 运行 它们分开,第一个示例就可以工作的原因。
试一试。它正确引用了对象,并且还有重试:
Sub Add_Set_Scroll()
Dim RetryCount as integer
On Error Goto eh
RetryCount = 0
Sheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ScrollBar.1", Link:=False, _
DisplayAsIcon:=False, Left:=159.75, Top:=77.25, Width:=290.25, Height _
:=36.75).Name = "Scroll_1"
Sheets("Sheet1").OLEObjects("Scroll_1").object.Value = 32767
exit sub
eh:
If retrycount < 5 then
RetryCount = RetryCount + 1
Resume
else
MsgBox "Tried 5 times, can't get to the scroll bar"
Resume Next
End if
End Sub
当然,您可以更改重试次数以找到合适的值,以及change/eliminate失败处理。如果您无法访问滚动条对象,您可能需要在其中放置一些非常不同的东西而不是 MsgBox
。
我正在以编程方式创建一个 Excel 工作簿,我需要在其中使用 VBA.
在第一次打开工作簿时创建一些滚动条我还需要同时设置ScrollBars的值
下面是一些示例代码:
Private Sub Workbook_Open()
Call Add_Scroll
Call Set_Scroll
End Sub
Sub Add_Scroll()
Sheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ScrollBar.1", Link:=False, _
DisplayAsIcon:=False, Left:=159.75, Top:=77.25, Width:=290.25, Height _
:=36.75).Name = "Scroll_1"
End Sub
Sub Set_Scroll()
Sheets("Sheet1").Scroll_1.Value = 32767
End Sub
Sub Add_Set_Scroll()
Sheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ScrollBar.1", Link:=False, _
DisplayAsIcon:=False, Left:=159.75, Top:=77.25, Width:=290.25, Height _
:=36.75).Name = "Scroll_1"
Sheets("Sheet1").Scroll_1.Value = 32767
End Sub
现在,如果我 运行 Add_Scroll
然后手动 Set_Scroll
,我会创建一个 ScrollBar,然后设置它的值。
但是在打开工作簿时,或者 运行ning Add_Set_Scroll
我得到:
除非我注释掉对 Set_Scroll
这几乎就像代码 运行 对底层进程来说太快了,并试图在正确创建滚动条之前设置它的值。
我试过添加任意延迟,或者使 Add_Scroll
成为一个函数并在调用 Set_Scroll
之前评估 return(即确保它等待),全部失败有用
搜索没有任何帮助,如果有人能对此有所了解,我将不胜感激
上面弗里曼的评论让我走上了正确的轨道,所以谢谢... 问题出在我设置值的方式上:
Sheets("Sheet1").Scroll_1.Value = 32767
应该是:
Sheets("Sheet1").OLEObjects("Scroll_1").Object.Value = 32767
来自Using ActiveX Controls on Sheets [Excel 2003 VBA Language Reference]
我想当控件被创建时,它会立即被注册为一个 OLEObject,但它必须花费一些时间才能被显式注册为工作表的 属性,因此如果我 运行 它们分开,第一个示例就可以工作的原因。
试一试。它正确引用了对象,并且还有重试:
Sub Add_Set_Scroll()
Dim RetryCount as integer
On Error Goto eh
RetryCount = 0
Sheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ScrollBar.1", Link:=False, _
DisplayAsIcon:=False, Left:=159.75, Top:=77.25, Width:=290.25, Height _
:=36.75).Name = "Scroll_1"
Sheets("Sheet1").OLEObjects("Scroll_1").object.Value = 32767
exit sub
eh:
If retrycount < 5 then
RetryCount = RetryCount + 1
Resume
else
MsgBox "Tried 5 times, can't get to the scroll bar"
Resume Next
End if
End Sub
当然,您可以更改重试次数以找到合适的值,以及change/eliminate失败处理。如果您无法访问滚动条对象,您可能需要在其中放置一些非常不同的东西而不是 MsgBox
。