Добавить непрерывные элементы управления в пользовательскую форму
Еще раз я, кажется, застрял с 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().