- ベストアンサー
VBAで日付取得
お世話になっております。 このたび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を拾ってくれないのでしょうか。。。 ご教授ください。 宜しくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
> 2009が正常に返ってきます。 > これはOffsetが悪そうですね。 > しかしOffsetしたいのです・・・。 Offsetではなくて Cells(I, 1).Value とかでも変数が使えますよ ( I は 1 から始まらないとエラーになります) > Value2にしたら2009が返ってきました! なんかおかしいですね。もしかしてファイルが壊れているかもしれませんので 別の新しいファイルでテストしたらどうなるでしょうか。
その他の回答 (6)
- imogasi
- ベストアンサー率27% (4737/17070)
(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日からの経過日数の日付としてしまうと思う。
お礼
丁寧に教えてくださってありがとうございます。 >(2)日付に関するVBAの関数などはセルに日付シリアル値が入っていることが条件で、正常な働きをする。Year、Month、Dayもこの類だ。 表示形式の適用も同じ。 : >関数の結果を入れる変数を、Dateで定義すると、例2009と出た値を、日付けシリアル値と自動解釈して、2009を1900年1月1日からの経過日数の日付としてしまうと思う。 大分理解してきましたが、まだまだトンチンカンなのでシリアル値、 関数など勉強してみます。 ありがとうございました。
- kmetu
- ベストアンサー率41% (562/1346)
セルに入力された値もIntegerにしたんですね。 それでオーバーフローの原因はわかりました。 セルに入力された値はDateでいいですよ。
- kmetu
- ベストアンサー率41% (562/1346)
> 次に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が返ってきました! ありがとうございます!
- bin-chan
- ベストアンサー率33% (1403/4213)
> A1のValueは 2009/11/16 ではテキスト型ですかね? シリアル値(38999位の値)を期待したのですが。 A1の初期値を変えるか、DateValue関数で日付型にするか。
補足
DateValue関数で日付型にすると、 いったん全部数字にしてから再計算するということですか? あまりプログラミングに慣れなく 初心者じみたことを言って申し訳ございません。 初心者なんですけど、、、
- kmetu
- ベストアンサー率41% (562/1346)
Dim 年だけ As Date というように宣言していませんか? Integer か Variant にしてください。
補足
ご回答ありがとうございます。 宣言はDate型でしていたも間違いだったようなので 次にVariantにしたところ1899が返ってきました。 Integer にしてみたところオーバーフローになってしまいました。
- bin-chan
- ベストアンサー率33% (1403/4213)
セルA1には何が入ってますか? .Text(見た目) と .Value(値)の両方を教えてください。
補足
ありがとうございます。 A1の見た目は 09年11月16日 A1のValueは 2009/11/16 です。 宣言はDate型でしていたのですが Variantにしたところ1899が返ってきました。 なぜ・・・
お礼
たくさんのアドバイスありがとうございます! IやJなど配列にする変数(?)って決まりがあったんですね。 ご教授くださいましてありがとうございます。 とりあえず、IはMにしてみました。※なんとなくです ファイルが壊れているかもしれないということで 試してみたところ同じ結果でした。 うーん。 一応値が入ったので良しとします・・。 ありがとうございました。 お礼を投稿させていただきます。