質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

741閲覧

VBA ファイル比較 繰り返し

yakumo02

総合スコア103

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/08/11 10:15

編集2020/08/11 11:08

###追記::現在実装中です しばらくお待ちください

Aのファイル(ThisWorkbook)のデータと複数のファイルのデータを全て照合するコードを書きたいと思っています。
配列Sheet(1~179)に比較する複数のファイルのパスが入っています。

AファイルにはG列にデータが入っています
######Aファイル
行番号|F |G |H|
|:--|:--:|--:|
1||初期||
2||テスト||
3||アクション||
4||イベント||
5||デバッグ||

配列Sheetに入っている複数のファイルのデータはCC列に入っているが、データ数がバラバラ
Bファイル CC1CC6
Cファイル CC1
CC8 など

######Bファイル
行番号|CB |CC | CD |
|:--|:--:|--:|
1||イベント||
2||検索||
3||デバッグ|
4||PHP||
5||AWS|
6||初期||

######Cファイル
行番号|CB |CC | CD |
|:--|:--:|--:|
1||C#||
2||テスト||
3||Ruby|
4||Java||
5||C||
6||エラー||
7||Python||
8||module||

実装したいことは、以下です

もしAファイルのG列のデータが、配列に入っている、どれかのファイルのデータに1つでもあれば、真横のH列に「一致」という文字を入力。無ければ、Sheet配列を更新し、次のファイルと比べる。
全てのファイルと比較してもない場合は、不一致を入力。
(例)AファイルのG1が"初期"というデータであり、Sheet(1)に入っているBファイルのCC6に初期という文字があれば、AファイルのH2に一致を入力。全ファイルと比較しても、無ければ不一致を入力

######Aファイル
行番号|F |G |H|       
|:--|:--:|--:|
1||初期|一致|
2||テスト|一致|
3||LINE|不一致|
4||イベント|一致|
5||API|不一致|

現在悩んでいる点は
1つのデータしか比較することができません。
実行するとアプリケーション定義または、オブジェクト定義エラーが出てしまい、AファイルのH2にしか、結果がでてきません。
また、不一致となるであろうでの処理では、170近くのファイルと比較するはずなのに、10秒もたたずにエラーがでて、不一致と入力されてしまいます。

下記のコードになります
vba歴1か月でお見苦しいコードですがよろしくお願いします。

グローバル変数 仮で200 Dim Sheet(200) As String 'ファイルのパスとシート名(book.xlsxなど)が合わさったものを格納の配列 Dim Sheet_path(200) 'ファイルのパスだけ配列に格納 Dim b As Long Dim a As Long Sub hikaku() Set this = ThisWorkbook.Worksheets("イベント") a = 1 b = 2 c = 2 d = 1 this_line = this.Cells(Rows.Count, 7).End(xlUp).Row 'G列のデータの最終行を取得 Do While this_line > a 'AファイルのG列のデータ分だけループ target = this.Cells(b, 7).Value '(AファイルG列のデータを取得) Do While UBound(Sheet) > d '配列の要素数分だけ繰り返し filename = Sheet(c) '配列に入っているデータ(比較ファイルのパス)を変数に格納 '関数呼び出し Call IsContained(target, filename) If IsContained(target, filename) = True Then '戻り値がTrueだった場合 this.Cells(b, 8).Value = "一致" Exit Do Else this.Cells(b, 8).Value = "不一致" End If d = d + 1 c = c + 1 Loop d = 1 c = 2 b = b + 1 a = a + 1 Loop End Sub Function IsContained(target, filename) As Boolean '関数 path = Sheet_path(b) 'パスだけ変数に代入 Set open_file = Workbooks.Open(filename:=path & "\" & filename, UpdateLinks:=False) this_line = Workbooks(filename).Worksheets("説明").Cells(Rows.Count, 81).End(xlUp).Row `比較ファイルのデータの最終行を取得 i = 1 j = 10 Application.ScreenUpdating = False Do While this_line / 2 > i 'データ数分だけ繰り返し セルが結合してあるので2で割る ThisWorkbook.Activate If Workbooks(filename).Worksheets("説明").Cells(j, 81).Value Like target Then 'AファイルG列のデータが、比較ファイルにあれば IsContained = True Exit Do Else i = i + 1 j = j + 2 End If IsContained = False Loop Workbooks(filename).Close Application.ScreenUpdating = True End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

配列を示す番号が混同していました。
申し訳ありません

投稿2020/08/11 11:39

yakumo02

総合スコア103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問