2015-03-31 69 views
-2

我正在编程创建一个Excel工作簿,在该工作簿中,需要在第一次打开工作簿时使用VBA创建一些滚动条。创建ActiveX控件并在同一个子集中设置值

我还需要同时设置滚动条的值。

下面是一些示例代码:

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手动,我得到一个滚动条创建,然后将其值设置。

但在打开的工作簿或运行Add_Set_Scroll我得到:

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

除非我注释掉调用Set_Scroll

这几乎就像代码运行太快基本过程并试图在正确创建之前设置滚动条的值。

我试着在调用Set_Scroll之前在任意延迟中添加一个函数并对返回进行评估(即确保它等待),但都无济于事。

搜索已经取得了什么帮助,我会很感激,如果任何人都可以在有何启示这个

+0

什么时候调用Add_Set_Scroll()?当你运行这个Sub时,错误发生在哪一行?对'Sheets(“Sheet1”)。Scroll_1.Value = 32767'的引用对我来说似乎是错误的,但是当你手动执行'Set_Scroll()'时,它会工作... – FreeMan 2015-03-31 14:14:02

+0

@FreeMan,'Add_Set_Scroll'没有得到称为,除非我手动运行它。这只是示例代码,用于演示如果在创建控件后立即发生控件设置错误,无论是在同一个Sub中还是在从另一个Sub中连续调用的单个子中,都会给出错误。该错误发生在Scroll值设置的行上。 – SiHa 2015-03-31 14:27:06

+0

@FreeMan。谢谢,你的评论让我看着正确的方向。 – SiHa 2015-03-31 15:21:42

回答

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 

你可以,当然,改变retrys的号码找到一个合适的值,并改变/消除故障处理。如果您无法访问您的滚动条对象,则可能需要在此处放置非常不同的内容,而不是MsgBox

+0

非常感谢一个有用的工作示例,“On Error Resume Next”。 – SiHa 2015-04-01 07:40:09

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,但它也需要一些时间才能被明确注册为工作表的属性,因此第一个例子工作的原因是我分别运行它们。

+0

很高兴我能帮到你。猜猜我应该做出答案:/。由于它似乎是一个简单的时间问题,我认为你可以在'.Object.value'部分尝试'On Error Resume'包装。我会在一个小样本项目中进行测试,如果强制关闭销毁,这将是无关紧要的。您也可以包含一个计数器,以便在重新计算5次时避免无限循环。 – FreeMan 2015-03-31 15:25:13

+0

如果你想让它成为答案,我会接受它。我会尝试包装的东西,以及谢谢。我对VBA非常陌生,并且曾经想过,但不确定如何去做。现在,Python,另一方面... – SiHa 2015-03-31 15:48:03