プロが教えるわが家の防犯対策術!

OfficeXPのExcelを使用しています。

選択した範囲に空白のセルがあったらそこにスペースを入力するというマクロで、下記の一行だけ書きました。
Sub Test()
Selection.SpecialCells(xlCellTypeBlanks).Value = " "
End Sub

空白のセルが有った場合は問題ないのですが、無いときにエラーになります。
どのようなエラー処理をすればこれを回避出来るのでしょうか?教えて下さい。

A 回答 (5件)

StudyVBAさん、こんにちは。



>マウスで範囲指定した場合は、selection.SepcialCells...ではなく、
>For each の方がベターなのでしょうか

実は、書いた時点では感覚的なものだったので、検証してみました。
 SpecialCells(xlCellTypeBlanks)
というのは、Excelライブラリの中の、Rangeクラスの配下(メンバ)なんですが、この動作には、漠然とした部分があると思うのです。(実際に、私は使わないのです。)

例えば、
 ActiveSheet.Cells.SpecialCells(xlCellTypeBlanks).Select

としてみると、
 ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Select

とたぶん、同義だと思いますが、いかがでしょうか?
Selection というのは、あくまでも、マウス等によるユーザー選択の部分ですね。
ということは、そのUsedRangeとは違いが出ます。

こんなテストをしてみました。

新しいシートに、いくつか、値を点在させて、その最終セルを越えて、マウス選択してみます。

Sub Test_UsedRange_Selection()
Dim r As Range
Dim SelectedRow As Long, UsedRow As Long
Dim SelectedColumn As Integer, UsedColumn As Integer
'
Set r = Selection
With ActiveSheet
 SelectedRow = r.Cells(r.Count).Row
 SelectedColumn = r.Cells(r.Count).Column
 UsedRow = .UsedRange.Cells(.UsedRange.Count).Row
 UsedColumn = .UsedRange.Cells(.UsedRange.Count).Column
End With
If SelectedRow > UsedRow Then
  MsgBox "選択した行は、UsedRangeよりも大きいです。"
End If
If SelectedColumn > UsedColumn Then
  MsgBox "選択した列は、UsedRangeよりも大きいです。"
End If
End Sub

Sub Test()
Set r = Selection
 With r.Cells.SpecialCells(xlCellTypeBlanks)
   .Select
   '=" "
 End With
End Sub

そうすると、UsedRange よりも先の部分の Selection は、Select しないのではないでしょうか?ですから、SpecialCells(xlCellTypeBlanks)の範囲というのは、その検索範囲がかならず、UsedRange内と明確ではない限りは、For Each ~ In Selection のほうが、はっきりとしているのではないかと思います。
    • good
    • 0
この回答へのお礼

マクロまで組んで頂いての説明大変ありがとうございました。

Selection.SpecialCells(xlCellTypeBlanks)では
使われていないところまでの選択はされないのですね。
大変参考になりました。

ありがとうございました。

お礼日時:2005/04/27 22:41

Wendy02さん、koba_nobさん、再度のこんにちは。


koba_nobさんも知りたいとのことでしたので質問した甲斐がありました。

仰る意味、確かに理解しました。
以前、xlCellTypeVisibleをちょっと勉強した時、マウス選択範囲がUsedRangeの範囲を超えてもちゃんと求められたものでそれが頭にありました。
SpecialCellsといってもその定数によって思いがけない動作をするものですね。
今回のこと、しっかり頭に入れておきます。

貴重な時間を割いていただき感謝いたします。
これからも目から鱗の回答期待しています。
ありがとうございました。
    • good
    • 0
この回答へのお礼

ありがとうございました。

おかげでまた一つマクロへの理解が少しだけ深まりました。

お礼日時:2005/04/27 22:43

こんにちは。


Wendy02さんにお尋ねします。
No.1の回答のように単純に
--------------------------------------------
Sub Test()
  On Error GoTo NotFound
  Selection.SpecialCells(xlCellTypeBlanks).Value = " "
  Exit Sub
NotFound:
  MsgBox "ブランクセルはありません"
End Sub
-------------------------------------------
でいいと思うのですが、なぜ
マウスで範囲指定した場合は、selection.SepcialCells...ではなく、
For each の方がベターなのでしょうか

Wendy02さんの回答はいつも参考にさせて頂いていますので、宜しくお願いいたします。
たぶん、質問者の方も知りたいのでは。
    • good
    • 0
この回答へのお礼

補足有り難うございます。
はい、知りたいです。

お礼日時:2005/04/26 14:45

補足:


>空白のセルがあったら、スペースを入力するという意味とは、若干違うと思いますが。
マウスで範囲指定した場合は、
Selection.SepcialCells...
ではなく、

Sub Test2()
For Each c In Selection
 If IsEmpty(c) Then
  c.Value = " "
 End If
Next
End Sub

このようにしたほうが良いのではないか、ということです。もちろん、間違いだというわけではありません。
    • good
    • 0
この回答へのお礼

有り難うございました。
なるほど、これならエラーにならないですね。

参考になりました。

お礼日時:2005/04/26 14:40

On Error Resume Next


Selection.SepcialCells...
で、エラー・トラップをかけますが、でも、空白(Empty)のセルがあったら、スペースを入力するという意味とは、若干違うと思いますが、もう少し、考えたほうがよいのではありませんか?
    • good
    • 0

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