• ベストアンサー

VBAのセルのClearについて

VBA超初心者で、困っていることがあります;; たとえば、プログラムを実行したら、セルの「A1~D3」の範囲をクリアするという物があったとして、 その他の条件が以下のようになっています。 (1)クリアしても、セル内の数式を保持 (2)クリア対象のセルの罫線は残す 私は、以下のように記述したのですが、数式は残るのですが罫線が残りませんでした。 Sheets("シート名").Range("A1:D3").ClearFormats 数式を保持し、罫線を残すようにするには、どのような記述をすれば良いのでしょうか。 以上、よろしくお願いいたします。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.4

#2です。 んー・・・日本語って難しいですねぇ。 > プログラムを実行すると、「シート2」に数値が返されます。 > 「シート1のA1~D3」には数式が書かれており、「シート2」に返された数値をもとに > 「シート1」の対象セルに計算結果が表示されます。 なるほど、ごく単純に考えるとシート1のA1セルに     =シート2!A1 みたいな式が入っているのですね。 あるいは、VBAを使って     Sheets("シート1").Range("A1")=Sheets("シート2").Range("A1") とでもしているのでしょうか。 どちらにしても、「式の計算結果」が入力される、と。 > 「シート1のA1~D3」には、必ず数値が表示されるとは限りません。 > 今回はA1にデータがあったけど、次はA1にデータが無い。 なるほどなるほど、ワークシート関数なら     =IF(シート2!A1<>"",シート2!A1,"")    ※2 くらいでしょうか。 VBAなら     If Sheets("シート2").Range("A1")<>"" Then         略     End If ですかね。 > 一度「シート1のA1~D3」の数値をクリアしておかないと、 > 再度実行した際に、本当はデータが無いのに、前回の数値が残ってしまい、 > 表示が残っている状態になってしまいます。 ここがわからないんですよね・・ 質問文中の > (1)クリアしても、セル内の数式を保持 を信じるなら、セルには「数式」が入っているはずです。 上記の※のようにしておけば「シート2の参照セルが空白なら空白」が戻りますから、 わざわざVBAで「クリア」する必要は全くと言って良いくらい無いですよね? そうじゃなく、シート1に表示する計算結果はVBAで入力してるんだよ、と言うなら シート1には「値」しか入っていないはずですから、何も考えずに     Sheets("シート名").Range("A1:D3").ClearContents で十分に事足りるはずなんです。 プログラムを実行すると、「シート2」に数値が返されます。 なのであれば、むしろ「シート2の内容を消去する」コードを書いてやらないといけないのでは? それこそ、     Sheets("シート2").Range("該当範囲").ClearContents で間に合うのではないでしょうか。 A1セルに「=B1+10」という式があり、B1に「5」があれば、 A1セルに表示される返り値は「15」ですよね? これを「A1の数式を書き換えずに、返り値を変えたい」のであれば、 B1セルを操作してやるはずですね。 で、「B1セルが空白ならA1セルも空白」としたいのであれば、 A1セルには「=IF(B1<>””,B1+5,””)」としてやりますよね? こうしておけば「何らかの事情でB1セルが空白になった時」には A1セルにも空白が返ってきて、見た感じ「消去された」ように出来ますよね? VBAと言うよりは、エクセルの基本かもしれませんが、いかがでしょう? それでも足りない!とおっしゃるのであれば、 「実際にどんなデータに、どんなコードを走らせているか」 明記した上で「再質問」してみてくださいませ。 ちなみに。 おっしゃる > Sheets("シート名").Range("A1:D3").ClearFormats これは「書式を消去」の意味ですので、当然「罫線を含む書式」が消えますよ。

kumainu555
質問者

補足

詳細にご回答いただきありがとうございました! >なのであれば、むしろ「シート2の内容を消去する」コードを書いてやらないといけないのでは? >それこそ、 >    Sheets("シート2").Range("該当範囲").ClearContents >で間に合うのではないでしょうか。 これ必須でした・・・。 むしろ、これを加えれば解決する気がします。 おっしゃる通り、シート2をクリアしないと、データが残ったままになります;; シート2の対象範囲をクリアするようにしたところ、シート1の対象範囲には0が表示されました。 なんか基礎がなってないですね;; もう勉強して、慣れてから出直して参ります>< 詳しくご説明頂き、ありがとうございました^^

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! >数式を保持し、罫線を残すようにするには・・・ すなわち数式によって表示されているデータはそのままで、 実データのみ消去する!という解釈でよい訳ですよね? Sub Sample1() Dim c As Range For Each c In Range("A1:D3") If Not c.HasFormula Then c.ClearContents End If Next c End Sub こんな感じではどうでしょうか?m(_ _)m

kumainu555
質問者

補足

ご回答いただきありがとうございます! 今から試してみます>< 初心者なので、若干時間かかると思いますが;; ありがとうございました^^

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

すいません。 何度読み返しても理解できなかったので、補足ください。 > (1)クリアしても、セル内の「数式を保持」 > (2)クリア対象のセルの「罫線は残す」 実際問題、何を消したいのでしょうか? 数式と値は同居しないので、値ではなさそうだし・・・ もしかしたら「罫線以外の書式」でしょうか?

kumainu555
質問者

補足

すいません;;; 完全に日本語が足りませんでしたね>< えっと… まずはシートが2つあると仮定します。 プログラムを実行すると、「シート2」に数値が返されます。 「シート1のA1~D3」には数式が書かれており、「シート2」に返された数値をもとに 「シート1」の対象セルに計算結果が表示されます。 しかし、「シート1のA1~D3」には、必ず数値が表示されるとは限りません。 今回はA1にデータがあったけど、次はA1にデータが無い。 という現象がありえます。 なので、一度「シート1のA1~D3」の数値をクリアしておかないと、 再度実行した際に、本当はデータが無いのに、前回の数値が残ってしまい、 表示が残っている状態になってしまいます。 これを回避するために、数式を残して値をクリアするといった事をしようと考えたのですが、 クリア時に罫線も消えてしまいました;; 他にも良い方法があるよ!というのがあれば、それも含めて教えて頂けると大変助かります>< まだVBAを初めて5日くらいの初心者なので、意味不明な事を言っていたらごめんなさい><

回答No.1

私の使っている方法は、下記です。 1)別のシートの「A1~D3」に基本の罫線、数式を書いておく。 2)クリアしたいとき、別シートの「A1~D3」をコピーし、クリアしたいシートの「A1~D3」に貼り付けます。 3)別シートを非表示にしておけば、気になりません。

kumainu555
質問者

補足

なるほど… 数式と罫線を別シートに記載しておき、数式ごとコピーして持ってくるのですね! たしかにうまくいきそうな気がします!!! これで解決しそうな気がしますが、今後の事も考えてプログラム側でなんとかしたいと思っていたり…。 本当に初心者なので、解決しなかった場合は、この方法で解決したいと思います! 最後の策として、大変有用な手順を教えて頂き感謝いたします。 ありがとうございました^^

関連するQ&A

専門家に質問してみよう