セルを、指定されたXのセルにコピーしていくマクロの作業の質問です。
Xにはシートが「テスト1」「テスト2」……「テスト*」と続き、各シートの
B7セルには固有IDがあります(純粋な値ではなく数式)。Yはシートが1つです。
Yにもこの固有ID(純粋な値)がA列にあり(YにはXに挿入したいタイトル一覧
【大見出し、中見出しなど】がD列に記されています)、Xのあるシート内の
固有ID(=B7)と一致したYの行を抽出し、そのD列にあるセル群をXのそのシート
におけるB16から順にB17、B18……と貼り付けていきたいのです。
Yの一覧ではすでにXの各シートに挿入したいタイトル順には整列されています
ので、並び替えは不要です。すなわちXのB7セルとYのA列セルが一致した範囲の
D列そのものをXのB16から貼り付けていくことになります。
そして、指定した範囲内の固有IDにおいて実行したいと考えています。
固有IDは "A_test_t01","A_test_t02",……となっております。
マクロを忘れてしまったため、どうぞよろしくお願いいたします。
こういったものを言葉で表現しにくくて申し訳ありません。
記載した質問でほぼあっていたので、ほっとしています。
ファイル名固定で、エラーチェックは少しさぼって作ってみました。
多分これで実用できると思います。コピーして、title.xlsの標準モジュールにマクロを入れて動かしてみてください(別なブックへ入れても動きます)。
動作環境などは、ソース上のコメントをご覧ください。
title.xlsはFrom表、youkou.xlsはTo表と呼んでいます。
Option Explicit 'ブック名称や列は下記に固定→可変にする場合は、マクロ変更ください Public Const sKeyBody As String = "a_test_" '小文字で指定 Public Const sFromName As String = "title.xls" Public Const sFromAnsClm As String = "D" Public Const iFromTitleRow As Integer = 1 Public Const sToName As String = "youkou.xls" Public Const sToKeyAddr As String = "B7" Public Const sToTgtAddr As String = "B16" Sub 抽出() ' ' From表にまとめられているデータをToのそれぞれの ' シートにあるキーワードで抽出してペーストする ' ' <動作環境> ' 両方のブックは開いておく。 ' From表は、オートフィルター状態にしておく ' マクロ起動で、範囲を聞いてくるので、入力する ' Dim sStart As String Dim sEnd As String Dim objTo As Worksheet Dim sKey As String sStart = sKeyBody & Format(InputBox("開始番号は?"), "00") sEnd = sKeyBody & Format(InputBox("終了番号は?"), "00") Windows(sToName).Activate For Each objTo In Worksheets 'Toの各シート毎に処理 objTo.Select '文字型にして小文字化 sKey = LCase(CStr(Range(sToKeyAddr).Value)) If sStart <= sKey And sKey <= sEnd Then '範囲内ならフィルタして貼り付け Windows(sFromName).Activate Selection.AutoFilter Field:=1, Criteria1:=sKey 'キーワードがないときには、貼り付けしない If Range("D65536").End(xlUp).Row <> iFromTitleRow Then '先頭行の次から値がある最後までをコピー Range(Range(sFromAnsClm & iFromTitleRow).Offset(1), _ Range("D65536").End(xlUp)).Select Selection.Copy Windows(sToName).Activate Range(sToTgtAddr).Select '文字内容のみを貼り付け Selection.PasteSpecial Paste:=xlPasteValues, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=False Else Windows(sToName).Activate End If End If Next End Sub
P.S.キーワードが、片方はA_test_t01、片方はa_test_01で文字内容が違っています。アップしてあったファイルそのままでは動きませんので、同じ文字に合わせてください(大小文字は関係なし)。
P.S.質問中のコメントやトラックバックは有効にしておいたほうがいいです。途中でも色々コメントがもらえますから。。。
質問の意味が難解です。。。
解読した結果、「1つの表から、検索内容を変えて別シートに抽出したい」ということでしょうか?
●元データ
Y.xls:表
X.xls:検索条件
X.xlsには、1つの検索条件が1つのシートに書かれている(B7セルに式で)。
検索条件はシート名と連動しており(?)、"テスト1"→"A_test_t01"、"テスト2"→"A_test_t02"の規則に従う。連番とは限らない。
●処理内容
X.xlsの検索条件は、FromとToの番号(?)で指定する。
検索条件にマッチした表のD列を抽出して、検索条件記載シートのB16列へ入れる。
●具体例
Y.xls
A | B | C | D |
---|---|---|---|
ID | ふぃらー1 | ふぃらー2 | 見出し |
A_test_t01 | 科学-宇宙 | ||
A_test_t01 | 科学-ほげ | ||
A_test_t02 | 文学-日本 | ||
A_test_t02 | 文学-アジア | ||
A_test_t02 | 文学-欧米 |
X.xls
テスト1シート
A | B | C | |
---|---|---|---|
7 | ="A_test_t"&"01" |
実行後のX.xls結果(From=1, To=1にしたとき)
テスト1シート
A | B | C | |
---|---|---|---|
7 | ="A_test_t"&"01" | ||
: | |||
16 | 科学-宇宙 | ||
17 | 科学-ほげ | ||
18 |
p.s. From-Toの件数とこの処理を行う頻度によりますが、マクロで書くより、【データ→フィルタ→フィルタオプションの設定】が早そうです。
(マクロは、マクロの記録してソース見れば一発で思い出しそうですが。。。)
ご回答ありがとうございました。そして、言葉だけでは表現しにくいものを
解読してくださり、誠にありがとうございました。知人から頼まれている作業
なので、私の理解不足により表現が難解だったかもしれません。、
今外におりますが、W-ZERO3にて現物の簡易版を作成し、以下にuploadいたしました。
Xにあたるもの
http://web.sfc.keio.ac.jp/~luce/hatena/youkou.xls
Yにあたるもの
http://web.sfc.keio.ac.jp/~luce/hatena/title.xls
●補足
youkou.xlsはサマリというシートがあり、そこに記された固有idを他のシートの
固有id欄に数式で拾ってきて表示させています。シート名に記されている数字と、
シート内の固有id内の数字は必ずしも一致しません。シート自体は連番ですが、
固有idは連番ではないということです。なお各シート内にNo.1~6まで番号を
振りましたが、その数に意味はありません。もしかしたら固有id欄(=B7)に
"#VALUE!" と表示されてしまっているかもしれません。その場合は、お手数ですが
B7セルをクリックし、数式入力欄をクリックし、Enterキーを押してください。
実物は、シート数が100近くあり、今後もこのくらいのファイルがいくつも
できるみたいで、マクロでやりたいそうです。
title.xlsのA列にある固有idは、番号の区切り目で
行を挿入していたりしていなかったりな状態です。
#コンピュータにあまり明るくないので、なかなか思い出せません。。。
どうぞよろしくお願いいたします。
記載した質問でほぼあっていたので、ほっとしています。
ファイル名固定で、エラーチェックは少しさぼって作ってみました。
多分これで実用できると思います。コピーして、title.xlsの標準モジュールにマクロを入れて動かしてみてください(別なブックへ入れても動きます)。
動作環境などは、ソース上のコメントをご覧ください。
title.xlsはFrom表、youkou.xlsはTo表と呼んでいます。
Option Explicit 'ブック名称や列は下記に固定→可変にする場合は、マクロ変更ください Public Const sKeyBody As String = "a_test_" '小文字で指定 Public Const sFromName As String = "title.xls" Public Const sFromAnsClm As String = "D" Public Const iFromTitleRow As Integer = 1 Public Const sToName As String = "youkou.xls" Public Const sToKeyAddr As String = "B7" Public Const sToTgtAddr As String = "B16" Sub 抽出() ' ' From表にまとめられているデータをToのそれぞれの ' シートにあるキーワードで抽出してペーストする ' ' <動作環境> ' 両方のブックは開いておく。 ' From表は、オートフィルター状態にしておく ' マクロ起動で、範囲を聞いてくるので、入力する ' Dim sStart As String Dim sEnd As String Dim objTo As Worksheet Dim sKey As String sStart = sKeyBody & Format(InputBox("開始番号は?"), "00") sEnd = sKeyBody & Format(InputBox("終了番号は?"), "00") Windows(sToName).Activate For Each objTo In Worksheets 'Toの各シート毎に処理 objTo.Select '文字型にして小文字化 sKey = LCase(CStr(Range(sToKeyAddr).Value)) If sStart <= sKey And sKey <= sEnd Then '範囲内ならフィルタして貼り付け Windows(sFromName).Activate Selection.AutoFilter Field:=1, Criteria1:=sKey 'キーワードがないときには、貼り付けしない If Range("D65536").End(xlUp).Row <> iFromTitleRow Then '先頭行の次から値がある最後までをコピー Range(Range(sFromAnsClm & iFromTitleRow).Offset(1), _ Range("D65536").End(xlUp)).Select Selection.Copy Windows(sToName).Activate Range(sToTgtAddr).Select '文字内容のみを貼り付け Selection.PasteSpecial Paste:=xlPasteValues, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=False Else Windows(sToName).Activate End If End If Next End Sub
P.S.キーワードが、片方はA_test_t01、片方はa_test_01で文字内容が違っています。アップしてあったファイルそのままでは動きませんので、同じ文字に合わせてください(大小文字は関係なし)。
P.S.質問中のコメントやトラックバックは有効にしておいたほうがいいです。途中でも色々コメントがもらえますから。。。
airplant 様
ご丁寧にありがとうございます.モバイル端末で作成したため,バグが混入してしまったようです……
コメントやトラックバックのことも意識していなかったため,デフォルトのままでした.
これからまた出てしまうので,後ほどhiramatsu_kg様のところで,合わせてお返事したいと思います.
どうもありがとうございました.
airplant 様
正式なお返事が遅くなりました.
動きました! ソースを拝見させていただきながら,なるほどなあと感じました.
お恥ずかしながら普段プログラム全般をあまり書かないこともあって結構鈍って
いたようです.これを機に,いろいろといじくり始めようと思います.
本当にどうもありがとうございました.
> hiramatsu_kg様
大変素晴らしい回答,どうもありがとうございます.質問していないで自分で
調べて解決しなさいって意義深いご指摘ですね.あなた様の過去の回答を拝見
させていただきますと,そういう流れがよく汲み取れます.
私もその意味を前もって学習し,hiramatsu_kg様のことを事前によく調べておけば
と後悔いたしました.今後の反省材料とさせていただきます.ありがとうございました.
airplant 様
ご丁寧にありがとうございます.モバイル端末で作成したため,バグが混入してしまったようです……
コメントやトラックバックのことも意識していなかったため,デフォルトのままでした.
これからまた出てしまうので,後ほどhiramatsu_kg様のところで,合わせてお返事したいと思います.
どうもありがとうございました.