重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になっております。
このたびVBAを使用してWBSを作成しようと考えております。
そこで、以下のような日付取得のロジックを考えました。

・A1セルからA100セルまで一行ずつ下へforでまわす
・日付はYYYYとMMとDDに分割したい

---------------------------------------
For I = 0 To 99
セルに入力された値 = Range("A1").Offset(I).Value
MsgBox セルに入力された値 '(1)2009/11/16とでます。

年だけ = Year(セルに入力された値)
MsgBox 年だけ '(2)1905/03/13とでます。

NEXT


--------------------------------------
(2)は(1)の値を変えてみても1905/03/13とでます..
(2)はなぜ2009を拾ってくれないのでしょうか。。。

ご教授ください。
宜しくお願いいたします。

A 回答 (7件)

> 2009が正常に返ってきます。


> これはOffsetが悪そうですね。
> しかしOffsetしたいのです・・・。

Offsetではなくて
Cells(I, 1).Value
とかでも変数が使えますよ
( I は 1 から始まらないとエラーになります)

> Value2にしたら2009が返ってきました!

なんかおかしいですね。もしかしてファイルが壊れているかもしれませんので
別の新しいファイルでテストしたらどうなるでしょうか。
    • good
    • 0
この回答へのお礼

たくさんのアドバイスありがとうございます!
IやJなど配列にする変数(?)って決まりがあったんですね。
ご教授くださいましてありがとうございます。
とりあえず、IはMにしてみました。※なんとなくです

ファイルが壊れているかもしれないということで
試してみたところ同じ結果でした。
うーん。
一応値が入ったので良しとします・・。
ありがとうございました。
お礼を投稿させていただきます。

お礼日時:2009/11/18 21:55

(1)クセルでは日付セルは、日付シリアル値という正整数(1900年1月1日からの経過に数)を持っている。


それは標準では2009/11/16などの入力をしたとき自動で変換されてセルに日付シリアル値がセットされる
文字列で日付をいれて要る場合があるので注意
(2)日付に関するVBAの関数などはセルにヒヅケシリアル値が入っていることが条件で、正常な働きをする。Year、Month、Dayもこの類だ。
表示形式の適用も同じ。
ーー
VB他の言語の熟達者であっても、エクセルVBAをやる前には、エクセル特有の必要知識を得て(またはエクセルの操作や機能など)、VBAをやるべきで、そうしないから、問答がこんなに長引く。この質問など、普通は質問にならない問題だと思うが。
ーー
エクセルVBAの場合変に変数の方定義いなくても適当にやってくれるのでy=Year(Range(a1))でよかろう。
Sub test02()
MsgBox Year(Range("A1"))
End Sub
行く行くは、変数の型などもしっかり勉強すべき時が来ると思うが。
ーー
関数の結果を入れる変数を、Dateで定義すると、例2009と出た値を、日付けシリアル値と自動解釈して、2009を1900年1月1日からの経過日数の日付としてしまうと思う。
    • good
    • 0
この回答へのお礼

丁寧に教えてくださってありがとうございます。
>(2)日付に関するVBAの関数などはセルに日付シリアル値が入っていることが条件で、正常な働きをする。Year、Month、Dayもこの類だ。
表示形式の適用も同じ。

>関数の結果を入れる変数を、Dateで定義すると、例2009と出た値を、日付けシリアル値と自動解釈して、2009を1900年1月1日からの経過日数の日付としてしまうと思う。

大分理解してきましたが、まだまだトンチンカンなのでシリアル値、
関数など勉強してみます。
ありがとうございました。

お礼日時:2009/11/18 22:03

セルに入力された値もIntegerにしたんですね。


それでオーバーフローの原因はわかりました。
セルに入力された値はDateでいいですよ。
    • good
    • 0

> 次にVariantにしたところ1899が返ってきました。


> integer にしてみたところオーバーフローになってしまいました。

こちらで試したら正常な値(2009)が表示されるのですが…
オーバーフローもおかしいですね。

ループを外して
セルに入力された値 = Range("A1").Value
にして試してみたらどうなりますか?

ちなみに
A1のValueが2009/11/16で表示されてもテキスト型ということは
ありませんので念のため(日付型でもValueは2009/11/16です)
シリアル値を期待するなら.Value2です。

この回答への補足

>ループを外して
>セルに入力された値 = Range("A1").Value
>にして試してみたらどうなりますか?
2009が正常に返ってきます。
これはOffsetが悪そうですね。
しかしOffsetしたいのです・・・。

あ!
Value2にしたら2009が返ってきました!
ありがとうございます!

補足日時:2009/11/17 23:45
    • good
    • 0

> A1のValueは 2009/11/16


ではテキスト型ですかね?


シリアル値(38999位の値)を期待したのですが。
A1の初期値を変えるか、DateValue関数で日付型にするか。

この回答への補足

DateValue関数で日付型にすると、
いったん全部数字にしてから再計算するということですか?
あまりプログラミングに慣れなく
初心者じみたことを言って申し訳ございません。
初心者なんですけど、、、

補足日時:2009/11/17 23:16
    • good
    • 0

Dim 年だけ As Date



というように宣言していませんか?

Integer か Variant にしてください。

この回答への補足

ご回答ありがとうございます。
宣言はDate型でしていたも間違いだったようなので
次にVariantにしたところ1899が返ってきました。
Integer にしてみたところオーバーフローになってしまいました。

補足日時:2009/11/17 23:07
    • good
    • 0

セルA1には何が入ってますか?


.Text(見た目) と .Value(値)の両方を教えてください。

この回答への補足

ありがとうございます。
A1の見た目は 09年11月16日
A1のValueは 2009/11/16
です。
宣言はDate型でしていたのですが
Variantにしたところ1899が返ってきました。
なぜ・・・

補足日時:2009/11/17 22:58
    • good
    • 0

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