X,Y、2つのエクセルファイルがあり、以下に述べるある条件に合致したYの

セルを、指定された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",……となっております。

マクロを忘れてしまったため、どうぞよろしくお願いいたします。
こういったものを言葉で表現しにくくて申し訳ありません。

回答の条件
  • 1人2回まで
  • 登録:2007/08/09 11:56:31
  • 終了:2007/08/12 01:16:42

ベストアンサー

id:airplant No.2

airplant回答回数220ベストアンサー獲得回数492007/08/11 03:42:42

ポイント60pt

記載した質問でほぼあっていたので、ほっとしています。


ファイル名固定で、エラーチェックは少しさぼって作ってみました。

多分これで実用できると思います。コピーして、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.質問中のコメントやトラックバックは有効にしておいたほうがいいです。途中でも色々コメントがもらえますから。。。

id:violin

airplant 様

ご丁寧にありがとうございます.モバイル端末で作成したため,バグが混入してしまったようです……

コメントやトラックバックのことも意識していなかったため,デフォルトのままでした.

これからまた出てしまうので,後ほどhiramatsu_kg様のところで,合わせてお返事したいと思います.

どうもありがとうございました.

2007/08/11 12:54:38

その他の回答(2件)

id:airplant No.1

airplant回答回数220ベストアンサー獲得回数492007/08/09 23:46:47

ポイント20pt

質問の意味が難解です。。。

解読した結果、「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の件数とこの処理を行う頻度によりますが、マクロで書くより、【データ→フィルタ→フィルタオプションの設定】が早そうです。

(マクロは、マクロの記録してソース見れば一発で思い出しそうですが。。。)

id:violin

ご回答ありがとうございました。そして、言葉だけでは表現しにくいものを

解読してくださり、誠にありがとうございました。知人から頼まれている作業

なので、私の理解不足により表現が難解だったかもしれません。、


今外におりますが、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は、番号の区切り目で

行を挿入していたりしていなかったりな状態です。

#コンピュータにあまり明るくないので、なかなか思い出せません。。。

どうぞよろしくお願いいたします。

2007/08/10 12:43:53
id:airplant No.2

airplant回答回数220ベストアンサー獲得回数492007/08/11 03:42:42ここでベストアンサー

ポイント60pt

記載した質問でほぼあっていたので、ほっとしています。


ファイル名固定で、エラーチェックは少しさぼって作ってみました。

多分これで実用できると思います。コピーして、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.質問中のコメントやトラックバックは有効にしておいたほうがいいです。途中でも色々コメントがもらえますから。。。

id:violin

airplant 様

ご丁寧にありがとうございます.モバイル端末で作成したため,バグが混入してしまったようです……

コメントやトラックバックのことも意識していなかったため,デフォルトのままでした.

これからまた出てしまうので,後ほどhiramatsu_kg様のところで,合わせてお返事したいと思います.

どうもありがとうございました.

2007/08/11 12:54:38
id:hiramatsu_kg No.3

hiramatsu_kg回答回数424ベストアンサー獲得回数32007/08/10 22:58:56

id:violin

airplant 様

正式なお返事が遅くなりました.

動きました! ソースを拝見させていただきながら,なるほどなあと感じました.

お恥ずかしながら普段プログラム全般をあまり書かないこともあって結構鈍って

いたようです.これを機に,いろいろといじくり始めようと思います.

本当にどうもありがとうございました.


> hiramatsu_kg様

大変素晴らしい回答,どうもありがとうございます.質問していないで自分で

調べて解決しなさいって意義深いご指摘ですね.あなた様の過去の回答を拝見

させていただきますと,そういう流れがよく汲み取れます.

私もその意味を前もって学習し,hiramatsu_kg様のことを事前によく調べておけば

と後悔いたしました.今後の反省材料とさせていただきます.ありがとうございました.

2007/08/12 01:15:09
  • id:airplant
    動いて良かったですね。
    いるか、ありがとうございました。

    p.s. 質問はできるだけ平易で具体的な内容にすると回答がつき易いと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません