実現したいこと
時刻 | 項目1 | 項目2 |
---|---|---|
2025/3/23 0:00:00 | 111 | 222 |
2025/3/23 0:00:01 | aaa | bbb |
時刻 | 項目3 | 項目4 |
---|---|---|
2025/3/23 0:00:01 | a1 | b1 |
2025/3/23 0:00:03 | x1 | y1 |
時刻 | 項目1 | 項目2 | 項目3 | 項目4 |
---|---|---|---|---|
2025/3/23 0:00:00 | 111 | 222 | ||
2025/3/23 0:00:01 | aaa | bbb | a1 | b1 |
2025/3/23 0:00:03 | x2 | y2 |
発生している問題・分からないこと
全てのシートのA列は秒単位で吐き出されたもので、指定時間(例:2025/3/23 0:00:00)から1秒後のデータが各シートの列1にあり、同じ時間帯の全項目を一つのシートに集約したいです。
該当のソースコード
VBA
1Sub Disp_clac_2() 2 Dim i As Long, j As Long 3 Dim Ave, Disp As Currency 4 Dim StartTime, StopTime As Single 5 Dim finalRow As Long 6 Dim FinalCol As Long 7 Dim シートNo As Long 8 Dim Table As Variant 9 10 For シートNo = 1 To Worksheets.Count 11 12 finalRow = Worksheets(シートNo).Range("A1").End(xlDown).Row 13 FinalCol = Worksheets(シートNo).Range("A1").End(xlToRight).Column 14 15 16 Table = Worksheets(シートNo).Range("A2:C" & FinalCol).Value 17 18 19 Next 20 21 22 23 MsgBox Table(2, 1) 24 25End Sub
VBA
1Sub Workbook_Open() 2Dim searchValue As String 3Dim currentSheet As Worksheet 4Dim cell As Range 5Dim hitCount As Integer 6Dim found As Boolean 7 8' ユーザーフォームで検索語を入力する 9searchValue = InputBox("2025/3/23 0:00:00") 10 11' 全てのワークシートを検索する 12For Each currentSheet In ActiveWorkbook.Worksheets 13 ' C8からC1800の範囲を検索する 14 For Each cell In currentSheet.Range("A2:C8") 15 ' セルの値に検索語が含まれているかチェックする 16 If InStr(1, cell.Value, searchValue, vbTextCompare) > 0 Then 17 hitCount = hitCount + 1 18 ' ヒットした場合はセルをアクティブにする 19 currentSheet.Activate 20 cell.Activate 21 found = True 22 End If 23 Next cell 24Next currentSheet 25 26If found = False Then 27 MsgBox "検索語が見つかりませんでした。" 28ElseIf hitCount >= 2 Then 29 MsgBox hitCount & "件のヒットがありました。" 30End If 31End Sub
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Table(1,1)の時間が#2025/3/23#です。
Table(2,1)の時間が#2025/3/23 0:00:01#です。
また"2025/3/23 0:00:00"を検索したいですが、検索できていません。
何方かご存じでしたら、教えていただけますでしょうか。
補足
Alt+F11でOffice2021環境で実行しています。
> VBAで全シートのA列をキーに列を結合するには
> ユーザーフォームで検索語を入力する
課題はデータの結合ですか?文字列の検索ですか?何がしたくて今どこまで実装できているのでしょうか??
すみません、DBから抽出したデータが1つ目のシートまでできて、100個くらいのCSVを2つ目以降のシートまでしかできていません。
1つ目のシートのA列の時間(0:00:00~23:59:59)毎に、それ以降の100くらいのシート内容のA列の時間をキーに全シートの列結合がしたいですが、まだ全然書けていません><
> すみません、DBから抽出したデータが1つ目のシートまでできて、100個くらいのCSVを2つ目以降のシートまでしかできていません。
「できて」「できていません」というのは何がどうなることを言っていますか?
質問文にはDBの話は出てきませんでしたが、データはDBに保存されているということですか?状況はよく分かりませんがDB上でデータ結合した方が良くないですか?(それができない理由等があるのであればそのあたりも質問文に追記しましょう)
> 全てのシートのA列は秒単位で吐き出されたもので、
> 指定時間(例:2025/3/23 0:00:00)から1秒後のデータが
> 各シートの列1にあり、同じ時間帯の全項目を一つのシートに集約したいです。
実行結果の 3 行目([時刻]=#2025/3/23 0:00:03#)について、
・なぜ[項目3]と[項目4]ではなく[項目1]と[項目2]に値が代入されるのか。
・なぜ[項目1]に"x1"ではなく"x2"が、[項目2]に"y1"ではなく"y2"が代入されるのか。
という点が不明です。
> DBから抽出したデータ
> 100個くらいのCSV
おおもとのデータが何らかのデータベースから参照された複数のテーブルやビュー、
あるいは( 1 つのフォルダ内に保存された)複数の CSV ファイルなのであれば、
VBA にこだわらず Power Query を使用するという方法も考えられるでしょう。
説明が分かりにくくて、すみません。
項目3、項目4は、結合したときにわかりやすいため、そう書いただけです。
PLCからそれぞれのCSVが吐き出されていて、全データを1つのDBのテーブルに登録した(妥当かどうかはわかりませんが、そう決まったことです)もので、最終チェックで苦労しています。
私のやり方がやっぱり良くないのでしょうか。先輩のご指導をお願いします。
> PLCからそれぞれのCSVが吐き出されていて
・全ての CSV ファイルに共通して記録されている項目(列)は[時刻]のみである。
(その列の名前は全てのファイルにおいて完全に統一されている)
・[時刻]以外の項目は多数あり、それらの列名や列数はファイルによってバラバラである。
(同じ列名の項目が複数のファイルに記録されていることもあれば、
そのファイルにしか記録されていない項目が存在していたりもする)
という前提であるとして、
> 全データを1つのDBのテーブルに登録した
「1つのDBのテーブル」というのは具体的に何を示しているのでしょうか。
Excel における「テーブル」と同じ意味でしょうか。
それとも何らかの外部データベース上のテーブルでしょうか。
また「登録『した』」とありますが、(meg_さんがたびたび指摘されていますが)
問題とされている「同じ時間帯の全項目を一つのシートに集約」自体は
既に出来ているのでしょうか。それとも出来ていないのでしょうか。
ここまでのご説明だと「個々の CSV ファイルのデータを別々のワークシート
( 1 つのファイルにつき 1 つのワークシート)として読み込んだ 1 つのブックがある」
と解釈できるのですが、100 個ほどもある CSV ファイルをわざわざ 1 つずつ開く
作業でも行なわれたのでしょうか。
> 最終チェックで苦労しています。
その「最終チェック」とは具体的にどのような作業で、
どのような結果が得られれば完了となるのでしょうか。
それは「同じ時間帯の全項目を一つのシートに集約」とは
別の問題ではないのでしょうか。
何となく、「自分で考えてできそうなところ」のVBAのコードをいきなり書き始めているから詰めのところでできなくなっちゃっているんじゃないかなと思えます。回答いただいてるように、基本的な設計をしてから進めればいいのに、と思える事案ですね。
> また"2025/3/23 0:00:00"を検索したいですが、検索できていません。
> 何方かご存じでしたら、教えていただけますでしょうか。
これはまた別の話(質問)になってしまうのではないでしょうか。
> PLCからそれぞれのCSVが吐き出されていて、全データを1つのDBのテーブルに登録した(妥当かどうかはわかりませんが、そう決まったことです)もので、最終チェックで苦労しています。
そのDBの内容がぐちゃぐちゃになっているということでしょうか?(値は登録されているが項目名が不明ということ??)
そのDBの入力元であるCSVファイルが全てあるのであれば、sk.exeさんが言及されているようにPowerQueryで結合するのが良いかと思います。微調整が必要であれば結合後に処理すれば良いかと思います。PowerQueryで結合できない場合はその理由を質問に書かれると何かアドバイスできることがあるかもしれません。
DBは100個くらいのCSVをもとに登録されていて、その最終確認で苦労しています。
PowerQueryは使ってことがないのですが、100個以上のCSVになるとExcel上の操作だけでできるものなんでしょうか。
Excelのlookup関数を使っても良いかもしれません。初回の作成は少々手間かと思いますがどうでしょうか?
> DBは100個くらいのCSVをもとに登録されていて、その最終確認で苦労しています。
具体的に苦労されている事が伝わらないのですが、皆さんの回答では解決しませんか?
