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

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

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

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

Q&A

2回答

512閲覧

VBAで全シートのA列をキーに列を結合するには

rena_168

総合スコア73

VBA

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

1グッド

0クリップ

投稿2025/04/07 06:35

編集2025/04/07 06:58

実現したいこと

時刻項目1項目2
2025/3/23 0:00:00111222
2025/3/23 0:00:01aaabbb
時刻項目3項目4
2025/3/23 0:00:01a1b1
2025/3/23 0:00:03x1y1
時刻項目1項目2項目3項目4
2025/3/23 0:00:00111222
2025/3/23 0:00:01aaabbba1b1
2025/3/23 0:00:03x2y2

発生している問題・分からないこと

全てのシートの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環境で実行しています。

tatsu99👍を押しています

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

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

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

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

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

meg_

2025/04/07 10:45

> VBAで全シートのA列をキーに列を結合するには > ユーザーフォームで検索語を入力する 課題はデータの結合ですか?文字列の検索ですか?何がしたくて今どこまで実装できているのでしょうか??
rena_168

2025/04/07 11:24

すみません、DBから抽出したデータが1つ目のシートまでできて、100個くらいのCSVを2つ目以降のシートまでしかできていません。 1つ目のシートのA列の時間(0:00:00~23:59:59)毎に、それ以降の100くらいのシート内容のA列の時間をキーに全シートの列結合がしたいですが、まだ全然書けていません><
meg_

2025/04/07 14:06

> すみません、DBから抽出したデータが1つ目のシートまでできて、100個くらいのCSVを2つ目以降のシートまでしかできていません。 「できて」「できていません」というのは何がどうなることを言っていますか? 質問文にはDBの話は出てきませんでしたが、データはDBに保存されているということですか?状況はよく分かりませんがDB上でデータ結合した方が良くないですか?(それができない理由等があるのであればそのあたりも質問文に追記しましょう)
sk.exe

2025/04/07 22:29

> 全てのシートの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 を使用するという方法も考えられるでしょう。
rena_168

2025/04/08 01:07

説明が分かりにくくて、すみません。 項目3、項目4は、結合したときにわかりやすいため、そう書いただけです。 PLCからそれぞれのCSVが吐き出されていて、全データを1つのDBのテーブルに登録した(妥当かどうかはわかりませんが、そう決まったことです)もので、最終チェックで苦労しています。 私のやり方がやっぱり良くないのでしょうか。先輩のご指導をお願いします。
sk.exe

2025/04/08 02:30 編集

> PLCからそれぞれのCSVが吐き出されていて ・全ての CSV ファイルに共通して記録されている項目(列)は[時刻]のみである。  (その列の名前は全てのファイルにおいて完全に統一されている) ・[時刻]以外の項目は多数あり、それらの列名や列数はファイルによってバラバラである。  (同じ列名の項目が複数のファイルに記録されていることもあれば、  そのファイルにしか記録されていない項目が存在していたりもする) という前提であるとして、 > 全データを1つのDBのテーブルに登録した 「1つのDBのテーブル」というのは具体的に何を示しているのでしょうか。 Excel における「テーブル」と同じ意味でしょうか。 それとも何らかの外部データベース上のテーブルでしょうか。 また「登録『した』」とありますが、(meg_さんがたびたび指摘されていますが) 問題とされている「同じ時間帯の全項目を一つのシートに集約」自体は 既に出来ているのでしょうか。それとも出来ていないのでしょうか。 ここまでのご説明だと「個々の CSV ファイルのデータを別々のワークシート ( 1 つのファイルにつき 1 つのワークシート)として読み込んだ 1 つのブックがある」 と解釈できるのですが、100 個ほどもある CSV ファイルをわざわざ 1 つずつ開く 作業でも行なわれたのでしょうか。 > 最終チェックで苦労しています。 その「最終チェック」とは具体的にどのような作業で、 どのような結果が得られれば完了となるのでしょうか。 それは「同じ時間帯の全項目を一つのシートに集約」とは 別の問題ではないのでしょうか。
dodox86

2025/04/08 02:47

何となく、「自分で考えてできそうなところ」のVBAのコードをいきなり書き始めているから詰めのところでできなくなっちゃっているんじゃないかなと思えます。回答いただいてるように、基本的な設計をしてから進めればいいのに、と思える事案ですね。 > また"2025/3/23 0:00:00"を検索したいですが、検索できていません。 > 何方かご存じでしたら、教えていただけますでしょうか。 これはまた別の話(質問)になってしまうのではないでしょうか。
meg_

2025/04/08 03:24

> PLCからそれぞれのCSVが吐き出されていて、全データを1つのDBのテーブルに登録した(妥当かどうかはわかりませんが、そう決まったことです)もので、最終チェックで苦労しています。 そのDBの内容がぐちゃぐちゃになっているということでしょうか?(値は登録されているが項目名が不明ということ??) そのDBの入力元であるCSVファイルが全てあるのであれば、sk.exeさんが言及されているようにPowerQueryで結合するのが良いかと思います。微調整が必要であれば結合後に処理すれば良いかと思います。PowerQueryで結合できない場合はその理由を質問に書かれると何かアドバイスできることがあるかもしれません。
rena_168

2025/04/09 00:15

DBは100個くらいのCSVをもとに登録されていて、その最終確認で苦労しています。 PowerQueryは使ってことがないのですが、100個以上のCSVになるとExcel上の操作だけでできるものなんでしょうか。
meg_

2025/04/09 11:20 編集

Excelのlookup関数を使っても良いかもしれません。初回の作成は少々手間かと思いますがどうでしょうか? > DBは100個くらいのCSVをもとに登録されていて、その最終確認で苦労しています。 具体的に苦労されている事が伝わらないのですが、皆さんの回答では解決しませんか?
guest

回答2

0

「VBAで」と指定されていますが、とりあえず Power Query を使用する場合の例を挙げます。

使用するファイルについて

ある1つのフォルダの中に、以下の仕様を満たしたテキストファイルが1つ以上保存されているものとする。

  • フォーマット: CSV 形式(可変長カンマ区切り)
  • ファイル拡張子: .csv
  • 文字エンコード: Shift_JIS
  • 列見出し行: あり(1行目)
  • 列数: 2列以上(可変。ファイルによって異なる)
  • 列名: 1列目は[時刻](全てのファイルに共通)。2列目以降はファイルによって異なる。
  • [時刻]列のデータ型/形式: yyyy/m/d h:mm:ssなど datetime 型に変換可能な形式の文字列とする。

サンプルファイル

file0001.csv

1"時刻","項目1","項目2" 22025/3/23 0:00:00,"111","222" 32025/3/23 0:00:01,"aaa","bbb"

file0002.csv

1"時刻","項目3","項目4" 22025/3/23 0:00:01,"a1","b1" 32025/3/23 0:00:03,"x1","y1"

file0003.csv

1"時刻","項目1","項目5","項目6" 22025/3/23 0:00:03,"ddd",1,1690 32025/3/23 23:59:59,"dde",0,98 42025/3/24 0:00:00,"dzq",1,89210

Power Query エディターによるクエリの作成例

1: Excel 上で空のブックを新規作成する。

2: [データ]タブ -> [データの取得と変換]グループ -> [データの取得] -> [Power Query エディターの起動]をクリックし、Power Query エディターを起動する。

3: [ホーム]タブ -> [パラメーター]グループ -> [パラメーターの管理] -> [新しいパラメーター]をクリックし、テキスト型のパラメーターTargetFolderPathを作成、CSVファイルが保存されているフォルダの絶対パスを[現在の値]ボックスに入力する。

イメージ説明

4: [ホーム]タブ -> [新しいクエリ]グループ -> [新しいソース] -> [その他のソース] -> [空のクエリ]をクリックし、空のクエリを新規作成する。

5: 作成されたクエリが選択された状態で[ホーム]タブ -> [クエリ]グループ -> [詳細エディター]をクリックし、詳細エディターを開く。

6: 詳細エディターに次のようなクエリを記述する。

PowerQuery

1let 2 //キー列(日時データ)の名前を定義 3 KeyColumnName = "時刻", 4 //CSVファイル読込用のカスタム関数を定義 5 LoadCsv = (CsvContent as binary) => 6 let 7 //引数に渡されたバイナリデータを CSV ファイルとみなし、テーブルとして読み込む。ここでのエンコード方式は Shift_JIS とする。 8 LoadedContent = Csv.Document(CsvContent,[Delimiter=",", Encoding=932]), 9 //読み込んだテーブルの 1 行目のレコードを列見出しに昇格させる 10 PromotedHeaders = Table.PromoteHeaders(LoadedContent) 11 in 12 PromotedHeaders, 13 //テーブルレイアウト変換用のカスタム関数を定義 14 TransformTable = (table1 as table) => 15 let 16 //キー列のデータ型を datetime 型に変換する 17 TransformedFirstColumnTypes = Table.TransformColumnTypes(table1,{{KeyColumnName, type datetime}}), 18 //キー列以外の全ての列のピボットを解除する 19 UnpivotedOtherColumns = Table.UnpivotOtherColumns(TransformedFirstColumnTypes, {KeyColumnName}, "属性", "値") 20 in 21 UnpivotedOtherColumns, 22 //指定したフォルダ内のファイル情報をテーブルとして取得 23 Source = Folder.Files(TargetFolderPath), 24 //拡張子が .csv であるファイルのレコードを抽出する 25 FilteredByExtension = Table.SelectRows(Source, each [Extension]=".csv"), 26 //カスタム関数を使用して全ての CSV ファイルを読み込み、テーブルに変換する 27 LoadedFiles = Table.TransformColumns(FilteredByExtension, {"Content", LoadCsv}), 28 //キー列と同じ名前の列を含むテーブルのみを抽出する 29 FilteredByHeader = Table.SelectRows(LoadedFiles, each List.Contains(Table.ColumnNames([Content]),KeyColumnName)), 30 //カスタム関数を使用して全てのテーブルを同一レイアウトに変換する 31 TransformedTable = Table.TransformColumns(FilteredByHeader, {"Content", TransformTable}), 32 //変換された全てのテーブルをマージする 33 CombinedTables = Table.Combine(TransformedTable[Content]), 34 //[属性]列の値を新たな列見出しとして[値]列の値をピボット 35 PivotedColumn = Table.Pivot(CombinedTables, List.Distinct(CombinedTables[属性]), "属性", "値"), 36 //レコードをキー列の昇順に並べ替える 37 SortedRows = Table.Sort(PivotedColumn,{{KeyColumnName, Order.Ascending}}) 38in 39 SortedRows

7: 構文エラーがないことを確認したら、[完了]ボタンをクリックする。

8: プレビューにエラー表示がないことを確認したら、[クエリの設定]ウィンドウよりそのクエリを任意の名前に変更する。

9: [ホーム]タブ -> [閉じる]グループ -> [閉じて読み込む] -> [閉じて読み込む]をクリックする。

10: 追加されたワークシートの A 列の 2 行目から最後のデータ行までの範囲を選択する。

11: 選択範囲の表示形式をyyyy/mm/dd hh:mm:ss に変更する(秒を表示させる)。

変換結果

イメージ説明

投稿2025/04/09 03:08

sk.exe

総合スコア1048

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

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

0

端的に言えば、エクセルで処理することではないと思いますRDBでの運用をご検討ください
どうしてもエクセルでしか対応できないというのであれば

  1. 各シートからA列をコピーしてまとめシートのA列に流し込む
  2. 重複の削除
  3. 各シートのデータをindex+matchで抽出

という流れになると思います

参考

復数のシートのA列の値を「シートA」のA列に集約する方法

vba

1 Dim r1 As Range 2 Dim r2 As Range 3 Dim sheet As Worksheet 4 Dim shukeiSheetName As String 5 shukeiSheetName = "シートA" 6 7 Dim allData() As Variant 8 Dim uniqueData As Variant 9 Dim newData() As Variant 10 Dim dict As Object 11 Set dict = CreateObject("Scripting.Dictionary") 12 For Each sheet In Sheets 13 Set r1 = sheet.Range("A:A") 14 If sheet.name <> shukeiSheetName Then 15 If WorksheetFunction.CountIf(r1, "<>") > 0 Then 16 Set r2 = r1.SpecialCells(xlCellTypeConstants) 17 For Each cell In r2 18 If Not IsEmpty(cell.Value) Then 19 If (Not Not allData) = 0 Then 20 n = 0 21 Else 22 n = UBound(allData) + 1 23 End If 24 ReDim Preserve allData(n) 25 allData(n) = cell.Value 26 End If 27 Next 28 End If 29 End If 30 Next 31 For i = 0 To UBound(allData) 32 If Not dict.exists(allData(i)) Then 33 dict.Add allData(i), True 34 End If 35 Next i 36 uniqueData = dict.keys 37 ReDim newData(UBound(uniqueData), 0) 38 For i = 0 To UBound(uniqueData) 39 newData(i, 0) = uniqueData(i) 40 Next i 41 Set sheet = Sheets(shukeiSheetName) 42 If Not sheet Is Nothing Then 43 sheet.Range(sheet.Cells(1, 1), sheet.Cells(UBound(uniqueData) + 1, 1)).Value = newData 44 End If

投稿2025/04/08 00:37

編集2025/04/09 02:29
yambejp

総合スコア117548

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

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

rena_168

2025/04/08 01:13

100個くらいのPLC測定のCSVデータがDB一つのテーブルに登録したもので、そのチェックで今苦労しています。(その仕様はよくないかもしれませんが、決まり事でしかたないです) 要するに、すべての時間の全項目をDBに登録していて、チェック方法で私はVBAでチェックしようとしていますが、もっといい方法がありましたら、教えていただきたいです。 すみません、RDBの運用はよくわからないので、また勉強が必要です><
yambejp

2025/04/08 02:23

>もっといい方法がありましたら 私が回答した内容で要件は足りると思いますがダメなのですか?
rena_168

2025/04/08 03:39

YAMさんのやり方でできると思いますが、1日分のデータが100以上のCSVシートを関数入れて繰り返してやって5日分やるのがちょっと大変そうで、もっと作業短縮できる方法はないかなと思っているところです。 プログラムが出来る人なら、すぐそれで一発できそうですが、そういう能力がなくて、苦労しています>< 先輩なら、どうされますか?
yambejp

2025/04/09 02:30 編集

参考のソースをあげておきました 仕様が違うようなら指摘ください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問