前提・実現したいこと
VBAで、一番下の行を複製してその下に貼り付けたいのですが、
先頭のセルには日付、一番後ろのセルには数式が入っています。
日付は月毎、数式はそのままコピーしたい場合、
どのように記載したらよいのでしょうか?
マクロの記録だと以下のようになりますが、
これをボタンクリック毎に下に行を追加していきたいのです。
よろしくお願いいたします。
該当のソースコード
Sub Macro9()
'
' Macro9 Macro
'
'
Range("B5:Q7").Select
Selection.AutoFill Destination:=Range("B5:Q10"), Type:=xlFillDefault
Range("B5:Q10").Select
Range("B5:B7").Select
Selection.AutoFill Destination:=Range("B5:B10"), Type:=xlFillMonths
Range("B5:B10").Select
Range("P5:P7").Select
Selection.AutoFill Destination:=Range("P5:P10"), Type:=xlFillCopy
Range("P5:P10").Select
End Sub
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/29 06:14
回答3件
0
ExcelVBA
1Sub test() 2 With Cells(Rows.Count, "B").End(xlUp).Resize(3, 15) 3 .Copy .Offset(.Rows.Count) 4 With .Columns(1) 5 .AutoFill .Resize(.Rows.Count * 2), xlFillMonths 6 End With 7 End With 8End Sub
コピーの仕方というより、
コピー元、コピー先のセル範囲の取得の仕方
が、テーマですね?
今回の件の場合、
ResizeプロパティやOffsetプロパティを使って表現できるといいかもです。
参考URL>>
Excel(エクセル) VBA入門:セル範囲の指定方法
ちなみに、B列に数字が入っており、コピーしたらそこだけ数字が
一つ増えるようにしたい場合はどうしたらよいのでしょうか?
AutoFill .Resize(.Rows.Count * 2), xlFillMonths
のところを変えるのでしょうか?
ExcelVBA
1Option Explicit 2 3Sub test2() 4 Dim rngFrom As Range 'コピー元セル範囲 5 Dim rngTo As Range '貼付け先セル範囲 6 Dim ixRow As Long '使用しているセル範囲の行数 7 Dim i As Long 'オートフィルのタイプ 8 9 'セル範囲の取得 10 With ActiveSheet.UsedRange 11 ixRow = .Rows.Count 12 Set rngFrom = Intersect(.Cells, .Offset(ixRow - 3)) 13 Set rngTo = .Cells(ixRow + 1, 1).Resize(rngFrom.Rows.Count) 14 End With 15 16 'コピー 17 rngFrom.Copy rngTo 18 '値の型によりオートフィルのタイプを変える 19 If TypeName(rngFrom.Cells(1).Value) = "Date" Then 20 i = xlFillMonths 21 Else 22 i = xlFillSeries 23 End If 24 'オートフィル 25 With rngFrom.Columns(1) 26 .AutoFill Application.Range(.Cells, rngTo), i 27 End With 28End Sub 29
条件により処理が変わるなら、
IF文を使い条件分岐します。
参考サイト
プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う
↑を参考にメソッドにどういう引数を与えたらいいかヘルプで確認してください。
(ヘルプの意味が解らなかったらネットで単語を検索してみること)
1行1行意味の理解に努めていただけたら嬉しく思います。
う~ん。
意味的には、
B列の最後のデータが結合されているセル範囲の15列分
が、コピー元のセル範囲なので、
コードにそう書いておいたほうが後で読んだとき(半年後や1年後)にわかりやすいですね。
ただ、結合セルにoffsetプロパティ適用すると変な値を返すので、
冗舌な表現で書くしかなくなるのでコードがきれいでなくなるのが難点かな。
投稿2019/12/31 07:14
編集2020/01/01 09:08総合スコア2163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/01 07:37
2020/01/01 08:07
2020/01/02 02:26
0
ベストアンサー
追加の質問について...
ちなみに、結合していない1行のみをコピーする場合は、
最初のコードで「MaxRow + 3」を「MaxRow + 1」にすればよいのでしょうか?
コピーする表に結合セルが1つも含まれていない場合は、「MaxRow + 1」で問題なく動くと思います。
同じ処理を他のシートでも行いたいのですが、
その場合はどのようにしたらよいのでしょうか?
例えばシート1にボタンを一つ設置して、
シート4,5,6で同じ処理がしたいです。
マクロを記載しているシートと異なるシートの操作をする場合、Rangeを指定する際に、シート名も指定しないといけません。
下記のコードの通り、ワークブックとシート名を指定しました。
繰り返しの記述を避けるために、withブロック変数を使ってます。
複数のシートで同じ処理をするということだったので、行追加の処理をメソッド(RowAdd)にしました。
以下がコードになります。ご確認ください。
VBA
1'// ボタンで実行するマクロ 2Sub macro1() 3 '// シート名を指定して、メソッドを呼ぶだけ 4 Call RowAdd("sheet1") 5 Call RowAdd("sheet4") 6 Call RowAdd("sheet5") 7 Call RowAdd("sheet6") 8End Sub 9 10'// 行追加するメソッド(引数は行追加するシート名) 11Sub RowAdd(SheetName) 12 thisworkbook.Sheets(SheetName).Select '// 行追加するシートを表示する 13 14 With thisworkbook.Sheets(SheetName).Cells(Rows.Count, "B").End(xlUp) 15 MaxRow = .Row + .MergeArea.Rows.Count - 1 '// B列の最終行を取得 16 End With 17 18 With thisworkbook.Sheets(SheetName) '// 行追加するシート名を指定 19 .Range("B" + CStr(MaxRow - 2) + ":Q" + CStr(MaxRow)).Select '// 初期データの3行を選択 20 Selection.AutoFill Destination:=.Range("B" + CStr(MaxRow - 2) + ":Q" + CStr(MaxRow + 3)), Type:=xlFillDefault '// とりあえず、表全体をコピー 21 22 .Range("B5:B7").Select '// 初期データの3行を選択(日付データのB列) 23 Selection.AutoFill Destination:=.Range("B5:B" + CStr(MaxRow + 3)), Type:=xlFillMonths '// 日付は月毎の設定で上書き 24 25 .Range("P5:P7").Select '// 初期データの3行を選択(数式データのP列) 26 Selection.AutoFill Destination:=.Range("P5:P" + CStr(MaxRow + 3)), Type:=xlFillCopy '// 数式は数式の設定で上書き(なくてもいい) 27 28 .Range("B" + CStr(MaxRow + 1) + ":Q" + CStr(MaxRow + 3)).Select '// 追加した3行を選択状態で終了(特に意味はない) 29 End With 30End Sub 31
不明点ありましたら、教えてください。
以上
投稿2019/12/30 20:53
総合スコア640
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
###回答
初期データのイメージが違ってるかもしれませんが、コードから推測してご要望の動作を作ってみました。
初期データと動作のイメージはこんな感じです。(画像参照)
マクロを見た感じ、表範囲はB列~Q列、B列は日付、P列は数式と解釈しました。
初期データはB5:Q7の3行と解釈しました。
以下、コード。不要なコードはコメントアウトしました。
VBA
1 MaxRow = Range("B5").End(xlDown).Row '// 最終行番号を取得 2 3 Range("B5:Q7").Select '// 初期データの3行を選択 4 Selection.AutoFill Destination:=Range("B5:Q" + CStr(MaxRow + 3)), Type:=xlFillDefault '// とりあえず、表全体をコピー 5 '//[削除] Range("B5:Q10").Select 6 Range("B5:B7").Select '// 初期データの3行を選択(日付データのB列) 7 Selection.AutoFill Destination:=Range("B5:B" + CStr(MaxRow + 3)), Type:=xlFillMonths '// 日付は月毎の設定で上書き 8 '//[削除] Range("B5:B10").Select 9 Range("P5:P7").Select '// 初期データの3行を選択(数式データのP列) 10 Selection.AutoFill Destination:=Range("P5:P" + CStr(MaxRow + 3)), Type:=xlFillCopy '// 数式は数式の設定で上書き(なくてもいい) 11 '//[削除] Range("P5:P10").Select 12 Range("B" + CStr(MaxRow + 1) + ":Q" + CStr(MaxRow + 3)).Select '// 追加した3行を選択状態で終了(特に意味はない)
###補足
xlFillDefault でB列~Q列までデフォルト設定のオートフィルで、数式も正しくコピーされるので、xlFillCopy はなくてもいいと思います。
月データはデフォルト設定でコピーできないので、xlFillMonths で上書きしてます。
以上
ちなみにテラテイルでの画像のアップボタンは下記のアイコンです。
###追記 コード修正
VBA
1 thisworkbook.Sheets("Sheet3").Select 2 3 With Cells(Rows.Count, "B").End(xlUp) 4 MaxRow = .Row + .MergeArea.Rows.Count - 1 5 End With 6 7 Range("B" + CStr(MaxRow - 2) + ":Q" + CStr(MaxRow)).Select '// 初期データの3行を選択 8 Selection.AutoFill Destination:=Range("B" + CStr(MaxRow - 2) + ":Q" + CStr(MaxRow + 3)), Type:=xlFillDefault '// とりあえず、表全体をコピー 9 10 Range("B5:B7").Select '// 初期データの3行を選択(日付データのB列) 11 Selection.AutoFill Destination:=Range("B5:B" + CStr(MaxRow + 3)), Type:=xlFillMonths '// 日付は月毎の設定で上書き 12 13 Range("P5:P7").Select '// 初期データの3行を選択(数式データのP列) 14 Selection.AutoFill Destination:=Range("P5:P" + CStr(MaxRow + 3)), Type:=xlFillCopy '// 数式は数式の設定で上書き(なくてもいい) 15 16 17 Range("B" + CStr(MaxRow + 1) + ":Q" + CStr(MaxRow + 3)).Select '// 追加した3行を選択状態で終了(特に意味はない) 18
投稿2019/12/29 08:19
編集2019/12/29 13:39総合スコア640
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/29 08:46
2019/12/29 08:53
2019/12/29 09:05
2019/12/29 09:17 編集
2019/12/29 09:22
2019/12/29 09:33
2019/12/29 09:35
2019/12/29 10:12 編集
2019/12/29 12:07
2019/12/29 12:24
2019/12/29 12:29
2019/12/29 12:35
2019/12/29 12:44
2019/12/29 12:48
2019/12/29 13:15
2019/12/29 13:41
2019/12/30 04:58
2019/12/30 06:58
2019/12/30 20:54
2020/01/01 07:36
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。