- ベストアンサー
結合セルのデータ消去でエラーになります。どのようにすればいいでしょうか?
Range(”A1:A6”)にデータが入っていますが、そのうちA3、A4、A5セルは 結合されています。Range(”A1:A6”)のデータをクリアするために以下 コーディングをしましたが、結合セルの先頭でエラー(実行時エラー 1004)に なってしまいます。 結合セルのデータクリアはどのようにすればいいのでしょうか。 お分かりの方よろしくご教示ください。 Sub Sample() Dim i As Long For i = 1 To 6 Cells(i, 1).ClearContents Next i End Sub
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
横から失礼。 ちょっと不思議な展開のような気がしてます。 Range("A1").Value = "" セルの表示形式が文字列の場合は本当の空白セルになりませんよね? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MsgBox IsEmpty(Range("A1")) それに Range("A65536").End(xlUp).Select そもそも Range("A1:A6").ClearContents ? 私が何か勘違いしてるのかしらん? #ひょっとしてA3:A5が結合してるのではなくてそれぞれが横方向に結合してたりするのかなぁ。 #その場合でもRange("A1:A6").Value = Emptyで良いはずだけど。
その他の回答 (7)
- myRange
- ベストアンサー率71% (339/472)
myRangeです。 Empty、失念しておりました。。(^^;;; 何れにしろ当方のコメントで質問者を混乱させてしまったようで 申し訳ありませぬ。 で、ちょと整理してみますと、セルA3:A5が結合セルとして。 ●ClearContentsメソッドは結合セルの一部を指定できない● Range("A3:A5").ClearContents のように結合セル全セルを指定するのはいいが、 質問者のコードのように range("A3").ClearContents と、結合セルの一部指定はできない。 Range("A1:A6").ClearContents これは、結合セル(A3:A5)が全て含まれているのでOK。 このようにClearContentsメソッドで結合セルをクリアーする場合は そこら辺りの煩わしさがあるので、あっさりと Range("A1:A6").Value = Empty Emptyを代入した方がいいのかも知れません。 ------------------------------------------------------ 今回は改めて基本的な事柄を再確認することができ end-uさん、MackyNo1さん、質問をしてくださったyamato99さん お三方に感謝せねばなりません。 ありがとうございました。 以上です。
お礼
最後に整理していただき、ありがとうございました。 いろいろ勉強になりました。 これからもよろしくお願いします。
- MackyNo1
- ベストアンサー率53% (1521/2850)
>Range("A1").Value = "" セルの表示形式が文字列の場合は本当の空白セルになりませんよね? end-uさん、ご指摘ありがとうございます。 ご指摘のように、文字列のセルには、空白文字列が代入されてしまいますね。 私は、VBAについては入門書を読んだだけで、ほとんど参考書を読まず、必要に応じて試行錯誤して実戦的に覚えた自己流のマクロなので、実際に不都合が発生するまで問題に気がつかないこともたびたびありました(それで少しずつノウハウがわかるようになってきましたが)。 今回のようなコードを使用した場合はRange("A65536").End(xlUp).Selectなどで最下行セルを特定するときなどに、確かに問題が発生する可能性がありますね。 これまでは、どうにか解決するという場当たり的な対応していましたが、これを機会に少し上級の参考書でVBAを基本から勉強してみようかと思っています。
- end-u
- ベストアンサー率79% (496/625)
いえ。 『一部(A3:A5)が結合している範囲(A1:A6)のデータをクリアするには』 Range("A1:A6").ClearContents です。
- myRange
- ベストアンサー率71% (339/472)
MackyNo1さん、 的確なご指摘、感謝しまします。 仰るとおりです。 エクセル側とVBAをごちゃまぜにしていたようです。(^^;;; 質問者さん、回答2の 「数値が入るべきセルに””を入れると拙い場合云々」 は無視願います。 MackyNo1さんの回答は勉強になるものが多いので 目につくと必ず見るようにしています。 これからも目から鱗の回答期待しています。 今回はありがとうございました。 以上です。
- MackyNo1
- ベストアンサー率53% (1521/2850)
MyRangeさん >●長さ0の文字列””を代入する場合 >数値が入るべきセルに””を入れると拙い場合がありますよね。 VBAの「""」は関数で使用する場合の「""」と違って、本当の空白セルになると思うのですが(「=TYPE(A1)」で1が返ります)、どのような場合に不都合がでるのでしょうか? 後学のために教えていただけると幸いです。
- myRange
- ベストアンサー率71% (339/472)
ClearContentsと""(長さ0の文字列)は、 クリアーといっても意味が違いますので。。 ●ClearContentsを使う方法 この方がセルの内容が初期値になるのでお勧めです。 '----------------------------------------------- Sub test11() Dim i As Long For i = 1 To 6 Cells(i, "A").MergeArea.ClearContents Next i End Sub '---------------------------------------------- ●長さ0の文字列””を代入する場合 数値が入るべきセルに””を入れると拙い場合がありますよね。 '-------------------------------------- Sub test22() Range("A1:A6").Value = "" End Sub '-------------------------------------- 以上です。
お礼
回答ありがとうございました。 ClearContentsを使う方法を使ってうまく行きました。 これからもよろしくお願いします。
- MackyNo1
- ベストアンサー率53% (1521/2850)
Cells(i, 1).ClearContents ↓ Cells(i, 1).Value = "" のようにしてはいかがでしょう
お礼
早々の回答ありがとうございました。 MackyNo1 の回答でもやってみましたが、うまく行きました。 数値項目だった場合でも表示形式は変わりませんので、 これもうまいやり方ですね。 これからもよろしくお願いします。
お礼
解答ありがとうございました。 話が難しくなってきましたが、結局、一部(A3:A5)が結合している範囲(A1:A6)のデータをクリアするには、(1)または(2)が良いということでしょうか。 (1)Range("A1:A6").Value = Empty (2)Range("A1:A6").MergeArea.ClearContents