web-dev-qa-db-ja.com

Excel-VBA:SubからUserformに変数を渡す

同様のトピックで見つけた解決策を読んで適用しましたが、私の場合は何もうまくいかないようです。

それで、Module1の1つのサブからユーザーフォームに変数を渡したいと思います。 「provinceSugg」という文字列です。

これは私のコードの関連部分です:

Public provinceSugg As String

Sub probaCity()
[...]
If province = "" And city <> "" Then
provinceSugg = sCurrent.Cells(p, db_column).Offset(0, 1).Value
UserForm2.Label1 = "Do you mean " & city & " in " & provinceSugg & " ?"
UserForm2.Label1.TextAlign = fmTextAlignCenter
UserForm2.Show
Else
End If

End Sub

そして私のユーザーフォームコードでは:

Private Sub userformBtn1_Click()

MsgBox provinceSugg
sMain.Range("J6").Value = provinceSugg

End Sub

プログラムを実行すると:

1 /サブから呼び出されたMsgBoxにProvinceSuggのコンテンツが表示されます(ProvinceSuggがあるため、空の変数ではありません)。
2 /ユーザーフォームから呼び出されたMsgBoxが空で(値を渡すことができなかったため)、「sMain.Range( "J6")。Value = ProvinceSugg」を実行するとプログラムがクラッシュします「Error 424 Object Required」のようなものです(そのため、変数はユーザーフォームに渡されませんでした)。

私はフォーラムとここで見つけたすべてのものを試しました(ProvinceSuggがパブリック変数であるが、まだクラッシュしていることを示すさまざまな方法...)。

よろしくお願いします!

8
Phalanx

モジュールで設定できるパブリック変数をユーザーフォーム内に作成できます。

これらの変数は、ロードされるとユーザーフォーム内でのみアクセスできます。

ユーザーフォーム内で、両方のオブジェクトのパブリック変数を宣言します。

Public sMain As Worksheet
Public provinceSugg as string

Private Sub userformBtn1_Click()

MsgBox provinceSugg
sMain.Range("J6").Value = provinceSugg

End Sub

モジュール内では、これらの変数の両方を評価できます。

Sub probaCity()
[...]
If province = "" And city <> "" Then

    provinceSugg = sCurrent.Cells(p, db_column).Offset(0, 1).Value

    With UserForm2
        .provinceSugg = provinceSugg 
        Set .sMain = sMain 
        .Label1 = "Do you mean " & city & " in " & provinceSugg & " ?"
        .Label1.TextAlign = fmTextAlignCenter
        .Show
    End With

End If

End Sub
9
Dan
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim selectColumn
selectColumn= Split(Target.Address(1, 0), "$")(0)

Call UserFormStart(selectColumn)
End Sub

メインモジュール内

Public columnSelection As String
...
Public Sub UserFormStart(ByVal columnRef As String)
    'MsgBox "Debug columnRef=" & columnRef
    columnSelection = columnRef
    UserForm1.Show
End Sub

ユーザーフォーム内

Private Sub UserForm_Initialize()

'MsgBox "Debug UserForm_Initialize =" & columnSelection
...

End Sub

Worksheet_SelectionChangeは、columnSelectionがパブリックとして宣言され、ユーザーフォームから可視であるモジュールのサブルーチンを呼び出します。列参照に3つの異なる変数を使用して、ユーザーフォームがモジュールにアクセスできる場所があることを示しました。上記のすべてが機能し、検索して解決するまでに時間がかかりました。幸せな狩猟の人々

1
Andrew Day