エクセルマクロでセルを検索してコピーする方法

このQ&Aのポイント
  • エクセルのマクロを使用して、特定の値を検索して別のシートにコピーする方法をご教示いただけますか?
  • マクロを使用して、アクティブセルの右に5つのセルをコピーし、下に1つのセルを起点として下方向に6セル分をコピーする方法を教えてください。
  • アクティブセルの値と同じ値のセルを別のシートで検索し、該当セルの右に2つ分のセルに行列を入れ替えて値のみをペーストする方法を教えてください。同じ日付が複数ある場合はメッセージを表示します。
回答を見る
  • ベストアンサー

エクセルのマクロ(値を検索して別シートにコピー)

エクセルで下記のマクロをご教示いただけるでしょうか。 1.Sheet1のアクティブセルの右に5つ、下に1つのセルを起点として下方向に6セル分をコピー (例)Sheet1のアクティブセルがA2だとすると、F3~F8をコピー 2.Sheet1のアクティブセルの値(yy/mm/dd形式の日付)と同じ値のセルをSheet2のA列から検索し、該当セルの右に2つ分のセルに行列を入れ替えて値のみをペースト (例)Sheet1のアクティブセル(A2)の値がSheet2のA4セルにあるとすると、Sheet2のC4に行列を入れ替えて値のみペースト 3.Sheet1のアクティブセルの値がSheet2のA列に2つ以上あれば、「同じ日付が複数あります。」というメッセージを表示

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

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

No.2の追加です Dim fRng As Range を削除して Dim c As Range を追加してください。 また、 If IsDate(c.Value) = True Then はいらないと思いますので(テスト時のものが残ってました) For Each c In Ws2.Range(Ws2.Cells(1, "A"), Ws2.Cells(Rows.Count, "A").End(xlUp)) If IsDate(c.Value) = True Then If c.Value = Selection.Value Then c.Offset(0, 2).Resize(1, 6).Value = WorksheetFunction.Transpose(Tmp) Exit Sub End If End If Next を以下に変更してください。 For Each c In Ws2.Range(Ws2.Cells(1, "A"), Ws2.Cells(Rows.Count, "A").End(xlUp)) If c.Value = Selection.Value Then c.Offset(0, 2).Resize(1, 6).Value = WorksheetFunction.Transpose(Tmp) Exit Sub End If Next また、日付として同じでも見た目が同じもの以外は別物とする場合 Dim cnt As Long を追加して If WorksheetFunction.CountIf(Ws2.Range("A:A"), Selection.Value) > 1 Then MsgBox "同じ日付が複数あります", vbInformation Set Ws1 = Nothing Set Ws2 = Nothing Exit Sub End If を以下に変更して For Each c In Ws2.Range(Ws2.Cells(1, "A"), Ws2.Cells(Rows.Count, "A").End(xlUp)) If c.Text = Selection.Text Then cnt = cnt + 1 If cnt > 1 Then MsgBox "同じ日付が複数あります", vbInformation Set Ws1 = Nothing Set Ws2 = Nothing Exit Sub End If End If Next その下にある If c.Value = Selection.Value Then c.Offset(0, 2).Resize(1, 6).Value = WorksheetFunction.Transpose(Tmp) Exit Sub End If を以下に変更してください。 If c.Text = Selection.Text Then c.Offset(0, 2).Resize(1, 6).Value = WorksheetFunction.Transpose(Tmp) Exit Sub End If

その他の回答 (4)

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

> 数値を昇順でソートしてからコピーするにはどのような処理を加えればよいでしょうか?(コピーしてからソートでも手間が少ないほうで結構です) 元のSheet1のデータをソートする場合。 最後の方に Tmp = Selection.Offset(1, 5).Resize(6, 1).Value というところがありますので その前にソートのコードを追加します。 ↓追加 Selection.Offset(1, 5).Resize(6, 1).Sort _ Key1:=Selection.Offset(1, 5), Order1:=xlAscending ↑追加ここまで ↓既存のコード Tmp = Selection.Offset(1, 5).Resize(6, 1).Value 転記後のSheet2のデータをソートする場合。 上記コードの下にある If c.Value = Selection.Value Then c.Offset(0, 2).Resize(1, 6).Value = WorksheetFunction.Transpose(Tmp) Exit Sub End If の部分を以下に変更してください。 If c.Value = Selection.Value Then c.Offset(0, 2).Resize(1, 6).Value = WorksheetFunction.Transpose(Tmp) '↓追加 c.Offset(0, 2).Resize(1, 6).Sort _ Key1:=c.Offset(0, 2), Order1:=xlAscending, Orientation:=xlLeftToRight '↑追加ここまで Exit Sub End If

KIKAIDER01
質問者

お礼

バッチリでした。重ね重ねのご教示ありがとうございました。

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

No.2の訂正 Findだと同じ形式じゃないと駄目みたいですね。 は Findだと(種類:*2012/3/14)以外だと駄目だったり(種類:*2012年3月14日)の場合いけたり駄目だったりで不安定な感じです。

KIKAIDER01
質問者

お礼

ありがとうございます。私の仕様にいろんなメッセージを追加していただき、何が原因で正しく動作しないのか一目瞭然です。素晴らしいです。

KIKAIDER01
質問者

補足

追加質問で恐縮です。1の「アクティブセルの右に5つ、下に1つのセルを起点として下方向に6セル分」の数値を昇順でソートしてからコピーするにはどのような処理を加えればよいでしょうか?(コピーしてからソートでも手間が少ないほうで結構です)

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

> 日付の表示形式の分類を「日付(種類:*2012/3/14)」にするとうまくいきますが、「日付(種類:2012/3/14)」やユーザー定義の「YY/MM/DD」にすると、「該当するデータがありません」というメッセージが出ます。 Findだと同じ形式じゃないと駄目みたいですね。 Findをやめて 'Set fRng = Ws2.Range("A:A").Find(What:=Selection.Text) 'If Not fRng Is Nothing Then ' fRng.Offset(0, 2).Resize(1, 6).Value = WorksheetFunction.Transpose(Tmp) 'Else ' MsgBox "該当するデータがありません", vbInformation 'End If の部分を For Each c In Ws2.Range(Ws2.Cells(1, "A"), Ws2.Cells(Rows.Count, "A").End(xlUp)) If IsDate(c.Value) = True Then If c.Value = Selection.Value Then c.Offset(0, 2).Resize(1, 6).Value = WorksheetFunction.Transpose(Tmp) Exit Sub End If End If Next MsgBox "該当するデータがありません", vbInformation に変更してみてください。 形式に関わらず以下の場合でも同じ日と認識すると思います。 2022/1/10を 形式で以下のようにしたもの 22/1/10 2022年1月10日 2022年1月 1月10日

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

以下で試してみてください。 Sub Test() Dim Tmp As Variant Dim Ws1 As Worksheet, Ws2 As Worksheet Dim fRng As Range Set Ws1 = Sheets("Sheet1") If ActiveSheet.Name <> Ws1.Name Then MsgBox Ws1.Name & "以外を選択して実行できません", vbInformation Set Ws1 = Nothing Exit Sub End If If Selection.Count > 1 Then MsgBox "複数のセルを選択して実行できません", vbInformation Set Ws1 = Nothing Exit Sub End If If Selection.Value = "" Then MsgBox "セルに値がありません", vbInformation Set Ws1 = Nothing Exit Sub End If Set Ws2 = Sheets("Sheet2") If WorksheetFunction.CountIf(Ws2.Range("A:A"), Selection.Value) > 1 Then MsgBox "同じ日付が複数あります", vbInformation Set Ws1 = Nothing Set Ws2 = Nothing Exit Sub End If Tmp = Selection.Offset(1, 5).Resize(6, 1).Value Set fRng = Ws2.Range("A:A").Find(What:=Selection.Value, LookIn:=xlValues) If Not fRng Is Nothing Then fRng.Offset(0, 2).Resize(1, 6).Value = WorksheetFunction.Transpose(Tmp) Else MsgBox "該当するデータがありません", vbInformation End If Set Ws1 = Nothing Set Ws2 = Nothing End Sub

KIKAIDER01
質問者

補足

ご教示ありがとうございます。追加の質問があります。私の環境(Windows11)では日付の表示形式の分類を「日付(種類:*2012/3/14)」にするとうまくいきますが、「日付(種類:2012/3/14)」やユーザー定義の「YY/MM/DD」にすると、「該当するデータがありません」というメッセージが出ます。この点に関して詳解していただけると幸いです。

関連するQ&A

  • VBA 今日の行にあるセル コピー 別シートへ

    (1)sheet1にボタン button1 があり、そのボタンを押すと、マクロが起動する。 (2)データは sheet2 貼り付け先は sheet3 sheet2 F列に日付が入っています。   F列は、日付(過去~本日まで ※未来の日付はありません)か、空白の場合があります。 F列の日付が本日のとき、 sheet2 A列のセルの値を sheet3 B列へ。  A列には連番。 sheet2 D列のセルの値を sheet3 C列へ。 sheet2 G列のセルの値を sheet3 D列へ。 sheet2 F列のセルの値を sheet3 E列へ。 それぞれ、Sheet3の各行の一番下に貼り付ける形をとりたいのです。 こちらでマクロはどうしたらよいのでしょうか。

  • エクセルで別シートの値を取得したいです。

    エクセルで質問があります。 別シートからセル値を取得したいです。 ただ、セル番地は行番号、列番号で指定し、 行、列番号はセルに入力してある値を使いたいです。 例 Aシート(値格納シート) B1セル値=1000 -------------- Bシート(値取得シート) A列=行番号入力 B列=列番号入力 C列=Aシートの取得関数 A2セル値=1 B2セル値=2 C2セル=1000(取得値) C2セルの関数に、A2とB2の値を使って Aシートのセル値を取得したいです。 よろしくお願いします。

  • エクセルのブック間で値のみコピー

    エクセル 2003使用です。 エクセルのブック間におけるシートのコピーについてお願いします。 Book.Aのシート1の各セルは、関数の数式で入力(出力)されています。 このシートをコピーして、Book.Bにペーストしたいのですが、 コピーは、関数計算後の”結果の文字列”で行いたいです。 Book.Aのシート全体をコピーして Book.Bのシートに「形式を選択して貼り付け」 → 「値」 で可能なのですが、シート数が多いので困っています。 Book.Aのシートタブを右クリックして「移動またはコピー」で シートのコピーをすると、数式でコピーされてしまいます。 この方法で、値のみコピーのような方法はありませんでしょうか? よろしくお願いします。

  • エクセルの数式コピー&ペースト【列の値だけ変化】

    エクセルの数式を縦方向に 相対参照でコピーしたいのですが、 同一の列でのコピーでは列の値に変化は ありませんよね。これを、、 例えば・・ A1セルに=sheet1!G$32とあるのをコピーして、 A2セルに=sheet1!H$32、 A3セルに=sheet1!I$32、 ・ ・ A6セルに=sheet1!L$32といった具合に 行ではなく列の値だけをどんどん変化させたいです。 コピー&ペーストでこれを解消できる方法、 もしくはそれ以外に簡単に解決する対処方法は ありますでしょうか?

  • エクセルマクロ:別のブックから該当するデータをコピー

    Book1のSheet1、A列に日付、B列に対応するデータがあります。 Book2のSheet1A1セルに入力された日付と一致するBook1Sheet1B列の値を、Book2のB1セルに値貼り付けしたいのですが、どのように記述すればよろしいでしょうか。 宜しくお願いいたします。

  • エクセルで、コピーに関するマクロ

    CC列に入力されている文字列を以下のようにコピーしたいのですが。 CC1からCC100まで、順番にコピーしていきます。途中に空欄のセルもありますが、それはコピー対象から外します。 コピーの形式と貼り付ける場所ですが、CC1が"school"なら、A1に"s"、B1に"c"、C1に"h"、D1に"o"、E1に"o"、F1に"l"と、横に連なる形でコピーします。 次にCC2が"dog"なら、A2に"d"、B2に"o"、C2に"g"というふうに、先ほどの下の行にコピーします。 次のコピー対象に対しては、A3が貼り付けの起点となります。その次の起点はA4ですが、その次はM1が起点になります。M2、M3と起点が移り、M4までいくとその次はY1が起点となります。Y2、Y3と起点が移り、Y4までいくと次はAK1が起点となり、以後4行ごとに列が変わっていきます。 コピー対象セル内の文字数が13文字以上になると、以後のコピー時にかぶさってしまう部分が発生しますが、それはそれでかまいません。 コピー対象の列は常にCCで、範囲は常に1~100です。また、貼り付けるセルの出発点は常にA1です。 コピー対象セルの数が多いと、CC列にも貼り付けられてしまいますが、実際は空欄セルが多いのでCC列に貼り付けられるケースはまずあり得ません。そういうケースが生じた場合はそのままでかまいません。 上記のことができるマクロを教えてもらいたいのですが。

  • エクセルマクロ 別シートへ行列を入れ替えてコピペ

    下記内容のエクセルのマクロをご教示いただきたいと存じます。 ①「data」シートのB2からデータが入力されている最終行までをコピー(20行目までデータが入力されていたとすると、B2~B20をコピー。最終行は不定) ②「result」シートのE列のデータが入力されている最終行の次行に①のデータを行列を入れ替えてペースト(E列のデータが19行目まで入力されていたとすると、「E20」セルに①のデータ<この場合だと、「data」シートのB2~B20のデータ>を行列を入れ替えてペースト。「result」シートのE列の最終行は不定)

  • シートコピーと値の転記 シート名変更マクロを

    エクセル2010で マクロのご教授をお願いいたします。 BOOK1の Sheet1 A1~A10に 数値1000が入力されているとして Sheet1のシートのコピーを作成 Sheet1にもどり A1~A3の値だけコピーして 作業列C1に 値を貼り付け A1~A10 をクリアーにしたのちに  ※↓が うまくいきません。 A1の値→ A8 A2の値→ A9 A3の値→ A10 に入力 させるマクロは どうなるでしょうか? マクロの記録で いろいろと やってみましたが どうも ※の部分が うまくいきません どう考えてもエクセルに対しての 理解不足だと思われますが、ご教授のほどお願いします。 おこなった自動マクロの記録は↓です。 マクロの記録開始する 名前 シートコピー Sheet1を右クリックして移動またコピー コピーを作成にチェックをいれ OK コピーシートが作成される。 Sheet1をクリックしなおして A1からA3をコピー  作業列として C1に 形式を選択して貼り付け 値 A1~A10を delete でクリア C1~C3を選択 コピー A8に 形式を選択して貼り付け 値 マクロの記録終了。 あと Sheet1をコピーするさいに シート名を前日の日付に自動的に変更できればと いいなと 考えておりますが できるのでしょうか? 例えば、本日でいえば シート名→ 0112 のような シート名を変更できればすてきだと おもいます。 どうぞ よろしくお願いします。

  • エクセルマクロで日付検索について

    エクセルのマクロで日付を検索するマクロについて質問です。 ブックAのシート1のA列に A1 2017/3/13 A2 2017/4/1 A3 2017/4/19 A4 2017/5/16 A5 2017/7/17 A6 2017/9/5 というような日付が入っています。 ブックBのシート1のA1セルに2017/6/3と入力してマクロを実行した際に その日付に一番近い一つ前の日付を探し、見つけた日付のB列のセルを ブックBのシート1のA2セルに表示したいです。 今回の例であれば2017/6/3に対してブックAのシート1のA列はA4セルが当てはまり その当てはまったA4セルの1つ横のB4セルの内容をブックBのシート1のA2セルに表示するということです。 よろしくお願いします。

  • EXCELのマクロがわかりません・・・

    現在、A列にデータが並んでいるのですが、 これを7つ区切り(例:A1~A7、A15~A21)にして、 別シートに用意した表に行列を入れ替えて、 貼り付けるマクロを作っているのですが、 なにぶんVBは素人ですので、よくわかりません。 今作ろうとしているマクロは、 「元データ」セルのA1からA7までをコピーして、 「作成データ」セルのB2を起点として、 コピーした内容の行列入れ替えを行い貼り付け、 以後、「元データ」のコピー範囲を7つづつ 下にずらし、「作成データ」の貼り付け起点を 1つづつ下にずらして、「元データ」のA列の 最後までくりかえすものです。 必ず「Range」文で引っかかってしまうのですが、 何か構文的におかしいでしょうか? かなり急ぎですので、 わかる方、よろしくお願いしますっ!! 下に、作成したマクロを貼り付けます。 Sub Macro3() ' ' Macro3 Macro ' マクロ記録日 : 2005/12/5 ユーザー名 : *** Worksheets("元データ").Activate 開始行 = -6 終了行 = 0 ペースト行 = 0 Do 開始行 = 開始行 + 7 終了行 = 終了行 + 7 ペースト行 = ペースト行 + 1 開始セル番号 = "A" & 開始行 終了セル番号 = "A" & 終了行 ペーストセル番号 = "B" & ペースト行 Range("開始セル番号:終了セル番号").Select Selection.Copy Sheets("作成データ").Select Range(ペーストセル番号).Select Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _ , Transpose:=True Loop End Sub

専門家に質問してみよう