创建 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