[[20051018111808]] 『該当行の抽出方法』(信州) ページの最後に飛ぶ

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

 

『該当行の抽出方法』(信州)
 下記のデータベースをInpBoxを使って該当行のみを抽出する方法を試みているのですが、うまくいきません。

       A	         B	   C	 D
1    受付日      注文書No	 顧客県	品物
2    2005/10/4  05-0508	  東京	お菓子
3    2005/10/3  05-0507	  大阪	お米
4    2005/10/3  05-0506	  埼玉	お酒
5    2005/10/3  05-0505	  広島	玩具
6    2005/10/3  05-0504	  東京	衣類
7    2005/9/30  05-0503	  名古屋	PC
8    2005/9/30  05-0502	  大阪	PC
9    2005/9/30  05-0501      東京	PC
10   2005/9/29  05-0500	  札幌	お酒
11   2005/9/29  05-0499	  東京	お米
12   2005/9/28  05-0498	  博多	お菓子
 *   2005/9/**  05-04**	   *       *
 *   2005/9/**  05-04**	   *	  *
99   2005/9/1   05-0411	  東京	PC
100  2005/9/1   05-0410	  東京	家電
101  2005/8/31  05-0409	  新潟	家電
102  2005/8/31  05-0408	  大阪	お米
103  2005/8/31  05-0407	  東京	衣類
104  2005/8/31  05-0406	  長野	PC
800  2004/12/31 04-1500      東京	PC
801  2004/10/20 04-1300      博多	お菓子
850  2004/9/30  04-1250      名古屋 お米
851  2004/9/10  04-1230      大阪	PC
840  2004/8/31  04-1220       札幌	お酒

 9月度の行(7行〜100行)を残して、10月度と8月度の行を自動削除したいのですが、
 @10月始めは2005/10/3が4行あり、10/3で注文書Noの若い方(05-0504)を自動選択する
 A8月末は2005/8/31が4行あり、8/31で注文書Noの大きい方(05-0409)を自動選択する
 B05-0503〜05-410の行を残して他の行を削除する 

 Option Explicit
Sub てすと()
Dim mth As Integer
mth = InputBox("抽出する月は?")
With Sheets("Sheet1")
    With .Range("A2", .Range("A65536").End(xlUp))
        With .Offset(, 255)
            .Formula = "=IF(MONTH(A2)<>mth,1,"""")"
            On Error Resume Next
                .SpecialCells(xlCellTypeFormulas, 1).EntireRow.Delete
            On Error GoTo 0
        End With
    End With
End With
End Sub

 mthを固定した数値にするとうまくいくのですが、変数にしてInpBoxにするとVBAは認識しません。記述に問題があればどなたかご教示下さいませんか?


 >.Formula = "=IF(MONTH(A2)<>mth,1,"""")"

 .Formula = "=IF(MONTH(A2)<>" & mth & ",1,"""")"

 どうですか?

 検討もせず適当なことを書く(Null)


 早速のレスありがとうございます。ですが、今試みた所認識しませんでした。(信州)


 そのままソースを貼り付けて上の部分を直したら動きました。

 環境の問題ですかね?
 認識できないという現象をもう少し詳しく教えていただけますか?

 きれいなソースですね^^(Null)


 よく、記述を調べたら、こちらの入力ミスでした。
 
 正・・・  .Formula = "=IF(MONTH(A2)<>" & mth & ",1,"""")"
 こちらのミス・・・ .Formula = "=IF(MONTH(A2)<> & mth & ,1,"""")"

 修正したら、うまく動きました。有難うございました!これから業務のEXCELにチャレンジしてみます。

 業務DBにチャレンジして、がーん!

 上記のDBは2005年の範囲でしたが、業務DBは1998年に遡ってデータが入っているので

  .Formula = "=IF(MONTH(A2)<>" & mth & ",1,"""")" の記述ではエラーになってしまいます。

 InpBoxに 2005,9と入力して2005年9月の行のみを抽出するにはどうしたらいいでしょう?

 上記のDBに2004年のデータを追加しました。

 こんばんわ
 書き込み遅くなってすいませんmm

 .Formula = "=IF(YEAR(A2)&""/""&MONTH(A2)<>""" & mth & """,1,"""")"
 そのまま比較する文字に西暦を追加で同でしょうか?

 この場合 mth の 型を String に変更する必要があります。

 入力の方法は 2004/9 と入れれば 2004年の9月が抽出できると思います。

 反応の遅くなってしまった(Null)

 おはようございます!又、有難うございます。 試したら、うまくいきました。が、2005/8と入力した時、上記のDBのうち、
2005年9月度の行の中にある

 *   2005/9/**  05-04**	   *       *
 *   2005/9/**  05-04**	   *	  *

 が一緒に抽出されてしまうのですが、これは
.Formula = "=IF(YEAR(A2)&""/""&MONTH(A2)<>""" & mth & """,1,"""")"の中にある数字1と関係あるのですか? 
 恥ずかしながら小生自身、1の持つ意味がわからないままやっているのですが、もしご存知でしたらご教示頂けないでしょうか?
 m(_ _)m m(_ _)m 


 またまた返信遅くてすいません。
 YEAR や MONTH 関数の引数はシリアル値でなければなりません!!
 問題の行の値はシリアル値ではないのでうまくうごきません!!
 この場合関数から帰ってくる値は 多分 「#VALUE!」 になるはずです

 でもて↓に示した部分の処理は
 .SpecialCells(xlCellTypeFormulas, 1).EntireRow.Delete
 関数を入力したセルの中で値が「1」のセルを消しなさい!!

 という処理になります。

 .Formula = "=IF(YEAR(A2)&""/""&MONTH(A2)<>""" & mth & """,1,"""")"
 の部分で指定した日付と違う場合は「1」を返しなさいとなっています。

 指定した値と違うセルには「1」が入り、その跡で「1」の入っている行を消すという処理をして抽出を行っているわけですが・・・

 ここで問題なのはエラーがでた場合です。[#VALUE!]は「1」ではないので残ってしまいます。

 エラーが出た場合その行が必要かどうか判断することができないため残していたほうが安全だとは思いますが、じゃまなようであれば消すような処理をいれてあげればよいと思います。

 あとこの元データって(信州)さんが作ったものですか?
 12〜99までをつなげるために書いてあるようなきがするのですが・・・

 まとはずれだったらすいません(Null)

 気になったので私なりに二つ作ってみました。
Option Explicit
Sub てすと()
Dim mth As Variant
mth = Application.InputBox("抽出する月は?", , Default:=Format(Date, "yyyy/mm"), Type:=2)
If VarType(mth) = vbBoolean Then Exit Sub
If mth <> "" Then
    With Sheets("Sheet1")
        With .Range("A2", .Range("A65536").End(xlUp))
            With .Offset(, 255)
                .Offset(, -1).Value = mth & "/1"
                .Formula = "=IF(TEXT(A2,""yyyy/mm"")<>TEXT(IU2,""yyyy/mm""),1,"""")"
                On Error Resume Next
                    .SpecialCells(xlCellTypeFormulas, 1).EntireRow.Delete
                    .Offset(, -1).Resize(, 2).EntireColumn.ClearContents
                On Error GoTo 0
            End With
        End With
    End With
End If
End Sub
 >が一緒に抽出されてしまうのですが、
 これは数値だけを選択しているので
 ↓これを
 >.SpecialCells(xlCellTypeFormulas, 1).EntireRow.Delete
 ↓これに
.SpecialCells(xlCellTypeFormulas, 17).EntireRow.Delete
すればエラーも選択されますので削除されます。
Sub てすと()
Dim mth As String
mth = InputBox("抽出する月は?")
With Sheets("Sheet1")
    With .Range("A2", .Range("A65536").End(xlUp))
        With .Offset(, 255)
            .Formula = "=IF(YEAR(A2)&""/""&MONTH(A2)<>""" & mth & """,1,"""")"
'            .Formula = "=IF(MONTH(A2)<>mth,1,"""")"
            On Error Resume Next
                .SpecialCells(xlCellTypeFormulas, 17).EntireRow.Delete
            On Error GoTo 0
        End With
    End With
End With
End Sub
(SoulMan)

 おはようございます。
 xlCellTypeFormulas,1は数値の抽出ですねorz
 (SoulMan)さんご指摘ありがとうございますmm
 数値指定して抽出できるんだぁ「へぇ」とか勝手におもてましたがorz
 修行不足ですねf^^;

 (SoulMan)さんがエラーを削除する方法を提案してくれてますので。
 私からももうひとつ数式でエラーの場合数値を入れるっていうのもひとつの方法ですよね^^
 .Formula = "=IF(or(iserror(YEAR(A2)&""/""&MONTH(A2)),YEAR(A2)&""/""&MONTH(A2)<>""" & mth & """),1,"""")"

 Sub てすと4()
 Dim mth As Variant
 mth = Application.InputBox("抽出する月は?", , Default:=Format        (Date, "yyyy/mm"), Type:=2)
 If VarType(mth) = vbBoolean Then Exit Sub
 If mth <> "" Then
     With Sheets("Sheet1")
         With .Range("A2", .Range("A65536").End(xlUp))
             With .Offset(, 255)
                 .Formula = "=IF(iserror(YEAR(A2)&""/""&MONTH(A2)),IF(Left(A2," & Len(mth) & ")<>""" & mth & """,1,""""),IF(YEAR(A2)&""/""&MONTH(A2)<>""" & mth & """,1,""""))"
                 On Error Resume Next
                     .SpecialCells(xlCellTypeFormulas, 1).EntireRow.Delete
                 On Error GoTo 0
             End With
         End With
     End With
 End If
 End Sub

 データに文字列が混じるので2005/9/** は 2005/9 とマッチしない判定になるのでその抽出を追加しましたが、関数が長いですorz
 多分きっと申すこし短くなると思います。orz
 でもって今日から実家(宮崎)へ帰郷いたします。NET環境がないので中途半端なんですが、回答(快答)ができなくなると思います。ということで・・・
 (ノーー)ノ=======■
 丸投げ

 いってきまぁす(Null)ノシ

 >データに文字列が混じるので
 >2005/9/** は適当な日付かと思ったら実際にあるのですね? 
 日付の部分が必ず「/**」ならSUBSTITUTEで置換するのはどうでしょうか?
 いずれにしても数式の問題なので色々と数式を入力してそれを記録して
 加工されたらいいでしょう。
 というわけで
 2005/9と入力して
 2005/9/**も抽出するには↓これを
 >.Formula = "=IF(TEXT(A2,""yyyy/mm"")<>TEXT(IU2,""yyyy/mm""),1,"""")"
 ↓これに変更すればいいと思います。
 .Formula = "=IF(TEXT(SUBSTITUTE(A2,""/**"",""""),""yyyy/mm"")<>TEXT(IU2,""yyyy/mm""),1,"""")"
 どうでしょうか?
(SoulMan)


 Soulmann先生、そしてNulさん有難うございます。これからテストしてみます。(信州)


コメント返信:

[ 一覧(最新更新順) ]


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