2013-06-25 11 views
5

私は類似のトピックで見つけましたが、私の場合は何も動作していないようです。Excel - VBA:SubからUserformに変数を渡します。

だから、私は、ユーザーフォームに自分のModule1の一つのサブからの変数を渡したいです。それは "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/ userformから呼び出されたMsgBoxは空です(値を渡すと失敗します)。 "sMain.Range(" J6 ")。Value = provinceSugg"を実行するとプログラムがクラッシュする "Error 424 Object Required" (そのため、変数はユーザーフォームに渡されませんでした)。私はすべてのものを試してみました

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

ご協力いただきありがとうございます。

+1

私のためにうまくいった。 'provinceSugg'でintereringするUserForm Initialisationのような他のコードが走っていますか?あなたはあなたのワークブックを投稿できますか? – brettdj

+0

@brettdj私はいくつかの更新があります:このコードはbutton_click( "MsgBox provinceSugg sMain.Range(" J6 "))です。Value = provinceSugg)、私は今MsgBoxに表示されているprovinceSuggコンテンツを持っていますが、次の行と同じエラー(オブジェクト必須/エラー424)には何も残っていないので、値は渡されますが、 。 – Phalanx

+4

'Sheets(x).Range(" J6 ")を試してみたらValue = provinceSugg'ここで' x'は 'sMain'の位置です - これはあなたの問題だと思います – brettdj

答えて

5

あなたはモジュールによって設定することができますユーザーフォーム内のパブリック変数を作成することができるだろう。

これらの変数は、それがロードされているとしてユーザーフォーム内でのみアクセス可能です。ユーザーフォーム内

、両方のオブジェクトのパブリック変数を宣言します。

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 
+0

メモリリークを防ぐためにパブリック変数をリセットまたはクリアする必要がありますか?フォームは閉じられていますか? – michaelf

1
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は、カラム選択がユーザーフォームから公開とvisableとして宣言されたモジュールのサブを呼び出します。 Column Referenceに3つの異なる変数を使用して、UserFormがモジュールにアクセスできる場所があることを示しました。 上記のすべてが動作し、それを見つけてそれを解決するために時代がかかりました。幸せな狩猟の人々

+0

これは、変数を別のプロジェクトから渡す必要がある場合に、より良い解決策です。 (そうでなければ、他のプロジェクトは、public変数にアクセスするために、userformを使ってプロジェクトへの参照を含める必要があります)。 – Michael