プロが教える店舗&オフィスのセキュリティ対策術

こんにちは、エクセル2010を使っています。

画像のB2~F2のようにデータがあるとします。
これをコピーして、B10に貼りつけたいのですが、10行目には既に何か入力されている可能性があります。

それを判別して、空白でない場合11行目に貼りつけるようなマクロはどのようなものになるでしょうか?

既にボタンクリックのコピペは作成済みなので、これに追加して機能すれば助かります。

Range("B2:F2").Copy Range("B10")  ' 1行目 コピー & ペースト

空白ならそのまま貼り付け、空白でない場合1行下げて貼りつけと言う事です。

詳しい方、よろしくお願いいたします。

「エクセル マクロ 貼り付け先が空白でない」の質問画像

質問者からの補足コメント

  • うーん・・・

    こんばんは、試してみたのですが、コピー元を選択してマクロを実行してみたのですが、普通通りそのままコピペされてしまい、ここに貼り付けでよろしいですか? と言う風な状態にならないのですが何故でしょうか?

    お手数ですが教えて頂けませんか?
    よろしくお願いします。

    No.3の回答に寄せられた補足コメントです。 補足日時:2019/12/19 03:18
  • うーん・・・

    こんにちは お世話になっております。

    試してみたのですが、思う結果にならないみたいで、どこが悪いのか教えて頂けませんでしょうか。

    改変したのは
    Const 開始列 As String = "D66" 'どこの列からコピーするか指定して下さい。
    Const 終了列 As String = "AB66" 'どこの列までコピーするか指定して下さい。
    Const 始行 As Long = 90 'どこから空欄を探すか指定して下さい。
    Const 終 As Long = 91 'どこまで空欄を探すか指定して下さい。最終行までの時は「0」にして下さい

    No.7の回答に寄せられた補足コメントです。 補足日時:2019/12/19 19:49
  • うーん・・・

    変更したのはこの部分のみで、確認のボックスが開くのですが、実際に貼り付けの確認位置は 6690行になっており、更にはいを選択すると、666770行にコピー元? が点線で囲われてコピーした後のようなかんじんなってしまいます。

    これはどこがいけなかったのでしょうか?
    実際は、上記コード以外の部分も変更するのでしょうか?

    お手数ですが教えて頂けませんでしょうか。
    よろしくお願いいたします。

      補足日時:2019/12/19 19:50
  • うれしい

    何度も回答をいただき、ありがとうございます。
    なるほど、そういう事だったのですねお手数をお掛けしました。

    任意の行をコピーするためには、同じくマクロで行を選択してあげれば1つの動作で任意の行をコピー&ペーストできるのですね。

    おかげさまでやりたい事が実現出来そうです、何度も教えて頂き感謝します。
    ありがとうございました。

    No.9の回答に寄せられた補足コメントです。 補足日時:2019/12/20 13:23

A 回答 (9件)

No.8 の補足(以下のように書いておけばよかったですね)



Const 開始列 As String = "D" 'どこの列からコピーするか?列名を指定して下さい。
Const 終了列 As String = "AB" 'どこの列までコピーするか?列名を指定して下さい。
Const 始行 As Long = 135 'どこから空欄を探すか?行番号を指定して下さい。
Const 終 As Long = 0 'どこまで空欄を探すか?行番号を指定して下さい。最終行までの時は「0」にして下さい
この回答への補足あり
    • good
    • 1
この回答へのお礼

ラックさん こんばんは。
おかげさまで無事目的を果たせました。
いつも助かっております^^
色々教えて頂き、ありがとうございます。

お礼日時:2019/12/21 00:25

「"D66"」は「"D"」、「"AB66"」は「"AB"」 にしておいて下さい。


66行目を選択しておいてマクロを実行してみて下さい。
    • good
    • 0

No.6 の修正です(最後まで「いいえ」をした場合に元の行に戻るようにしました)



Sub Sample()

Const 開始列 As String = "D" 'どこの列からコピーするか指定して下さい。
Const 終了列 As String = "AB" 'どこの列までコピーするか指定して下さい。
Const 始行 As Long = 135 'どこから空欄を探すか指定して下さい。
Const 終 As Long = 0 'どこまで空欄を探すか指定して下さい。最終行までの時は「0」にして下さい
Dim 終行 As Long
Dim 行 As Long
Dim 元 As String

 If 終 = 0 Then
  終行 = Rows.Count
 Else
  終行 = 終
 End If
 元 = 開始列 & Selection.Row & ":" & 終了列 & Selection.Row
 For 行 = 始行 To 終行
  If Cells(行, Range(終了列 & 行).Column + 1).End(xlToLeft).Column < Range(開始列 & 行).Column Then
   Range(開始列 & 行 & ":" & 終了列 & 行).Select
   Select Case MsgBox("ここにコピーしても良いですか?", vbYesNoCancel)
    Case vbYes
     Range(元).Copy
     Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
     Exit For
    Case vbCancel
     Exit For
   End Select
  End If
 Next
 Range(元).Select

End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

こんにちは、なんども回答をいただき、ありがとうございます。
色々考えて頂いたようで大変ありがたく思います。

教えて頂いたマクロをちょっと挑戦してみたいと思います。
ありがとうございます。

お礼日時:2019/12/19 18:31

以下のような物はいかがでしょうか?



①「Const ~」の部分を実際の物に合わせて下さい。(初回だけ)
② コピー元の適当なセルを選択する。同じ行ならコピーしない場所でもOKです。
③ このマクロを実行します。
④「ここにコピーしても良いですか?」への回答により以下のように動作します。
 ・「はい」の場合:コピー(値貼り付け)して、元の場所に戻る
 ・「いいえ」の場合:次の空白欄が選択され、確認メッセージが再度表示される
 ・「キャンセル」の場合:コピーせず、元の場所に戻る

Sub Sample()

Const 開始列 As String = "D" 'どこの列からコピーするか指定して下さい。
Const 終了列 As String = "AB" 'どこの列までコピーするか指定して下さい。
Const 始行 As Long = 135 'どこから空欄を探すか指定して下さい。
Const 終 As Long = 0 'どこまで空欄を探すか指定して下さい。最終行までの時は「0」にして下さい
Dim 終行 As Long
Dim 行 As Long
Dim 元 As String

 If 終 = 0 Then
  終行 = Rows.Count
 Else
  終行 = 終
 End If
 元 = 開始列 & Selection.Row & ":" & 終了列 & Selection.Row
 For 行 = 始行 To 終行
  If Cells(行, Range(終了列 & 行).Column + 1).End(xlToLeft).Column < Range(開始列 & 行).Column Then
   Range(開始列 & 行 & ":" & 終了列 & 行).Select
   Select Case MsgBox("ここにコピーしても良いですか?", vbYesNoCancel)
    Case vbYes
     Range(元).Copy
     Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
     Range(元).Select
     Exit Sub
    Case vbCancel
     Range(元).Select
     Exit Sub
   End Select
  End If
 Next

End Sub
    • good
    • 0

何度も申し訳ございません。

いろいろ見直してみましたら気づきました。宜しければご回答ください。
① 本当はD列~AB列をコピーという事なのでこれを選択するのは大変ですよね?列は事前に設定しておいて選択されている行の登録している部分をコピペする方が良いですよね?
② 質問時の画像を見るとコピー元は数式になっています。数式のままコピーした方が良いのか?値貼り付けにした方が良いのか?どちらでしょうか?
    • good
    • 0

大変申し訳ございません。

誤解を与えてしまったみたいですね。
マクロの作り方を説明したのではなく、動作としてこんな感じで良いのか?を確認したのです。
いかがでしょうか?
    • good
    • 0

それでしたら以下のような考え方が良いと思いますがいかがでしょうか?



コピー元を選択状態にしてマクロを実行すると
・ 列は変えずに下に空欄を探していき空いている所にコピペする。
・「ここに張付けでよろしいですか?」の確認をする
・ [はい]の場合はそのまま終了、[いいえ]の場合はクリアして終了
・ 終了してもクリップボードには残っているので、近くに張付けたい場所が有れば手動で貼り付けできます。
という事で良いのかと思います。

ところでコピー元はクリアする必要はないのでしょうか?
この回答への補足あり
    • good
    • 0
この回答へのお礼

こんばんは、再回答いただきありがとうございます。

コピー参照元はクリアする必要はないです、貼り付け先のみクリアします。

その1行でグラフを作っていますので固定の2行の中に貼りつけする必要があるのでこういった形になりました。

マクロの記録でもこういった分岐の入ったマクロを作る事も出来るのですね。
教えてくださった方法を試してみたいと思います、ありがとうございます。

お礼日時:2019/12/18 22:41

確認させてください。


空白の判定ですが次のどれですか?
① B列だけ判定すればよい
② B列~F列まで全て確認が必要
③ その他(具体的に説明して下さい)
どの行まで延長しても良いのでしょうか?
④ 11行目のみ
⑤ 最大行まで
⑥ その他(具体的に説明して下さい)
    • good
    • 0
この回答へのお礼

こんにちは、回答ありがとうございます。

貼りつけ位置の空白判定ですが、B列のみでOKです。
延長位置は、一度行を下げたら次の行にはデータがある可能性は無い形です。
(簡単であれば行を下げる回数が指定出来れば嬉しいです)

ちなみに実際のコピー元のセル範囲は
D66~AB66   1行目
D67~AB67   2行目
.
D73~AB73   8行目

貼り付け先はD135~AB136

それで、この中の2行を選んで貼りつける形なので、1行目ボタンクリックで貼り付け、4行目ボタンクリックで貼り付けみたいな事をやりたいのです。

今回は上記が機能すればそれでOKなのですが、以降、列が増えたり、行が変わったりする可能性も否めないなぁ、と思いまして自分でもコピー元を簡単に変更できる、今回の質問のコードにさせて頂きました。

よろしくお願いします。

お礼日時:2019/12/18 14:59

その処理の前に、IF文を記述してください。


エクセル セルが空白かどうかチェックする、みたいなワードで検索すればサンプルコードはいくらでも出てきます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A