#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が表示されました。 なんか基礎がなってないですね;; もう勉強して、慣れてから出直して参ります>< 詳しくご説明頂き、ありがとうございました^^