2017-08-24 10 views
2

VBAの新機能 - OOP言語でゲッターとセッターを使用するようなシートプロパティを使用しようとしています。私は(明確にするために簡略化)シート1に次のコードを持っている:Excel VBA - シートプロパティはフィールドを割り当てません。

Option Explicit 

Private bAllowChange As Boolean 

Public Property Let AllowChange(bLetAllowChange As Boolean) 
    bAllowChange = bLetAllowChange 
End Property 

IはAllowChangeプロパティは、別のモジュール内のサブによって呼び出されたときに、bAllowChangeフィールドはそれに応じて更新されることが期待されます。 VBEのデバッグ機能を使用することにより、私はAllowChangeが正しい値(bLetAllowChangeが正しい値をとる)が、bAllowChangeに値を割り当てていないライン

bAllowChange = bLetAllowChange 

を渡されていることがわかります。 bAllowChangeをPublicに設定すると、期待どおりに動作しますが、これは最初にプロパティを使用する目的に反するものです。これはおそらくVBAの範囲について理解していない単純なものです。助言がありますか?前もって感謝します。

+0

あなたは本当に、あなたがしたい聞かせて/ getを使用したい場合は、クラスを設定することです。このリンクを参照してください。たとえば、http://www.cpearson.com/excel/classes.aspx –

+0

シートはVBAのクラスではありませんか?もしそうなら、プロパティはそれらのために働きませんか?そうでない場合は、通常のSubs/Functionsを使用する必要がありますか?私はWorksheet_Changeサブルーチンをサポートするためにこれらのプロパティを使用しています。そのため、私はSheetで作業しています。別のモジュールではありません。 –

+0

私は、プロパティが永続的であることを期待していると考えています。ではない。コードを解除するかワークブックを閉じると、プロパティがリセットされます。ワークブック[Workbook.CustomDocumentProperties](https://msdn.microsoft.com/en-us/vba/excel-vba/articles/workbook-customdocumentproperties-property-excel)にカスタムプロパティを追加できますが、個別のワークシートには追加できません。 –

答えて

0

私のために、次の作品:Module1ので

:シートで

Option Explicit 

Sub SetItToFalse() 
    Sheet1.AllowChange = False 
End Sub 
Sub SetItToTrue() 
    Sheet1.AllowChange = True 
End Sub 

Sheet1のコードネームを持つ:

Option Explicit 

Private bAllowChange As Boolean 

Public Property Let AllowChange(bLetAllowChange As Boolean) 
    bAllowChange = bLetAllowChange 
End Property 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    MsgBox bAllowChange 
End Sub 

設定しているコードでは、私が呼び出すことができますSetItToFalseサブルーチンを実行して、すべての選択変更が私にそれがFalseであることを示しています。 SetItToTrueを呼び出すと、すべての選択変更が私に表示されます。それはTrueです。

+0

コードを新しいワークブックにコピーし、あなたが記述したとおりに動作します。しかし、私は最初に、 'bAllowChange'をモニターするために追加したウォッチが、その後のSelection Changesにも' True'値を表示していたにもかかわらず、それをFalseと表示して混乱しました。 さらに、元のコードでウォッチウィンドウが表示されていたかどうかを確認しようとしましたが、問題は解決しません。私のコード/コンピュータ/設定で何か間違っているはずですので、私はこの質問に回答としてマークします。なぜなら、私が問題を説明したように、あなたの解決策を示しているからです。 –

+0

@ScottYoshidaウォッチウィンドウに追加するとき、それはあなたが見ていたSheet1で 'bAllowChange'だったことを確認しましたか?他のスコープ( 'Module1'など)で' bAllowChange'を誤って見たことがありませんでしたか? – YowE3K

+0

私は(All Procedures)と(All Modules)を選択しました。これにより、私はそれをどの範囲でも見ることができます。 –

2

あなたが永続的な性質をしたい場合は、(更新/カスタムプロパティを削除/取得/設定する方法のほんの一例)これを試して

Sub customProperties() 

    ActiveWorkbook.Sheets("Sheet1").customProperties.Add "abc123", 123 
    Debug.Print ActiveWorkbook.Sheets("Sheet1").customProperties(1)  ' custom properties are not indexed by name 

    ActiveWorkbook.Sheets("Sheet1").customProperties(1).Value = "this is my data" 
    Debug.Print ActiveWorkbook.Sheets("Sheet1").customProperties(1) 

    ActiveWorkbook.Sheets("Sheet1").customProperties(1).Delete 


    ' CustomDocumentProperties Types 
    ' msoPropertyTypeBoolean 2 
    ' msoPropertyTypeDate  3 
    ' msoPropertyTypeFloat 5 
    ' msoPropertyTypeNumber 1 
    ' msoPropertyTypeString 4 


    ActiveWorkbook.CustomDocumentProperties.Add Name:="xyz", LinkToContent:=False, Type:=msoPropertyTypeString, Value:="xyz" 
    Debug.Print ActiveWorkbook.CustomDocumentProperties("xyz") 

    ActiveWorkbook.CustomDocumentProperties("xyz").Value = "abcdefg" 
    Debug.Print ActiveWorkbook.CustomDocumentProperties("xyz") 

    ActiveWorkbook.CustomDocumentProperties("xyz").Delete 

End Sub 
+0

ワークシートにカスタムプロパティを追加できることはわかりませんでした。+1賞 –

0

あなたのカスタムワークシートのプロパティ値を格納するためのワークシートの名前のコレクションを使用することができます永久に。

この主な注意点は、値に等号が前に付いて返されることです。 (たとえば、name.Value = Trueを設定した後、name.Valueは= =Trueとなります)。私は私の例でこれを回避する方法をとった。

enter image description here


Public Property Let AllowChange(bLetAllowChange As Boolean) 
    Dim n As Name 
    On Error Resume Next 
    Set n = Me.Names("bLetAllowChange") 
    If n Is Nothing Then 
     Set n = Me.Names.Add("bLetAllowChange", bLetAllowChange) 
    End If 
    n.Value = bLetAllowChange 
    On Error GoTo 0 
End Property 

Public Property Get AllowChange() As Boolean 
    Dim result As String 
    On Error Resume Next 
    result = Me.Names("bLetAllowChange").Value 
    result = Right(result, Len(result) - 1) 
    AllowChange = Application.Evaluate(result) 
    On Error GoTo 0 
End Property 
関連する問題