[[20260330104456]] 『マクロの応用を教えてください。』(hyu) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『マクロの応用を教えてください。』(hyu)

お世話になります。
恐縮ですが、どなたかお知恵を貸していただけないでしょうか。

とある集計表を作成しています。
取引先での売上、仕入、配達経費、粗利などをだしていくものです。
取引先が増えるたびに下に延びていく表となっており、これまでは新規に追加された取引先を、枠をコピーして作成しておりました。

かなり長くなってきてしまったので、スクロールとコピーの手間を考え、新規追加枠を最初から別シートに作っておき、これに入力したら自動で一番下に追加されるというマクロを記録したいと思っています。

例えば現在の一番下がA29だとしたら、A30に追加されるようにしたいのです。
しかしながら、マクロを普通に記録しただけだと、延々とA30に上書きされるだけになってしまいます。

これを、常に一番下に追加されるように出来ないでしょうか。
よろしくお願いいたします。

< 使用 Excel:Excel2021、使用 OS:Windows11 >


 マクロを使用せずに「フォーム機能」では駄目なの?
(はてな) 2026/03/30(月) 11:06:01

 A列のデータがある最終行の下のセル(Rangeオブジェクト)は、以下のように書けます。
     Dim rng As Range
     Set rng = Cells(Rows.Count, "A").End(xlUp).Offset(1)
 これを元にコードにトライしてみて下さい。

 もし、うまくいかなければ、
 >新規追加枠を最初から別シートに作っておき、これに入力したら自動で一番下に追加される
 の新規追加枠とは何かというのをレイアウトとともに説明したり、
 マクロ記録の結果を示してください。
 (説明がないと、こちらは千里眼を持ち合わせないので訳がわかりません。)

(xyz) 2026/03/30(月) 11:53:09


はてな様
言葉足らずで申し訳ないです。
下記のような表であるため、フォーム機能ではちょっと違うのです…。

xyz様
教えていただきありがとうございます。
コードにトライということは、VBAに入力ということですよね?
説明が足りず申し訳ないです。表は下記のようなものになります。

   A    B   C   D   E   F
1 取引先名 1月  2月  3月  4月  5月
2 売上数  数字  数字  数字  数字  数字
3 仕入値  数字  数字  数字  数字  数字
4 経費   数字  数字  数字  数字  数字
5 粗利   数字  数字  数字  数字  数字
  :

というような形です。
この1行目から5行目までを1取引先の枠として、下に延々と伸びていきます。合計シートと呼んでいます。
新規追加用のシートに空白枠を作っておき、そこに入力したら合計シートの一番下に追加されるようにしたかったのです。

判りにくくてすみません。
(hyu) 2026/03/30(月) 12:09:35


なお、マクロは記録ボタンで作りました。(当方、VBAの知識がありません)
新規追加用のシートに情報を入れた上で記録ボタンを押し、合計シートの一番下に持って来てみましたが、最初の投稿にある通り、一度A30に追加したら二回目以降もA30に上書きされてしまいました。
当然ではあるのですが…。
(hyu) 2026/03/30(月) 12:18:41

 >マクロは記録ボタンで作りました。
 でしたら、それをこちらに投稿してもらえば、それをもとに議論ができるんじゃないでしょうか。

(xyz) 2026/03/30(月) 12:34:06


xyz様
記録したのは以下の内容です。

Sub 新規追加()
'
' 新規追加 Macro
'

'

    Rows("3:15").Select
    Range("D3").Activate
    Selection.Copy
    Sheets("マクロ試し").Select
    ActiveWindow.SmallScroll Down:=15
    Rows("72:72").Select
    ActiveSheet.Paste
    Range("A72:A84").Select
    Sheets("新規入力用").Select
    Range("A3:C15,E3:E15").Select
    Range("E3").Activate
    Application.CutCopyMode = False
    Selection.ClearContents
    Range("A3:A15").Select
End Sub

(hyu) 2026/03/30(月) 12:43:02


 こんな感じでしょうか。

 Sub test()
     Dim ws1     As Worksheet
     Dim ws2     As Worksheet
     Dim rng     As Range

     Set ws1 = Sheets("新規入力用")
     Set ws2 = Sheets("合計用")      'シート名修正のこと

     '新規入力枠から、合計用のA列最終行の次のセル以下にコピー
     Set rng = ws2.Cells(Rows.Count, "A").End(xlUp).Offset(1)
     ws1.Rows("3:15").Copy rng

     '新規入力枠の消去
     ws2.Range("A3:C15,E3:E15").ClearContents
     '    ws2.Range("A3:E15").ClearContents  'D列を特別視する理由が不明です
     ''[追記,注意]ここはws1を使うべきところ誤記したものです。
 End Sub

 薄いテキストで良いので学習されるとよいのでは?
(xyz) 2026/03/30(月) 13:12:37

xyz様

ありがとうございます…!
いただいたコードをそのままコピーさせてもらったのですが、「400」というエラーが出ます。
また、最後に新規入力用シートを空白に戻すところまでコードに組みたいのですが、どうすればいいでしょうか?

この問題が片付いたら、おっしゃる通り少し勉強してみようと思います。
よろしくお願いいたします。
(hyu) 2026/03/30(月) 14:27:27


xyz様
すみません、言葉足らずでした。
Microsoft Visual Basic for Applications 400というエラーが出ます。
(hyu) 2026/03/30(月) 14:29:20

>また、最後に新規入力用シートを空白に戻すところまでコードに組みたいのですが、どうすればいいでしょうか?

ここについですが、いただいたコードではA3〜C15、E3〜E15がうまく消えない状態です。
(hyu) 2026/03/30(月) 14:51:05


 失礼しました。
 シートを間違えていました。
 '新規入力枠の消去
  ws1.Range("A3:C15,E3:E15").ClearContents
 に修正してください。

 合計用のほうを消去してしまっているので、
 データをもとに戻して下さい。

 # テスト検証してませんでした。済みません。

 ついでに言うと、
 こちらも行全体ではなく、範囲を限定したほうが良いと思います。
 ws1.Rows("3:15").Copy rng
 ↓
 ws1.Range("A3:E15").Copy rng
 のように。

(xyz) 2026/03/30(月) 15:01:38


xyz様

出来ました…!!
お手数をおかけいたしました。
本当にありがとうございました。
これから自分でも勉強いたします。
助かりました。
(hyu) 2026/03/30(月) 15:20:35


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.