Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー

エクセルVBAでシートモジュールでのパブリック変数

エクセル2000です。 標準モジュールで取得したパブリック変数は他のシートモジュールで参照できますが、逆にシートモジュールで取得したパブリック変数は他のシートで参照できないのでしょうか? シートチェンジイベントで取得した文字列を変数nmに格納し、ワークブックモジュールで呼び出そうとしたら何もでてきませんでした。 どうやったらよいのでしょうか? 'シートモジュールの記述 Public nm As String Private Sub Worksheet_Change(ByVal Target As Range) Dim rw As Integer If Intersect(Target, Range("A1").CurrentRegion) Is Nothing Then Exit Sub If Selection.Count > 1 Then Exit Sub rw = Target.Row nm = IIf(Cells(rw, "A") = "", Cells(rw, "A").End(xlUp).Value, Cells(rw, "A").Value) 'MsgBox nm End Sub 'ThisWorkbookモジュールの記述 Private Sub Workbook_BeforeClose(Cancel As Boolean) If nm = "" Then Exit Sub MsgBox nm & "さん、ご苦労様でした。" End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

Public nm As String をsheetで宣言してないかい。 標準モジュールで宣言すれば? sheetやのbookはPrivate なんだから。

merlionXX
質問者

お礼

そうでしたか。 質問で書いたとおりシートモジュールで宣言をしていました。 標準モジュールで宣言するよう変えたらうまくいきました。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。 オブジェクトモジュール(クラス、シート、ThisWorkbook、Userform 等)で 宣言された Public な変数にアクセスするには、親オブジェクトを装飾する 必要があります。例えば、シートモジュールなら   Sheet1.StaffName ですね。なお、シート名は可変のため、VBA で使うなら   コードネーム.変数名 とすることが多いです。ブックモジュールの Public 変数も、コードネームが ThisWorkbook のままなら、   ThisWorkbook.SystemAuthor などとします。これは VBA の言語仕様と考えて差し支えないと思います。

merlionXX
質問者

お礼

KenKen_SPさま、いつもありがとうございます。 Private Sub Workbook_BeforeClose(Cancel As Boolean) If Sheet1.nm = "" Then Exit Sub MsgBox Sheet1.nm & "さん、ご苦労様でした。" End Sub でうまくいきました。勉強になりました。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

If WorkSheets("Sheet1").mm = "" Then のようにすれば参照できます。

merlionXX
質問者

お礼

そうですか、ありがとうございました。 Private Sub Workbook_BeforeClose(Cancel As Boolean) With Sheets("Sheet1") If .nm = "" Then Exit Sub MsgBox .nm & "さん、ご苦労様でした。" End With End Sub で、うまくいきました。

すると、全ての回答が全文表示されます。

関連するQ&A