- ベストアンサー
選択範囲内の空白セルだけ抜き出すマクロでエラー(OfficeXP)
OfficeXPのExcelを使用しています。 選択した範囲に空白のセルがあったらそこにスペースを入力するというマクロで、下記の一行だけ書きました。 Sub Test() Selection.SpecialCells(xlCellTypeBlanks).Value = " " End Sub 空白のセルが有った場合は問題ないのですが、無いときにエラーになります。 どのようなエラー処理をすればこれを回避出来るのでしょうか?教えて下さい。
- みんなの回答 (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 のほうが、はっきりとしているのではないかと思います。
その他の回答 (4)
- StudyVBA
- ベストアンサー率0% (0/3)
Wendy02さん、koba_nobさん、再度のこんにちは。 koba_nobさんも知りたいとのことでしたので質問した甲斐がありました。 仰る意味、確かに理解しました。 以前、xlCellTypeVisibleをちょっと勉強した時、マウス選択範囲がUsedRangeの範囲を超えてもちゃんと求められたものでそれが頭にありました。 SpecialCellsといってもその定数によって思いがけない動作をするものですね。 今回のこと、しっかり頭に入れておきます。 貴重な時間を割いていただき感謝いたします。 これからも目から鱗の回答期待しています。 ありがとうございました。
お礼
ありがとうございました。 おかげでまた一つマクロへの理解が少しだけ深まりました。
- StudyVBA
- ベストアンサー率0% (0/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さんの回答はいつも参考にさせて頂いていますので、宜しくお願いいたします。 たぶん、質問者の方も知りたいのでは。
お礼
補足有り難うございます。 はい、知りたいです。
- Wendy02
- ベストアンサー率57% (3570/6232)
補足: >空白のセルがあったら、スペースを入力するという意味とは、若干違うと思いますが。 マウスで範囲指定した場合は、 Selection.SepcialCells... ではなく、 Sub Test2() For Each c In Selection If IsEmpty(c) Then c.Value = " " End If Next End Sub このようにしたほうが良いのではないか、ということです。もちろん、間違いだというわけではありません。
お礼
有り難うございました。 なるほど、これならエラーにならないですね。 参考になりました。
- Wendy02
- ベストアンサー率57% (3570/6232)
On Error Resume Next Selection.SepcialCells... で、エラー・トラップをかけますが、でも、空白(Empty)のセルがあったら、スペースを入力するという意味とは、若干違うと思いますが、もう少し、考えたほうがよいのではありませんか?
お礼
マクロまで組んで頂いての説明大変ありがとうございました。 Selection.SpecialCells(xlCellTypeBlanks)では 使われていないところまでの選択はされないのですね。 大変参考になりました。 ありがとうございました。