• ベストアンサー

Excel VBA 日付の認識など

こんにちは。 VBA初心者のものですが質問させていただきます。 ※エクセル2003です 「sheet1のD4:FA4のうち、09年8月以外の日付のセルすべてを選択する」 の構文を下記のように作ってみたのですがうまくいきません・・・ (1)「09年8月」の認識 (2)「~以外のセル全て選択」 の2点がネックで困っています。 ちなみに日付のセルには「2009/8/5」のように入力されており、 表示は「09/8/5」です。 すみませんがご教示お願いいたします。 Sub Macro1() Dim 日付 As Range For Each 日付 In Worksheets("sheet1").Range("D4:FA4") If 日付.Value like"*09/8/*"= false Then 日付.select End If Next End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 日付を文字列比較でもかまいませんが、VBAらしく書くと、以下のようになります。 必ず日付が入っているとは限らないので、IsDate でチェックします。 '------------------------------------------- Sub DateChecker1()   Dim c As Range   Dim myRng As Range   For Each c In Worksheets("Sheet1").Range("D4:FA4")     If IsDate(c.Text) Then       If CDate(c.Value) < DateSerial(2009, 8, 1) Or CDate(c.Value) > DateSerial(2009, 8, 31) Then         If myRng Is Nothing Then           Set myRng = c         Else           Set myRng = Union(c, myRng)         End If       End If     End If   Next c   If Not myRng Is Nothing Then     myRng.Select   Else     MsgBox "該当セルはありません。", 48   End If End Sub

raymay0905
質問者

お礼

お礼が遅くなりまして申し訳ありません。 ご回答ありがとうございました。 DateSerialとUnionは初めて知りました… もっと勉強して活用させていただきます。

その他の回答 (3)

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

エクセルは標準では、セルの値を日付シリアル値で持ってます。正整数の値です。1900年1月1日からの何日目かの数です。 またVBAではセルの値(.Value)を判別、加工の対象にすることがほとんどです。 ですから本当は2009年8月1日ー2009年8月31日までは、具体的には40026-40056までの値か判別することになります。しかしその数値は直ちにはわかりにくいので、DatrSerial関係の関数で考えたり、"2009/8/1"で考えたり(期間範囲の判別は大小比較になる)します。 ーー またエクセルVBAや関数にはYear関数、Month関数、Day関数があるので、Year関数の結果が2009、Month関数が8のAND条件で考える手もあります。 ーー さらには書式適用結果(シート上の見た目)を関数では =TEXT(A2,"geee年mm月") VBAでは Sub test01() Cells(1, 3) = Format(Cells(1, 1), "ge年mm月") End Sub のように書式結果を文字列に直して、それを対象に判別する方法もあります。 こちらなら、平成21年の判別の例で Sub Macro1() Dim d As Range For Each d In Worksheets("sheet1").Range("A1:A5") 'MsgBox Format(d, "ge年mm月") If Format(d, "ge年mm月") Like "H21*" = True Then MsgBox d End If Next End Sub もできる。 === それと、条件を満たしたときの 日付.select ですが、これでは1セルすつあくちぶセル選択セルが移動してしまい、条件を満たしたセル全体を掴んだ事にならない。 他の回答者がしておられるように、UNIONメソッドで集合化しないとなりません。 UNION以外でセル選択を累積していくコードを、いままで探しているのですが出会いません。

raymay0905
質問者

お礼

お礼が遅くなりまして申し訳ありません。 ご回答ありがとうございました。 日付の認識一つとってもいろいろやり方があるのですね。 今後活用させていただきます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

Sub try()  Dim r As Range, rr As Range  For Each r In Range("D4:FA4")      If Format(r.Value, "yy/m") <> "09/8" Then         If rr Is Nothing Then            Set rr = r         Else            Set rr = Union(rr, r)         End If      End If  Next  rr.Select End Sub こんな感じの事ですか?

raymay0905
質問者

お礼

お礼が遅くなりまして申し訳ありません。 ご回答ありがとうございました。 SetとUnionは初めて知りました… もっと勉強して活用させていただきます。

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.1

YearとMonthの関数を使います If year(日付)& Right("00" & month(日付))="200908"=false then とします。 Right("00" & month(日付))は月を2ケタで統一するためです。

raymay0905
質問者

お礼

お礼が遅くなりまして申し訳ありません。 ご回答ありがとうございました。 日付は単なる数値とは違うのですね。 ぜひ活用させていただきます。

関連するQ&A