Как динамически помещать значения ячеек в текстовое поле на многостраничной странице в Excel?

Я создал многостраничный файл с динамическими страницами. Когда пользовательская форма запускается, пользовательская форма проверяет значения в определенной ячейке в столбце, если они пусты или нет. затем создайте страницу для каждой из непустых ячеек.

Вот мой фрагмент кода

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, поэтому на данный момент сложно настроить.


person Jovanni G    schedule 20.02.2013    source источник
comment
MultiPage1.Pages(0).Controls.Copy это текстовое поле, которое вы копируете?   -  person Siddharth Rout    schedule 20.02.2013
comment
Нет, это страница, которая будет воспроизведена, тогда новые страницы с тем же содержимым, что и эталонная страница, будут иметь обновления значений ячеек.   -  person Jovanni G    schedule 20.02.2013
comment
Сколько текстовых полей на этой странице?   -  person Siddharth Rout    schedule 20.02.2013
comment
У меня сейчас только одно текстовое поле на странице, мне просто интересно, что, если я поставлю другое текстовое поле. Будет ли он заполнять второе поле тем же значением?   -  person Jovanni G    schedule 20.02.2013
comment
Нет, он заполнит первое найденное текстовое поле и выйдет из цикла, поскольку я использую Exit For Когда я работаю с динамическими элементами управления, я предпочитаю не копировать, а воссоздавать их с нуля, поскольку это дает мне больше контроля над этими объектами.   -  person Siddharth Rout    schedule 20.02.2013
comment
Ok. Я понимаю. Я тоже это имел в виду, я просто сейчас запутался, скрипты андроида путаются в голове. хе-хе .. Но большое спасибо, чувак. Ты жжешь.   -  person Jovanni G    schedule 20.02.2013
comment
Самый простой способ обработки таких нескольких текстовых полей — использование свойства Tag. На странице (0) установите теги для каждого текстового поля. и когда вы копируете текстовое поле, имена изменятся, но теги останутся прежними, которые можно использовать для их идентификации. дайте мне знать, если вы хотите пример?   -  person Siddharth Rout    schedule 20.02.2013
comment
да. Я хотел бы увидеть пример Сиддхарта.   -  person Jovanni G    schedule 20.02.2013
comment
хорошо, дай мне 15 минут, и я обновлю пост скриншотами :)   -  person Siddharth Rout    schedule 20.02.2013


Ответы (1)


Я думаю, это то, что вы пытаетесь?

После того, как вы вставите элемент управления, попробуйте это

'
'~~> 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

Однако, если вы все еще хотите использовать метод «Копировать-вставить», используйте свойство .Tag. См. этот пример

Создайте пользовательскую форму, как показано на снимке ниже.

На странице (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

Когда вы запустите его, вы получите

введите здесь описание изображения

ХТН

person Siddharth Rout    schedule 20.02.2013
comment
Спасибо за быстрый ответ, я пойду дальше и проверю его код прямо сейчас. - person Jovanni G; 20.02.2013
comment
OMG ... это сработало так, как я хотел. Спасибо большое. но что, если у меня есть 2 текстовых поля на странице? как я узнаю, какой из них будет скопирован в соответствующее текстовое поле? - person Jovanni G; 20.02.2013
comment
Большое спасибо Сиддхарт. Теперь я, наконец, на правильном пути. Твои инструкции были очень четкими, чувак. Ты жжешь. - person Jovanni G; 20.02.2013