電子書籍の厳選無料作品が豊富!

【質問】
以下のコードより、行数や文字数を少ない
マクロにする事はできますか?

マクロを少しでも簡単にしたいです

ご存じの方、コードやアドバイスをお願いします


【マクロの説明】
アクティブセルになっている行を上の表の最終行の1つ下に
移動するマクロです。移動する表の3列目には削除と文字が入力されます
以下コードは動きます

【条件】
上と下の表は常に8セルあいています


【コード】
Sub 不要行削除()

Dim filePath As String
Dim wb As Workbook
Dim LastRow1 As Long

filePath = "C:\Users\2020\OneDrive\マクロ\不要行削除\鏡.xlsm"

Set wb = Workbooks.Open(filePath)

Set ws = wb.Worksheets("RC00810")

LastRow1 = Cells(5, "A").End(xlDown).Row
ActiveRow = ActiveCell.Row


ws.Range(Cells(ActiveRow, 1), Cells(ActiveRow, 3)).Interior.ColorIndex = 15

ws.Cells(ActiveRow, 3) = "削除"

ws.Range(Cells(ActiveRow, 1), Cells(ActiveRow, 3)).Cut ws.Range(Cells(LastRow1 + 1, 1), Cells(LastRow1 + 1, 3))

ActiveCell.EntireRow.Delete
Rows(LastRow1 + 2).Insert

End Sub

「【マクロ】コードを少しでも、減らする為に」の質問画像
  • 画像を添付する (ファイルサイズ:10MB以内、ファイル形式:JPG/GIF/PNG)
  • 今の自分の気分スタンプを選ぼう!
あと4000文字

A 回答 (4件)

No1の回答のお礼にいただいた質問の答えです




---------------------------------------------------
(1) Range("A" & ActiveRow & ":C" & ActiveRow) の意味・・・
まず、この部分は 「A列からC列の ActiveRow 行目を範囲として取得」 という意味になります。

例えば、ActiveRow = 8 なら「ws.Range("A8:C8")」と同じです。

---------------------------------------------------
(2) .Cells(1, 3) の意味
次に Cells(1, 3) の動作ですが、これは 指定した範囲 (A8:C8) の中で、行1・列3 のセルを指します。

「A8:C8」の中で Cells(1, 3) を考える
Range("A8:C8") の セルの構成 を考えると、A8 B8 C8 の3つのセルがあります。
この範囲内での .Cells(1, 3) の意味は、
「この範囲の1行目(最初の行)の3列目」 なので C8 を指します。

つまり、「ws.Range("A8:C8").Cells(1, 3) = "削除"」は 「C8 に '削除' と入力する」 という意味になります。

---------------------------------------------------
(3) Cells(1,3) が A3 ではない理由
もし Cells(1, 3) を ワークシート全体(ws.Cells(1,3)) で考えるなら、それは C1 になります。

しかし、 Range("A8:C8") という範囲の中で Cells(1,3) を使っている ため、
「この範囲内での相対的なセル位置」として解釈 されます。

したがって、
Cells(1,1) → A8
Cells(1,2) → B8
Cells(1,3) → C8
となるわけです。

---------------------------------------------------
    • good
    • 0

あ、すみません、17行目以降は別の表なのですね。

失礼しました。
    • good
    • 1

ws.Activateを入れれば、以降は ws. が不要になりスッキリします。


説明では行を移動するということなので、CutするのもEntireRowにして
ActiveCell.EntireRow.Cut Rows(LastRow1 + 1)でいいでしょう。
図では8行目に「削除」の行が残っているし移動先はグレイになっていないし説明と違いますが、図が間違っているのでしょうか?
    • good
    • 1

改善点



・Dim を1行に記載する

・不要な変数を削減
filePath 変数を削除し、直接 Open に記述。

・With ステートメントの使用
ws の指定を簡略化し、冗長な ws.Range(Cells(...)) を省略。

・変数の宣言と使用方法を最適化
ActiveRow は Dim で明示的に宣言。

・セルの範囲指定を簡略化
Range(Cells(...), Cells(...)) を Range("A" & row & ":C" & row) で簡単に記述。

・不要な Insert の削除
Rows(LastRow1 + 2).Insert は不要だったため削除。







Sub 不要行削除()
Dim wb As Workbook, ws As Worksheet, LastRow1 As Long, ActiveRow As Long

' ブックを開く
Set wb = Workbooks.Open("C:\Users\2020\OneDrive\マクロ\不要行削除\鏡.xlsm")
Set ws = wb.Worksheets("RC00810")

' 最終行を取得
LastRow1 = ws.Cells(5, "A").End(xlDown).Row
ActiveRow = ActiveCell.Row

' 移動する行の色を変更し、3列目に「削除」と入力
With ws.Range("A" & ActiveRow & ":C" & ActiveRow)
.Interior.ColorIndex = 15
.Cells(1, 3) = "削除"
.Cut ws.Range("A" & LastRow1 + 1)
End With

' 元の行を削除
ActiveCell.EntireRow.Delete
End Sub
    • good
    • 1
この回答へのお礼

大変、分かりやすいコードありがとうございます
1点質問なのですが

ws.Range("A" & ActiveRow & ":C" & ActiveRow).Cells(1, 3) = "削除"

ここが分からないのですが、例えばActiveRowが8なら

A8:C8=Cells(1,3)=”削除” となると
Cells(1,3)は、A3になるイメージがありまして
つながってこないのです

ただ、コード動くのであっているのは分かっています
どういう意味か教えて頂けると幸いです

お礼日時:2025/03/20 01:11

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

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


おすすめ情報

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