PDA

View Full Version : Word VBA UserForm Array ListBox selections to FormField



illogic
07-27-2018, 02:15 AM
Hello,

i am trying to populate a formfield with items from a listbox which is populated via an array.

This is what i have so far:


Private Sub UserForm_Initialize()
Dim arrData As Variant
arrData = Array("Entry1", "Entry2", "Entry3", "Entry4", _
"Entry5", "Entry6")
ListBox1.List = arrData
End Sub

Public Sub cmdOK_Click()
Dim intListBox As Integer
Dim intAusgabe As Integer

For intListBox = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(intListBox) Then
intAusgabe = intListBox + 1
ActiveDocument.FormFields("Hinweise").Result = ListBox1.List(intAusgabe) & Chr(11)
End If
Next intListBox
Hide
lbl_Exit:
Exit Sub
End Sub

'Empty FormField Button
Private Sub cmdEmpty_Click()
ActiveDocument.FormFields("Hinweise").Result = ""
Hide
lbl_Exit:
Exit Sub
End Sub

'Cancel Button
Private Sub cmdESC_Click()
Unload Me
End Sub


The Problem is that when i select multiple items in the Listbox, only the last selected item gets transfered to the formfield.
(Item 1,2,4,6 selected, only item 6 is transfered etc.)

Does anyone know why this is happening and how to correct this issue?
Although the Items need to be written in a new line for each item. vbNewLine Does not work, is there an alternative?


Best Regards

Manuel

gmayor
07-27-2018, 04:42 AM
The problem is that you are replacing each selection with the next what you need is


Public Sub cmdOK_Click()
Dim intListBox As Integer
Dim strText As String

For intListBox = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(intListBox) Then
If strText = "" Then
strText = ListBox1.List(intListBox)
Else
strText = strText & Chr(11) & ListBox1.List(intListBox)
End If
End If
Next intListBox
ActiveDocument.FormFields("Hinweise").Result = strText
Hide
lbl_Exit:
Exit Sub
End Sub

illogic
07-27-2018, 05:33 AM
All right, your modification is working fine.
I see where i made my mistake. =)
Thanks for helping out!

illogic
07-27-2018, 07:04 AM
Ok i ran into another issue after playing with the code.
I tried to complexify it further because i need additional functionality.

Let me try to explain it:
When i select the string entry of the listbox, i want that entry to be converted to a longer string, because i don't wnat to clutter the listboxes with a wall of text.

For example:
I select Entry 1 "Gasket" - then ultimately what ends up in the Formfield is text like "PROTEGO DR/U-50 PTFE housing gasket replaced".

Therefore i had to declare another variable to initialize it with this code, it grabs additional information from other formfields.
But when i now want to select more than one entry, only the first one gets converted, the second, third etc. selection only results in the short text example.

I don't know if it makes sense to you, i will post the code that i modified:


Public Sub cmdOK_Click()

Dim intListBox As Integer
Dim strText As String
Dim secondaryText As String 'additional variable that stores the long string

For intListBox = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(intListBox) Then
If strText = "" Then
strText = ListBox1.List(intListBox)

'additional if statement to check which listbox entry is selected and what text to store in the additional variable
If strText = "Gehäusedichtung" Then
secondaryText = "• " & ActiveDocument.FormFields("Hersteller").Range & "®" & " " & ActiveDocument.FormFields("Typ").Range & _
"-" & ActiveDocument.FormFields("TypAdd1").Result & "-" & ActiveDocument.FormFields("TypAdd2").Result & _
" " & ActiveDocument.FormFields("GDTNG").Range & " " & "Gehäusedichtung erneuert."
End If

If strText = "2x Gehäusedichtung" Then
secondaryText = "• " & "2x " & ActiveDocument.FormFields("Hersteller").Range & "®" & " " & ActiveDocument.FormFields("Typ").Range & _
"-" & ActiveDocument.FormFields("TypAdd1").Result & "-" & ActiveDocument.FormFields("TypAdd2").Result & _
" " & ActiveDocument.FormFields("GDTNG").Range & " " & "Gehäusedichtung erneuert."
End If

Else
secondaryText = secondaryText & Chr(11) & ListBox1.List(intListBox)
End If
End If
Next intListBox
ActiveDocument.FormFields("Hinweise").Result = secondaryText
Hide
lbl_Exit:
Exit Sub
End Sub


I think a For Loop may not be the right type of loop for this task. I see no way to convert the second, third etc. selected listbox entries to a variable in order to properly populate the formfield if more than one listbox entries need to be converted to its long text versions.

Do you have an idea how this can be achieved?


Best Regards

Manuel

gmaxey
07-27-2018, 02:51 PM
Public Sub cmdOK_Click()
Dim lngIndex As Long
Dim strText As String
Dim strSecondaryText As String 'additional variable that stores the long string
strSecondaryText = vbNullString
For lngIndex = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(lngIndex) Then
strText = vbNullString
strText = ListBox1.List(lngIndex)
If Len(strSecondaryText) = 0 Then
If strText = "Gehäusedichtung" Then strSecondaryText = "• Some long string of text."
If strText = "2x Gehäusedichtung" Then strSecondaryText = "• Some other long string of text."
Else
If strText = "Gehäusedichtung" Then strSecondaryText = strSecondaryText & Chr(11) & "• Some long string of text."
If strText = "2x Gehäusedichtung" Then strSecondaryText = strSecondaryText & Chr(11) & "• Some other long string of text."
End If
End If
Next lngIndex
MsgBox strSecondaryText
Hide
lbl_Exit:
Exit Sub
End Sub