以下のWORD VBAは選択したテーブル内のデータをワイルドカード検索し、抽出されたデータを重複非表示、降順ソートでMSGBOXに表示するものです。 問題が出ております。それが、WORDファイルに4つのテーブルがあるとして、最初のテーブルを選択して検索すると、2番目から4番目のテーブルにあるデータも一緒に検索されてしまいます。2番目のテーブルで検索すると、3から4番目のデータが、3番目のテーブルで検索すると、4番目のデータが一緒に表示されてしまいます。4番目のテーブルを選択した時のみ、4番目のデータが表示されます。 下のVBAは選択したテーブル内で検索していると思うのですが、どこに問題があるかわかりません。どなたか教えていただけないでしょうか、よろしくお願い致します。
Sub SearchUniqueAndDisplaySelectedTable()
Dim tbl As Table
Dim rng As Range
Dim result As String
Dim foundItems As New Collection
Dim item As Variant
Dim i As Integer
' 選択されたテーブルを取得します
Set tbl = Selection.Tables(1)
' 結果を格納する変数を初期化します
result = ""
' テーブル内のすべてのテキストを検索します
For Each rng In tbl.Range.Cells
' セル内のテキストを検索します
With rng
With .Find
.Text = "XYZ Reg. on 20[0-9]{1,2}/[0-9]{1,2}/[0-9]{1,2}"
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
' ワイルドカード検索を実行します
If .Execute Then
' 重複したデータをチェックして追加します
If Not foundItemsExists(.Text, foundItems) Then
foundItems.Add .Text, .Text
End If
End If
End With
End With
Next rng
' 検索結果を配列に変換します
Dim resultsArray() As Variant
ReDim resultsArray(foundItems.Count - 1)
For i = 1 To foundItems.Count
resultsArray(i - 1) = foundItems(i)
Next i
' 配列を降順にソートします
Call SortArray(resultsArray)
' 結果を文字列に変換します
For i = LBound(resultsArray) To UBound(resultsArray)
result = result & resultsArray(i) & vbCrLf
Next i
' 結果を表示します
If result <> "" Then
MsgBox "検索結果:" & vbCrLf & result, vbInformation, "検索結果"
Else
MsgBox "指定された文字列が見つかりませんでした。", vbExclamation, "検索結果"
End If
End Sub
-------------------------------------------------------------------------------------------
Function foundItemsExists(item As Variant, collection As Collection) As Boolean
On Error Resume Next
foundItemsExists = Not IsEmpty(collection(item))
On Error GoTo 0
End Function
-----------------------------------------------------------------------------------------
Sub SortArray(ByRef arr As Variant)
Dim i As Long, j As Long
Dim temp As Variant
For i = LBound(arr) To UBound(arr) - 1
For j = i + 1 To UBound(arr)
If arr(i) < arr(j) Then
temp = arr(i)
arr(i) = arr(j)
arr(j) = temp
End If
Next j
Next i
End Sub
No.2ベストアンサー
- 回答日時:
No1です。
補足の内容は、処理の手順としては何も変わってないですよね?
例えば、カウンターを作って、No1で挙げた2)で、「処理したセル数」をカウントしてみると、指定した表のセル数よりも多くなっているということですか?
(ご質問の内容は『ループが想定通りになっていない』という問題なので、細かな処理内容は関係ないはずです)
そのあたりから順に確認すれば、原因がわかるのではというのがNo1の回答なのですが・・
(当方の環境とは全く異なる環境のようなので、こちらでは調べようがありません)
fujillin様
再度のご指摘ありがとうございました。選択ターブルのセル数と内容を確認し、選択テーブルで間違いないことを確認し、問題は検索処理にあることがわかりましたので、検索方法を見直し、希望通りの結果をえることができました。ありがとうございました。基本的なことをご指導いただきましたので、ベストアンサーとさせていただきました。
No.1
- 回答日時:
こんにちは
ご提示のマクロは、そのままでは私の環境ではまったく動作しませんけれど・・
(バージョンの問題なのか、環境の問題なのかは不明ですが)
ロジック的に、
>Set tbl = Selection.Tables(1)
>For Each rng In tbl.Range.Cells
としているのに、他のテーブルまで対象にしてしまうというご質問と解釈しました。
ご提示のマクロをあちこち修正して、ロジックはそのままで、ひとまず動作するようにしてテストしてみましたが、ご質問にあるように『他のテーブルまで検索対象にしてしまう』ような事象は発生しませんでした。
当方では事象が再現しないため、回答にはなっていませんけれど、
1)tblオブジェクトに目的の表だけが取得できているか
2)For Each のループ変数が、対象tbl内だけで循環しているか
などを確認してみれば、原因が掴めるのではないでしょうか?
ご質問には直接関係ありませんけれど、With構文をネストしているので、その中で省略形を用いる場合に、どちらの親オブジェクトが参照されるのかについては注意なさった方がよさそうに思われます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA listBoxについて 2 2024/03/26 16:14
- Excel(エクセル) エクセルで連勤チェックをしたいです。 7 2023/12/25 09:14
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) wordの文書内で上から順番に"有"、"無"などを走査し該当のキーワードがあったら丸で囲む、最終文字 1 2024/02/08 16:41
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
Excel VBA 定義されたプロージャ名、関数名の取得
Visual Basic(VBA)
-
現在のブックを閉じないで、マクロ抜きの(現在のブックの)コピーを作成したい
Visual Basic(VBA)
-
エクセルの合計を自動で表示させたいです
Visual Basic(VBA)
-
-
4
VBAの質問になります メッセージボックス
Visual Basic(VBA)
-
5
VBAに詳しい方教えてください。
Visual Basic(VBA)
-
6
Word VBA MSGBOX 内で降順表示
Visual Basic(VBA)
-
7
エクセルVBAにて =A1=B1とすれば A1とB1のセル内容が一緒だった場合 TRUE 違っていれ
Visual Basic(VBA)
-
8
Excelで「Ctrl+c」、「Ctrl+v」等をまとめた物
Visual Basic(VBA)
-
9
左右の表のキー位置を合わせたい
Visual Basic(VBA)
-
10
ExcelのVBAコードについて教えてください。
Visual Basic(VBA)
-
11
Excel-VBAのmsgBox()の不思議
Visual Basic(VBA)
-
12
VBAの質問になります Userform内で
Visual Basic(VBA)
-
13
VBA SaveChanges 上書きされない
Visual Basic(VBA)
-
14
エクセルのマクロについて教えてください。
Visual Basic(VBA)
-
15
VBA 複数条件の分岐処理の上手な方法
Visual Basic(VBA)
-
16
VBA初心者 Ctrl+での操作、ボタンに登録での操作
Visual Basic(VBA)
-
17
Excelはなんで先頭の0を消すんですか?しかもCSVとかもなんでそもそも勝手に元のデータ変えるのに
Excel(エクセル)
-
18
Vba SelStart、SelLen教えてください教えてください
Visual Basic(VBA)
-
19
VBA レジストリの値の読み方について教えてください
Visual Basic(VBA)
-
20
Vba 実数および実数タイプの変数について教えてください
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
他のMDBのテーブルに追加したい
-
Accessで別mdbのテーブルをコピー
-
VBとアクセスでSQL文に変...
-
DataGridViewに複数テーブルの...
-
ワークテーブルの作成について
-
.net 複数の主キーを設定する方法
-
SQLを発行とは?クエリの作成と...
-
CSVファイルのエクスポートでソ...
-
HTMLのテーブルの行数が多くな...
-
リストボックスに複数列表示し...
-
Accessのフォームでリス...
-
【ADO】「Execute」を使うと...
-
SQL文で在庫推移を得る。
-
「テーブルに主キーがありませ...
-
書式をテーブルにした場合の絞...
-
DAOの作成単位について
-
ORACLE 効率の良いDB設計に...
-
『列名 '担当者CD' があいま...
-
エクセルのテーブルを解除する...
-
VB.NET データセットのEXCELへ出力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WORD VBA プログラム修正をお願...
-
VBとアクセスでSQL文に変...
-
Accessで別mdbのテーブルをコピー
-
『列名 '担当者CD' があいま...
-
他のMDBのテーブルに追加したい
-
ExcelVBAからAccessMDB内のテー...
-
手動または分散トランザクショ...
-
SQLを発行とは?クエリの作成と...
-
DataGridViewに複数テーブルの...
-
CSVファイルのエクスポートでソ...
-
AccessからExcelへエクスポート...
-
エクセルのテーブルを解除する...
-
Excel複数シートをaccessへ一括...
-
HTMLのテーブルの行数が多くな...
-
COBOLのINVALID KEYが理解でき...
-
アクセステーブル、リンクとロ...
-
ACCESSのテーブル名をリストに...
-
ACCESS2010 実行時エラー 2766
-
DataGridの中身をDataSetにテー...
-
【ADO】「Execute」を使うと...
おすすめ情報
fujillin様
早速ご連絡いただきありがとうございます。
動作しないとご連絡いただき、調べたところ、不注意にも、模索中で動かなったファイルをコピー添付してしまいました。真に申し訳ありません。恐縮しています。再度添付させていただきます。これが、動作はしますが、他のテーブルのデータを拾ってしまいます。お手数ですが、再度ご検討いただければ幸いです。 補足本文の文字数がオーバーになりますので、次の補足で関係箇所だけ添付します。
' 選択されたテーブル内の各セルに対して処理を行います
For Each cell In tbl.Range.Cells
' セル内のテキストを検索します
Set rng = cell.Range
With rng.Find
.Text = " XYZ Reg. on 20[0-9]{1,2}/[0-9]{1,2}/[0-9]{1,2}*"
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
' ワイルドカード検索を実行します
Do While .Execute
' 重複したデータをチェックして追加します
If Not foundItemsExists(rng.Text, foundItems) Then
foundItems.Add rng.Text, rng.Text
End If
Loop
End With
Next cell
文字数の関係で細分化されてしまい申し訳ありません。