我正在以编程方式创建一个Excel工作簿,我需要在第一次打开工作簿时使用VBA创建一些ScrollBars。
我还需要同时设置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,然后设置其值。
但是在打开工作簿或运行Add_Set_Scroll
后,我得到了:
除非我注释掉Set_Scroll
这几乎就像代码对于底层进程运行得太快,并尝试在正确创建之前设置滚动条的值。
我尝试添加任意延迟,或者在调用Add_Scroll
之前使Set_Scroll
成为函数并评估返回(即确保它等待),但都无济于事。
搜索没有任何帮助,如果有人能够对此进行阐述,我将非常感激
答案 0 :(得分:1)
试一试。它正确引用了对象,并且还有一个重试:
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
当然,您可以更改重试次数以找到合适的值,并更改/消除失败的处理。如果您无法访问滚动条对象,则可能需要在其中放置一些非常不同的内容而不是MsgBox
。
答案 1 :(得分:0)
弗里曼上面的评论让我走上正轨,谢谢...... 问题在于我设置值的方式:
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,但它必须花一些时间才能明确注册为工作表的属性,因此第一个示例的工作原理如果我分开运行它们。