プロが教える店舗&オフィスのセキュリティ対策術

下記のVBAはWORDファイル内の青文字で書かれた登録日を検索し、MSGBOXに表示するもので、正常に使えています。 しかし、MSGBOX内の表示がファイル内での順番になっています。昇順または降順表示にしたいのですが、 ネット検索してトライしましたが結果が得られていません。ご指導いただければ大変たすかります。よろしくお願いします。 


Sub TEST()
'検索 青文字「ABC」+ 日付
Dim vv As Variant
Dim i As Integer

i = 0
ReDim vv(i)
ActiveDocument.Range(0, 0).Select
With Selection.Find
.Font.Color = wdColorBlue
.Text = "登録日 202[0-9]/[0-9]{1,2}/[0-9]{1,2}"
.MatchFuzzy = False
.MatchWildcards = True
Do While Selection.Find.Execute
vv(i) = Selection
i = i + 1: ReDim Preserve vv(i)
Loop
End With

MsgBox "登録日" + vbCrLf + vbCrLf + Join(vv, vbCrLf)

End Sub

A 回答 (3件)

ごめんなさい 訂正いたします



If arrData(i) > arrData(j) Then
swap = arrData(i)
arrData(i) = arrData(j)
arrData(j) = swap
End If

なので
QuickSortではなくBubble_Sort ですね

(ファンクション名を訂正してください)
参考:
https://daitaideit.com/vba-array-sort/
    • good
    • 0

>検索結果が重複して有る場合、1つだけ表示することができるのでしょうか?


WORDファイル内でメッセージ作成の処理とすでに出来ている処理を考えると4,5行のVBA処理コードで容易にできると思います

データの重複処理と言うとCollectionオブジェクトやDictionaryオブジェクトを使う例があります

今回既に配列を作成するロジック
vv(i) = Selection
i = i + 1: ReDim Preserve vv(i)
がありますのでKey自体の取り出しが不要でItem要素が無いので重複分岐のトリガーとして使えば良さそうです
(一度オブジェクトに登録したデータをソートするのは少し複雑になるため分岐処理のトリガーとして使うのが簡単です)

具体的な例などは私が対応できるかわかりませんが別スレッドを建てる方が良いでしょう
ご質問の追加に関してはサイトの規約に抵触する可能性が高いのです

ご質問表題、キーワードなどから来る後の訪問者の為に、
追加質問に対しての回答をベストアンサーに選ばない様にしてください
    • good
    • 0
この回答へのお礼

色々ご教授ありがとうございます。もう少し勉強してみます。

お礼日時:2024/03/29 14:21

Wordでのテストが出来ないので未検証ですが


配列vvをMsgBox前でソートする方法でいかがでしょうか
ソートについては下記をじっくり読んでください

参考 https://excel-ubara.com/excelvba5/EXCELVBA228.html

ExcelVBAですが今回は問題ないと思います

サンプル Function扱いとしています(昇順)

Function Array_QuickSort(arrData As Variant) As Variant()
Dim i As Long, j As Long
Dim swap As Variant
For i = LBound(arrData) To UBound(arrData)
For j = UBound(arrData) To i Step -1
If arrData(i) > arrData(j) Then
swap = arrData(i)
arrData(i) = arrData(j)
arrData(j) = swap
End If
Next j
Next i
Array_QuickSort = arrData
End Function

呼び出し位置
ご質問コード下部

i = i + 1: ReDim Preserve vv(i)
Loop
End With
vv = Array_QuickSort(vv)
MsgBox "登録日" + vbCrLf + vbCrLf + Join(vv, vbCrLf)

End Sub
    • good
    • 0
この回答へのお礼

ありがとう

Qchan1962様

早速ご連絡いただきありがとうございました。Wordで検証したところ、希望通りの結果となりました。arrData(i) > arrData(j)をarrData(i) < arrData(j)にすることにより、降順にすることも確認できました。大変に助かります。 もう一つ教えていただきたいのですが、検索結果が重複して有る場合、1つだけ表示することができるのでしょうか? 甘えてすいませんがよろしくご教授いただけますでしょうか?

お礼日時:2024/03/28 18:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A