• ベストアンサー

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を拾ってくれないのでしょうか。。。 ご教授ください。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.7

> 2009が正常に返ってきます。 > これはOffsetが悪そうですね。 > しかしOffsetしたいのです・・・。 Offsetではなくて Cells(I, 1).Value とかでも変数が使えますよ ( I は 1 から始まらないとエラーになります) > Value2にしたら2009が返ってきました! なんかおかしいですね。もしかしてファイルが壊れているかもしれませんので 別の新しいファイルでテストしたらどうなるでしょうか。

testAdmin
質問者

お礼

たくさんのアドバイスありがとうございます! IやJなど配列にする変数(?)って決まりがあったんですね。 ご教授くださいましてありがとうございます。 とりあえず、IはMにしてみました。※なんとなくです ファイルが壊れているかもしれないということで 試してみたところ同じ結果でした。 うーん。 一応値が入ったので良しとします・・。 ありがとうございました。 お礼を投稿させていただきます。

その他の回答 (6)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

(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日からの経過日数の日付としてしまうと思う。

testAdmin
質問者

お礼

丁寧に教えてくださってありがとうございます。 >(2)日付に関するVBAの関数などはセルに日付シリアル値が入っていることが条件で、正常な働きをする。Year、Month、Dayもこの類だ。 表示形式の適用も同じ。 : >関数の結果を入れる変数を、Dateで定義すると、例2009と出た値を、日付けシリアル値と自動解釈して、2009を1900年1月1日からの経過日数の日付としてしまうと思う。 大分理解してきましたが、まだまだトンチンカンなのでシリアル値、 関数など勉強してみます。 ありがとうございました。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

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

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

> 次にVariantにしたところ1899が返ってきました。 > integer にしてみたところオーバーフローになってしまいました。 こちらで試したら正常な値(2009)が表示されるのですが… オーバーフローもおかしいですね。 ループを外して セルに入力された値 = Range("A1").Value にして試してみたらどうなりますか? ちなみに A1のValueが2009/11/16で表示されてもテキスト型ということは ありませんので念のため(日付型でもValueは2009/11/16です) シリアル値を期待するなら.Value2です。

testAdmin
質問者

補足

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

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.3

> A1のValueは 2009/11/16 ではテキスト型ですかね? シリアル値(38999位の値)を期待したのですが。 A1の初期値を変えるか、DateValue関数で日付型にするか。

testAdmin
質問者

補足

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

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

Dim 年だけ As Date というように宣言していませんか? Integer か Variant にしてください。

testAdmin
質問者

補足

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

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

セルA1には何が入ってますか? .Text(見た目) と .Value(値)の両方を教えてください。

testAdmin
質問者

補足

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

関連するQ&A

  • VBA publicで日付が呼び出せない

    VBAにて、ユーザーフォーム上のテキストボックスに初期値として今日の日付が入力されており、さらにそれを任意で変更することも出来、最終的なテキストボックスの値を変数に格納するというマクロを作成しようとしています。 'テキストボックス2の初期値を今日の日付とする Private Sub UserForm_Initialize() TextBox2.Text = Format$(Date, "yyyy/mm/dd") 'テキストボックス2の値が日付かどうかチェック Private Sub TextBox2_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If IsDate(TextBox2.Value) Then DenpyouDate = TextBox2.Value Else TextBox2.Value = "" MsgBox ("日付が不正です") TextBox2.Text = Format$(Date, "yyyy/mm/dd") End If End Sub '他のモジュールでdenpyoudateを使用し、指定のセルに和暦形式で入力する Public DenpyouDate As Date Sheets("伝票").Range("A10").Value = Format(DenpyouDate, "e") Sheets("伝票").Range("C10").Value = Format(DenpyouDate, "m") 「ユーザーフォームのテキストボックスに初期値として日付を表示させ、その最終的な値を変数として格納、別のモジュールで呼び出してセルにセットする」というイメージです。 このマクロを実行した際、初期値である今日の日付を任意の日付に変更した場合は、問題なくそのままの値がセルにセットされるのですが、初期値のまま実行すると、その数値が反映されません。 ローカルウィンドウをチェックすると、ユーザーフォームの時点では、テキストボックスの初期値がきちんとdenpyoudateに格納されているのですが(例:2009/11/24)、それを別モジュールで呼び出した時は、denpyoudateの値が(#0:00:00#)になっており、これが原因だと考えています。 このエラーを回避し、初期値の場合でも値がきちんとセルにセットされるようにするには、どうしたらよいでしょうか?

  • エクセルVBA セルの書式につい

    ユーザーフォームのテキストボックスに入力した日付(yyyy/mm/ddの形式)をA1セルに入れるとします。  Range("A1").Value = Me.txt日付 A1セルの表示形式は書式設定でユーザー定義の"d"で表示されるように設定していますが、 テキストボックスに入力した形式のまま(yyyy/mm/dd)でA1セルに表示されてしまいます。 上記のみではNGでしょうか? ちなみに、yyyy/mm/ddと入力されたA1セルを一旦編集モード([F2]キーを押した状態)にして[Enter]を押すと"d"(書式設定で指定している書式)に変わります。 参考:A1セルの日付をみて別シートの一覧からVlookup関数で値を検索したいところが、yyyy/mm/ddで表示されるためにエラーとなってしまいます) ご存知の方教えていただきたいです。

  • Excel97の日付の書式設定

    現在Excel97で日付入力をしたいのですが、 最終的に演算に使用する日付で yyyy/mm/ddとyyyy/mmどちらでも入力できる書式設定を探しています。 yyyy/mm/ddの指定にするとyyyy/mmと入力してもyyyy/mm/01となってしまいます。 yyyy/mmのセルとdd専用のセルを別に作ると、ddを入力した時に 閏年のエラーチェックなどがかけられないので演算部分(1年後該当日前日の指定等)がうまく働きません。 いい方法がありましたら教えてください。

  • VBAでExcelのヘッダーに文字列+セルの値を入れたい

    お知恵を貸してください。 Excelヘッダーについてです。 セルA1に日付が入っていて、この値をYYYY/MM/DDの形でヘッダーにしたいと思っているのですが、この日付の前に「日報」という2文字を必ず入れたいのです。 最終的な形は「日報YYYY/MM/DD」となればよいのですが、これはVBAで可能なのでしょうか。 今まで手入力していたのですが毎日印刷するものなので、自動化したいと思うのです。 よろしくお願いいたします。

  • EXCEL 日付の入力形式

    こんにちは。 日付が、dd/mm/yyyyの形式で入力されたデータをもらいました。 関数を利用したいのでEXCELに日付として認識させたいのですが、 セルの書式設定で設定してもだめなようです。 質問 1)yyyy/mm/ddの形式で入力されていないと日付として認識されないのでしょうか? 2)現在の形式のまま、日付として認識させる方法はありますか? 3)dd/mm/yyyyをyyyy/mm/ddに変換する方法はありますか? 以上、よろしくお願いします。

  • 最新の日付を取得する方法。

    Excel2000にて 「YYYY/MM/DD HH:MM」で日付が入力されている列があります。 セルの型は標準です。 この列から1番最新のものを取得したいのですが MAXやMAXAを使っても上手く行きません…。 どなたかお知恵をお貸し下さいませm(__)m

  • フィールドのアイテム(日付)のコピーがうまくいきません。

    フィールドのアイテム(日付)のコピーがうまくいきません。 環境はExcel 2004 for Mac (Version 11.5.8)です。 例えばAのデータベースでは2004-03-03とされているものを、Bのデータベースにコピーすると2000-03-02と表示されます。「元の書式を保持」、「貼り付け先の書式と一致する」、「値と数値の書式」などの変更をしても変わりません。 AとBのセルの書式設定はユーザー定義:yyyy-mm-ddとなっていますが、これを標準に戻すと「いずれも」36587となります。しかし、ユーザー定義のyyyy-mm-ddに戻した場合、値が2004-03-03と2000-03-02となってしまいます。 どのようにしたら上手くコピーできるかご教授ください。

  • VBA アクティブセルに1行目の日付を入力したい

    こんにちは、VBA初心者です。 アドバイスお願いします。 1行目に日付が入力してあります。 任意のセルを選択し、マクロを実行すると1行目の日付(日のみ)がそのセルに入力されるマクロを作っています。 例えば、    A       B      C 1 2008/11/1  2008/11/2  2008/11/3 2 3 4          2  5 セルB4を選択して実行するとB4に2が入力され、セルC3を選択して実行するとC3に3と入力するようにしたいです。 私なりに考えたのが下記のコードです。 Sub アクティブセルに1行目の日付を入力() Dim hidukesyutoku As Byte Dim dd As Date dd = Date Do While ActiveCell.Value <> dd ActiveCell.Offset(-1).Activate hidukesyutoku = hidukesyutoku + 1 Loop ActiveCell.Copy Destination:=ActiveCell.Cells(hidukesyutoku + 1, 1) End Sub Do Whileを使って日付があるまでアクティブセルをオフセットしていくというものですが、このコードのままでは、dd=dateとなっているため今日の日付にしか反応しません。 今日だけではなく、日付というだけで反応するようにするにはどうしたらいいでしょうか? また、このコードは、処理にも時間がかかりあまりいいものではないと思います。(初心者の私では、これが限界でした。) もっと早いコードの作り方があれば教えて下さい。

  • VBAでOSの日付定義を無効にする方法

    お世話になります、 OSの地域のオプションの日付の形式が "yyyy-MM-dd"の場合 Excelのセルにで2002/5/29と入力しても 2002-5-29と自動変換されてしまいます。 これをできないようにVBAで制御したいのですが どのような方法があるでしょうか? よろしくお願いします。

  • エクセルで日付、時間表示

    お世話になります。エクセル2000を使っています。 セルの書式設定-ユーザー定義で以下の条件で表示させたいのですが・・・・ 日付データとして、日付のみのものと、時間も入っているデータを、 日付のみのものは日付のみの表示に、 時間も入っているものは日付と時間を表示する。 具体的には、ある一つのセルに 2003/07/26と入力した時 → "2003/07/26"と表示 2003/07/26 18:30と入力した時 →  "2003/07/26 18:30"と表示 ユーザー定義で、 yyyy/mm/dd yyyy/mm/dd hh:mm でそれぞれの表示はできますが、例えば 時間データのないものに、yyyy/mm/dd hh:mmと定義すると、"2003/07/26 00:00"と表示されて都合がよくありません。 文字データとして、前に「’」を付ければ表示のみはできますが、数値データとして使えません。 少し長くなりましたが、よろしくご教示ください。

専門家に質問してみよう