• ベストアンサー

選択範囲内の空白セルだけ抜き出すマクロでエラー(OfficeXP)

OfficeXPのExcelを使用しています。 選択した範囲に空白のセルがあったらそこにスペースを入力するというマクロで、下記の一行だけ書きました。 Sub Test() Selection.SpecialCells(xlCellTypeBlanks).Value = " " End Sub 空白のセルが有った場合は問題ないのですが、無いときにエラーになります。 どのようなエラー処理をすればこれを回避出来るのでしょうか?教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

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 のほうが、はっきりとしているのではないかと思います。

koba_nob
質問者

お礼

マクロまで組んで頂いての説明大変ありがとうございました。 Selection.SpecialCells(xlCellTypeBlanks)では 使われていないところまでの選択はされないのですね。 大変参考になりました。 ありがとうございました。

その他の回答 (4)

  • StudyVBA
  • ベストアンサー率0% (0/3)
回答No.5

Wendy02さん、koba_nobさん、再度のこんにちは。 koba_nobさんも知りたいとのことでしたので質問した甲斐がありました。 仰る意味、確かに理解しました。 以前、xlCellTypeVisibleをちょっと勉強した時、マウス選択範囲がUsedRangeの範囲を超えてもちゃんと求められたものでそれが頭にありました。 SpecialCellsといってもその定数によって思いがけない動作をするものですね。 今回のこと、しっかり頭に入れておきます。 貴重な時間を割いていただき感謝いたします。 これからも目から鱗の回答期待しています。 ありがとうございました。

koba_nob
質問者

お礼

ありがとうございました。 おかげでまた一つマクロへの理解が少しだけ深まりました。

  • StudyVBA
  • ベストアンサー率0% (0/3)
回答No.3

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

koba_nob
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

補足: >空白のセルがあったら、スペースを入力するという意味とは、若干違うと思いますが。 マウスで範囲指定した場合は、 Selection.SepcialCells... ではなく、 Sub Test2() For Each c In Selection  If IsEmpty(c) Then   c.Value = " "  End If Next End Sub このようにしたほうが良いのではないか、ということです。もちろん、間違いだというわけではありません。

koba_nob
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

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

関連するQ&A

専門家に質問してみよう