2015-03-31 68 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