Saya memiliki formulir pengguna dengan kotak daftar (multi pilihan) dengan empat entri.

enter image description here

Kode berikut membangun string:

Dim myArray() As String
'Use Split function to return a zero based one dimensional array.
    myArray = Split("text 1|" _
            & "text 2|" _
            & "text 3|" _
            & "text 4", "|")
  'Use .List method to populate listbox.
  ListBox1.List = myArray
  'Use the .ColumnWidth property to set column widths.  0 results in a hidden column.
  ListBox1.ColumnWidths = "1"
lbl_Exit:
  Exit Sub

Kode berikut di bawah ini berhasil menyisipkan kombinasi dari empat entri yang dipilih dengan , dan spasi di antara setiap entri termasuk . di akhir yaitu text 1, . atau text 1, text 2, text 3, . atau text 1, text 2, text 3, text 4, . menjadi kontrol konten.

Dim SelectedTexts As String
Dim index As Long
    For index = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(index) Then
            'Adds comma after every entry
            SelectedTexts = SelectedTexts & ListBox1.List(index) & ", "
        End If
    Next
    'Adds period to the end
    ActiveDocument.SelectContentControlsByTitle("test").Item(1).Range.Text = Mid(SelectedTexts, 1) _
    & "."
Unload Me

lbl_Exit:
  Exit Sub
Me.Repaint
Me.Hide

Saya mencoba untuk mencapai dua hal:

  1. Saya hanya menginginkan . setelah entri terakhir yaitu text 1. BUKAN text 1, .
  2. Saya ingin ada and sebelum hasil terakhir yaitu text 1 and text 2. atau text 1, text 2 and text 3. atau text 1, text 2 and text 4.
0
Mohamad Bachrouche 7 Januari 2021, 22:28

3 jawaban

Jawaban Terbaik

Setelah string Anda dibuat, Anda perlu memanipulasinya ke dalam bentuk yang Anda butuhkan. Inilah logika untuk melakukan ini:

Private Sub Test()
   Dim SelectedTexts As String
   Dim index As Long
   
   For index = 0 To ListBox1.ListCount - 1
      If ListBox1.Selected(index) Then
         SelectedTexts = SelectedTexts & ListBox1.List(index) & ", "
      End If
   Next

   SelectedTexts = Mid(SelectedTexts, 1, Len(SelectedTexts) - 2) & "."
   index = InStrRev(SelectedTexts, ",")
   If index > 0 Then SelectedTexts = Left(SelectedTexts, index - 1) & " and " & Right(SelectedTexts, Len(SelectedTexts) - index - 1)

   ActiveDocument.SelectContentControlsByTitle("test").Item(1).Range.Text = SelectedTexts
End Sub
0
Brian M Stafford 8 Januari 2021, 17:42

EDIT: Urutan kasus yang disesuaikan

EDIT 2: Kode yang di-recfactored

    Dim SelectedTexts As String
    Dim index As Long
    
    
    ' Get total selected
    Dim totalSelected As Long
    For index = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(index) Then
            totalSelected = totalSelected + 1
        End If
    Next
    
    ' Convert total selected to base 0
    totalSelected = totalSelected - 1
    
    Dim counter As Long
    
    For index = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(index) Then
            'Adds comma after every entry
            Dim delimiter As String
            Select Case True
                Case counter = totalSelected - 1
                delimiter = " and "
                Case counter < totalSelected
                delimiter = ", "
                Case Else
                delimiter = ""
                End Select
            SelectedTexts = SelectedTexts & ListBox1.List(index) & delimiter
            
            counter = counter + 1
        End If
    Next
    
    'Adds period to the end
    ActiveDocument.SelectContentControlsByTitle("test").Item(1).Range.Text = Mid(SelectedTexts, 1) _
    & "."
    Unload Me
    
lbl_Exit:
      Exit Sub
    Me.Repaint
    Me.Hide
0
Ricardo Diaz 7 Januari 2021, 21:23

Cukup ubah:

'Adds period to the end
ActiveDocument.SelectContentControlsByTitle("test").Item(1).Range.Text = Mid(SelectedTexts, 1) _
& "."

Untuk:

'Adds "and", plus period to the end
SelectedTexts = Left(SelectedTexts, Len(SelectedTexts) - 2) & "."
SelectedTexts = Left(SelectedTexts, InStrRev(SelectedTexts, ",") - 1) & ", and " & _
  Right(SelectedTexts, Len(SelectedTexts) - InStrRev(SelectedTexts, ",") - 1)
ActiveDocument.SelectContentControlsByTitle("test").Item(1).Range.Text = SelectedTexts

Jika Anda tidak ingin koma sebelum 'dan', ubah ", dan " menjadi " dan ".

0
macropod 8 Januari 2021, 20:19