[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
(あり) 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.