多くの試行錯誤やグーグルで、次のような解決策を思いつきましたが、これは私にとってはうまくいきます。まず、私のuserformで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
、Iループ配列内の選択されたアイテムを通って、赤色同じテキスト、(とそれぞれの選択した項目を置き換える:まず、それが処理するファイルを選択を促すと、最初のファイルを開きます私の他のマクロ - ここに示されていない - それは検索と置換を実行する場合)、それをスキップします:私は終える前に
'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
私は現在のドキュメントを閉じて、次のファイルを開くために、そして最終的に終了するために、サブセクションの上部にそれを返しますいくつかのコードがあります。私は、「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
それだそれ、私は、これは他の誰かに役立ちます願ってい
それはあなたが「変数の文字列」によって何を意味するかは明らかではありません。質問の下にある[編集]ボタンを使用して例を挙げてください。おそらく、各メンバでコードを実行してループすることができる値の配列*を意味しますか? –
はい、配列は私が欲しいと思うものです。私はその質問を編集し、私が試みていることを明確にしようとしました。 –
OK、私はまだ混乱しています:-)配列が必要な場合、配列を返すように関数を変更する必要があります( "As String"ではなく "As Variant"を使用してください)。実際に文字列が必要な場合は、配列を作成せずに、Forループで文字列を作成し、新しい値を文字列に追加します。sItems = sItems&ListBoxClients.List(i)& "、"それは関数からのものです。 –