• ベストアンサー

選択範囲内の空白セルだけ抜き出すマクロでエラー(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

  • エクセルVBAで空白セルを削除する方法

    みなさん教えてください。 今エクセルVBAで、下記のようにのA列に空白セルがある場合にそのセルを削除し、 空白セルが無い場合何もしないと言うマクロを作っています(下記のように自動記録し ました)。 しかし、作成したマクロは、下記のようにA列に空白セルがない場合はエラーが出てし まいます。 空白セルが無い場合エラーが出ない方法を教えて頂けないでしょうか。 よろしくお願いします。 <マクロ> Sub Macro1() Columns("A:A").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.SpecialCells(xlCellTypeBlanks).Select Application.CutCopyMode = False Selection.Delete Shift:=xlUp End Sub <データ> A --------- 1 2 1 1 1 3 4 ・ ・ ・ (以降約300行続きます)

  • 選択範囲の空白セルに0を入れるマクロ

    Private Sub CommandButton1_Click() If Cells("選択範囲").SpecialCells(xlcellTypeblank).Select Then Range("選択範囲").Value = 0 End If End Sub このマクロを作成したのですが、動きません。 どこが、おかしいのでしょうか?

  • 別シートに空白セルを詰めデータを自動コピー

    excel2013で、【sheet1】の列にあ~わ行まであり、行にそれぞれ氏名を入れています。 グループ1とグループ2にページを上下に分けていて、それぞれ合計50名です。 行は各20行まで用意していますが、行によっては空白セルもあります。 この【sheet1】のデータを【sheet2】の1~100番まで番号を振った隣のB列に空白セルを詰めながら氏名データを並べたいのですが、マクロで出来るでしょうか? ちなみに空白セルを詰めるマクロは下記コードで確認しています。 Sub Macro() Selection.SpecialCells(xlCellTypeBlanks).Select Selection.Delete Shift:=xlUp End Sub シート間のデータ移動の方法も分かるのですが、2つをどう繋ぎ合わせればいいか分かりません。 簡単ですが、sheet1の参考画像も添付していますので、アドバイス宜しくお願いします。

  • VBAで指定範囲内の空白セルを左詰めで一括削除したいのですが

    エクセルで作成した表中に測定結果を集約し、管理しております。 測定を行った際に得られる数値を項目毎に対象列のセルへ集積しているのですが、 測定を行っていない項目のセルは空白となるため、空白セルを左詰めで一括削除したく望んでおります。 下記のようにマクロの記録を使用してコードを取得し、実行してみたのですが、エラーになってしまいます。 Private Sub CommandButton1_Click() Sheets("A").Select Range("B:AH").Select Selection.SpecialCells(xlCellTypeBlanks).Select Selection.Delete Shift:=xlToLeft Range("A1").Select End Sub 対象範囲(列)はB列からAH列としておりますが、測定項目が増えると記載列も増えますので、 範囲を柔軟に変更出来るような方法で希望しております。 お手数ですがご教授いただけませんでしょうか? 宜しくお願い致します。

  • セルを結合するマクロ

    マクロ初心者です。 Aセルをブランク領域で選択してマクロを実行しますとセルが結合します。 最後の空白がどこまでかは、何か指定がないといけないので、仮にエンドと名付けます。 このコードはA列のみです。A列からM列またはL列までと指定するにはどうすれば良いですか? ご教鞭をお願いします。 Sub test() Set Rng = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)) Set blanks = Rng.SpecialCells(xlCellTypeBlanks) For Each ar In blanks.Areas Union(ar(1).Offset(-1), ar).Merge Next Cells(Rows.Count, 1).End(xlUp).ClearContents End Sub

  • 使用中のセル範囲に空白があるか取得するには?

    For Each r In ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks) ’空白セルに対して処理を行なう Next r このようなコードの場合、使用中のセル範囲に空白がないとエラーになるので、 ループに入る前に、空白セルがあるかを取得したいのですが、 どういう方法があるのでしょうか?

  • 現在選択中のセルの中に空白があるのなら

    現在選択中のセルの中に空白があるのなら と言うコードを作りたいのですが Sub test() Dim r As Range Set r = Selection 'if rの中に空白があるなら then MsgBox "空白セルがあります" 'end if Set r = Nothing End Sub ここまでしかわかりませんでした。 ifステートメントどうすればいいか教えていただけますか? ご教授よろしくお願いします。

  • Excel 偶数番シートのA列が空白であるセル削除

    Excel の1つのファイル内の偶数番シートのA列が空白であるセルを行ごと削除したいのですが、下のコードではうまく動かないです。 シート番号はSheet(2)から(90)までです。 Sub 空白行削除() Dim i For i = 2 To 90 Step 2 Worksheets(i).Activate Columns("A:A").Select Selection.SpecialCells(xlCellTypeBlanks).Select Selection.EntireRow.Delete Next i End Sub

  • 実行時エラー1004空白セルを上に詰める

    よろしくお願いします いろいろ試しましたが解決できませんでした。 Private Sub CommandButton1_Click() With Worksheets("Sheet1") For r = 2 To .Cells(Rows.Count, "C").End(xlUp).Row If .Cells(r, "C").Value = 提出先.Value Then Me.提出先.Value = "" .Cells(r, "C").Value = "" Else End If Next r .Range("J3").Value = "" ’下記の構文でエラーが出ます ’実行時エラー1004 ’アプリケーション定義またはオブジェクト定義のエラーです .Range(Range("C2"), Cells.SpecialCells(xlCellTypeLastCell)).SpecialCells (xlCellTypeBlanks).Delete Shift:=xlUp End With End Sub

  • Excelの質問です。空白のセルを検索し、ダイアログボックスで把握したい。

    こんばんは。 またまたExcelで頭を悩ませています(>_<) 仕事上、大量のデータを扱うことが多いのですが、データがしっかり入力されているのか否かをチェックする必要に迫られまして・・・。 ここ↓ http://d.hatena.ne.jp/Deja/20090124/1232780962 のやり方なども参照してみたのですが、「同じ行の他のセルに空白データがある場合も選択してしまう」ことから、別の方法を探ってみました。 そして、ダイアログボックスで空白セルを探すことを決めたのですが、書いたコードがうまく作動しません(;_;) Sub blanksearch() MsgBox (Range("A1:A1000").SpecialCells(xlCellTypeBlanks).Address) End Sub は、うまく作動し、ダイアログボックスで空白セルの範囲が表示されたのですが、A列の最下行から検索しようと思い、 Sub blanksearch() MsgBox (Range(.Range("A1"), .Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeBlanks).Address) End Sub と書きかえると、「参照が不正または不完全です。」というエラーメッセージが表示されてしまいました(ToT) 2つめのコードはなぜ、うまく動作しないのでしょうか?お暇な時で構いませんので、教えていただければ幸いです。 よろしくお願いします<m(__)m>

専門家に質問してみよう