プロが教える店舗&オフィスのセキュリティ対策術

初歩的な問題で申し訳ありません。
VBAの質問です。

Public userName As String
Sub Workbook_Open()
' ・・・【中略】・・・
loginForm.show
msgBox userName'テストのため
'以下処理が続く
end Sub

loginFormを表示させそのフォーム内で入力させた値を

Public Sub OKButton1_Click()
'・・・【中略】・・・
If Trim$(Text_ID.Text) <> "" Then
userID = Trim$(Text_ID.Text)
Me.Hide
Else
exit Sub
Me.Hide
End Sub

どうしたら引き継げるのですか?

A 回答 (6件)

挿入→標準モジュールを開きそこで変数宣言してください。

この回答への補足

 ThisWorkBookでPublicを宣言しても、標準フォーム内のプロシージャには無効・・というか、その宣言は生きていてその変数を扱えるのですが、プロシージャ内で値を変えてもThisWorkBook内には帰ってこない。
 そこで、
[Public/Private] Sub Workbook_Open()
Call mainFlow
End Sub
として、標準プロシージャで
Private mainFlow()
'・・・ここにThisWorkBookに書かれていたものを移す
End Sub
して、その前で宣言をしてみました。
・・・これでうまくいきました。

 そこで、kmetuのコメントに気がついて、いっそのこと変数宣言だけの標準モジュール(DeclareVariable)を作成しても良いことを確認しました。
 結果的には、
ThisWookBookで、
Private Sub Workbook_Open()
 Call mainFlow
End Sub

として、標準プロシージャで、

Option Explicit
Public [変数] As type
Public mainFlow()
'処理
'プロシージャまたはユーザーフォーム
'変数の利用
End Sub

という形に落ち着きましたが、これでよいのかな??

なんともへんな形だけど

補足日時:2009/10/11 20:48
    • good
    • 0
この回答へのお礼

私の質問
「Public userName As String:Sub Workbook_Open()」
で宣言しても、ユーザーフォーム//標準モジュール・・
「loginFormを表示させそのフォーム内で入力させた値を」
「どうしたら引き継げるのですか?」
に対して、まさにピンポイントの回答でした。
 WorkBook_Open()が最初に実行される動作なので、そこでPublic [Variable] As [Type]で宣言すると、ずっとPublicだと思ってました。
 ありがとうございました。

お礼日時:2009/10/13 00:49

もっと丁寧にステップを踏んで質問文を書くこと。

それが質問者の勉強になると思う。
読者は質問でわかるとしても、質問者は質問には、どこにどのようなコードを書いて、何処でどうなったか書くもの。
ーーー
ThisWorkbookのOpenイベント
Private Sub Workbook_Open()
UserForm1.Show
'MsgBox UserName 'テストのため
MsgBox "フォームへ行ったあと" & userID
'以下処理が続く
Range("A1") = userID
End Sub
ーー
UserForm1のコントロール
テキストボックス1つ
TextBox1
コマンドボタン1つ
CommandButton1
を設ける。
そのClikイベント
Private Sub CommandButton1_Click()
If Trim$(TextBox1.Text) <> "" Then
userID = Trim$(TextBox1.Text)
MsgBox "フォーム入力直後" & userID
Me.Hide
Else
Exit Sub
Me.Hide
End If
End Sub
ーーー
標準モジュール1のコード
Public userID As String
だけ。PUBLIC変数の宣言。
ーー
以下実行の操作の内容。
実行ーSUB/ユーザーフォームの実行

UserFom1が表示される
テキストボックス1にUserIdの文字列をを入れて
コマンドボタン1をクリック
(あくまで例えで)Sheet1のA1セルにUserIDの文字列をセット
--
パスワードもテキストボックスを1つ増やせば同様で出きる。
    • good
    • 0

各シートやThisWorkbookでPublic宣言した変数は



ThisWorkbook.変数名
Sheet1.変数名

とかでアクセスできますが
標準モジュールでPublic宣言したほうが単純じゃないでしょうか。
    • good
    • 0

標準モジュールにグローバル変数というのもいいですが


Workbookにプロパティを新設するといった方法も可能ですよ

--- ThisWorkbook のコード
' プロパティ内容の保存用変数
private sName as String

public Property Get myName() as String
  myName = sName
End Property

public Property Let myName(ByVal newName as String )
  sName = newName
End Property
といった具合にしておいて

UserForm上から代入する際には ... Property Let を使用
ThisWorkbook.myName = Trim$(Text_ID.Text)

代入した値を参照する場合は ... Property Get を使用
dim ss as String
ss = ThisWorkbook.myName
といった具合にします
    • good
    • 0

標準モジュールでPublicで変数宣言した変数は


SheetでもThisWorbookでもFormでもどこでも使えるはずですが。
    • good
    • 0
この回答へのお礼

ありがとうございました。
>標準モジュールでPublicで変数宣言した変数は
のようですね。
 ThisWorkBookで指定した場合は、「だめ」ということですね。
 なんかへんだけど、・・・

お礼日時:2009/10/11 22:55

どこまで引き継ぐのか分かりませんが


適切なグローバル変数(プロシージャの外で変数宣言してください)
に代入したらいかがですか

グローバル変数を使う上での注意点もあります

http://www.bekkoame.ne.jp/~poetlabo/COMP/Excel/V …

この回答への補足

このworkbookが開いている間・・
ということで、Thisworkbookにコードを書いてます。

Public userName As String'★ここでpublic
Sub Workbook_Open()

そして、その中から
loginForm.show
でユーザーフォーム開いてます。

補足日時:2009/10/11 18:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!