アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
行を削除するマクロを探してtom04さんの下記マクロにたどり着いたのですが、マクロの意味がわからず、どなたか教えていただけないでしょうか?
https://oshiete.goo.ne.jp/qa/11485794.html

特に

If myRng Is Nothing Then
  Set myRng = Cells(i, "A")
  Else
  Set myRng = Union(myRng, Cells(i, "A"))
End If

この[Union(myRng, Cells(i, "A"))]の意味が調べても良くわかりませんでした。
実際のデータは起点がF列となり、A~E列までは空白もあるのですが、"A"のままで大丈夫でしょうか?

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

  • うーん・・・

    回答ありがとうございます。
    書き方が悪かったようで申し訳ないのですが、
    どちらもmyRngにセットしているのに、何故Unionにすると削除できるのでしょうか。
    よろしくお願いします。

      補足日時:2023/08/17 15:55

A 回答 (8件)

提供されたリンク先のマクロを見る限り、Excel VBAを使用して行を削除するためのコードが記載されています。

以下、そのコードの詳細について解説します。

このマクロは、指定された条件に基づいて行を削除するために使用されます。具体的には、列Fのデータに対して、特定の条件を満たす行を削除することを目的としています。ただし、コード内では「A」列を操作していますが、これは元のコードの記述ミスと思われます。詳細な修正が必要です。

以下にコードの詳細を説明します。

Dim myRng As Range:
myRng という変数を宣言しています。この変数は削除する行を格納するための範囲(Range)を指定するのに使用されます。

ループ部分:
For i = 100 To 1 Step -1 というループが、100行目から1行目まで逆順で繰り返されます。このループは、列Fのデータを上から下へチェックしていくためのものです。

If 文:
If Cells(i, "F").Value = "○" Then という条件文があります。これは、行の列Fが「○」である場合に対して以下の操作を行うという意味です。

行の削除:
Rows(i).Delete というコードが行を削除しています。このコードは、現在のループで指定されている行を削除するためのものです。

myRng の操作:
削除すべき行を myRng に追加する部分が上記でのコードの説明を行なっています。ここで、誤った部分が含まれており、正しくは「F」列ではなく「A」列でなければならないと思われます。正しくは myRng = Union(myRng, Cells(i, "A")) となるべきです。

最後の操作:
ループが終了した後に、If Not myRng Is Nothing Then myRng.EntireRow.Delete という操作が行われます。これは、myRng に格納された行を削除するためのコードです。

最終的な目的は、特定の条件に基づいて行を削除することですが、コード内にいくつかの間違いが含まれている可能性があります。具体的には、「A」列でなく、「F」列を操作すべき部分があります。修正が必要ですので、修正してから使用することをおすすめします。
    • good
    • 0

myRngに何も入ってなければ、myRngにセル番地としてi行A列をセットする。



何か入っていたら、既にセル番地が入っているmyRngに、セル番地としてi行A列を追加する。
    • good
    • 0

>実際のデータは起点がF列となり、A~E列までは空白もあるのですが、"A"のままで大丈夫でしょうか?



その個所は、Aのままで大丈夫ですが、探す範囲を変える必要があります。
要件から提示していただいた方が良いかと思います。
1.1行目は見出し行なのか、それとも、いきなりデータ行なのか。
2.削除対象となる行は、どのような行なのか。
tom04さんの例では、"赤"の文字があるセルで、検索するのはA列のみとなっています。
今回は、もし、同様の要件だとすると、
①検索文字列(複数の場合は複数列挙する)、
検索文字列は完全一致なのか部分一致なのかも明記
(tom04さんの例では完全一致)
②検索対象のセルの列(複数の場合は複数列挙する)
が不明です。
    • good
    • 1

>どちらもmyRngにセットしているのに、何故Unionにすると削除できるのでしょうか。


Unionは複数のセル範囲をまとめて保持する機能です。

Set myRng = Cells(3, "A")
Set myRng = Union(myRng, Cells(5, "A"))
Set myRng = Union(myRng, Cells(7, "A"))

とすると
myRngは
Cells(3,"A")
Cells(5,"A")
Cells(7,"A")
を保持します。

myRng.EntireRow.Delete
とすると
Cells(3,"A")
Cells(5,"A")
Cells(7,"A")
に作用するので
3,5,7行が削除されます。

参考URL
https://excel-ubara.com/excelvba1/EXCELVBA403.html
    • good
    • 0
この回答へのお礼

うーん・・・

ありがとうございます。
わからないのが、実際に上記のコードで実行してみると
Set myRng = Cells(i, "A")
としたものは削除されないです。

回答にあるSet myRng = Cells(3, "A")は削除されず、
Unionを使ってセットものだげが削除される理由はわかりますでしょうか?

お礼日時:2023/08/17 16:58

複数ある場合に、まとめて削除する為です。


トビトビの3行を削除する時、普通にやれば、for文の繰り返しで行を見つけて削除で、対象が3行だったらfor文の繰り返しで3回ヒットして完了します。
対象が10行有ったらfor文の繰り返しで10回がヒットして完了します。

myRngにトビトビの対象行をセットして置けば、1回で纏めて削除が出来ます。

その違いです。
が、良く無い作りです。

高度な処理を書くと、後で見返した時に本人でも解らなくなります。
作った本人は「スマートだろ?」と言いたいのでしょうが、システム作り専門会社からすると「メンテナンスを難しくする良く無い作りだ!」と評価されます。

地道に普通に書くのが良いプログラムなんです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
実際にFor文でやってみたのですが、処理速度が段違いで、内容が理解出来ればこれでやりたいと思った次第です。

お礼日時:2023/08/17 17:06

>わからないのが、実際に上記のコードで実行してみると


>Set myRng = Cells(i, "A")
>としたものは削除されないです。

>回答にあるSet myRng = Cells(3, "A")は削除されず、
>Unionを使ってセットものだげが削除される理由はわかりますでしょうか?

こちらの環境では削除されます。
以下のマクロを実行すると3行目が削除されます。
(添付図参照、左側が実行前、右側が実行後です)
このマクロで確認していただけませんでしょうか。
Sub 行削除2()
Dim myRng As Range
Set myRng = Cells(3, "A")
myRng.EntireRow.Delete
End Sub
「VBA 選択範囲とUnionの使い方につ」の回答画像6
    • good
    • 0

>>回答にあるSet myRng = Cells(3, "A")は削除されず、


>>Unionを使ってセットものだげが削除される理由はわかりますでしょうか?

チャント3,5,7行だけが削除されますよ、間違いなくです。

Dim myRng As Range
Set myRng = Cells(3, "A")
Set myRng = Union(myRng, Cells(5, "A"))
Set myRng = Union(myRng, Cells(7, "A"))
myRng.EntireRow.Delete
    • good
    • 0

当たり前の話ですが、


Dim myRng As Range
Set myRng = Cells(2, "A") ・・・①
Set myRng = Cells(3, "A")
Set myRng = Union(myRng, Cells(5, "A"))
Set myRng = Union(myRng, Cells(7, "A"))
myRng.EntireRow.Delete
①の箇所の行は、削除されません。(2行目は削除されません)


上記のようなマクロではなく、下記のようなマクロであるなら、
If myRng Is Nothing Then
  Set myRng = Cells(i, "A") ・・・②
  Else
  Set myRng = Union(myRng, Cells(i, "A"))
End If

②の行にブレイクポイントを設定し、実行してください。
②の行で止まるので、その時のiの値を確認してください。
そのiの値が、削除されるべき行の番号を示しています。
そのiの値が、あなたが想定していた値と同じかどうか確認してください。
想定していた値と異なるなら、あなたの勘違いということになります。
想定していた値と同じなら、最後まで実行してください。
その値で示される行が削除されるはずです。
    • good
    • 1

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