[[20140822182530]] 『B列が日付以外だったらスキップする』(たまや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.