新しく質問する

エクセルAとエクセルBで同じ項目があった場合Bの内容をAにコピーする。

役に立った:1件
  • 質問者:mugenn44
  • 投稿日時:2007/05/30 11:41
  • 困り度:すぐに回答が欲しいです
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

始めまして、マクロ初心者ですが、何とぞ宜しくお願いします。

エクセルAのシートA
A* 学校名 B* クラス数 C*生徒数 D*男子 E*女子
A?    B?     C?    D?   E?
A* の 「*」には行番号が入りますが、可変行数が入る感じです。

エクセルBシートB
A1 学校名 B1 クラス数 C1 男子 D1 女子 E1 生徒数
A2 A中学 B2 4クラス C2 60人 D2 60人 E2 120人
A3 B中学 B3 5クラス C3 70人 D3 80人 E3 150人
A4 C中学 B4 1クラス C4 10人 D4 20人 E4 30人

現状A1、B1、C1 がタイトルとしていますが、この部分の行数も可変となってます。

エクセルのシートAで実行した場合、エクセルシートAとエクセルシートBで同じ項目がある場合、
エクセルシートBの内容をエクセルシートAにコピーします。
コピー例:
エクセルシートBとAで同じ「学校名」という項目があった場合、
エクセルシートBの「学校名」の下「A2」からしたの文字列全部を
エクセルシートAの「学校名」の下「A?」にコピーします。

またエクセルシートAの検索内容をエクセルシートCで指定できれば
幸いです。
エクセルシートCの指定例:
エクセルシートAが下記の場合
A6 学校名 B6 クラス数 C6生徒数 D6男子 E6女子
エクセルシートBが下記の場合
A1 学校名 B1 クラス数 C1 男子 D1 女子 E1 生徒数

エクセルシートCに下記の内容を指定したら其の範囲をコピー
A1 A6 ←シートAの検索開始箇所
A2 E6 ←シートAの検索終了箇所
A3 A1 ←シートBの検索開始箇所
A4 E1 ←シートBの検索終了箇所

説明が判り難い箇所が有りますが、何とぞ宜しくお願い致します。

この質問に回答する
このQ&Aは役に立ちましたか?(役に立った:1件)

回答(3件)

  • 参考になった:0件
  • 回答者:x0000x
  • 回答日時:2007/05/30 19:16

#1 です。

もしかして、お門違いの回答でしたか?
#2で提示したマクロは、フィルターオプションの設定をマクロで実現した様な内容です。(EXCELブックは、ご指摘どおり別々にしています)
つまり、シートCのA2セル~An(nは最大行)セルに含まれる学校名で、シートBのA2~An(nは最大行)の学校名を検索し、発見できた場合は、シートAのA~Eに発見したシートBのA~Eの対応項目を順次コピーしていくマクロ処理です。

質問の内容で
>エクセルのシートAで実行した場合、エクセルシートAとエクセルシートBで同じ項目がある場合、
>エクセルシートBの内容をエクセルシートAにコピーします。
コピー例:
>エクセルシートBとAで同じ「学校名」という項目があった場合、
>エクセルシートBの「学校名」の下「A2」からしたの文字列全部を
>エクセルシートAの「学校名」の下「A?」にコピーします。

つまり、シートAの学校名でシートBの学校名を検索し、発見した場合は
???…ここが理解し難いのですが、

説明している、「A2」や「A?」はセルのアドレスではなく、
セル内に格納されている文言に含まれていますか?
そうだとするともっと複雑な処理になると思います。

ブックやシート別の各セルの状態と欲しい結果のシート状態を例示いただければ、質問者様のやりたい事が判ると思います。

通報する

この回答への補足

x0000xさん度々すみません。
自分の説明が下手で誤解させてしまった部分がありました。
ブックの状態と実行後のブックを記載しましたので参照
お願い致します。

ブックA:シート1 の状態、
   C   D    E   F  G
1 生徒数 学校名 クラス数 男子 女子



ブックA:シート2 の状態、
  A   B
1 A10    ←ブックB:シート1の検索開始範囲
2 E10    ←ブックB:シート1の検索終了範囲
3 C2     ←ブックA:シート1の貼付け開始範囲
4 G2     ←ブックA:シート1の貼付け終了範囲
 
ブックB:シート1 の状態、
   A   B    C  D   E
10 学校名 クラス数 男子 女子 生徒数
11 A中学 4クラス 60人 40人 100人
12 B中学  4クラス 60人 50人 110人
13 C中学  4クラス 60人 60人 120人

********************************

実行結果
ブックA:シート1 の状態、
   C   D    E   F  G
1 生徒数 学校名 クラス数 男子 女子
2 100人  A中学  4クラス 60人 40人
3 110人 B中学  4クラス 60人 50人
4 120人  C中学  4クラス 60人 60人

ブックB:シート1 で "学校名" を検索し
ブックA:シート1 にも "学校名" が有ったら
ブックB:シート1 の"学校名"以下の文字列を全部
ブックA:シート1 の"学校名"の直下にコピーする。
*ブックA、ブックB 共に"学校名"等の項目名は変わらないが
列や行が変わる可能性が高いので、
検索した文字列が該当した場合のみ貼付けの方が助かります。

  • 参考になった:1件
  • 回答者:x0000x
  • 回答日時:2007/05/30 15:34

#1です。

マクロならこんな感じでしょうか。

ブックA、B、Cにそれぞれ"SheetA","SheetB","SheetC"があるとして、
各ブックは開いておきます。

"SheetC"のA列に検索する学校名を入力して、マクロを実行します。

Sub myFind()

On Error GoTo err

Dim stA As Worksheet
Dim stB As Worksheet
Dim stC As Worksheet

Set stA = Workbooks("TestA.xls").Sheets("SheetA")
Set stB = Workbooks("TestB.xls").Sheets("SheetB")
Set stC = Workbooks("TestC.xls").Sheets("SheetC")


'最大格納行数を求める
Dim stAmaxRow As Long
Dim stBmaxRow As Long
Dim stCmaxRow As Long

stAmaxRow = stA.Cells(stA.Rows.Count, "A").End(xlUp).Row
stBmaxRow = stB.Cells(stB.Rows.Count, "A").End(xlUp).Row
stCmaxRow = stC.Cells(stC.Rows.Count, "A").End(xlUp).Row


Dim R As Long
R = 2
While R <= stCmaxRow

'シートCのA列の学校名でシートBの学校名を検索
Dim nmRng As Range
Set nmRng = stB.Range("A2:A" & stBmaxRow).Find(stC.Cells(R, "A").Value, LookIn:=xlValues)

If Not nmRng Is Nothing Then
'発見した。
stAmaxRow = stAmaxRow + 1
stA.Cells(stAmaxRow, "A").Value = stB.Cells(nmRng.Row, "A") '学校名のコピー
stA.Cells(stAmaxRow, "B").Value = stB.Cells(nmRng.Row, "B") 'クラス数のコピー
stA.Cells(stAmaxRow, "C").Value = stB.Cells(nmRng.Row, "E") '生徒数のコピー
stA.Cells(stAmaxRow, "D").Value = stB.Cells(nmRng.Row, "C") '男子のコピー
stA.Cells(stAmaxRow, "E").Value = stB.Cells(nmRng.Row, "D") '女子のコピー

End If

R = R + 1

Wend

stC.Activate

Set stA = Nothing
Set stB = Nothing
Set stC = Nothing

Exit Sub

err:
MsgBox Error
End Sub


※上記のブック名、シート名は適当に置き換えてください。
※行数の可変?には対応していませんが、
シートBの検索開始行は「Set nmRng = stB.Range("A2:A" ~」の"A2"を変更することで検索開始位置を動的に変更可能になります。
また、シートAへの格納開始位置は
「stAmaxRow = stA.Cells(stA.Rows.Count, "A").End(xlUp).Row」で現在の格納行の最後+1から格納しています。
「stAmaxRow = stC.cells(行,列)」などに変更することで格納
位置を動的に変更できると考えます。

通報する

この回答への補足

x0000x さん丁寧な対応本当に感謝いたします。

上記の内容を参考に現在色々試しているのですが、
なんせマクロのコードでどんな処理してるのかが
全く判らない為ヘルプと検索を駆使して解読してますが、
判らない箇所が多々有り、動かせないでいますT_T

  • 参考になった:1件
  • 回答者:x0000x
  • 回答日時:2007/05/30 13:22

こんにちは。

やりたいことが良く理解できないのですが、

シートBのデータからシートCで指定した条件(学校名)で検索し
シートAに抽出する事で良いのであれば、フィルターオプションの設定で抽出可能です。

たとえば、
<SheetA>
   A     B       C       D      E 
┌──────────────────────────────
1│学校名    クラス数   生徒数   男子    女子
2│
3│
4│

<SheetB>
   A     B      C      D      E  
┌─────────────────────────────
1│学校名   クラス数   男子    女子   生徒数
2│A中学   4クラス    60人    60人   120人
3│B中学   5クラス    70人    80人   150人
4│C中学   1クラス    10人    20人   30人

<SheetC>
   A      B      C      D      E 
┌──────────────────────────────
1│学校名    クラス数   生徒数    男子     女子
2│B中学
3│
4│

上記状態で、シートAを表示させた後、

(1)メニューから「データ」ー「フィルターオプションの設定」を選択。
⇒フィルターオプションの設定ダイアログが表示されます。

(2)フィルターオプションの設定ダイアログで
 ・「指定した範囲」を選択
 ・リスト範囲には「SheetB!$A$1:$E$4」
 ・検索条件範囲には「SheetC!$A$1:$E$2」
 ・抽出範囲には「SheetA!$A$1:$E$1」
(3)「OK」ボタンを押下します。

シートAに検索結果が抽出できます。

<SheetA>
   A      B      C      D      E  
┌──────────────────────────────
1│学校名     クラス数    生徒数   男子   女子
2│B中学     5クラス     150人   70人   80人
3│
4│

※ 検索対象のデータ行数が1000行ある場合(シートBが1000行の場合)は、リスト範囲の「SheetB!$A$1:$E$4」を「SheetB!$A$1:$E$1000」に変更してください。

通報する

この回答への補足

x0000x さんご返答有難うございます。
上記の方法を試した所確かに出来ました有難うございます。

しかしシート単位じゃなくエクセル単位での作業なので
エクセルファイルが異なる場合、
関数の書き換えが発生するみたいです。

それと出来ればマクロで処理した方が
関数を消してしまう心配なども少ないと考えてます。
処理も軽いのでマクロでの処理方法を教えていただけませんでしょうか。

  
このQ&Aは役に立ちましたか?(役に立った:1件)

このページのトップへ

Facebook公式ページ

公式Twitter