[[20231110094639]] 『60以下の数字は削除するvbaについて』(あり) ページの最後に飛ぶ

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

 

『60以下の数字は削除するvbaについて』(あり)

Sub sample()
Dim MyV As Variant
Dim i As Long

MyV = Cells(1, 1).CurrentRegion.Resize(, 2)
For i = 1 To UBound(MyV)
If MyV(i, 1) < 60 Then
MyV(i, 1) = ""
End If
Next

Range(Cells(1, 1), Cells(UBound(MyV), 1)).Value = MyV
End Sub

A列に60以下の数字が入っていたら削除するというものなのですが、このvbaでなぜ60以下の数字が削除されるのか分かりません。
MyV(i, 1) = ""に関しても、vbaでの""にはどのような意味があるのでしょうか。よろしくお願いいたします。

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


 >A列に60以下の数字が入っていたら削除するというものなのですが

 厳密に言うと、削除するプロシージャではないです。
 長さ0の文字列("")で上書きするものです。

 削除は、セルの値をEmptyにするものであり、MyV(i, 1) = Empty が正しい。

 とは言え、結果は、それでもセルの値はEmptyになるのが普通です。

 何故かと言えば、RangeオブジェクトのValueプロパティ(プログラムの一種)が、
 セルの書式を勘案して、更にEmptyに変えてくれるからです。(ここが分かっていない人が多すぎる)

 書換え直前にセルの書式を文字列型に変えてみるとその違いが分かるでしょう。

(半平太) 2023/11/10(金) 10:26:57


詳しくありがとうございます。
もしよろしければ加えて教えてください。
vbaで、D列に30万以下の数字がある際に行ごと削除したいのですが、
どんな式を使うのが一番いいのでしょうか?

(あり) 2023/11/10(金) 10:42:03


 そっちが本命でしたか。(初めからそう聞いてくださいよ。私はスルーしたでしょうけど)

 それがまさしく削除であり、冒頭の話は削除ではなくクリアと呼ぶのが正しい。
 (ただ手動で値クリアはDELETEキーを押すので、「削除」と表現するのも無くはないです。)

 行の削除は、下からがセオリです。

 上からだと、これから削除しようと思っていた行が
 それまでの削除によって想定の位置からズレてしまうので、厄介なことになります。

 以下(そちらのデータ状況がよく分からないので)少しリスキーですが・・

 Sub sample()
     Dim i As Long

     With Cells(1, 1).CurrentRegion
         For i = .Rows.Count To 1 Step -1
             If .Cells(i, "D").Value <= 300000 Then
                 Rows(i).Delete
             End If
         Next
     End With
 End Sub

(半平太) 2023/11/10(金) 11:20:00


すみません。自力で頑張ろうと思ったのですが…
その通りで削除によって行がずれてしまうので困っていました。
ありがとうございます!

(あり) 2023/11/10(金) 11:47:15


コメント返信:

[ 一覧(最新更新順) ]


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