
No.5ベストアンサー
- 回答日時:
こんばんは。
実際にやってみましたが、考えていたよりも遥かにむつかしいですね。
このSpecialCells のコードのレベルは、意外にも、かなり上級になってしまうかもしれません。今回は、便宜的に使います。
確かに、記録マクロで作れるレベルですが、思わぬ落とし穴が一杯あります。
私が、最初に考えていたコード(BlankToZero)
・VBAでは、本来は、なるべく、ワークシートの「名前-定義」は、あまり使わないほうがよいです。「名前-定義」がエラーでもぐりこんでしまうと、VBAでは触れられなくなってしまいます。
・SpecialCells(xlCellTypeBlanks)は、以下のような、エラートラップ必要です。
(1)
Sub BlankToZero()
Dim r As Range
'SpecialCells のブランク探しは、エラートラップが必要です
On Error Resume Next
'名前-定義でつけられたもの,オブジェクトの中にシート情報があるので、芳しくない
Set r = Range("選択範囲").SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not r Is Nothing Then
r.Value = 0
End If
'オブジェクトの開放
Set r = Nothing
End Sub
しかし、これでは、本当に成功はしません。それは、SpecialCells は、あくまでも、UsedRange の範囲しか受けつけてくれませんので、いくら、「名前-定義」があっても、正しく、「0」は入らない時があります。
したがって、どうやら、.SpecialCells(xlCellTypeBlanks) は、万能ではなさそうです。(うまくいく場合は、あくまでも、UsedRangeに、その範囲が入っている場合のみです)
以下のようなものからやってみてください。なるべく、ワークシートで使われるメソッドは、ミスやトラブルが多いので、実践を何度も積んでからのほうがよいです。私は、今回は、たまたま気がついただけです。
次が改良型(BlankToZeroRvs)
'標準モジュールのみ
Sub BlankToZeroRvs()
Dim c As Variant
'画面を更新させないと、処理スピードが劇的に速くなります
Application.ScreenUpdating = False
For Each c In Range("選択範囲")
If IsEmpty(c) Then
c.Value = 0
End If
Next c
Application.ScreenUpdating = True
End Sub
実際やってみました。
違いがまだわかりませんが、どちらでもうまくいきました。
もっと経験を積んで失礼にならないくらいになりたいです。
こんな骨なしに時間を無駄にしたと思われないようにがんばります。
No.6
- 回答日時:
#5 の訂正です
#今回は、便宜的に使います。
は、
・VBAでは、本来は、・・・・
の末尾につけてください。便宜的に「名前-定義」を使います。
ということでした。そのままでは、意味が通りません。
No.4
- 回答日時:
Cells("選択範囲").SpecialCells(xlcellTypeblank)
すなわち指定範囲の空白セルを
Selectしてセル群のオブジェクト(Range)を掴み、
それのValueプロパティに対して、値0を代入する。
--
xlcellTypeblank はxlcellTypeblanksのミス
--
Cells("選択範囲")はRange(選択範囲)が正しい
RangeとCellsの関係を勉強すること
ーー
例えば
Sub test01()
Range("A1:C10").Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.Value = 0
End Sub
ーー
以下は参考に
IFは不要ということに関連して
SpecialCells(xlcellTypeblank)を使うことにより、IF文的な選択は内部的に行われるので、VBAのスクリプト上はIF文は要りません。
この機能がVBAなどスクリプトを使えば、IF文の繰り回しを表現せずに、実質IFを多数回数繰り回ししたのと同じになります。
それでコードがすっきりします。
For Each Cl In Rande(範囲)
If Cl="" Then
・・
と言ったコードに比べれば、すっきりします。
ですから
(1)VB的コード法(他言語のプログラム経験あり、エクセルVBAの
本を余り読んでないタイプの人に多い)
(2)エクセル固有のプロパティを使うコード法
(3)もっと凝ったやり方(いつもあるとは限らないが有るかも)
もうひとつ例を挙げると、Findメソッドを使うと(2)にあたり
各セルをIF文で同じか聞いて、全行走査するのが(1)です。
エクセルの関数をVBAで使うのも(2)です。例えば平均で、合計をだし、データ数で割って出すのは(1)です。
すいません。丁寧な解説ありがとうございます。
とにかく、VBAを覚えようと思って、何でもかんでも自動化を試しています。
経験を積むことが大事かなと思って。
No.3
- 回答日時:
#1です。
If Cells("選択範囲").SpecialCells(xlcellTypeblank).Select Then
と
End If
の2行はいりません。念のため。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
空白への0入力 二次元配列(VBA)
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
excelのマクロで該当処理できなければ飛ばして進むにはどうすればよいのでしょうか
Visual Basic(VBA)
-
-
4
特定のセルが空白だったら、その行を非表示にしたい。。。
Visual Basic(VBA)
-
5
VBA 存在しないシートを選択した時にエラーメッセージを表示するには?
Visual Basic(VBA)
-
6
VBAのオートフィルターで該当行がない場合に処理を止めたい
Excel(エクセル)
-
7
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
8
Excel VBA マクロ ある列の最終行迄を参照し、別の列の空白セルに値を入力したいです
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
visual studio でインデントを...
-
反転する時の色を変えたいのですが
-
エクセル マウスで選択した範...
-
セル削除右(又は下)方向にシフト
-
選択範囲の空白セルに0を入れる...
-
テーブルリンク エクセルの4...
-
エクセルである行以下全部を削...
-
万博のID・チケットについて 3...
-
絶対パスと相対パスについて。
-
運送屋さんに質問です。
-
Photoshop で8bit /チャンネル ...
-
PANTONE の 正しいCMYK値の調べ方
-
ipadのpagesでMS明朝を使う方法...
-
「無」と「未」の使い方
-
シフトキーを使った範囲選択が...
-
「要求された操作を完了できま...
-
画像の四隅を移動して変形でき...
-
画像で特定の領域の割合を知りたい
-
Wordでドロップダウンリスト連動
-
PDFを開くとデフォルトで閲覧モ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
visual studio でインデントを...
-
エクセル マウスで選択した範...
-
Wordデータの色を反転させたい
-
エクセル ダブルクリック入力の...
-
テーブルリンク エクセルの4...
-
選択範囲の空白セルに0を入れる...
-
セル削除右(又は下)方向にシフト
-
EXCEL VBA----離れたセル範囲の...
-
反転する時の色を変えたいのですが
-
Cell内の一部を指定する方法(Wo...
-
読み上げ機能について
-
ペイントでの切り取り
-
この画像の上と下の黒い部分を...
-
EXCEL VBAにて画像処理のアドイ...
-
エクセルのマクロで選択範囲の...
-
エクセルのフィルタオプション...
-
Wordで一括範囲指定について
-
VBA 罫線を消さずに切り取り A1...
-
EXCEL ボリュームゾーンごとの...
-
エクセルの選択範囲名の削除方法
おすすめ情報