Page 583 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼複数条件一致のVBA PAL 03/1/17(金) 16:54 ┗Re:複数条件一致のVBA りん 03/1/18(土) 3:24 ┣Re:複数条件一致のVBA BOTTA 03/1/18(土) 4:09 ┃ ┗Re:複数条件一致のVBA りん 03/1/18(土) 4:24 ┃ ┗Re:複数条件一致のVBA BOTTA 03/1/18(土) 4:42 ┃ ┗Re:複数条件一致のVBA JuJu 03/1/18(土) 20:44 ┗Re:複数条件一致のVBA PAL 03/1/20(月) 16:14 ┗Re:複数条件一致のVBA りん 03/1/20(月) 21:52 ┣Re:複数条件一致のVBA りん 03/1/21(火) 7:19 ┃ ┗Re:複数条件一致のVBA PAL 03/1/22(水) 11:29 ┗Re:複数条件一致のVBA PAL 03/1/22(水) 11:21 ─────────────────────────────────────── ■題名 : 複数条件一致のVBA ■名前 : PAL ■日付 : 03/1/17(金) 16:54 -------------------------------------------------------------------------
初歩的なところで躓いているように思うのですが、自分では改善できそうにないので こちらで質問させていただきます。 Sheet1のJ列に日付が入力されていて、C列〜F列に発送物名が入力されています。 Sheet1----------------------------- C D E F ・・J 1 ○ 1/1 2 ▲ 1/3 3 △ ○ 1/6 4 ○ □ 1/10 5 △ □ ▲ 1/15 6 ----------------------------------- これをSheet2のD列に日付毎に発送物(各マーク)毎の件数が入るようにしたいのですが、うまくいきません。 Sheet2----------------------------- A ・ C D 1 1/1 ○ 1 2 1/2 ○ 0 3 1/3 ○ 0 4 1/4 ○ 0 5 1/5 ○ 0 6 1/6 ○ 1 7 1/7 ○ 0 8 1/1 ▲ 1 9 1/2 ▲ 0 10 1/3 ▲ 0 11 1/4 ▲ 0 12 1/5 ▲ 0 13 1/6 ▲ 0 14 1/7 ▲ 0 ----------------------------------- とりあえず、Sheet2のD1に1/1の「○」の件数が入るように 下記を作ってみたのですが、実行すると「型が一致しません」となってしまいます。 Sumproduct部分のようなのですが、よくわかりません。 Sub test() '日付入力 Dim md As Date Dim w_msg As String, w_title As String w_msg = "日付を入力してください。" w_title = "集計" md = Application.InputBox(prompt:=w_msg, Title:=w_title, Default:=Date, Type:=2) md = md - 7 '集計 Dim dd As Date, zz As Integer Dim s1 As String Dim cf As Range, jj As Range dd = md '予め入力された日付 s1 = "○" '集計する送付物の指定 zz = Application.WorksheetFunction.CountA(Sheets("発送リスト").Columns("J")) With Worksheets("発送リスト") Set cf = Range(.Cells(2, "C"), .Cells(zz, "F")) Set jj = Range(.Cells(2, "J"), .Cells(zz, "J")) End With Cells(1, "D") = Application.WorksheetFunction _ .SumProduct((jj = dd) * (cf = s1)) End Sub つたない文章で申し訳ないのですが、どうかよろしくお願いいたします。 |
PAL さん、こんばんわ。 >Sheet1のJ列に日付が入力されていて、C列〜F列に発送物名が入力されています。 >これをSheet2のD列に日付毎に発送物(各マーク)毎の件数が入るようにしたいのですが、 関数にしてみました。標準モジュールに書いてください。 Function NN(Dt1 As Range, Mk1 As Range) As Long Dim ws1 As Worksheet, r1 As Range, r2 As Range Dim Rpos As Long, Rmax As Long ' Set ws1 = ThisWorkbook.Worksheets("Sheet1") '最下行設定 10 => J Rmax = ws1.Cells(65536, 10).End(xlUp).Row '日付セル検索 For Rpos = 1 To Rmax If ws1.Cells(Rpos, 10).Value2 = Dt1.Value2 Then Exit For Next '関数の戻り値設定 If Rpos > Rmax Then '一致する日付がなかった場合 NN = 0 Else 'あった場合 3 => C , 9 => I With ws1 Set r2 = .Range(.Cells(Rpos, 3), .Cells(Rpos, 9)) End With NN = Application.WorksheetFunction.CountIf(r2, Mk1.Value) End If Set r1 = Nothing: Set r2 = Nothing Set ws1 = Nothing End Function こんな感じです。 関数なので、Sheet2のD列に 【セルD1】=NN(A1,C1) という風に入力します。 |
PALさん、こんばんは。 質問者に断りもなく、飛び入りまして失礼します。 りん さん、お見事です。 さすがです。 今回、初めて Value2プロパティなるものを知りました。 Valueプロパティと比べて、どのようなメリットがあるのでしょうか? ヘルプには、むちゃ簡単な説明しかなかった。 (今晩は、やけに遅いですねぇ) |
BOTTA さん、こんばんわ。 まだ起きてます。 >今回、初めて Value2プロパティなるものを知りました。 >Valueプロパティと比べて、どのようなメリットがあるのでしょうか? >ヘルプには、むちゃ簡単な説明しかなかった。 とりあえず内容はこんな感じです。 Sub Test() With Range("A1") .Value = "1/1" '2003/1/1になる MsgBox .Value, vbInformation, "Valueはこんな感じ" MsgBox .Value2, vbInformation, "Value2はこんな感じ" MsgBox CDbl(.Value), vbInformation, "CDblするのと同じ" End With End Sub 日付のシリアル値が取得できます。まあそれだけなんですけど(笑) 途中いろいろと試したのですが、比較するなら数値の方がいいかなあと。 通貨型を浮動小数点にするメリットはわかりませんけどね。 >(今晩は、やけに遅いですねぇ) じんましんがかゆくて眠れなくなりました。原因は不明です。 |
なぁ〜る・・ あっ、りんさん、こんばんは。 いつも、丁寧な解説ありがとうございました。 覚えたからには、今度どっかで使ってみよっと。 >>(今晩は、やけに遅いですねぇ) > じんましんがかゆくて眠れなくなりました。原因は不明です。 夜、体があったまるとみょぉにかゆくなる事ってありますね。 明日は、近所のスーパーの特売品に並ばなきゃならぬ身なのでそろそろ寝ます。 おやすみなさい。 PALさん割り込みごめんなさい。 |
PALさん、りんさん、BOTTAさん、こんにちはぁ 私も使ったことがなかったので、少し調べてみました。 英語サイトのほうに少しだけ解説がありました http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b213719 "MORE INFORMATION"の初めの方が少しいやらしいですね^^; 通貨型のメリットはやっぱり分かりませんね。 将来への布石なんでしょうか。 ではではぁ |
りん さんこんにちは。 また、皆様遅い時間までありがとうございます。 教えていただいたように関数を作成して試してみたのですが、 マークが該当する日毎に1件ずつという計算結果になりました。 再度、質問させていただきます。 同じ日に同じ発送物(マーク)が2件や3件ある場合にはその件数を出したいのですが、 どのようにしたらいいのでしょうか? 私の説明がつたなく、申し訳ありません。 よろしくお願いいたします。 |
PAL さん、こんばんわ。 >同じ日に同じ発送物(マーク)が2件や3件ある場合にはその件数を出したいのですが、 >どのようにしたらいいのでしょうか? あれ? 私の方では Sheet1の C1:○ D1:○ J1:2003/1/1 と入力したら、 Sheet2の A1:2003/1/1 C1:○ で、D1:=NN(A1,C1) で2件と表示されましたが。 入力データの範囲はC列からI列ですよね。違いますか? |
PAL さん、おはようございます。 >>同じ日に同じ発送物(マーク)が2件や3件ある場合にはその件数を出したいのですが、 >>どのようにしたらいいのでしょうか? >あれ? >私の方では >Sheet1の C1:○ D1:○ J1:2003/1/1 と入力したら、 >Sheet2の A1:2003/1/1 C1:○ で、D1:=NN(A1,C1) で2件と表示されましたが。 >入力データの範囲はC列からI列ですよね。違いますか? もしかして、日付重複の場合でしたか? 変更版(日付の重複に対応) Function NN(Dt1 As Range, Mk1 As Range) As Long Dim ws1 As Worksheet, r1 As Range, r2 As Range Dim Rpos As Long, Rmax As Long Dim Ndt As Long '加算に対応 Ndt = 0 ' Set ws1 = ThisWorkbook.Worksheets("Sheet1") '最下行設定 10 => J Rmax = ws1.Cells(65536, 10).End(xlUp).Row '日付セル検索 With ws1 For Rpos = 1 To Rmax If ws1.Cells(Rpos, 10).Value2 = Dt1.Value2 Then '3 => C , 9 => I Set r2 = .Range(.Cells(Rpos, 3), .Cells(Rpos, 9)) Ndt = Ndt + _ Application.WorksheetFunction.CountIf(r2, Mk1.Value) End If Next End With Set r1 = Nothing: Set r2 = Nothing: Set ws1 = Nothing '関数の戻り値設定 NN = Ndt End Function |
りん さん、こんにちは。 変更版の方で出来ました。 本当に助かりました。ありがとうございました。 また、何かありましたらよろしくお願いいたします。 |
りんさん、こんにちは。 お返事が遅くなってすみません。 >あれ? >私の方では >Sheet1の C1:○ D1:○ J1:2003/1/1 と入力したら、 >Sheet2の A1:2003/1/1 C1:○ で、D1:=NN(A1,C1) で2件と表示されましたが。 >入力データの範囲はC列からI列ですよね。違いますか? 入力データの範囲はC列からF列です。 前回いただいたIのところをF<6>に直して試したのですが、件数が反映されませんでした。 |