2016-12-01 13 views
0

ブックを閉じる前にボタンの色を変更するためのVBAコードを作成しています。私のコードは "Microsoft Excel Objects" - "ThisWorkbook"の下に書かれています。私は2つのタブがあり、1つは「User Interface_OneStep」と呼ばれ、もう1つは「User Interface_UserSupervised」と呼ばれます。ワークブックを閉じると、両方のワークシートのボタンの色を変更したいと思います。VBA Excelイベント「オブジェクトがこのプロパティまたはメソッドをサポートしていません」エラー

私は今、問題があるのは、私が "User Interface_OnseStep"に留まってブックを閉じると、すべて正常に動作するということです。しかし、私が "User Interface_UserSupervised"ワークシートに残っていると、ブックを閉じるときに、 "オブジェクトがこのプロパティまたはメソッドをサポートしていません"というエラーメッセージが表示されます。私のコードは、以下である:

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 =ユーザーInterface_OneStep。なぜ別のタブに切り替えると、Excelは他のタブのプロパティを変更できないのですか?

ありがとうございます!

+0

あなたはSTRING'として '公共worksheetnameを、モジュール内のすべての' Sub'sがそれを認識します。この方法として、モジュールレベルでそれをdecalringことで、 'グローバルとしてWorksheetName'を定義するか必要があります。あるいは、 'Sub ResetColorTemplate()' –

+0

に渡すことができます。申し訳ありませんが、変数を定義しました。ここに貼り付けるのを忘れてしまった。思い出してくれてありがとう。 – vivi11130704

答えて

3

シェイプがオンのワークシートがアクティブでない場合、ExcelはSelectという形にできません。これには2つの方法があります。どちらも修正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 

方向2 - オブジェクトを直接操作 - 優先メソッド

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

これは機能します!どうもありがとう !! – vivi11130704

1

スコット・ホルツマンは、正しい答えを持っています。

ButtonNumberArrayに1回だけResetColorTemplateを電話する必要があることを指摘したいと思います。ここで

あなたは worksheetnameを= コールResetColorTemplate次のVARを "ユーザーがInterface_UserSupervised" ButtonNumberArrayの各VARのために一度For Each element in ButtonNumberArray

それを呼び出す

また、あなたがWorksheetNameを渡すことによってグローバル変数を避けますパラメータとしてButtonNumberArray

サブResetColorTemplate(文字列、バリアントとしてButtonNumberArrayとしてworksheetnameを)個人

、私はまた、制御配列を構築する機能を作成します。


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 
関連する問題