2

動的ページを含むマルチページを作成しました。ユーザーフォームが起動されると、ユーザーフォームは列の特定のセルの値が空かどうかをチェックします。次に、空でないセルごとにページを作成します。

ここに私のコードスニペットがあります

Private Sub UserForm_Initialize()
    Dim i As Integer
    Dim custDate As Date
    Dim vID As String
    'ActiveWorkbook.Worksheets("Sheet1").Activate

    i = 0

    custDate = DateValue(Now)

    Range("A1").Offset(1, 0).Select
    Do While Not IsEmpty(ActiveCell.Value)
        'MsgBox ActiveCell.Address
        If custDate = ActiveCell.Value Then 'first column(A) are dates
            MultiPage1.Pages.Add
            MultiPage1.Pages(0).Controls.Copy 'page 1 is the reference page
            i = i + 1 'row counter
            ActiveCell.Offset(0, 2).Select 'go to column(C) on the same row where visit ids are located
            vID = ActiveCell.Value 
            MultiPage1.Pages(i).Paste 'copy page 1 contents to new page for each row on the active worksheet

            'I guess this is where you put the code to put values 
            'on a txtbox that was from the reference page which is page 1

            ActiveCell.Offset(0, -2).Select 'go back to column(A) to check back dates

        End If
        ActiveCell.Offset(1, 0).Select 'move to the next row
    Loop

    MultiPage1.Value = i 'select the new page on the userform

End Sub

今私の問題は、参照非表示ページから動的に作成された新しいページにコピーされたセルからテキストボックスに値を配置する方法です。昨夜、VBAプログラミングを始めたばかりです。私は Android アプリケーションの開発者なので、現時点では調整が難しいです。

4

1 に答える 1

2

これがあなたがしようとしていることだと思いますか?

コントロールを貼り付けたら、これを試してください

'
'~~> Rest of your code
'
MultiPage1.Pages(i).Paste

For Each ctl In Me.MultiPage1.Pages(i).Controls
    If TypeOf ctl Is MSForms.TextBox Then
        '~~> Your code here
        ctl.Text = vID
        Exit For
    End If
Next
'
'~~> Rest of your code
'

また、これをコードの先頭として宣言します

Dim ctl As Control

フォローアップ(コメントから)

同じタイプが複数ある場合はControls、コピーして貼り付けるのではなく、最初から再作成することをお勧めします。これにより、それらをより細かく制御できますControls

ただし、それでもCopy-Pasteメソッドを使用する場合は、.Tagプロパティを使用します。この例を参照してください

以下のスナップショットに示すように、ユーザーフォームを作成します。

Page(0)で、各テキストボックスにタグを設定します。

ここに画像の説明を入力してください

このコードをユーザーフォームで使用しましょう

Option Explicit

Dim ctl As Control

Private Sub CommandButton1_Click()

    Debug.Print "Page (0):-"
    For Each ctl In Me.MultiPage1.Pages(0).Controls
        If TypeOf ctl Is MSForms.TextBox Then
            Debug.Print ctl.Name; "==="; ctl.Tag
        End If
    Next

    Debug.Print "---"
    Debug.Print "Page (1):-"

    MultiPage1.Pages(0).Controls.Copy

    MultiPage1.Pages.Add
    MultiPage1.Pages(1).Paste

    For Each ctl In Me.MultiPage1.Pages(1).Controls
        If TypeOf ctl Is MSForms.TextBox Then
            Debug.Print ctl.Name; "==="; ctl.Tag
        End If
    Next

    Debug.Print "---"
    Debug.Print "Page (2):-"

    MultiPage1.Pages.Add
    MultiPage1.Pages(2).Paste
    For Each ctl In Me.MultiPage1.Pages(2).Controls
        If TypeOf ctl Is MSForms.TextBox Then
            Debug.Print ctl.Name; "==="; ctl.Tag
        End If
    Next
End Sub

コードを実行すると、この出力が画面に表示されます

ここに画像の説明を入力してください

.Tagが変わらないことに気づいたら。したがって、より多くのコントロールがあれば、これを効果的に使用できます。この例を参照してください

Option Explicit

Dim ctl As Control

Private Sub CommandButton1_Click()
    MultiPage1.Pages(0).Controls.Copy

    MultiPage1.Pages.Add
    MultiPage1.Pages(1).Paste

    For Each ctl In Me.MultiPage1.Pages(1).Controls
        If TypeOf ctl Is MSForms.TextBox Then
            Select Case ctl.Tag
                Case "A"
                    '~~> Your code goes here to put text in this textbox
                    ctl.Text = "AAAA"
                Case "B"
                    '~~> Your code goes here to put text in this textbox
                    ctl.Text = "BBBB"
            End Select
        End If
    Next
End Sub

あなたがそれを実行すると、あなたは

ここに画像の説明を入力してください

HTH

于 2013-02-20T09:10:27.023 に答える