dポイントプレゼントキャンペーン実施中!

VBA超初心者で、困っていることがあります;;

たとえば、プログラムを実行したら、セルの「A1~D3」の範囲をクリアするという物があったとして、
その他の条件が以下のようになっています。

(1)クリアしても、セル内の数式を保持
(2)クリア対象のセルの罫線は残す

私は、以下のように記述したのですが、数式は残るのですが罫線が残りませんでした。

Sheets("シート名").Range("A1:D3").ClearFormats

数式を保持し、罫線を残すようにするには、どのような記述をすれば良いのでしょうか。

以上、よろしくお願いいたします。

A 回答 (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
これは「書式を消去」の意味ですので、当然「罫線を含む書式」が消えますよ。

この回答への補足

詳細にご回答いただきありがとうございました!

>なのであれば、むしろ「シート2の内容を消去する」コードを書いてやらないといけないのでは?
>それこそ、
>    Sheets("シート2").Range("該当範囲").ClearContents
>で間に合うのではないでしょうか。

これ必須でした・・・。
むしろ、これを加えれば解決する気がします。
おっしゃる通り、シート2をクリアしないと、データが残ったままになります;;
シート2の対象範囲をクリアするようにしたところ、シート1の対象範囲には0が表示されました。


なんか基礎がなってないですね;;
もう勉強して、慣れてから出直して参ります><

詳しくご説明頂き、ありがとうございました^^

補足日時:2013/08/23 01:45
    • good
    • 0

こんばんは!



>数式を保持し、罫線を残すようにするには・・・

すなわち数式によって表示されているデータはそのままで、
実データのみ消去する!という解釈でよい訳ですよね?

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

この回答への補足

ご回答いただきありがとうございます!

今から試してみます><

初心者なので、若干時間かかると思いますが;;

ありがとうございました^^

補足日時:2013/08/22 22:08
    • good
    • 0

すいません。


何度読み返しても理解できなかったので、補足ください。

> (1)クリアしても、セル内の「数式を保持」
> (2)クリア対象のセルの「罫線は残す」

実際問題、何を消したいのでしょうか?


数式と値は同居しないので、値ではなさそうだし・・・
もしかしたら「罫線以外の書式」でしょうか?

この回答への補足

すいません;;;

完全に日本語が足りませんでしたね><

えっと…
まずはシートが2つあると仮定します。

プログラムを実行すると、「シート2」に数値が返されます。
「シート1のA1~D3」には数式が書かれており、「シート2」に返された数値をもとに
「シート1」の対象セルに計算結果が表示されます。

しかし、「シート1のA1~D3」には、必ず数値が表示されるとは限りません。
今回はA1にデータがあったけど、次はA1にデータが無い。
という現象がありえます。

なので、一度「シート1のA1~D3」の数値をクリアしておかないと、
再度実行した際に、本当はデータが無いのに、前回の数値が残ってしまい、
表示が残っている状態になってしまいます。

これを回避するために、数式を残して値をクリアするといった事をしようと考えたのですが、
クリア時に罫線も消えてしまいました;;


他にも良い方法があるよ!というのがあれば、それも含めて教えて頂けると大変助かります><
まだVBAを初めて5日くらいの初心者なので、意味不明な事を言っていたらごめんなさい><

補足日時:2013/08/22 22:04
    • good
    • 0

私の使っている方法は、下記です。



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

この回答への補足

なるほど…

数式と罫線を別シートに記載しておき、数式ごとコピーして持ってくるのですね!
たしかにうまくいきそうな気がします!!!

これで解決しそうな気がしますが、今後の事も考えてプログラム側でなんとかしたいと思っていたり…。

本当に初心者なので、解決しなかった場合は、この方法で解決したいと思います!
最後の策として、大変有用な手順を教えて頂き感謝いたします。

ありがとうございました^^

補足日時:2013/08/22 22:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!