• ベストアンサー

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/17068)
回答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

  • どこが間違ってますか? (エクセルVBAです)

    質問をご覧くださりありがとうございます。 どなたか助けていただけないでしょうか。 以下のコードの場合、B2セルをダブルクリックすればシート(1)が開くと思っていたのですが、B2以外のセルをダブルクリックしてもシート(1)が開いてしまいます。 どこが悪いのでしょうか。 詳しい方がいらっしゃいましたら、どうか教えてください。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, cancel As Boolean) If Target = Range("B2") Then cancel = True Worksheets("シート(1)").Activate End If End Sub どうか、宜しくお願いいたします。

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • 印刷後のVBAの実行 (3)

    Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "Sheet1" Then If Range("D6").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("D6").Select Exit Sub End If Else If ActiveSheet.Name = "Sheet2" Then If Range("C11").Value = "" Then Cancel = True MsgBox ("受付時間を入力してください") Range("C11").Select Exit Sub End If Else Exit Sub End If End If If Worksheets("Sheet1").Range("D5") = "不要" Then GoTo P1 ActiveSheet.Range("A70:Y70").Copy If Worksheets("Sheet3").Range("A1").Value = "" Then Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues Else Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If Application.CutCopyMode = False P1: ActiveSheet.Range("A1").Select End Sub sheet1のD5に「不要」と入っていたら 24~33行目の作業がキャンセルになりますが sheet2のD5にも「不要」と入っていたら、同じ様にキャンセルできる様に出来ますでしょうか? ご回答お願いします

  • EXCEL マクロ 

    お世話になります。 マクロは初心者です。 セルの数値を参照して、シートをアクティブにしたいのですが 下記のような繰り返しでシートが30ぐらいあるので、簡単な 表現に出来ないでしょうか。 宜しくお願いします。 Private Sub Workbook_Open() If 0 <= Worksheets(4).Range("M1") < 7 Then Worksheets(4).Activate End If If 0 <= Worksheets(5).Range("M1") < 7 Then Worksheets(5).Activate End If If 0 <= Worksheets(6).Range("M1") < 7 Then Worksheets(6).Activate End If If 0 <= Worksheets(7).Range("M1") < 7 Then Worksheets(7).Activate End If If 0 <= Worksheets(8).Range("M1") < 7 Then Worksheets(8).Activate End If If 0 <= Worksheets(9).Range("M1") < 7 Then Worksheets(9).Activate End If End Sub

  • エクセルVBAについて教えてください

    エクセル2003です。 Sheet1     A    B    C     D 1 種類1 商品1 商品A  商品あ 2 種類2 商品2 商品B  商品い 3 種類3 商品3 商品C  商品う  4      商品4 商品D  商品え 5  商品5 商品E  商品お Sheet2   AB CDF     G    H     I 1         種類表示     商品表示  2         種類表示     商品表示  3         種類表示     商品表示  4         種類表示     商品表示  5         種類表示     商品表示  *Sheet2のG1をダブルクリックでSheet1のA列をユーザーフォームのコンボボックス1にてセルに表示  の上挿入 *コンボ1の選択によりコンボ2(Sheet2のI1をダブルクリック)の表示を変更する *コンボ1 種類1 → コンボ2 Sheet1のB列を表示の上セルに挿入 *コンボ1 種類2 → コンボ2 Sheet1のC列を表示の上セルに挿入 *コンボ1 種類3 → コンボ2 Sheet1のD列を表示の上セルに挿入 までは、出来きたのですが、Sheet2の2行目以降も同作業をしたいのですが、、、 Offset等を使用するのでしょうか? あまりわかっていないので詳しく教えて頂ければ幸いです コード Sheet2のコード Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With Target If .Address = "$F$1" Then UserForm1.Show ElseIf .Address = "$H$1" Then Dim k As Long, myFlg As Boolean, myArray myArray = Array("種類1", "種類2", "種類3") myFlg = False For k = 0 To UBound(myArray) If Range("F1") = myArray(k) Then myFlg = True End If Next k If myFlg = False Or Range("F1") = "" Then MsgBox "種類を選択して", vbOKOnly Range("F1").Select Exit Sub End If UserForm2.Show End If End With End Sub ユーザーフォーム1のコード Private Sub UserForm_Initialize() ComboBox1.RowSource = "sHEET1!A1:A3" End Sub コンボ1のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("F1") = UserForm1.ComboBox1.Text Worksheets("Sheet2").Range("H1") = "" Unload Me End Sub ユーザーフォーム2のコード Private Sub UserForm_Initialize() With UserForm2.ComboBox1 Select Case Worksheets("Sheet2").Range("F1") Case "種類1" .RowSource = "Sheet1!B1:B5" Case "種類2" .RowSource = "Sheet1!C1:C5" Case "種類3" .RowSource = "Sheet1!D2:D5" End Select End With End Sub コンボ2のコード Private Sub ComboBox1_Change() Worksheets("Sheet2").Range("H1") = UserForm2.ComboBox1.Text Unload Me End Sub このコードをいじくってSheet2以降も同作業できるようにお願いします

  • Excel、VBAのIF文で

     いつもお世話になります。 エクセルのVBAでセルF4からF65536までを選択していれば印刷して、それ以外を選択していれば「氏名セルを選択してください」と表示させたいのですが、うまくいきません。  全く構文かもしれませんが以下が作成したプロシージャです。VB初心者です。ご指導よろしくお願いします。 Sub 成績個人印刷if() If Range("f5,f65536").Activate = True Then Worksheets("個人カード").Range("a3").Value = ActiveCell.Offset(0, -4) Worksheets("個人カード").PrintOut End If MsgBox "氏名セルを選択してください" End Sub

  • 印刷後のVBAの実行 (2)

    Private Sub Workbook_BeforePrint(Cancel As Boolean)   If ActiveSheet.Name = "Sheet1" Then     If Range("D6").Value = "" Then       Cancel = True       MsgBox ("名前を入力してください")       Range("D6").Select       Exit Sub     End If   Else     If ActiveSheet.Name = "Sheet2" Then       If Range("C11").Value = "" Then         Cancel = True         MsgBox ("受付時間を入力してください")         Range("C11").Select         Exit Sub       End If     Else              Exit Sub     End If   End If   ActiveSheet.Range("A70:Y70").Copy   If Worksheets("Sheet3").Range("A1").Value = "" Then     Worksheets("Sheet3").Range("A1").PasteSpecial Paste:=xlPasteValues   Else     Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _       Paste:=xlPasteValues   End If   Application.CutCopyMode = False   ActiveSheet.Range("A1").Select End Sub 先日、上記のコードを回答者の方から教えてもらい、とても助かっていますが sheet1のD5に「不要」という文字が入っていた場合、 sheet3への貼り付け(23~30行目の作業)をキャンセルして、最後にsheet1のA1を選択するようにはどの様にしたらいいでしょうか?

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

  • VBAエクセル2003での下記の命令文の作成2

    命令文: シート名:商品売上げのセルB16に入っている数字と シート名:売り上げのセルC16に入っている数字が同じなら メッセージBOXに○を表示させる そうでなければ メッセージBOXに×を表示させる ↓ Sub 売り上げ() Set WS1 = Worksheets("売上") Set WS2 = Worksheets("商品売上") If WS1.Range("C16") = WS2.Range("B16") Then MsgBox "○" Else MsgBox "×" End If End Sub この作業をマクロの実行を押さずにショートカットキーで 作業を可能にするには どういった命令文または操作でショートカットキーでの表示がかのでしょうか。 (ショートカットキーを押すことで○×の表示を出すにはどうしたらいいでしょうか?) また、同じシート内でB16のセルとC16のセル、D15が同じ場合は メッセージボックスに○そうでない場合は×の場合は Sub 売り上げ2() Worksheets("商品売上") If Range("B16") = Range("C16") =Range("D15") Then MsgBox "○" Else MsgBox "×" End If End Sub だけでいいんでしょうか? 詳しい方教えてください。 今、仕事でミスが多くプログラミングでどうにか ミスを防げないか工夫したいのですが まだ、習いたてでよくわかりません。 お手数が教えていただけませんでしょうか。 よろしくお願いいたします。

専門家に質問してみよう