列の値と一致するシートを選び、指定セルをコピぺする

このQ&Aのポイント
  • マクロの勉強をしている初心者です。タイトルにありますように、あらかじめ列に入力する値と一致するシートを検索し、そのシートの中の所定の場所にあるセルの値をひろう、というマクロをつくりたいのですがご教示頂けないでしょうか。
  • 例を画像で説明します。左のbookと右のbookは別であり、右は読み込み用で、左bookに入力をしていくものです。左bookの売上げ(赤塗)、目標(青塗)という部分に、右bookのセルの場所の値をコピーしたいです。
  • 毎回人の入れ替わりがあるため、Aと同じ値のシートを選ぶというプログラムが必要です。左bookは上から田中、山下、と並んでいますが、その都度何行目に誰がくるかは変わります。右bookのコピーしたいセルの場所はどのシートも変わりません。
回答を見る
  • ベストアンサー

列の値と一致するシートを選び、指定セルをコピぺする

マクロの勉強をしている初心者です。   タイトルにありますように、あらかじめ列に入力する値と一致するシートを検索し、そのシートの中の所定の場所にあるセルの値をひろう、というマクロをつくりたいのですがご教示頂けないでしょうか。 わかりづらいので例を画像を添付します。 (手書きですみません。) まず、左のbookと右のbookは別であり、右は読み込み用で、左bookに入力をしていくものです。 左bookの売上げ(赤塗)、目標(青塗)という部分に、右bookのというセルの場所の値をコピペすることを希望です。 毎回人の入れ替わりが頻繁にあるため、Aと同じ値のシートを選ばせるというところからプログラムさせたいです。左bookは上から田中、山下、と並んでいますが、その都度何行目に誰がくるかはかわります。 右bookのコピーしたいセルの場所(B列6行目、C列6行目)はどのシートも変わりません。 恐れ入りますがご教示の程宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1614/2452)
回答No.2

> 右bookのコピーしたいセルの場所(B列6行目、C列6行目)はどのシートも変わりません。 として、以下で試してみてください。ブック名やシート名は実際のものに変更してください。画像の矢印は右向きですが左向きではないでしょうか…。 Sub Test() Dim Ws1 As Worksheet, Wb1 As Workbook, Sh As Worksheet Dim mstr As String Dim LastRow As Long, i As Long, flg As Boolean Set Ws1 = ThisWorkbook.Worksheets("Sheet1") '左Bookのシート名 Set Wb1 = Workbooks("右book.xlsx") LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row mstr = "" For i = 2 To LastRow flg = False For Each Sh In Wb1.Worksheets If Sh.Name = Ws1.Cells(i, "A").Value Then Ws1.Cells(i, "B").Value = Sh.Cells(6, "B").Value Ws1.Cells(i, "D").Value = Sh.Cells(6, "C").Value flg = True Exit For End If Next If flg = False Then mstr = mstr & Ws1.Cells(i, "A").Value & " : " End If Next If mstr <> "" Then MsgBox mstr & "シートがありません", vbCritical End If Set Ws1 = Nothing Set Wb1 = Nothing End Sub

mika1100
質問者

お礼

初心者にわかりやすい変数でくみあわされており、正しい数字を簡単に取得することができました!本当ありがとうございます! あまりに勉強する内容が多い為、一旦答えを頂いた後にそれぞれの変数がどのような意味を示すか、ひとつひとつ調べるやり方をしています。助かりました。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

こんなのは、基礎的な知識として、オブジェクトを「掴む」方法について (1)シート場合 シートの名前を指定して、(下記注と関連する)(VBAで)で捕まえられる (2)セル 名前を定義済みのセルでなければ、行、列の捕捉を頼りに       特定せざるええない。       隣に、そのセル場所を特定する文字列があれば、それを頼って使える場合がある。 こう言うことを、質問者は、はっきり意識してない段階なだけで、こういう質問になるのでは? 他人には、面白みのない課題だろう。 === 例データ Sheet1 A1:B4 - 売上 田中 山下 山田 個別シートには 田中、山下、山田のシートがあり、シートタブの名前順はどうでもよい(注)。 名前の各シートの A6:B6  には 田中では 合計 160000 山下では 合計 300000 山田では 合計 190000 が入っているとする。 B列で「合計」という文字列で合計行を探すことにする。 ーーー 標準モジュールに Sub test01() With Worksheets("Sheet1") lr = .Cells(1000, "A").End(xlUp).Row MsgBox lr For Each cl In .Range("A2:A" & lr) MsgBox cl.Value Set sh = Worksheets(cl.Value) r = sh.Range("A:A").Find("合計").Row MsgBox r .Cells(cl.Row, "B") = sh.Cells(r, "B") Next End With End Sub ーーー 実行すると、結果Sheet1 売上 田中 160000 山下 300000 山田 190000 === 個人的な行き掛かり上Withを使ったが, 使わずに Sub test21() Set sh1 = Worksheets("Sheet1") '集約シート lr = sh1.Cells(1000, "A").End(xlUp).Row MsgBox lr For i = 2 To lr Set sh2 = Worksheets(sh1.Cells(i, "A").Value) r = sh2.Range("A:A").Find("合計").Row MsgBox r sh1.Cells(i, "B") = sh2.Cells(r, "B") Next End Sub の方がすっきりしているかな。 === 別構想として、こういうことを考える癖を付けないと、今後のため、進歩しないのでは。 本質問では、名前のリストがSheet1のA列にあると(前提に)したが、 名前シートの、あるがままの順にSheet1に集約データを作り、名前(A列)の 順序をソート(ただし、ユーザーリストを作ってのソート)する方法もある。 ちょっと凝っている方法かも。何を言っているか判る?

mika1100
質問者

お礼

ありがとうございます。頂いたプログラムで例の通りのシートを作成し、やってみましたところ、求めている数字をつくりあげることができました。 あとは、各項目がなんの意味をするのか?ネットと本で調べていきます。前回助言頂いたように、本を常備するようにいたします。 意味を理解することで、応用できるようになりますのでがんばりますね!

  • kkkkkm
  • ベストアンサー率65% (1614/2452)
回答No.5

No2を左book以外で実行する場合は Set Ws1 = ThisWorkbook.Worksheets("Sheet1") '左Bookのシート名 を Set Ws1 = Workbooks("左book.xlsm").Worksheets("Sheet1") '左Bookのシート名 に変更してください。左book.xlsmは実際のブック名。

  • kkkkkm
  • ベストアンサー率65% (1614/2452)
回答No.4

No2の追加です。 > 右bookのコピーしたいセルの場所(B列6行目、C列6行目)はどのシートも変わりません。 これが、常時6行目固定という意味ではなく、月ごとに行は変化するが全てのシートの合計の行が同じ行であるという意味でしたら Dim TRow As Long を宣言の所に追加して LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row の前に TRow = Wb1.Sheets(1).Cells(Rows.Count, "B").End(xlUp).Row を追加して Ws1.Cells(i, "B").Value = Sh.Cells(6, "B").Value Ws1.Cells(i, "D").Value = Sh.Cells(6, "C").Value の2か所を Ws1.Cells(i, "B").Value = Sh.Cells(TRow, "B").Value Ws1.Cells(i, "D").Value = Sh.Cells(TRow, "C").Value に変更してください。 ただし、右bookの一番左のシートが質問の画像のようなフォーマットのシートでB列の合計行より下に何もない(式も含めて)ことが前提です。 合計行より下に何かあるのでしたらA列の合計という文字のセルを探すという処理にする必要があります。

  • kkkkkm
  • ベストアンサー率65% (1614/2452)
回答No.3

No2は左bookで実行してください。 また、A列の途中に空白がある場合は If flg = False Then を If flg = False And Ws1.Cells(i, "A").Value <> "" Then に変更してください。

  • HohoPapa
  • ベストアンサー率65% (454/690)
回答No.1

添付画像の構造を前提に 後記コードを標準モジュールに配置し、 値を取得したいセルに =GetJisseki($A2,B$1) といった計算式を埋める解はいかがでしょうか。 なお、右側ブックのA1セルに"年月"を埋める必要があります。 また、右側ブックの6行目を見つけているのではなく "年月"列の"合計"の行を拾う仕様です。 つまり、必ずしも6行目である必要はありません。 Function GetJisseki(StaffName As String, ColName As String) As Double Dim SQL As String Dim cn As Object Dim rs As Object Const JisBook = "C:\test\実績.xlsx" 'SQL全文を組み立て SQL = "SELECT [" & ColName & "]" & vbCrLf SQL = SQL & "FROM [" & StaffName & "$A1:Z50000]" & vbCrLf SQL = SQL & "Where [年月] = '合計'" & vbCrLf 'SQLを実行 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Provider = "Microsoft.ACE.OLEDB.12.0" cn.Properties("Extended Properties") = "Excel 12.0;HDR=Yes;IMEX=1" cn.Open JisBook rs.Open SQL, cn GetJisseki = rs(ColName) '後処理 rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Function

mika1100
質問者

お礼

ありがとうございました!レベルをあげて回答頂き感謝です。要求する数字をひろうことができました。私の知識が不足しており、わからない言葉だらけなので、一つ一つ調べてその仕組みを理解していきたいと思います。

関連するQ&A

  • 列の任意のセルに値入力時にマクロ起動

    ExcelのVBAについて質問です。 2列目の任意のセルに値を入力した際にマクロを起動したい場合、どのようにソースを記述すればよろしいでしょうか? たとえば2列目の任意のセルに入れた値に基づいた値を3列目の同じ行に返す場合などです。 ご教示お願いします。

  • 2つのブックで、1レコードの3列の値が同じ行のセル選択するには?

    2つのブックで、1レコードの3列の値が同じ行のセル選択するには? Windows XP Home Edition Office XP Personal 2002 Excel 2002 画像のように、 左.xls のB5(赤色セル)を選択したら  右.xls のB10(B9ではありません)を選択させたいのですが、 うまく行きません。 左右のブックの赤色セルの各行番号は同じではありません。 1レコードの「 B列 と C列 と D列 」の「3列の値が同じ行のセル」を選択したいのです。 この行は、必ず1つしかありません。 しかし「 B列 と C列 」「 B列 と D列 」などの「2列の値が同じ行のセル」は複数あります。 また、 左.xls のB6(青色セル)を選択した場合は、  右.xls のB12(B11ではありません)を選択させたいのです。 B列( 日付、実際には西暦 2010/05/05 です )だけは、全く同じデータとなっております。 ●2つのブックを左右に並べて、  同じ行データを閲覧したいわけでございます。 下記コードは、B列だけしか参照できません。 ややこしくて、恐れ入りますが、 何卒、ご教示のほどをお願い致します。 Sub TEST() Const wBook = "右.xls" '表示させたいBook名 Const wSht = "Sheet1" '表示させたいSheet名 Dim Target As Range Dim TargetVa As Integer TargetVa = ActiveWindow.ActiveCell.Value With Workbooks(wBook).Sheets(wSht)   For Each Target In .Range("B1", .Range("B65536").End(xlUp))    If Target.Value = TargetVa Then     Workbooks(wBook).Activate     Sheets(wSht).Activate     Target.Cells.Select    End If   Next Target  End With End Sub

  • Excelでセル文字列に応じて他シートからコピペ

    Excelで、 シート1には「ある値の羅列」 シート2には「特定の値についての詳細説明が複数セルにわたって記載されている」 という構成になっているとき、 シート1のセル内の部分的な値と一致する、シート2の特定のセル (詳細説明の中で必要なセルのみ)をシート1の値の横のセルから右方向に コピーアンドペーストしたいと考えています。 具体的には シート1の、A列のセル内に以下のように「:」で区切った情報の羅列が数千行分 入力されています。     A                  B 1 商品名:リンゴ:渋谷店:在庫有り  (空白セル) 2 商品名:みかん:新宿店:在庫無し  (空白セル) 3 商品名:メロン:池袋店:在庫有り  (空白セル)    ・    ・ シート2には      A     B     C     D     E      1 イチゴ      赤   甘酸っぱい  春     高価   ・・・ 2 みかん      橙   甘酸っぱい  冬     安価   ・・・ 3 リンゴ      赤    甘い    冬     普通   ・・・ 4 メロン      緑    甘い    夏     高価   ・・・ 5 バナナ      黄色   甘い    ?     普通    ・    ・    ・ という風に、ある値に対する詳細説明が列方向に記載されています このとき、シート1のA1のある値(リンゴ、みかん 等)に対応した シート2の説明行のうち、ある一定の部分(D列より右がわ)を、 シート1のB列より右に一括でコピーアンドペーストできないでしょうか? 出来上がりの希望は以下の通りです。     A                  B      C   ・・・ 1 商品名:リンゴ:渋谷店:在庫有り     冬     普通  ・・・ 2 商品名:みかん:新宿店:在庫無し     冬     安価  ・・・ 3 商品名:メロン:池袋店:在庫有り     夏     高価  ・・・    ・    ・    ・ 従来ははいちいちシート1のA列の値をコピーし、シート2で検索、 該当する情報をドラッグしてコピー、シート1の戻ってB列にペースト、 という作業を行っていました。 しかし今回、シート1の内容が数千行もあるため、できればマクロや関数でなんとかできれば、 と思っています。 この作業の自動化に付き、ご存知の方、お教えいただきたくお願いいたします。

  • Open Office 3.2 Calc である値に一致したセルを含む

    Open Office 3.2 Calc である値に一致したセルを含む行を別のシートに抜き出し一覧にする方法を教えてください。 例えば、 Sheet1 という名前のシートに 行1 1,いぬ,,5 行2 8,ねこ,a,9 行3 11,いぬ,b,d のようなデータがあるとして、 行1から順番に見ていき、列B(左から2番目)の値が いぬ という文字列の場合に、 Sheet2 という名前のシートに、 行1から順番に、そっくりそのまま参照(コピーではなく)するように値を入力し、 行1 ='Sheet1'.A1,='Sheet1.B1',='Sheet1.C1',='Sheet1.D1' 行2 ='Sheet1'.A3,='Sheet1.B3',='Sheet1.C3',='Sheet1.D3' とするということです。 例は3行ですが、実際には不規則に大量にあります。(例では奇数行に いぬ がありますが、実際はそういう規則性はありません) 数式でやろうとしましたが、規則的に連続していないものを詰めて並べるのは不可能だと思いました。 マクロでもできるのかわかりませんが、どんな関数、プロパティを使ったら出来るのかでもよいので教えてください。 私は基本的なOpen Office BasicなどOpen Officeがサポートしているスクリプト言語なら理解できます。

  • excel 串刺しセルの値を列に並べる

    excel2000を利用しています。 シートが10枚以上あるexcelブックがあるのですが、これらのシートのフォーマットは全て同じで、値がそ れぞれ独自に入っています。 一番左側のsheet1は無地です。 そして、左から2sheet目以降の全てのシートで、それぞれ 指定セル を sheet1のA列に縦にデータを保管したいです。 そして、同様にまた違う指定セルをB列、また違うセルをC列・・・・ といった具合で全シートの複数の項目をsheet1にリスト形式でまとめたいです。 どうかご教授をお願いいたします。

  • 別シート同士のセルを比較して一致したらセルに代入をしたいと考えています

    別シート同士のセルを比較して一致したらセルに代入をしたいと考えています。 excelのVBAを使って行いたいのです book1のsheet1に A列     B列    C列       D列 2000     NEC   VL100 5000     Sony   vaio-200 3000     東芝     letsnote 単価、メーカー、型番、空き列があり 200行くらいです。 book2のsheet1に 同じく、単価、メーカー、型番がありますが 単価がsheet1とは異なり、違うメーカー型番の情報が 4000行くらいあります A列     B列    C列 5225     XXXX   XXXX 2200     NEC   VL100 5200     Sony   vaio-200 2684     XXXX   XXXX 2566     XXXX   XXXX 6000     東芝     letsnote ・・・・・・ ・・・・・・ そこで book1のB,C列のメーカーと型番が一致するものを book2のsheet1のB,C列から探し 一致したら、book1のsheet1のD列に book2 sheet1のA列の値を入れのです。 参考になるスクリプトを教えて頂けると大変助かります、 よろしくお願い致します。

  • 2つのブックで、1レコードの2列の値が同じ行のセル選択するには?

    2つのブックで、1レコードの2列の値が同じ行のセル選択するには? Windows XP Home Edition Office XP Personal 2002 Excel 2002 画像のように、左.xls 右.xls 共に、 1レコードの 「 B列 と C列 」 の値が同じ行のセルを選択したいのですが、 うまく行きません。 画像の例では赤色セルの部分です。 左右のブックの赤色セルの各行番号は同じではありません。 B列(日付、実際には西暦です)だけは、全く同じデータとなっております。 ●2つのブックを左右に並べて、  同じ行データを閲覧したいわけでございます。 何卒、ご教示のほどをお願い致します。 Sub TEST() Const wBook = "右.xls" '表示させたいBook名 Const wSht = "Sheet1" '表示させたいSheet名 Dim Target As Range Dim TargetVa As Integer TargetVa = ActiveWindow.ActiveCell.Value With Workbooks(wBook).Sheets(wSht)   For Each Target In .Range("B1", .Range("B65536").End(xlUp))    If Target.Value = TargetVa Then     Workbooks(wBook).Activate     Sheets(wSht).Activate     Target.Cells.Select    End If   Next Target  End With End Sub

  • 【Excel VBA】セルに入力されている値と同じ名前のシートにデータをコピーする

    Excel2003を使用しています。 Sheet1のC2セル以下に入力されている値と同じ名前のシートに、その行のデータをコピーする作業をマクロで処理したいのですが、セルに入力されている値と同じ名前のシートを取得する方法がわかりません。 どのようにコードを書いたらいいのでしょうか? ちなみに、Sheet1のC2セル以下に入力されている値(=シート名)は、文字列(4桁の数字)です。 よろしくお願いします。

  • Excel2003 2つのシートから相互にセルの値を変更したいのですが

    Excel2003を使用して2つのシートにあるセルの値を相互に変更できるようにしたいのですが。 例えば Sheet2 のセル A1 に =Sheet1!A1 と入力しておけば Sheet1 のセル A1 に 80 と入力すると Sheet2 のセル A1 は 80 と表示されますが,この状態で Sheet2 のセル A1 に別の値を入力すると,もう Sheet1 のセル A1の値を参照しなくなってしまいます。 そこで教えていただきたいことがあります。 Sheet1 のセル A1 に値(例えば80)を入力すると Sheet2 のセル A1 の値も同じ値(例えば80)になり,逆に Sheet2 のセル A1 に値(例えば80)を入力すると Sheet1 のセル A1 の値も同じ値(例えば80)になるように相互に値が変化できるようにしたいのです。 具体的に私がしたいことは (1) Sheet1 ~Sheet6 の A列 には同じ40人の名簿を使う。 (2) Sheet1 の B列 には国語の得点,同様に Sheet5 まで社会,数学,理科,英語の得点を入力。(本来は複数のテストの合計得点として, K列 にしたいのですが,今回は B列 ということでお願いします。) (3) Sheet1 ~ Sheet5 のセル D1 にそれぞれの教科の合格に必要な得点を入力。 (4) Sheet1 ~ Sheet5 の C列 には =if(B2>=D1,"○","×") のような数式を入力し,合格なら○,不合格なら×を表示するようにする。 (5) Sheet6 の B列 ~ F列 にはそのぞれの教科の○,×が参照されるようにし,B列 ~ F列の42行目にそれぞれの教科の合格に必要な点数が参照されるようにする。 (1)~(5)をすれば, Sheet1 ~ Sheet5 を見れば教科ごとの合格者が分かり, Sheet6 を見たときに誰がどの教科で合格か不合格か分かります。 Sheet6 の全教科の合格者数をみて,それぞれの教科の合格に必要な点数を上げたり,下げたりしたいのです。 Sheet1 ~ Sheet5 に戻れば,合格に必要な点数の上げ下げが可能なのですが, Sheet6の B列 ~ F列 の42行目でも合格に必要な点数の上げ下げをできるようにしたいのです。もちろん Sheet6 で合格に必要な点数を上げ下げしたときには, Sheet1 ~ Sheet5 の合格に必要な点数をも反映されるようにしたいのです。 長文で分かりにくいかもしれませんが,いい方法があれば教えてください。よろしくお願いします。

  • 一番左のシートのセルA6に入力した値を次のシート以降のシートに入力したい

    Excel2003でマクロを作成しています。 複数のシートがあり一番最初のシートのセルA6に日付を入力します。 二番目以降のシートのA6に「一番左のシートのA6の値を入力しなさい」という関数をコードに書きます。これを何回も試行錯誤したのですができません。どうコードを書いたらいいかご教示ください。

専門家に質問してみよう