|
■No96836 (魔界の仮面弁士 さん) に返信 > ■No96835 (工場プログラマー さん) に返信 >>For〜Nextで日付計算(DateDiff)しているんですが、 > > DATEDIF (ワークシート関数) ではなく、 > DateDiff (VBA 関数) の方の話でしょうか。
VBAです。
> たとえば 2000/12/31 から 2002/01/01 までの差は「1年と1日」ですよね。 > この場合、「年数」を求めようとすると > DATEDIF は「1」年と算出されて、 > DateDiffは「2」年と算出されます。どちらがお好みですか?
切り捨てたいのでDATEDIFですね。 >>Date型じゃないのでERRORになるのは当たり前ですが > 「2020年」と記録されている B1 セルの値は何ですか? > 数値なのか文字列なのかそれとも…?
2020年だけなので判定は文字列です。 セルの書式は日付型です。 言い忘れてましたがA1もB1も変数Date型に格納して使用しています。 (例)DateDiff("yyyy", "hogehoge", Now) これで型が一致しませんと言われます。
>>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 > などが使えます。
|