【问题标题】:Creating a variable string from a multiselect listbox in MS Word从 MS Word 中的多选列表框中创建变量字符串
【发布时间】:2016-05-25 04:49:46
【问题描述】:

我创建了一个带有“OK”命令的多选列表框的用户表单。当我的用户从列表框中进行选择并单击 OK 命令时,我想创建一个数组(基于用户在列表框中的选择),然后当我打开用户拥有的多个文件时,我可以循环遍历数组中的每个项目指定的。

例如,如果我的用户在我的列表框中选择“客户端 1”和“客户端 3”,然后选择“确定”命令,我想从这些值创建一个数组,然后调用数组中的每个值一个“查找和替换”子程序,例如,用“客户端 1”(红色)替换“客户端 1”,用“客户端 3”(红色)替换“客户端 3”。 (红色是为了让我的其他查找和替换宏可以通过指定要查找的不同颜色以及文本客户端 1、客户端 3 等来跳过这些项目)

在本网站的其他地方阅读,我创建了一个函数来尝试生成数组,但我不知道如何将它放入并在我的 UserForm Sub 中使用它。

在下面找到答案后,我删除了我在这里粘贴的原始代码,因为它显然都是错误的,对任何人都没有帮助。

关于总体目标的其他信息:我已经创建了一个宏来在多个文件中进行初始查找和替换。此宏打开用户选择的一堆文件,并将某些客户端名称替换为文本“机密客户端”。现在,人们问我是否可以排除某些客户被替换。这就是为什么我想在用户窗体中添加一个列表框,让他们选择要排除的客户端。

请帮忙!

【问题讨论】:

  • 不清楚您所说的“一串变量”是什么意思。您能否使用问题下的edit 按钮并提供示例?您可能是指一个可以循环的值的array,在每个成员上执行代码?
  • 是的,我想我想要一个数组。我编辑了问题并试图澄清我正在尝试的内容。
  • 好吧,我还是很困惑 :-) 如果你想要一个数组,那么你应该改变你的函数来返回数组(使用“As Variant”而不是“As String”)。如果你真的想要一个字符串,那么不要创建一个数组,在 For-Loop 中创建一个字符串,将每个新值添加到字符串中:sItems = sItems & ListBoxClients.List(i) & ", " 然后返回来自函数。
  • 然后是“查找和替换子”的问题。我明白你的意思,但如果你不希望它连接到“确定”按钮,则不清楚何时应该调用它?

标签: vba ms-word listbox userform multi-select


【解决方案1】:

因此,经过反复试验和谷歌搜索,我想出了以下解决方案,它非常适合我的目的。首先,在我的用户窗体上单击 F7 后,我将项目添加到列表数组中。

Private Sub UserForm_Initialize()
   'Creates and assigns the array to ListBoxClients when the form loads
   With ListBoxClients
   .AddItem "Client 1"
   .AddItem "Client 2"
   .AddItem "Client 3"
   End With
End Sub

然后,我为我的“OK”命令创建了以下响应。首先,它提示用户选择要处理的文件并打开第一个文件:

Private Sub cmdOK_Click()
   Me.Hide
   MsgBox "Click OK to browse and select files to exclude.", vbInformation
   Dim MyDialog As FileDialog, GetStr(1 To 3000) As String '3000 files is the maximum applying this code
   On Error Resume Next
   Set MyDialog = Application.FileDialog(msoFileDialogFilePicker)
   With MyDialog
       .Filters.Clear
       .Filters.Add "All WORD File ", "*.docx", 1
       .AllowMultiSelect = True
   i = 1
   If .Show = -1 Then
   For Each stiSelectedItem In .SelectedItems
   GetStr(i) = stiSelectedItem
   i = i + 1
   Next
   i = i - 1
   End If
   Application.ScreenUpdating = False
   For j = 1 To i Step 1
   Set Doc = Documents.Open(FileName:=GetStr(j), Visible:=True)
   Windows(GetStr(j)).Activate

然后,我循环遍历数组中的选定项目,并用相同的文本替换每个选定的项目,颜色为红色(所以我的其他宏 - 此处未显示 - 在执行查找和替换时将跳过它) :

'Find and replace listbox items in files
Dim ii As Integer
   For ii = 0 To ListBoxClients.ListCount - 1
      If ListBoxClients.Selected(ii) Then
      Selection.Text = ListBoxClients.List(ii)
      Selection.Find.ClearFormatting
      Selection.Find.Replacement.ClearFormatting
      Selection.Find.Replacement.Font.Color = 192
            With Selection.Find
                .Text = Selection.Text
                .Replacement.Text = Selection.Text
                .Forward = True
                .Wrap = wdFindContinue
                .Format = True
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
      Selection.Find.Execute Replace:=wdReplaceAll

在我完成之前,我删除了由于未知原因粘贴在每个文件顶部的选定数组项:

      ' delete mysterious added text at top of page (figure this out later)
      Selection.HomeKey Unit:=wdStory
      Selection.EndKey Unit:=wdLine, Extend:=wdExtend
      Selection.Delete Unit:=wdCharacter, Count:=1
      End If
   Next ii

然后我有一些代码可以关闭当前文档并将其返回到 sub 的顶部以打开下一个文件(并最终结束)。我不知道为什么“Application.Run macroname:="NEWMACROS" 在那里,但它有效,所以我不打算删除它。

   Application.Run macroname:="NEWMACROS"
   ActiveDocument.Save
   ActiveWindow.Close
   Next
   Application.ScreenUpdating = True
   End With
End Sub

最后,如果用户改变主意,我添加取消表单的代码:

Private Sub cmdCancel_Click()
'User has cancelled so hide the form
Me.Hide
End Sub

就是这样。我希望这对其他人有帮助。

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多