创建ActiveX控件并在同一个Sub中设置Value

时间:2015-03-31 14:03:56

标签: excel-vba excel-2010 vba excel

我正在以编程方式创建一个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后,我得到了:

Run-time Error 438, Object doesn't support this propperty or method

除非我注释掉Set_Scroll

的来电

这几乎就像代码对于底层进程运行得太快,并尝试在正确创建之前设置滚动条的值。

我尝试添加任意延迟,或者在调用Add_Scroll之前使Set_Scroll成为函数并评估返回(即确保它等待),但都无济于事。

搜索没有任何帮助,如果有人能够对此进行阐述,我将非常感激

2 个答案:

答案 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,但它必须花一些时间才能明确注册为工作表的属性,因此第一个示例的工作原理如果我分开运行它们。