[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『該当行の抽出方法』(信州)
下記のデータベースを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.