2009年08月05日
エクセルマクロ(VBA):パブリック変数の宣言について
台風が近づいていますね。
職場の鉢植えの木を片付けようか迷ってましたが、
備えあれば憂いなしで夕方一気に片付けてしまい
ました。
家の対策はどうしよう。心配です。
今日は、変数の「Public宣言」について書いてみたいと思います。
シートが2枚あり、
1枚目に「請求一覧」
2枚目に「入力画面」があります。

「請求一覧」から対象者のセルをダブルクリックすると
「入力画面」へ移り、
入金額を入力後「一覧表へ」のボタンを押すと
「請求一覧」の対象者セルへ入金額を編集し
「請求一覧」の画面に戻る動きのプログラムをつくります。
「請求一覧」と「入力画面」で、どの対象者の処理
なのかを受け渡す必要があります。
つまり何行目のデータが選択されたかを取得して
モジュール間で参照できる事が必要になります。
そこで、思いつくのがモジュール間で参照可能な
Public変数です。
でも、その「Public変数」
指定する場所を間違えると値が消えてしまいます。
注意して下さい。
これは、私の失敗談です。
次のプログラムですが、ワークシートモジュールで「行」という
変数を宣言しました。
-------- ワークシートモジュール 請求一覧 ----
Public 行 'パブリック変数
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
行 = ActiveCell.Row '選択されたセルの行番号を取得
Sheets("入力画面").Range("c5:e5").Value = ""
Sheets("入力画面").Range("b5").Value = Sheets("請求一覧").Range("b" & 行)
Sheets("入力画面").Range("c5").Value = Sheets("請求一覧").Range("c" & 行)
Sheets("入力画面").Select
End Sub
-------- ワークシートモジュール 入力画面 ----
Private Sub CommandButton2_Click() ’請求一覧のボタンを押す動く
Sheets("請求一覧").Range("d" & 行).Value = Sheets("入力画面").Range("d5").Value
Sheets("請求一覧").Select
End Sub
実行してみます。
金城ハジメさんのデータをダブルクリックします。
「入力画面」が表示されます。
入金額を入力し「一覧表へ」のボタンを押します。

するとエラーがでました。

デバッグをみてみます。

Public変数「行」に何も入っていないと認識しているようです。
publicで宣言し、「請求一覧」のモジュールで
選択された行番号を編集して「入力画面」へ移動している
はずなのに「入力画面」では空になっている。
何故だろう?
最近、参考書を読んでいてわかったのですが、
public変数は標準モジュールで宣言する
と書かれていました。
早速、試してみました。
-------- 標準モジュール1 ----
Public 行 'パブリック変数
-------- ワークシートモジュール 請求一覧 ----
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
行 = ActiveCell.Row '選択されたセルの行番号を取得
Sheets("入力画面").Range("c5:e5").Value = ""
Sheets("入力画面").Range("b5").Value = Sheets("請求一覧").Range("b" & 行)
Sheets("入力画面").Range("c5").Value = Sheets("請求一覧").Range("c" & 行)
Sheets("入力画面").Select
End Sub
-------- ワークシートモジュール 入力画面 ----
Private Sub CommandButton2_Click() ’請求一覧のボタンを押す動く
Sheets("請求一覧").Range("d" & 行).Value = Sheets("入力画面").Range("d5").Value
Sheets("請求一覧").Select
End Sub

正常に動きました。
さて問題です。
私は、今まで
同じような処理のプログラムを何個か作ってきましたが
正常に動いています。
どのように作っていたのでしょうか。
(おはずかしい
)
続きは、明日書きますね。
職場の鉢植えの木を片付けようか迷ってましたが、
備えあれば憂いなしで夕方一気に片付けてしまい
ました。
家の対策はどうしよう。心配です。
今日は、変数の「Public宣言」について書いてみたいと思います。
シートが2枚あり、
1枚目に「請求一覧」
2枚目に「入力画面」があります。

「請求一覧」から対象者のセルをダブルクリックすると
「入力画面」へ移り、
入金額を入力後「一覧表へ」のボタンを押すと
「請求一覧」の対象者セルへ入金額を編集し
「請求一覧」の画面に戻る動きのプログラムをつくります。
「請求一覧」と「入力画面」で、どの対象者の処理
なのかを受け渡す必要があります。
つまり何行目のデータが選択されたかを取得して
モジュール間で参照できる事が必要になります。
そこで、思いつくのがモジュール間で参照可能な
Public変数です。
でも、その「Public変数」
指定する場所を間違えると値が消えてしまいます。
注意して下さい。
これは、私の失敗談です。
次のプログラムですが、ワークシートモジュールで「行」という
変数を宣言しました。
-------- ワークシートモジュール 請求一覧 ----
Public 行 'パブリック変数
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
行 = ActiveCell.Row '選択されたセルの行番号を取得
Sheets("入力画面").Range("c5:e5").Value = ""
Sheets("入力画面").Range("b5").Value = Sheets("請求一覧").Range("b" & 行)
Sheets("入力画面").Range("c5").Value = Sheets("請求一覧").Range("c" & 行)
Sheets("入力画面").Select
End Sub
-------- ワークシートモジュール 入力画面 ----
Private Sub CommandButton2_Click() ’請求一覧のボタンを押す動く
Sheets("請求一覧").Range("d" & 行).Value = Sheets("入力画面").Range("d5").Value
Sheets("請求一覧").Select
End Sub
実行してみます。
金城ハジメさんのデータをダブルクリックします。
「入力画面」が表示されます。
入金額を入力し「一覧表へ」のボタンを押します。

するとエラーがでました。

デバッグをみてみます。

Public変数「行」に何も入っていないと認識しているようです。
publicで宣言し、「請求一覧」のモジュールで
選択された行番号を編集して「入力画面」へ移動している
はずなのに「入力画面」では空になっている。
何故だろう?
最近、参考書を読んでいてわかったのですが、
public変数は標準モジュールで宣言する
と書かれていました。
早速、試してみました。
-------- 標準モジュール1 ----
Public 行 'パブリック変数
-------- ワークシートモジュール 請求一覧 ----
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
行 = ActiveCell.Row '選択されたセルの行番号を取得
Sheets("入力画面").Range("c5:e5").Value = ""
Sheets("入力画面").Range("b5").Value = Sheets("請求一覧").Range("b" & 行)
Sheets("入力画面").Range("c5").Value = Sheets("請求一覧").Range("c" & 行)
Sheets("入力画面").Select
End Sub
-------- ワークシートモジュール 入力画面 ----
Private Sub CommandButton2_Click() ’請求一覧のボタンを押す動く
Sheets("請求一覧").Range("d" & 行).Value = Sheets("入力画面").Range("d5").Value
Sheets("請求一覧").Select
End Sub

正常に動きました。
さて問題です。
私は、今まで
同じような処理のプログラムを何個か作ってきましたが
正常に動いています。
どのように作っていたのでしょうか。
(おはずかしい

続きは、明日書きますね。
Posted by ミール at 19:42│Comments(0)
│VBA