VB初心者です。
二つのエクセルファイルを指定した列データだけを抜き出し1つのエクセルファイルにする方法が上手くいかず困っています。
A.xlsm : ID 種類 所属 ファイル名
B.xlsm : ファイル名 データ1 データ2 データ3 データ4 データ5 データ6
上記のような項目でデータがあるのですが、
まとめたとき、下記のようにしなければなりません
C.xlsm: ID URL データ1 データ2 データ3 データ5
ファイル名を主キーにして、引っ張らなければならないという事までは分かるのですが、
その後、どのように記述していいものか、わかりません。
今の説明も、うまくお伝えできているか変わりませんが
お分かりになる方がいましたら、お教えいただけないでしょうか。
No.1
- 回答日時:
以下、補足要求です。
1)3つのブックは既に、開いてある(オープンしてある)という前提で良いですか。(A.xlsm,B.xlsm,C.xlsm)
又、実際のブック名も、この名称でOKですか。
2)C.xlsmにまとめるとき、データ6はまとめなくて良いのですか?
3)3つのブックのシート名は何ですか。(それとも、全てSheet1の前提で良いですか)
4)3つのブックのデータは1行目が見出しで、2行目から実際のデータがあるという前提で良いですか。
5)マクロを格納するのは、どのブックですか。
No.2
- 回答日時:
すみません。
1点、確認もれがありました。C.xlsm: ID URL データ1 データ2 データ3 データ5
上記のB列のURLは、どのようにして取得すればよいのでしょうか。
No.4
- 回答日時:
以下のマクロを標準モジュールへ登録してください。
Const folder As String = "d:\goo\excel\goo251"
は、A.xlsmとB.xlsmを格納したフォルダ名です。あなたの環境にあわせて適切に設定して下さい。
もし、データが大量にあり、処理時間がかかる場合は、その旨補足ください。(多少は改善できます)
一般的に、このようなケースの場合は、連想配列(Dictionary)を使用すると効率がよいです。
VBA Dictionary で検索すると使用例が出てきます。(参考まで)
------------------------------------------------------------
Option Explicit
Public Sub まとめ()
Const folder As String = "d:\goo\excel\goo251"
Const bookA As String = "IDlist.xlsm"
Const bookB As String = "Datalist.xlsm"
Dim dicT As Object
Dim row As Long
Dim row3 As Long
Dim maxrowA As Long
Dim maxrowB As Long
Dim sh As Worksheet
Dim key As Variant
Dim dt1 As Variant
Dim dt2 As Variant
Dim dt3 As Variant
Dim dt4 As Variant
Dim dt5 As Variant
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Workbooks.Open Filename:=folder & "\" & bookA
Workbooks.Open Filename:=folder & "\" & bookB
Workbooks(bookB).Activate
Set sh = Worksheets("Sheet1")
'BookBの最終行を求め、最終行まで繰り返す
maxrowB = sh.Cells(Rows.Count, 1).End(xlUp).row
For row = 1 To maxrowB
key = sh.Cells(row, 1).Value
dt1 = sh.Cells(row, 2).Value
dt2 = sh.Cells(row, 3).Value
dt3 = sh.Cells(row, 4).Value
dt4 = sh.Cells(row, 5).Value
dt5 = sh.Cells(row, 6).Value
dicT(key) = Array(dt1, dt2, dt3, dt4, dt5)
Next
ThisWorkbook.Worksheets("Sheet1").Cells.Clear
Workbooks(bookA).Activate
'BookAの最終行を求め、最終行まで繰り返す
Set sh = Worksheets("Sheet1")
maxrowA = sh.Cells(Rows.Count, 1).End(xlUp).row
row3 = 1
For row = 1 To maxrowA
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 1).Value = sh.Cells(row, 1).Value 'ID
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 2).Value = sh.Cells(row, 2).Value '種類
key = sh.Cells(row, 4).Value
'ファイル名が存在すれば
If dicT.exists(key) = True Then
'データ1~データ5を設定
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 3).Value = dicT(key)(0)
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 4).Value = dicT(key)(1)
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 5).Value = dicT(key)(2)
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 6).Value = dicT(key)(3)
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 7).Value = dicT(key)(4)
End If
row3 = row3 + 1
Next
Workbooks(bookA).Close
Workbooks(bookB).Close
MsgBox ("完了")
End Sub
No.5ベストアンサー
- 回答日時:
前回のは破棄してください。
2万件なので、画面表示を抑止しました。Const folder As String = "d:\goo\excel\goo251"
は、A.xlsmとB.xlsmを格納したフォルダ名です。あなたの環境にあわせて適切に設定して下さい。
-----------------------------------
Option Explicit
Public Sub まとめ()
Const folder As String = "d:\goo\excel\goo251"
Const bookA As String = "IDlist.xlsm"
Const bookB As String = "Datalist.xlsm"
Dim dicT As Object
Dim row As Long
Dim row3 As Long
Dim maxrowA As Long
Dim maxrowB As Long
Dim sh As Worksheet
Dim key As Variant
Dim dt1 As Variant
Dim dt2 As Variant
Dim dt3 As Variant
Dim dt4 As Variant
Dim dt5 As Variant
Application.ScreenUpdating = False
Set dicT = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Workbooks.Open Filename:=folder & "\" & bookA
Workbooks.Open Filename:=folder & "\" & bookB
Workbooks(bookB).Activate
Set sh = Worksheets("Sheet1")
'BookBの最終行を求め、最終行まで繰り返す
maxrowB = sh.Cells(Rows.Count, 1).End(xlUp).row
For row = 1 To maxrowB
key = sh.Cells(row, 1).Value
dt1 = sh.Cells(row, 2).Value
dt2 = sh.Cells(row, 3).Value
dt3 = sh.Cells(row, 4).Value
dt4 = sh.Cells(row, 5).Value
dt5 = sh.Cells(row, 6).Value
dicT(key) = Array(dt1, dt2, dt3, dt4, dt5)
Next
ThisWorkbook.Worksheets("Sheet1").Cells.Clear
Workbooks(bookA).Activate
'BookAの最終行を求め、最終行まで繰り返す
Set sh = Worksheets("Sheet1")
maxrowA = sh.Cells(Rows.Count, 1).End(xlUp).row
row3 = 1
For row = 1 To maxrowA
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 1).Value = sh.Cells(row, 1).Value 'ID
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 2).Value = sh.Cells(row, 2).Value '種類
key = sh.Cells(row, 4).Value
'ファイル名が存在すれば
If dicT.exists(key) = True Then
'データ1~データ5を設定
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 3).Value = dicT(key)(0)
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 4).Value = dicT(key)(1)
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 5).Value = dicT(key)(2)
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 6).Value = dicT(key)(3)
ThisWorkbook.Worksheets("Sheet1").Cells(row3, 7).Value = dicT(key)(4)
End If
row3 = row3 + 1
Next
Workbooks(bookA).Close
Workbooks(bookB).Close
Application.ScreenUpdating = True
MsgBox ("完了")
End Sub
No.6
- 回答日時:
>エクセルの最大行数ぎりぎりまで件数があります。
データベースに切り替えた方がよいのでは?
SQL文使えば楽だと思いますし、どうしてもExcelに結果が欲しいなら
CSV形式で吐き出せば良いかと。
Excelの行数は確かに最大まで使えるかもですけど、
A+Bを開いて配列も使ってCに書き込むって、
メモリの消費心配しちゃうしBookの破損も・・・
No.7
- 回答日時:
No.6です。
Aが2万で
Bが最大行数って事は、
・BにはAに存在しないファイル名がある
・Bには『重複して』ファイル名がある
によっても違いますしね。
特に後者の場合、『重複』している際のデータの扱いがどうなるのか?
たまに『数値を加算したい』とか「最大(最小)値を求めたい』とか「平均値を出したい』とか、
要望はありますので気になりますね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
エクセルで2つの時系列のデー...
-
二分探索の平均探索回数
-
特定のデータの抽出方法を教え...
-
S9タイプからXタイプにデータ...
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
ActiveReportについて
-
CString型の文字列連結について
-
この行は既に別のテーブルに属...
-
MSCommを用いたRS-232-Cデータ転送
-
0が含まれる幾何平均が「#NUM!」
-
EXCELVBAでSQLserverからデータ...
-
VBAで「"」[']をエスケープする...
-
VBAを使ってOutlookメール本文...
-
VBA(多くの数値データの最小値...
-
クレジットカードの磁気データ...
-
ACCESSからEXCELに出力する際、...
-
VBにおいてフォーム間の変数の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
VBA 円グラフ 特定条件に一致し...
-
メモ帳(テキストデータ)をExc...
-
EXCELVBAでSQLserverからデータ...
-
VBA 空白セルを削除ではない方...
-
S9タイプからXタイプにデータ...
-
ブレーカー落ちで壊れたりしな...
-
Accessで該当データにフラグを...
-
多量のSUMIF式を軽くしたい
-
エクセルで2つの時系列のデー...
-
VBAを使ってOutlookメール本文...
-
特定のデータの抽出方法を教え...
-
この行は既に別のテーブルに属...
-
カンマからスラッシュに
-
VBAでシートからコンボボックス...
-
GridViewの行の一部を複数行にする
-
ユーザーフォームのテキストボ...
-
<VB>String→Object
おすすめ情報
早速のお返事ありがとうございます。
補足です
1)について
大変申し訳ありませんが、ブックを開くところからお願いします。
実際のファイル名は以下になります
A.xlsm → IDlist.xlsm
B.xlsm → Datalist.xlsm
C.xlsm → matome.xlsm
2)について
データ6は省きたいです
3)について
シート名はすべてsheet1です
4)について
見出し行はありません
1行目からのデータ取得になります
5)について
マクロを格納したいのは
C.xlsm(matome.xlsm)です。
C.xlsmでマクロを実行するとsheet1にデータが表示されるイメージです。
以上になります。
まだ、情報がたりていない場合、又は的外れな補足をしていた場合には
ご指摘いただければと思います。
申し訳ありません!!
URLではなく種類です!
C.xlsm: ID 種類 データ1 データ2 データ3 データ5 です。
何度もありがとうございます
A.xlsmのデータは約2万件です
B.xlsmのデータはエクセルの最大行数ぎりぎりまで件数があります。