2016-12-01 112 views
0

我正在寫關閉工作簿之前更改按鈕顏色的VBA代碼。我的代碼寫在「Microsoft Excel對象」 - 「ThisWorkbook」下。我有兩個選項卡,一個叫做「User Interface_OneStep」,另一個叫做「User Interface_UserSupervised」。我想在關閉工作簿時更改兩個工作表上的按鈕顏色。VBA Excel事件「對象不支持此屬性或方法」錯誤

我現在遇到的問題是,如果我關閉工作簿時停留在「User Interface_OnseStep」中,則一切正常。但是如果我停留在「User Interface_UserSupervised」工作表中,當我嘗試關閉本書時,彈出一條「Object不支持此屬性或方法」的錯誤消息。我的代碼如下:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
ReDim ButtonNumberArray(14) As Variant 
ButtonNumberArray(0) = "Rectangle 95" 
ButtonNumberArray(1) = "Rectangle 92" 
ButtonNumberArray(2) = "Rectangle 98" 
ButtonNumberArray(3) = "Rectangle 104" 
ButtonNumberArray(4) = "Rectangle 105" 
ButtonNumberArray(5) = "Rectangle 106" 
ButtonNumberArray(6) = "Rectangle 103" 
ButtonNumberArray(7) = "Rectangle 96" 
ButtonNumberArray(8) = "Rectangle 114" 
ButtonNumberArray(9) = "Rectangle 89" 
ButtonNumberArray(10) = "Rectangle 120" 
ButtonNumberArray(11) = "Rectangle 123" 
ButtonNumberArray(12) = "Rectangle 128" 
ButtonNumberArray(13) = "Rectangle 122" 
ButtonNumberArray(14) = "Rectangle 137" 
For Each var In ButtonNumberArray 
    WorksheetName = "User Interface_OneStep" 
    Call ResetColorTemplate 
Next var 
ReDim ButtonNumberArray(18) As Variant 
ButtonNumberArray(0) = "Rectangle 84" 
ButtonNumberArray(1) = "Rectangle 89" 
ButtonNumberArray(2) = "Rectangle 2" 
ButtonNumberArray(3) = "Rectangle 12" 
ButtonNumberArray(4) = "Rectangle 88" 
ButtonNumberArray(5) = "Rectangle 13" 
ButtonNumberArray(6) = "Rectangle 14" 
ButtonNumberArray(7) = "Rectangle 15" 
ButtonNumberArray(8) = "Rectangle 40" 
ButtonNumberArray(9) = "Rectangle 16" 
ButtonNumberArray(10) = "Rectangle 81" 
ButtonNumberArray(11) = "Rectangle 17" 
ButtonNumberArray(12) = "Rectangle 57" 
ButtonNumberArray(13) = "Rectangle 86" 
ButtonNumberArray(14) = "Rectangle 62" 
ButtonNumberArray(15) = "Rectangle 65" 
ButtonNumberArray(16) = "Rectangle 67" 
ButtonNumberArray(17) = "Rectangle 64" 
ButtonNumberArray(18) = "Rectangle 74" 
For Each var In ButtonNumberArray 
    WorksheetName = "User Interface_UserSupervised" 
    Call ResetColorTemplate 
Next var 
End Sub 

的顏色模板宏此(在模塊寫入):

Option Explicit 
Public ButtonNumberArray() As Variant 
Public WorksheetName As String 

Sub ResetColorTemplate() 
ThisWorkbook.Worksheets(WorksheetName).Shapes.Range(ButtonNumberArray()).Select 
Selection.ShapeRange.ShapeStyle = msoShapeStylePreset22 
With Selection.ShapeRange.TextFrame2.TextRange.Font.Fill 
    .Visible = msoTrue 
    .ForeColor.RGB = RGB(0, 0, 0) 
    .Transparency = 0 
    .Solid 
End With 
End Sub 

在該行中出現的錯誤:

Selection.ShapeRange.ShapeStyle = msoShapeStylePreset22 

而當錯誤發生時, WorksheetName = User Interface_OneStep。爲什麼當我切換到另一個選項卡時,Excel無法修改其他選項卡的屬性?

在此先感謝!

+0

您需要可以定義'WorksheetName'全球,通過在模塊級爲'公共WorksheetName爲String',這樣所有的'Sub's的模塊將識別它decalring它。或者,您可以將它傳遞給'Sub ResetColorTemplate()' –

+0

抱歉,我確實定義了變量。忘了粘貼在這裏。感謝提醒。 – vivi11130704

回答

3

問題是Excel不能在形狀打開的工作表不活動時形狀Select。有兩種方法可以解決這個問題。兩者都涉及修改ResetColorTemplate

一號 - 選擇表

Sub ResetColorTemplate() 

    ThisWorkbook.Worksheets(WorksheetName).Select 
    ThisWorkbook.Worksheets(WorksheetName).Shapes.Range(ButtonNumberArray()).Select 
    Selection.ShapeRange.ShapeStyle = msoShapeStylePreset22 
    With Selection.ShapeRange.TextFrame2.TextRange.Font.Fill 
     .Visible = msoTrue 
     .ForeColor.RGB = RGB(0, 0, 0) 
     .Transparency = 0 
     .Solid 
    End With 

    End Sub 

兩種方式 - 直接工作,對象 - 首選方法

Sub ResetColorTemplate() 

Dim ws as Worksheet 
Set ws = ThisWorkbook.Worksheets(WorksheetName) 

With ws.Shapes.Range(ButtonNumberArray()).ShapeRange 
    .ShapeStyle = msoShapeStylePreset22 
    With .TextFrame2.TextRange.Font.Fill 
     .Visible = msoTrue 
     .ForeColor.RGB = RGB(0, 0, 0) 
     .Transparency = 0 
     .Solid 
    End With 
End With 

End Sub 
+0

This Works!非常感謝 !! – vivi11130704

1

斯科特·霍爾茨曼有正確的答案。

我只想指出,你應該只打ResetColorTemplateButtonNumberArray一次。

在這裏,你把它叫做一次For Each element in ButtonNumberArray

對於每個變種在ButtonNumberArray WorksheetName = 「用戶Interface_UserSupervised」 呼叫ResetColorTemplate下一步變種

你也避免全局變量擦肩而過的WorksheetNameButtonNumberArray作爲參數

子ResetColorTemplate(WorksheetName作爲字符串,ButtonNumberArray作爲變型)

就個人而言,我也創建構建控制陣列的功能。


Private Sub Workbook_BeforeClose() 
    ResetColorTemplate "User Interface_OneStep", getControlArray("Isosceles Triangle ", 95, 92, 98, 104, 105, 106, 103, 96, 114, 89, 120, 123, 128, 122, 137) 
    ResetColorTemplate "User Interface_UserSupervised", getControlArray("Isosceles Triangle ", 84, 89, 2, 12, 88, 13, 14, 15, 40, 16, 81, 17, 57, 86, 62, 65, 67, 64, 74) 

End Sub 

Sub ResetColorTemplate(WorksheetName As String, ButtonNumberArray As Variant) 
    With ThisWorkbook.Worksheets(WorksheetName).Shapes.Range(ButtonNumberArray).ShapeRange 
     .ShapeStyle = msoShapeStylePreset22 
     With .TextFrame2.TextRange.Font.Fill 
      .Visible = msoTrue 
      .ForeColor.RGB = RGB(0, 0, 0) 
      .Transparency = 0 
      .Solid 
     End With 
    End With 
End Sub 

Function getControlArray(BaseName As String, ParamArray CTRLNumbers()) 
    Dim x As Long 
    For x = 0 To UBound(CTRLNumbers) 
     CTRLNumbers(x) = BaseName & CTRLNumbers(x) 
    Next 
    getControlArray = CTRLNumbers 
End Function 
相關問題