2016-05-25 16 views
0

"OK"コマンドで複数選択リストボックスを持つuserformを作成しました。ユーザーがリストボックスから選択してOKコマンドをクリックすると、リストボックス内のユーザーの選択に基づいて配列を作成し、ユーザーが持つ複数のファイルを開いてアレイの各アイテムをループすることができます指定された。MS Wordで複数選択リストボックスから変数文字列を作成する

たとえば、自分のリストボックスで「クライアント1」と「クライアント3」を選択して「OK」コマンドを選択した場合、それらの値から配列を作成し、配列の各値を呼び出す「クライアント1」を「クライアント1」(赤色)、「クライアント3」を「クライアント3」(赤色)に置き換えた「検索と置換」Sub内にある。 (赤は、私の他の検索と置換マクロがテキストClient 1、Client 3などと一緒に見つけるために別の色を指定することによってこれらの項目をスキップできるようになります)

このサイトの他の場所を読む関数を使用して配列を生成しようとしていますが、どうやってそれを取得してUserForm Subで使用するのか分かりません。

以下の回答を見つけたら、私はここに貼り付けた元のコードを削除しました。これは明らかにすべてが間違っていて誰にも役立たないためです。

全体的な目的に関する追加情報:私はすでに複数のファイルで初期の検索と置換を行うマクロを作成しました。このマクロは、ユーザーが選択した一連のファイルを開き、特定のクライアント名を「Confidential Client」というテキストで置き換えます。今、特定のクライアントを置き換えることを除外できるかどうか尋ねています。そのため、除外するクライアントを選択できるリストボックスを持つuserformを追加する必要があります。

助けてください!

+0

それはあなたが「変数の文字列」によって何を意味するかは明らかではありません。質問の下にある[編集]ボタンを使用して例を挙げてください。おそらく、各メンバでコードを実行してループすることができる値の配列*を意味しますか? –

+0

はい、配列は私が欲しいと思うものです。私はその質問を編集し、私が試みていることを明確にしようとしました。 –

+0

OK、私はまだ混乱しています:-)配列が必要な場合、配列を返すように関数を変更する必要があります( "As String"ではなく "As Variant"を使用してください)。実際に文字列が必要な場合は、配列を作成せずに、Forループで文字列を作成し、新しい値を文字列に追加します。sItems = sItems&ListBoxClients.List(i)& "、"それは関数からのものです。 –

答えて

0

多くの試行錯誤やグーグルで、次のような解決策を思いつきましたが、これは私にとってはうまくいきます。まず、私の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 

それだそれ、私は、これは他の誰かに役立ちます願ってい

関連する問題