2014-07-14 34 views
2

我使用Excel for Mac 2011,並且我在一張表中有幾個複選框。我想他們用下面的代碼自動完成:ActiveSheet vs. WorkSheet

Private Sub CheckBox12_Click() 
    Dim ws As Worksheet 
    Set ws = ActiveSheet 
    With ws 
     If .Shapes("CheckBox12").OLEFormat.Object.Value = xlOn Then 
      .Range("CK1").EntireColumn.Hidden = False 
     Else 
      .Range("CK1").EntireColumn.Hidden = True 
     End If 
    End With 
End Sub 

此代碼給我的錯誤: 運行時錯誤445對象不支持此操作。

但是,如果刪除WS,只是做

Private Sub CheckBox12_Click() 
    With ActiveSheet 
     If .Shapes("CheckBox12").OLEFormat.Object.Value = xlOn Then 
      .Range("CK1").EntireColumn.Hidden = False 
     Else 
      .Range("CK1").EntireColumn.Hidden = True 
     End If 
    End With 
End Sub 

這一切正常。

這裏的交易是什麼?我知道我可以使用ActiveSheet,但我總是喜歡先設置它= ws,因爲它提供了屬性/方法的下拉列表。

+0

我試過你的代碼的複選框部分,它的工作,無論它是activesheet或工作表。這個問題似乎在別處。注意:我正在使用Windows操作系統。 – hnk

+0

您剛剛宣佈Dim ws爲工作表,但未將其分配給實際工作表。快速回答您的問題:使用第二個代碼片段。問候, –

+0

謝謝你們。亞歷克斯我說聲明後設置ws = ActiveSheet,是不夠的? – Yunfei

回答

0

我想你會得到一個編譯器錯誤,而不是運行時錯誤。

我懷疑ActiveSheet的工作原因是因爲編譯器沒有檢查它。另一方面,ws不起作用,因爲編譯器試圖解析它並且實際上有一個假標誌。所以編譯器檢查器有一個錯誤。它正在標記一個實際上不應該是錯誤的錯誤。

Object doesn't support this action (Error 445)

編輯:另外試試這個,讓我知道,如果它的工作原理:

Dim ws As Object 
Set ws = ActiveSheet 
With ws 
    ... 

還值得一提的是,ActiveSheetWorksheet是不一樣的東西。 ActiveSheet也可以包含ChartSheet;但ChartSheet不能成爲工作表。因此,With wsWith ActiveSheet之間的差異也許並不奇怪。

你應該嘗試是你的對象設置爲一個變量的另一件事情:

Dim ws As Worksheet 
Set ws = ActiveSheet 
Dim chk As Object 
With ws 
    Set chk = .Shapes("CheckBox12").OLEFormat.Object 
    If chk.Value = xlOn Then 
     .Range("CK1").EntireColumn.Hidden = False 
    Else 
     .Range("CK1").EntireColumn.Hidden = True 
    End If 
End With 

這可以從等式中刪除WS變量。當然,最好將其調暗爲正確的對象,而不是使用通用的as Object,但我不確定它會是什麼。

+0

我應該只使用錯誤恢復下一步然後..?似乎有點手波浪 – Yunfei

+0

不,你不應該使用錯誤恢復下一步。如果ActiveSheet正常工作,那麼無論你是否理解它,我都會使用它。當然,你的確提出了這個問題,因爲你想了解它。 –

相關問題