Добавить непрерывные элементы управления в пользовательскую форму

Еще раз я, кажется, застрял с VBA Word 2011 на Mac. Что я хочу сделать, так это добавить непрерывные текстовые поля в мою пользовательскую форму. Это для документа, чтобы написать счета. Вот код, который я понял:

Private Sub cbRechnungPosHinzu_Click()
    Dim Cntrl As control
    Dim PosName As String
    Dim BetName As String
    Dim i As Integer
    i = 2
    If UFRechnung.Controls.Count = (20 + (i * 2)) Then
        i = i + 1
    Else
        With UFRechnung
            .Height = UFRechnung.Height + 45
            .cbRechnungPosHinzu.Top = .cbRechnungPosHinzu.Top + 45
            .cbRechnungPosWeg.Top = .cbRechnungPosWeg.Top + 45
            .cbRechnungCancel.Top = .cbRechnungCancel.Top + 45
            .cbRechnungOk.Top = .cbRechnungOk.Top + 45
            PosName = "txtPos" & i
            BetName = "txtBet" & i
            Set Cntrl = UFRechnung.Controls.Add("Forms.Textbox.1", PosName, True)
            With Cntrl
'                .Name = PosName #already defined by Set Cntrl
'                .Visible = True
'                .Enabled = True
                .Top = UFRechnung.Controls("txtPos" & (i - 1)).Top + 45
                .Left = 20
                .Width = 470
                .Height = 25
                .AutoSize = False
'                .Font = "Calibri Light, 14" #These specials do not work on Mac
'                .SpecialEffect = fmSpecialEffectSunken
'                .TextAlign = fmTextAlignLeft
'                .WordWrap = True
            End With
            Set Cntrl = UFRechnung.Controls.Add("Forms.Textbox.1", BetName, True)
            With Cntrl
'                .Name = BetName
'                .Visible = True
'                .Enabled = True
                .Top = UFRechnung.Controls("txtBet" & (i - 1)).Top + 45
                .Left = 510
                .Width = 470
                .Height = 25
                .AutoSize = False
'                .Font = "Calibri Light, 14"
'                .SpecialEffect = fmSpecialEffectSunken
'                .TextAlign = fmTextAlignLeft
'                .WordWrap = True
            End With
            Selection.GoTo What:=wdGoToBookmark, Name:=("Betrag" & (i - 1))
            Selection.MoveRight
            Selection.TypeText Text:=vbNewLine
            Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput) _
                .Name = ("Position" & i)
            Selection.TypeText Text:=vbTab
            Selection.TypeText ("CHF")
            Selection.TypeText Text:=vbTab
            Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput) _
                 .Name = ("Betrag" & i)
         End With
    End If
End Sub

Теперь моя проблема в том, что он добавляет два текстовых поля только при первом нажатии кнопки, после чего только часть

With UFRechnung
    .Height = UFRechnung.Height + 45
    .cbRechnungPosHinzu.Top = .cbRechnungPosHinzu.Top + 45
    .cbRechnungPosWeg.Top = .cbRechnungPosWeg.Top + 45
    .cbRechnungCancel.Top = .cbRechnungCancel.Top + 45
    .cbRechnungOk.Top = .cbRechnungOk.Top + 45

похоже на работу. Что я делаю неправильно? Есть идеи для более простого кода?

Selection.GoTo What:=wdGoToBookmark, Name:=("Betrag" & (i - 1))
Selection.MoveRight
Selection.TypeText Text:=vbNewLine
Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput) _
    .Name = ("Position" & i)
Selection.TypeText Text:=vbTab
Selection.TypeText ("CHF")
Selection.TypeText Text:=vbTab
Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput) _
    .Name = ("Betrag" & i)

Эта часть также отлично работает.

Заранее спасибо. CU Kath

********************************************* Информация добавлена ​​*** ******************************************

Кстати:

If UFRechnung.Controls.Count = (20 + (i * 2)) Then
    i = i + 1

был мой способ проверить, сколько элементов управления активно в моей пользовательской форме, так как я не мог проверить, существуют ли уже текстовые поля с определенным именем. Поскольку он всегда добавляет 2 текстовых поля при следующей проверке, он увеличился на 2 флажка, поэтому для i = 1 у меня есть 22 (20 + 2) элемента управления, для i=2 у меня 24 (20 + 4) элемента управления в моей пользовательской форме. Надеюсь, я сделал это более понятным для вас, чтобы понять.

(Я даже нашел 2-3 ошибки, но все равно не повезло...)

UFSomething = UserForm
cbSomething = ControlButton
txtSomething = TextBox Name

2 ответа

Решение

Еще раз нашел ответ сам...:)

Вот код:

Private Sub cbRechnungPosHinzu_Click()
    Dim Cntrl As control
    Dim PosName As String
    Dim BetName As String
    Dim k As Integer
    k = (((UFRechnung.Controls.Count - 20) / 2) + 1)
    With UFRechnung
        .Height = UFRechnung.Height + 45
        .cbRechnungPosHinzu.Top = .cbRechnungPosHinzu.Top + 45
        .cbRechnungPosWeg.Top = .cbRechnungPosWeg.Top + 45
        .cbRechnungCancel.Top = .cbRechnungCancel.Top + 45
        .cbRechnungOk.Top = .cbRechnungOk.Top + 45
        PosName = "txtPos" & k
        BetName = "txtBet" & k
        Set Cntrl = UFRechnung.Controls.Add("Forms.Textbox.1", PosName, True)
        With Cntrl
            .Top = UFRechnung.Controls("txtPos" & (k - 1)).Top + 45
            .Left = 20
            .Width = 470
            .Height = 25
            .AutoSize = False
        End With
        Set Cntrl = UFRechnung.Controls.Add("Forms.Textbox.1", BetName, True)
        With Cntrl
            .Top = UFRechnung.Controls("txtBet" & (k - 1)).Top + 45
            .Left = 510
            .Width = 470
            .Height = 25
            .AutoSize = False
        End With
        Selection.GoTo What:=wdGoToBookmark, Name:=("Betrag" & (k - 1))
        Selection.MoveRight
        Selection.TypeText Text:=vbNewLine
        Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput) _
            .Name = ("Position" & k)
        Selection.TypeText Text:=vbTab
        Selection.TypeText ("CHF")
        Selection.TypeText Text:=vbTab
        Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput) _
           .Name = ("Betrag" & k)
        Exit Sub
    End With
End Sub

С линией

k = (((UFRechnung.Controls.Count - 20) / 2) + 1)

Я сделал трюк... Я считаю количество элементов управления, как пользовательская форма отображается по умолчанию. Проще, чем считать

debug.print Userform.controls.count

У меня обычно 22, но у меня уже есть txtpos1 и txtbet1 по умолчанию в пользовательской форме, поэтому я должен вычесть их для количества элементов управления, так как я хочу добавить текстовые поля, такие как txtpos2 и txtbet2 (с непрерывной нумерацией). Поэтому, когда у меня есть 22 элемента управления, у меня есть один элемент txtpos и один элемент txtbet, а когда у меня есть 24 элемента управления, txtpos2 и txtbet2 уже находятся в пользовательской форме... Это на самом деле не так сложно, как только вы видите все это. Может быть, это когда-нибудь поможет кому-то другому:) (когда я искал решения, я ничего не находил....)

Работа здесь сделана, но спасибо за помощь.

CU Kath

Я могу быть смущен неанглийским кодом, но похоже, что переменная i является локальной переменной в обработчике нажатия кнопки. Он будет сброшен на 2 при каждом нажатии кнопки. Вместо этого объявите его как область действия UserForm (декларации) и инициализируйте его в обработчике UserForm_Initialize().

Другие вопросы по тегам