1

既に多数のモジュールを含むプロジェクトにユーザー フォームを挿入しました。ユーザー フォームのコードをいじって、コンボ ボックスから値を返せることを確認しました。

ユーザーフォームコード:

Public SelectedPacking As Integer

Private Sub CancelButton_Click()
    UserForm1.Hide        
 End Sub

Private Sub OKButton_Click()
    SelectedPacking = ComboBox1.ListIndex    
    Call DemoDialogOk

    'Return list index value to cell C50
    Worksheets("Inputs & Results").Range("C50") = SelectedPacking    
    Unload UserForm1    
End Sub

私の問題は、この値をモジュールに記述されたマクロに渡すことができないことです。

モジュールコード:

Public Sub ShowComboBox()
    UserForm1.Show    
End Sub

 Public Sub DemoDialogOk()    
    ival = SelectedPacking

    'Return value of ival (list index value from combo box) to cell C17
     Worksheets("Packed bed (Random)").Range("C17") = ival
End Sub

明らかに、モジュールにはより有用なコードが含まれていますが、どこが間違っているのかを把握するために、すべてをコメントアウトしました。私はいくつかのことを変えてきましたが、セル C17 にはまだ何も表示されないので、根本的な何かが欠けていると思います。

4

3 に答える 3

1

2 つのオプションがあると思います: 1) DemoDialogueOK を変数を受け入れるように変更します。

Public Sub DemoDialogOk(SelPack as integer)    
    ' ival = SelectedPacking

    Worksheets("Packed bed (Random)").Range("C17") = SelPack
End Sub

Private Sub OKButton_Click()
    SelectedPacking = ComboBox1.ListIndex
    Call DemoDialogOk(SelectedPacking)

    ...
End Sub

またはオプション 2: useform から変数を完全に修飾します。

Public Sub DemoDialogOk()
     ival = ufYourForm.SelectedPacking

    ...
End Sub

ユーザーフォームのパブリック変数は、モジュールレベルほど「パブリック」ではないようです...

于 2013-08-30T00:17:42.083 に答える
0

サイモンの答えに加えて、必要に応じてユーザーフォーム全体を渡すことができます。これにより、そのすべての部分にアクセスできるようになり、たとえば、さまざまなチェックボックスがチェックされているかどうかなどの検証を行う必要がある場合に特に役立ちます。

 Sub inOurUserForm()
    Call inADifferentModule(Me) 'Passes this userform
 End Sub

 Sub inADifferentModule(ourForm As UserForm1)
    'Passed the form, and using it like a class (As whatever the form is called)
    If ourForm.chkYes = True Then
        'Do something
    Else
        'Do something else, like
        ourForm.chkYes = False 'Because we are passing the object itself _
                                 rather than a copy, at least in my understanding
    End If

End Sub

また、必ずしもユーザーフォームを渡す必要はありません。たとえば、オブジェクト自体として参照するだけでよいためです。

UserForm1.chkYes
于 2015-07-09T17:07:38.797 に答える