web-dev-qa-db-ja.com

VBAでフォームからモジュールに変数を渡す

フォームに次のボタンがあります。

_Private Sub CommandButton1_Click()
 Dim pass As String
 pass = UserForm1.TextBox1
 Unload UserForm1
End Sub
_

次に、Module1というモジュールがあります。

_ Public Sub Login()

 ...

 UserForm1.Show
 driver.findElementByName("PASSWORD").SendKeys pass

 ...

End Sub
_

ユーザーが入力ボックスに入力したパスワードは、変数passに割り当てられます。しかし、私が問題を抱えているのは、passをUserForm1からModule1のLoginサブに渡すことです。

アンロードする前にフォームにModule1.Login (pass)のようなものを追加することはうまくいくと考えましたが、それは何もパスしないようです。どんな助けでも大歓迎です。ありがとう。

21
JimmyK

ユーザーフォームで変数を宣言しないでください。モジュールでPublicとして宣言します。

Public pass As String

ユーザーフォーム内

Private Sub CommandButton1_Click()
    pass = UserForm1.TextBox1
    Unload UserForm1
End Sub

モジュール内

Public pass As String

Public Sub Login()
    '
    '~~> Rest of the code
    '
    UserForm1.Show
    driver.findElementByName("PASSWORD").SendKeys pass
    '
    '~~> Rest of the code
    '
End Sub

driver.find...行を呼び出す直前に追加のチェックを追加することもできますか?

If Len(Trim(pass)) <> 0 Then

これにより、空の文字列が渡されなくなります。

31
Siddharth Rout

Siddharthの答えはNiceですが、グローバルスコープの変数に依存しています。より良い、よりOOPフレンドリーな方法があります。

UserFormは他のクラスモジュールと同じです-唯一の違いは、非表示のVB_PredeclaredId属性はTrueに設定され、VB=クラスにちなんで命名されたグローバルスコープオブジェクト変数を作成します-これがUserForm1.Showクラスの新しいインスタンスを作成せずに。

これから離れて、フォームを代わりにオブジェクトとして扱います-Property Getメンバーとフォームのコントロールを抽象化します-呼び出しコードはcontrolsを気にしません:

Option Explicit
Private cancelling As Boolean

Public Property Get UserId() As String
    UserId = txtUserId.Text
End Property

Public Property Get Password() As String
    Password = txtPassword.Text
End Property

Public Property Get IsCancelled() As Boolean
    IsCancelled = cancelling
End Property

Private Sub OkButton_Click()
    Me.Hide
End Sub

Private Sub CancelButton_Click()
    cancelling = True
    Me.Hide
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = VbQueryClose.vbFormControlMenu Then
        cancelling = True
        Me.Hide
    End If
End Sub

これで、呼び出しコードでこれを行うことができます(ユーザーフォームの名前がLoginPromptであると仮定):

With New LoginPrompt
    .Show vbModal
    If .IsCancelled Then Exit Sub
    DoSomething .UserId, .Password
End With

DoSomethingは、2つの文字列パラメーターを必要とするプロシージャです。

Private Sub DoSomething(ByVal uid As String, ByVal pwd As String)
    'work with the parameter values, regardless of where they came from
End Sub
21
Mathieu Guindon