[[20130130184834]] 『テキストボックスの日付以前のデータを抽出』(ゆき) ページの最後に飛ぶ

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

 

『テキストボックスの日付以前のデータを抽出』(ゆき)

 たびたびお世話になります。

[[20130128104307]] 

 の質問の関連なのですが、「出荷データ」というシートから、条件を指定して売上がされていない
 データを抽出しようとしています。

 抽出条件は、
 ・「営業担当」(出荷データシートのI列)
 ・「締日」(出荷データシートのE列)
 ・「納品日」(出荷データシートのO列)

 で、例えば
 ・「営業:田中」&「締日:末締」&「納品日:2013/1/31まで」
 という条件でデータを絞り込み、「未計上_雛形」というシートをコピーし、コピーしたシートに
 抜き出したデータを書き込みたいです。

 それで、「営業担当」と「締日」で絞り込む方法は分かったのですが、「納品日」で絞り込む方法がわかりません。

 ユーザーフォームに、ComboTanto(営業担当)、ComboSime(締日)、TextNohin(納品日)という
 コントロールを配置しました。

 下記のコードは、「営業担当」と「締日」で絞り込むところまでのコードです。
 (いずれかの条件が「指定なし」(納品日の場合はテキストボックスが空欄)の場合もあります)

 Option Explicit
 Public lsh As Worksheet

 Private Sub UserForm_Initialize()

    With ComboTanto
        .AddItem "田中"
        .AddItem "鈴木"
        .AddItem "指定なし"

    End With

    With ComboSime
        .AddItem "15日"
        .AddItem "20日"
        .AddItem "末締"
        .AddItem "指定なし"

    End With

 End Sub

 Private Sub CommandButton1_Click()

 Dim ws1 As Worksheet
 Dim FCell As Range
 Dim z As Long

    If ComboTanto.Value = "" Or ComboSime.Value = "" Then
        MsgBox "抽出条件を指定してください"
        Exit Sub
    End If

    Set ws1 = ThisWorkbook.Worksheets("出荷データ")

    z = ws1.Range("B" & ws1.Rows.Count).End(xlUp).Row

    Set FCell = ws1.Range("L3:L" & z).Find(what:="")

    If FCell Is Nothing Then
        MsgBox "未計上データはありません"
        Exit Sub
    End If

    If ComboTanto.Value = "指定なし" And ComboSime.Value = "指定なし" Then
        Call 全件抽出
    ElseIf ComboTanto.Value <> "指定なし" And ComboSime.Value = "指定なし" Then
        Call 担当指定抽出
    ElseIf ComboTanto.Value = "指定なし" And ComboSime.Value <> "指定なし" Then
        Call 締日指定抽出
    Else
        Call 全指定抽出
    End If

 End Sub

 Private Sub 全指定抽出()

 Dim cnt As Long
 Dim shName As String
 Dim bName As String
 Dim ws1 As Worksheet
 Dim ws2 As Worksheet
 Dim lRow As Long
 Dim z As Long
 Dim i As Long
 Dim j As Long
 Dim tanto As String
 Dim sime As String
 Dim DataCnt As Long

    Set ws1 = ThisWorkbook.Worksheets("出荷データ")

    z = ws1.Range("B" & ws1.Rows.Count).End(xlUp).Row

    tanto = ComboTanto.Value
    sime = ComboSime.Value

    DataCnt = 0
    cnt = 1
    bName = ws1.Range("C1").Text & "未売上リスト_" & tanto & "_" & sime
    ThisWorkbook.Sheets("未計上_雛形").Copy After:=Sheets(Sheets.Count)

    shName = bName

    Do
        If Not IsObject(Evaluate("'" & shName & "'!A1")) Then Exit Do
        cnt = cnt + 1
        shName = bName & "(" & cnt & ")"
    Loop

    ActiveSheet.Name = shName
    Set lsh = ThisWorkbook.Sheets(Sheets.Count)

    '抽出条件を見出しに書き出し
    lsh.Range("C1").Value = Date
    lsh.Range("H1").Value = ComboTanto.Value
    lsh.Range("J1").Value = ComboSime.Value
    lsh.Range("K1").Value = TextNohin.Text & "迄に納品済"

    For i = 3 To z

        lRow = lsh.Range("B" & lsh.Rows.Count).End(xlUp).Row

        j = lRow + 1

        If ComboSime.Value = ws1.Cells(i, 5).Value And ComboTanto.Value = ws1.Cells(i, 9).Value And ws1.Cells(i, 12) = "" Then
            lsh.Cells(j, 1).Value = ws1.Cells(i, 1).Value
            lsh.Cells(j, 2).Value = ws1.Cells(i, 15).Value
            lsh.Cells(j, 3).Value = ws1.Cells(i, 2).Value
            lsh.Cells(j, 4).Value = ws1.Cells(i, 3).Value
            lsh.Cells(j, 5).Value = ws1.Cells(i, 4).Value
            lsh.Cells(j, 6).Value = ws1.Cells(i, 5).Value
            lsh.Cells(j, 7).Value = ws1.Cells(i, 6).Value
            lsh.Cells(j, 8).Value = ws1.Cells(i, 7).Value
            lsh.Cells(j, 9).Value = ws1.Cells(i, 8).Value
            lsh.Cells(j, 13).Value = ws1.Cells(i, 11).Value

            DataCnt = DataCnt + 1

        End If
    Next i

   '該当データがなかったらコピーしたシートを削除してメッセージを表示
    If DataCnt = 0 Then
        Application.DisplayAlerts = False
        lsh.Delete
        Application.DisplayAlerts = True
        Worksheets("操作メニュー").Activate
        MsgBox "該当データはありません"
        Exit Sub
    End If

 End Sub

 (その他の抽出プロシージャは省略します)

 「営業担当」や「締日」は「条件に一致するもの」を指定すればよいのでできたのですが、
 例えば「出荷データ」シートのO列に

  〜  O
 1
 2
 3  納品日
 4  2013/1/10
 5  2013/1/15
 6  2013/2/1
 7  2013/1/20
 8  2013/1/25

 のように日付が順不同で入っていて、「2013/1/20までのデータ(1/20も含む)」を指定する
 方法がわかりません…

 ※上記の例だったら、4行目・5行目・7行目が該当データ

 テキストボックスに日付を入れて「その日付まで」という指定の仕方をするにはどうしたらよいでしょうか。


 Range("O4").Value <= CDate(TextNohin.Value)  とか?

 テキストボックスに日付データが入る前提で書かれていますが、
 日付形式で入力されていることを判定する必要はありませんかね?
 アクセスが入っているのであれば、カレンダーコントロールも使えますよ。

 (ROUGE)

 (ROUGE)さまありがとうございます。

 >日付形式で入力されていることを判定する必要はありませんかね?
 稀に、「出荷(納品)されていないけど売上する必要がある」場合があり、その場合はダミーで「2013/1/1」
 を入力することにしました。
 (これまでは「-」とか「キャンセル」といった文字列を入れていましたが日付の判定が難しいかと思って…)

 アクセスは正直言って私があまり使えません…
 一応PCに入ってはいますが…

 Range("O4").Value <= CDate(TextNohin.Value)
 これを今から試してみます。

 (ゆき)

 > アクセスは正直言って私があまり使えません…
 > 一応PCに入ってはいますが…
 
実際にアクセスを使うわけではなくて、アクセスがインストールされている環境であれば使えるということです。
VBEの画面で、[ツール]-->[その他のコントロール]とすすみ、[Microsoftカレンダーコントロール]にチェック
を入れると、使うことができます。
カレンダーの日付を押すので、とっても使いやすいと思いますよ。
 
日付の判定はIsDateとか使えばよさそうですが。
 
(ROUGE)

 (ROUGE)さまありがとうございます。

 よく見たら会社のPCにアクセスが入っていませんでした…

 (ゆき)

コメント返信:

[ 一覧(最新更新順) ]


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