
エクセルで以下の処理を行えるマクロを作成したいです。
当方、マクロについてほとんど知識がありません。
恐縮ですが、教えていただけると嬉しいです。
・主にしたいこと
[検索]ブックで一致するコードを探して、
[結果]ブックの対応するコードの行にそれぞれの項目を返したい。
●ブック1 [検索]
シートが12個あります(それぞれ、1、2、3…12というシート名=1~12月分)
↓各シートの内容
A B C D
1 氏名 数値 コード 内容
2 abc 111 SS1234 あいうえお
3 bcd 123 SS3456 かきくけこ
・
・
・
といった感じです。
12個のシートの中身はそれぞれ似たようなものですが、
「コード」や「内容」などは少しずつ違います。
●ブック2 [結果]
↓シートの内容
A B C D
1 氏名 コード 内容 数値
2 SS3456
3 SS1234
・
・
・
といった感じです。
(注)検索用ブックとは列の並びが異なっています。
ここでやりたいことの詳細ですが、
・[結果]ブックの「コード」(B列)にコードを入力すると、
[検索]ブックで一致するコードを検索し、
A列「氏名」、C列「内容」、D列「数値」に、[検索]シートの内容を
自動的に表示させたい。
(ただし[結果]ブックに入力した「コード」は、[検索]ブックの1~12のうち、
どのシートにあるかわからない)
・入力したコードが見つからない場合は何も表示しない。
ということです。
最初VLOOKUP、MATCH等の関数で表示することを考えましたが、
シートが複数にまたがっているのと、
列の並び方が[検索][結果]ブックで違うのでわかりませんでした。
長くなってしまい申し訳ありませんが、どうかおしえてください。
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
先ず、
>[検索]ブックは共有ですが、[結果]ブックは各人によって名前がちがいます。
>たとえば、[結果_鈴木_2008.xls]といったものです。
>これは各人でマクロのコードを変更してもらうしかないのでしょうか?
につきましては、その必要はありません。
Windows("結果.xls").Activate
の行を
ThisWorkbook.Activate
に書き換えると、どの「[結果]ブック」でも使うことはできます。
-------------------------------------------------------------------
次に
>・チェンジイベントとは、その名のとおりチェンジしたときしか変更されないのでしょうか?
>たとえば、元の[検索]ブックの内容が変更されたときも、
>[結果]ブックの「コード」を変更しないと、[検索]ブックで行った変更は反映されないのでしょうか。
につきましては、その通りですが、
>自動的に再計算させ
たいということでしたら、逆に「[検索]ブック」の方に チェインジイベント を書いて、「[結果]ブック」の内容を書き改めさせるというような段取りになるかと存じます。
が、しかし、
1)
>[結果]ブックは各人によって名前がちがいます。
ということでしたら、全員の「[結果]ブック」を書き換えないといけないので、手落ちが起こりやすい。
2)ある程度 マクロ とか VBA をご自分で記述できない場合は、運用は難しい。
ということになろうかと存じます。
このような場合は、「共有の[検索]ブック」にある12個のシートを、「[検索]ブック」の中で、13個目のシートに一旦集約しておき、「[結果]ブック」には関数でデータを拾ってくるというのが、安全かつ簡便かと存じます。
-------------------------------------------------------------------
● 《《「[検索]ブック」の中で、13個目のシートに一旦集約》》 する方法
1)「[検索]ブック」に新しいシートを挿入し「集約」と名前を付けます。
2)A1:D1 にそれぞれ、「氏名」・「数値」・「コード」・「内容」と入力し、E1 に
=MAX(COUNTA('1'!A:A),COUNTA('2'!A:A),COUNTA('3'!A:A),COUNTA('4'!A:A),COUNTA('5'!A:A),COUNTA('6'!A:A),COUNTA('7'!A:A),COUNTA('8'!A:A),COUNTA('9'!A:A),COUNTA('10'!A:A),COUNTA('11'!A:A),COUNTA('12'!A:A))
という式をコピペします。
すると、E1に シート1~12 のデータの入力された最大の行数が返ります。
3)A2 に
=OFFSET(INDIRECT(ADDRESS(1,COLUMN(A1),2,,ROUNDUP(ROW(A1)/$E$1,0))),MOD(ROW(A1)-1,$E$1)+1,0)
と入力し、B2:D2 にコピーします。
4)A2:D2 を下方向に数百行コピーします。
ここで言う「数百行」とは、最低「E1 の数字×12」ですが、余分にコピーすると「#REF!」が表示されますけれども、今後、各シートにどんどんデータが増えるのであれば、余分に何百行もコピーしていても構いません。
5)最後に「集約」シートを保護し非表示にします。
● 《《「[結果]ブック」には関数でデータを拾ってくる》》 方法
「結果.xls」のシートモジュールで、[回答番号:No.2] のコードを削除し、替わりに下記をコピペします。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRng As Range
If Target.Column = 2 And Target.Count = 1 Then
With Workbooks("検索.xls").worksheets("集約").Columns(3)
Set myRng = .Find(What:=Target.Value, LookIn:=xlValues, _
LookAt:=xlWhole, MatchCase:=False, MatchByte:=False, SearchFormat:=False)
End With
Windows("結果.xls").Activate
Application.EnableEvents = False
If myRng Is Nothing Then
With Target
.Offset(, -1).Value = ""
.Offset(, 1).Value = ""
.Offset(, 2).Value = ""
End With
Else
With Target
.Offset(, -1).FormulaR1C1 = "=OFFSET([検索.xls]集約!R1C1,MATCH(RC2,[検索.xls]集約!C3,0)-1,0)"
.Offset(, 1).FormulaR1C1 = "=OFFSET([検索.xls]集約!R1C1,MATCH(RC2,[検索.xls]集約!C3,0)-1,3)"
.Offset(, 2).FormulaR1C1 = "=OFFSET([検索.xls]集約!R1C1,MATCH(RC2,[検索.xls]集約!C3,0)-1,1)"
End With
End If
Application.EnableEvents = True
Target.Offset(1).Select
End If
End Sub
DOUGLAS_様、わかりにくい質問にも関わらず、
大変ご丁寧に回答いただき本当にありがとうございます。
初心者の私にできるように、かつ手間がないように
関数等も作ってくださり・・・尊敬の念・感謝の念でいっぱいです。
おかげさまで思い描いたとおりの動きが出来ました。
本当に助かりました。ありがとうございました。
No.3
- 回答日時:
[回答番号:No.2] の DOUGLAS_ です。
>「結果.xls」のシートモジュールに書きます。
と書いておりますが、「シートモジュール」というのは、ワークシートのシートタブを右クリック [コードの表示(V)] をクリックして出てくるコードウィンドウにコピペなさってください。
そのまま VBE(Visual Basic Editor)を閉じて、そのシートのB列に「SS3456」というようなデータが入力されると、自動でA・C・D列にデータが入ります。
コードの先頭に
Private Sub Worksheet_Change(~~)
と書いてありますのは、そのワークシートがチェンジ(変化)したときに自動で始まるマクロです。これを「チェインジイベント」といいます。
で、このような「イベント」は
>ツール→マクロ→マクロの一覧に出て
きませんし、そこから実行するものではありません。
>無理やり実行しようとすると「引数は省略できません」となってしまいます
どのようにして「無理やり実行」されたのか存じませんが、上記のようにしてみられて、それでもエラーが出るようでしたら、またお知らせください。
DOUGLAS_様、ありがとうございます!!!
早速ご指導のとおりにやってみましたところ、できました~~~!!!
無知すぎて申し訳ないです。。。丁寧に教えてくださりありがとうございました。
大変厚かましいのですが、重ねてお尋ねしてもよろしいでしょうか?
・チェンジイベントとは、その名のとおりチェンジしたときしか変更されないのでしょうか?
たとえば、元の[検索]ブックの内容が変更されたときも、
[結果]ブックの「コード」を変更しないと、[検索]ブックで行った変更は反映されないのでしょうか。
自動的に再計算させるということは不可能なのでしょうか??
・バイト先でシフト管理のために使いたいと思っているのですが、
[検索]ブックは共有ですが、[結果]ブックは各人によって名前がちがいます。
たとえば、[結果_鈴木_2008.xls]といったものです。
これは各人でマクロのコードを変更してもらうしかないのでしょうか?
もしお時間ありましたら教えてくださいますと嬉しいです。
(重ねての質問が不適切でしたらご指摘ください。新しく質問を投稿したほうが良いのでしょうか???)
No.2
- 回答日時:
もっとよいコーディングがあろうかとも存じますが、一応、こんなところでできないことはなさそうですが。
。。「検索.xls」は予め開いてからお試しください。
「結果.xls」のシートモジュールに書きます。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRng As Range
Dim myWS As Worksheet
If Target.Column = 2 And Target.Count = 1 Then
For Each myWS In Workbooks("検索.xls").Worksheets
With myWS.Columns(3)
Set myRng = .Find(What:=Target.Value, LookIn:=xlValues, _
LookAt:=xlWhole, MatchCase:=False, MatchByte:=False, SearchFormat:=False)
End With
If Not myRng Is Nothing Then
Exit For
End If
Next
Windows("結果.xls").Activate
Application.EnableEvents = False
If myRng Is Nothing Then
With Target
.Offset(, -1).Value = ""
.Offset(, 1).Value = ""
.Offset(, 2).Value = ""
End With
Else
With Target
.Offset(, -1).Value = myRng.Offset(, -2).Value
.Offset(, 1).Value = myRng.Offset(, 1).Value
.Offset(, 2).Value = myRng.Offset(, -1).Value
End With
End If
Application.EnableEvents = True
Target.Offset(1).Select
End If
End Sub
回答ありがとうございます!
すごいです!!!
早速コピーさせていただき書いてみましたが、ツール→マクロ→マクロの一覧に出てこず、
無理やり実行しようとすると「引数は省略できません」となってしまいます><
初心者すぎて恐縮ですが、登録の詳しい手順を教えていただけないでしょうか?><
よろしくお願い致します。。
No.1
- 回答日時:
「検索」をシート1、「結果」をシート2とした場合なら、
Sub try()
Dim myDic As Object
Dim i As Long, m As Long
Dim r As Range
Dim v
Set myDic = CreateObject("Scripting.Dictionary")
v = Worksheets("Sheet2").UsedRange
For i = 2 To UBound(v, 1)
myDic(v(i, 2)) = i
Next
With Worksheets("Sheet1")
For Each r In .Range(.Range("C2"), .Cells(Rows.Count, 3).End(xlUp))
If myDic.Exists(r.Value) Then
m = myDic(r.Value)
v(m, 1) = r.Offset(, -2).Value
v(m, 3) = r.Offset(, 1).Value
v(m, 4) = r.Offset(, -1).Value
End If
Next
End With
With Worksheets("Sheet2")
.Cells.ClearContents
.Range("A1").Resize(UBound(v, 1), UBound(v, 2)).Value = v
End With
Set myDic = Nothing
Erase v
End Sub
例えばこんなとか?
ただ同一ブックの単シートでは既にコードが出来ているのなら、これはスル~して下さい。
回答ありがとうございます!
マクロは本当にはじめたばかりで、
見てもあまりまだ理解もできないのですが…><参考になります!
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルブックの全シートの非表示列を再表示したい 1 2022/12/24 20:48
- Visual Basic(VBA) 【部分一致した行を含む8行をシートにコピーする方法】 以下のような作業を行いたいのですが、どなたがコ 1 2022/08/30 16:24
- Visual Basic(VBA) VBA 複数のブックに同じ列を表示させる方法 2 2022/07/20 23:49
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルのオートフィルターのしぼりをクリアーしたい 2 2022/12/24 08:36
- Visual Basic(VBA) VBA 検索と入力 Excel ブック ぶぶぶ シート ししし 列V 検索対象の列です 最終行は、お 6 2023/05/17 01:40
- Excel(エクセル) 指定値をマクロで検索&シート移動 2 2022/04/27 23:29
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Excel(エクセル) エクセルの複数ブックのシートを1つまとめたい 都道府県ごとに47ブックがあり、そのシートのデータを1 5 2022/11/15 14:57
- Excel(エクセル) 複数のExcelブックのシート1の内容を1つのExcelブックにコピー貼り付けたいのでvbaコードを 7 2023/02/10 23:20
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】1回目の実行後、2...
-
エクセル内に読み込んが画像の...
-
Excelのメニューについて
-
Excelで作成した出欠表から日付...
-
Excel 偶数月の15日(土日祝...
-
Excelの数式について教えてくだ...
-
勤務外時間を出す表が作りたい
-
VLOOKUP FALSEのこと
-
エクセルの数式について教えて...
-
【マクロ】参照渡しについて。...
-
Excel 日付の表示が直せません...
-
Excelの条件付書式について教え...
-
マクロを実行すると、セル範囲...
-
【マクロ】参照渡しとモジュー...
-
【マクロ】シート追加時に同じ...
-
Excelファイルを開くと私だけVA...
-
Excelのデーターバーについて
-
エクセルの設定、特定の列以降...
-
別のシートの指定列の最終行を...
-
エクセル 同じ行の隣り合う数字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【マクロ】重複する同じ行を、...
-
Excelの条件付き書式のコピーと...
-
vba 印刷設定でのカラー印刷と...
-
VBA の単語の意味を教えて下さい。
-
Excel 日付の表示が直せません...
-
エクセル 同じ行の隣り合う数字...
-
エクセル条件付き書式について。
-
エクセルの数式につきまして
-
ファイル名の変更
-
エクセル 数字のみ抽出につて
-
Excelの開始ブックを固定したい...
-
エクセルの数式について教えて...
-
エクセルのセルをクリックする...
-
=INDIRECT(RIGHT(CELL("filenam...
-
エクスプローラーで見ることは...
-
Excelの関数で質問です
-
至急お願いいたします 屋上の備...
-
エクセルでセルに入力する前は...
-
関数を教えて下さい
-
Excel 関数での質問です
おすすめ情報