C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 168 を表示中)
■96836 / )  Re[1]: 【ExcelVBA】ifで日付を判定
□投稿者/ 魔界の仮面弁士 (2970回)-(2021/02/17(Wed) 18:27:47)
No96835 (工場プログラマー さん) に返信
> For〜Nextで日付計算(DateDiff)しているんですが、

DATEDIF (ワークシート関数) ではなく、
DateDiff (VBA 関数) の方の話でしょうか。


たとえば 2000/12/31 から 2002/01/01 までの差は「1年と1日」ですよね。
この場合、「年数」を求めようとすると
DATEDIF は「1」年と算出されて、
DateDiffは「2」年と算出されます。どちらがお好みですか?



> Date型じゃないのでERRORになるのは当たり前ですが
「2020年」と記録されている B1 セルの値は何ですか?
数値なのか文字列なのかそれとも…?


> ifで回避させようと考えています。
入力内容に応じてプログラムの動きを変化させるのではなく、
入力値を常に日付値あるいは整数値の何れかに統一した方が良いと思いますよ。

たとえば B1 セルの書式を「yyyy」あるいは「yyyy"年"」にして、そこに日付を入れておくようにすれば、
セルの見た目は「2020」や「2020年」にしつつ、Date 値同士の演算を行うことができます。

あるいは、
 Debug.Print Year([A1].Value)
などとして、「2020年2月17日」なセル値を「2020」という Integer 値に変換することもできます。
この場合、Date 型同士の日付演算ではなく、整数演算で求められますね。


> ifでA1セルのみ判定するにはどんなコードがありますか?
VBA 側だと
 [A1].Text → セル書式に応じた String 値
 [A1].Value → セル書式に応じて Date だったり Double だったり String だったり Empty だったり
 [A1].Value2 → Value に近いが、日付セルであっても Double で返す
 [A1].NumbeFormat → セルの書式を返す
というプロパティがあります。
戻り値の型を判定したい場合は、VarType 関数または TypeName 関数を併用できます。


ワークシート関数側なら、
 =CELL("format",A1) → セルの書式を返す
 =ISBLANK(A1) → 空白ならTRUE
 =ISNONTEXT(A1) → 文字列以外ならTRUE
 =ISTEXT(A1) → 文字列ならTRUE
 =ISNUMBER(A1) → 数値ならTRUE
などが使えます。
返信 編集キー/


管理者用

- Child Tree -