[[20220118204036]] 『VBAを使って指定セルをコピー、最下行を増やして早x(ミー子) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAを使って指定セルをコピー、最下行を増やして挿入』(ミー子)

似たようなvbaはあったのですが素人なもので上手く使えなくてコチラに書かせて頂きました。
2つ教えて頂きたいです。

1つ目が
ランダムなセルに入力がされているアクティブなシートでA18からQ18までをコピー
B列最下行の1つ上に行を挿入
そこのAからQにコピーしたものを貼り付け

2つ目は
B列最下行の1つ上の行を削除

といったものを作りたいのですが、ご教授頂けると嬉しいです。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


追記

B列も入力のあるセルと無いセルがランダムにあります。
1番下の入力のあるセルから1行上の行削除が希望です。
(ミー子) 2022/01/18(火) 21:18


>似たようなvbaはあった
それが判断できるということはある程度は理解できるのですよね。

まずは、御自身が考えたものを提示して、どの部分がわからないのか説明されてはいかがでしょうか?

なお↓で必要な命令は【マクロの記録】で調べることができます。

 A18からQ18までをコピー
 行を挿入
 コピーしたものを貼り付け
 行を削除

(もこな2 ) 2022/01/18(火) 21:22


すいませんでした。
似たようなVBAというのは他の方からの似たような質問があったということのつもりでした。
たとえば「最下行の次に挿入」等、です。

そのVBAをコピーして使ってみようとしたのですが結局うまく使えず・・・
又、マクロの記録もやってみましたが行数が指定される為、最下行を選択しての作業が出来ず。。

「修正」コピーするのはA18からQ18ではなく18行全体でした。

下記の状態で分からなくなりコチラに質問しました。

Sub VBA()

   Rows("18:18").Select
    Application.CutCopyMode = False
    Selection.Copy
最終行 = Cells(Rows.Count, "B").End(xlUp).Row
    Selection.Insert Shift:=xlDown

End Sub

最下行に挿入したいのに19に挿入されてしまいます。

同様に削除の方も最下行を選択出来なかった為、最下行の削除できませんでした。

(ミー子) 2022/01/19(水) 07:58


 Selection.Insert Shift:=xlDown
 これは選択しているところに行を挿入して元々のデータは一行下に下げるということですね。
 あなたがやろうとしている目的に一致していますが、現実にはうまくいきません。

 なぜなら、「選択しているところ」はあなたのコードでは、
  Rows("18:18").Select
 のところで18行目を選択したままになっているからです。

 コードの巧拙ははともかくとして、、

    Rows("18:18").Select
    Application.CutCopyMode = False
    Selection.Copy
    最終行 = Cells(Rows.Count, "B").End(xlUp).Row
    Rows(最終行 + 1).Select                   '←この行を追加
    Selection.Insert Shift:=xlDown

 このようにすればとりあえずは希望どおりになりませんか。
  
(try) 2022/01/19(水) 17:14

既に回答がついているところですが投稿しておきます。

■1
>最下行に挿入したいのに19に挿入されてしまいます。
ちょっとよく分かりません。
「最下行」が何行目のときの話をされているのでしょうか?

■2
VBAの世界では基本的にシートやセル(オブジェクトと言います)を明示すればいちいちアクティブにしたり選択をしたりする必要はありません。

■3
提示されたコードを拝見すると、最終行の求め方はいくつかありますが、そのうち1つはもう理解されているということですね。
さらに、必要な命令はあらかた出揃っているようにおもいます。

例えば「■2」を踏まえて、"1つ目"に沿って組み合わせるとこんな感じになります。

    Sub まくろ壱()
        Dim 最終行 As Long

        With ActiveSheet
            最終行 = .Cells(.Rows.Count, "B").End(xlUp).Row '←最終行を取得

            .Rows("18:18").Copy                             '←(行全体を)コピーする命令
            .Rows(最終行).Insert                            '←(コピーした行を)挿入する命令
             Application.CutCopyMode = False                '←コピーモードを解除する命令
        End With
    End Sub

要は、最終行に1行まるごと挿入することで最終行が1行下がることになるので、結果として最終行の1行上に貼り付け(挿入)することになるわけですが、望んでいる動きはこのようなことではないのでしょうか?
なお、↑のとおりでよいのであれば↓でも同じ結果になります。

    Sub まくろ壱_改()
        With ActiveSheet
            .Rows("18:18").Copy
            .Cells(.Rows.Count, "B").End(xlUp).EntireRow.Insert
            Application.CutCopyMode = False
        End With
    End Sub

■4
「■3」が理解できれば削除も同じ話ですよね。
最終行を特定してから削除すればよいだけです。
ただし↓の条件は良く考えないといけません。
>B列最下行の1つ上の行を削除

すなわち、"最下行"が1行目だった場合は0行目を削除することになり、エラーが発生してしまいます。
"最下行"が1行目になることはあり得ないということなら別によいですが、きちんと条件分岐をしておくほうが安全だとおもいます。

たとえばこんな感じです。

    Sub まくろ弐()
        Dim 最終行 As Long

        With ActiveSheet
            最終行 = .Cells(.Rows.Count, "B").End(xlUp).Row '←最終行を取得
            If 最終行 > 1 Then .Rows(最終行 - 1).Delete     '←最終行が1より大きいときだけ処理
        End With
    End Sub

(もこな2 ) 2022/01/19(水) 18:28


try様
もこな2様
ありがとうございました
思っていたような動作が出来るようになりました。

(ミー子) 2022/01/21(金) 10:07


コメント返信:

[ 一覧(最新更新順) ]


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