『B列が日付以外だったらスキップする』(たまや) A列   B列  C列   D列  E列   F列 みかん 7/20 7/21 7/21 7/21 関東 みかん 7/25 7/25 関東 きゅうり 7/29 7/29 7/28 7/28 関西 みかん 7/29 7/30 7/30 7/31 甲信 きゅうり 7/29 7/28 関西 きゅうり 7/30 7/30 8/2 8/3 甲信 こんな感じのリストがあります。 VBAでデータ抽出をしているのですが、B列に日付が入ってない場合があり 上手くデータ抽出が出来ていません。 文字列や数字、空欄のものはNoMatchとして次の作業に進ませないようにしたいのですが 日付が入っているかどうかの判定をどのように記述すれば良いか解りません。 前後を抜粋すると以下のようになります。 アドバイス頂けると助かります。よろしくお願いします。  ・  ・   ・ For i = 2 To LRow j = 2 'B列が日付以外だったらスキップする If .Cells(i, j).Value <= KeyDate ・・・・                       < 使用 Excel:Excel2007、使用 OS:unknown > ---- 処置の全体を If IsDate(.Cells(i,"B").Value) = True Then 処理 End If としてどうでしょうか。 (Mook) 2014/08/22(金) 18:47 ---- Mookさん、アドバイスありがとうございます。 教えて頂いたコードを加えてみたのですが、データを一切拾わなくなってしまいました。 参照している日付の入力が、VBA上で日付と認識されていない様です。 VBAで認識できる様にする入力方法ってあるのでしょうか?? ご存知でしたら、教えて下さい。 (たまや) 2014/08/25(月) 16:14 ---- B列のデータは実際には何が入っているのでしょうか。 例えば、セルの日付書式を変更(たとえば M/D ⇒ M月D日)したらそれに追従して表示が 切り替わりますか? でも If .Cells(i, j).Value <= KeyDate ・・・・ は動作しているのですよね? B列は日付か空白しかないのであれば、 If .Cells(i,"B").Value <> "" Then でも良いのかもしれませんが。 (Mook) 2014/08/25(月) 19:10 ---- If .Cells(i, j).Value <= KeyDateは動作しています。 'B列が日付以外だったらスキップする  を追加したかった意図は B列には 日付(KeyDateと同じ書式=ユーザー設定、空白セル、文字列(「和歌山5」など。書式=標準)の 3種が入力されていて、最初に書いたコードでは空白や文字列を拾ってきてしまい、且つ拾ってきているデータ数が少ないように感じました。 B列に日付が入っている行を対象と認識させれば、この問題は解決するのでは?と思ったのですが・・・ 下記が、この質問をする前のコードです。 Sheet1のN1に入力した日付を、Sheet2のB列で確認し、N1以前のデータをSheet1に貼り付けたいのです。 VBAに詳しい上司に教わりながら書きましたが、私自身は理解不足な部分もあります。 上司に頻繁に確認できない状況ですので、お力になって頂ければ嬉しいです。 Private Sub CommandButton1_Click() Dim WB Dim WS_L As Worksheet Dim WS_M As Worksheet Dim myArray() Dim KeyDate As Long Dim LRow As Long Dim ListRow As Long Dim i As Long Dim j As Long Dim k As Long Dim flg As Boolean Set WS_L = ThisWorkbook.Worksheets("Sheet1") With WS_L '日付入力確認 If IsDate(.Range("N1").Value) Then KeyDate = .Range("N1").Value Else MsgBox "日付を入力してください", vbExclamation .Range("N1").Select Exit Sub End If 'Listデータ削除 .UsedRange.Offset(1).Delete ListRow = 2 End With '---Sheet2 Set WS_M = Worksheets("Sheet2") With WS_M 'データ取得 LRow = .Cells(.Rows.Count, 2).End(xlUp).Row If LRow > 1 Then ReDim myArray(LRow - 2, 11) k = 0 For i = 2 To LRow j = 1 If .Cells(i, j).Value >= KeyDate Then For j = 1 To 12 myArray(k, j - 1) = .Cells(i, j).Value Next j k = k + 1 End If Next i 'データ貼り付け WS_L.Range("A" & ListRow).Resize(UBound(myArray, 1), UBound(myArray, 2) + 1) = myArray ListRow = k + 2 End If End With With WS_L .Activate .Range("A1").Select End With Application.ScreenUpdating = True MsgBox "処理完了", vbInformation Exit Sub Err_Routine: MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description, vbExclamation Application.ScreenUpdating = True End Sub (たまや) 2014/08/26(火) 10:36 ---- 処理をどのようにしたいかがわからないのですが、 >文字列や数字、空欄のものはNoMatchとして次の作業に進ませないようにしたいのですが というのは、文字を検出した時点で、マクロの実行を中断したいということでしょうか。 それとも、そのデータを除いて処理をしたいということでしょうか。 それから >教えて頂いたコードを加えてみたのですが、データを一切拾わなくなってしまいました。 とありますが、上記のコードのどこの部分に、どのようにコードを入れたのでしょうか。 その位置の前後2,3行だけ提示できるでしょうか。 (Mook) 2014/08/26(火) 12:50 ---- Sub 日付かどうか() For i = 1 To 10 If TypeName(Cells(i, "A").Value) = "Date" Then Cells(i, "A").Offset(, 1).Value = "日付" Else Cells(i, "A").Offset(, 1).Value = "日付以外" End If Next End Sub BJ ---- Mookさん 実は、If .Cells(i, j).Value >= KeyDate Then ですが、正しく動作していないようです。 先ほど確認してみましたが、>= の部分が反映されておらず タイトル行を除いた全てのデータを 引っ張って来ているようです。 VBA初心者ですが、教えて貰いながら上記マクロを作成しましたので、理解していない所が沢山あり、何が問題なのか見つけられずにいます・・。 教えて頂いたコードは、下記のように挿入しました。 For i = 2 To LRow j = 1   If IsDate(.Cells(i,"B").Value) = True Then ←ココ If .Cells(i, j).Value >= KeyDate Then・・・ 変数に関しても理解不足なのですが、iを2つのIf文で使っていますが問題ないのでしょうか? 後学のためにも教えて頂けると有難いです。 BJさんもコメントありがとうございます。 (たまや) 2014/08/26(火) 14:21 ---- B列は、例えば8/28なら下記になります。 数式バー:2014/08/28 ユーザー定義:m"月"d"日" (たまや) 2014/08/26(火) 14:25 ---- 挿入場所は場所は良さそうですね。 >数式バー:2014/08/28 >ユーザー定義:m"月"d"日" としても、表示は 「8月28日」 にはならないのでしょうか。 >iを2つのIf文で使っていますが問題ないのでしょうか? 参照するだけなら何箇所で参照しても i 自体は影響を受けませんが、If は制御構文 なので、記載条件によって動作は変わります。 まずは、トレース実行(デバッグ)を覚えたほうが良さそうですね。 毎度の紹介ですが、 『マクロを「書いてみた」「動かした」「ダメでした」。』 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200.html 『デバッグトレースの開始方法』 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html コードを F8 を押しながら実行し、日付と思っているところ、条件に該当すると見えている ところで、期待通りに処理が進んでいるかを確認すると良いと思います。 実行している行の変数にカーソルを持っていけば、値の確認もできるので、値を見ながら 検証してみてください。 別案のテストとして(ファイルはバックアップして置いてください)、 どこかのセルに1を入れて、Ctl+C B 列を選択して、マウスを右クリック、形式を選択して貼り付け で 乗算 を選択して OK もし日付の部分が 40xxx のような数値になったら、 B列を選択して書式で 日付を設定。 これで日付がきちんと表示されるようなら、マクロをもう一度動かしてみて(ステップ 実行)動作は変わらないでしょうか。 (Mook) 2014/08/26(火) 16:32