- ベストアンサー
エクセル 2010 マクロ 検索に関する質問
- エクセル 2010 のマクロを使って、指定の条件に合致するセルの値を表示させたい。
- 特定の列を検索し、条件に合致したセルの値をmsgboxで表示させたい。
- 特定の条件に合致する行の一番上のセルの値をmsgboxで表示させたい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 Ws2 のA1 とA2 だけを使うというのでしたら、検索方法を変更しました。 以下は、十分にチェックなされていませんので、不具合がありましたら、教えてください。 自分で試した分には、なんとなく、メッセージが何度も出てきて、しっくりきません。 本来は、まとめて出たほうが良いかもしれません。 「私のアレンジ」という部分は、既に検索したものを表示するためのものです。 コメントブロックを外せばメッセージが出ますが、不要なら削除してしまっても良いです。 '// Sub 検索() 'ver.0.3 '2014/05/01 Dim Ws1 As Worksheet, Ws2 As Worksheet Dim strKey As Variant Dim s As String Dim c As Range, bln As Boolean Dim rng1 As Range Dim cnt As Long Set Ws1 = Sheet1 Set Ws2 = Sheet2 Ws1.Select '* Ws2 の画面に時に、Ws1に戻します。 With Ws2 strKey = Trim(.Range("A1").Value) & "," & .Range("A2").Value '* 'Application.Transpose(.Range("A1").Resize(2).Value) 'strKey = Join(strKey, "") End With If Trim(strKey) = "" Then MsgBox "検索キーが空です", vbCritical: Exit Sub With Ws1 .Select Set rng1 = .Range("K2", .Cells(Rows.Count, "K").End(xlUp)) For Each c In rng1.Offset(, -10) ' 'D,E,F,G,H,I,Kを検索 s = c.Offset(0, 3).Value & c.Offset(0, 4).Value & c.Offset(0, 5).Value & c.Offset(0, 6).Value & c.Offset(0, 7).Value & _ c.Offset(0, 8).Value & "," & c.Offset(0, 10).Value '* If StrComp(s, strKey, vbTextCompare) = 0 Then If c.Offset(0, 2).Value = "" Then '変更を加えた c.Offset(0, 2).Value = Date c.Resize(1, 14).Interior.ColorIndex = 6 bln = True If c.Offset(, 2).End(xlToRight).Value <> "" Then '右に検索 Call NumberSearch(c.Offset(, 2).End(xlToRight)) '*番号探し2 End If Exit For Else '私のアレンジ 'MsgBox "コードは見つかりましたが、日付が既に入っています。 " & c.Offset(0, 2).Text, vbExclamation End If End If Next c If Not bln Then Ws2.Select MsgBox "リストに存在しません", vbExclamation, "NotFound" Else '加える Call ReSearch(Ws1.Range("M2"), c.Row) '再設定 Set rng1 = .Range("K6", .Cells(Rows.Count, "K").End(xlUp)) MsgBox "残り" & DoubleCountBlank(rng1.Offset(, -8), rng1) & "品目です。", vbInformation '* End If End With Application.Goto Ws2.Range("A1"), True End Sub '//新たに付け加えたサブルーチン Sub NumberSearch(r As Range) '2014/05/01 Dim i As Long If r.Column = 4 Then If Cells(r.Row, 13).Value Like "191000####" Then For i = 2 To Cells(Rows.Count, "K").End(xlUp).Row If Cells(i, "M").Value Like "191000####" Then Cells(i, "M").Select MsgBox Cells(i, "M").Value, vbInformation Exit For End If Next i ElseIf Not Cells(r.Row, 13).Value Like "191000####" Then For i = 2 To Cells(Rows.Count, "K").End(xlUp).Row If Cells(i, "M").Value Like "191000####" Then Cells(i, "M").Select MsgBox Cells(i, "M").Value & "これは例外です", vbExclamation Exit For End If Next i End If Else For i = r.Row To 2 Step -1 If Cells(i, "M").Value Like "191000####" Then Cells(i, "M").Select MsgBox Cells(i, "M").Value, vbInformation Exit For End If Next i End If End Sub 前回の印刷設定の件: このマクロは、その都度、列幅が紙の横に入らない時は、縮小値が変わるようになっていますが、できれば、固定値の方がよいと思います。場合により、設定時間が掛かることがあるからです。 '//'標準モジュールのみ Sub TestPrint() Dim myRng As Range Dim i As Long Dim j As Long Dim k As Long j = 100 '印刷縮小率-初期値100% With ActiveSheet Set myRng = .Range("A1", .Cells(Rows.Count, "K").End(xlUp)).Resize(, 14) For i = 1 To myRng.Columns.Count If i <> 9 Then .Columns(i).AutoFit End If Next i With .PageSetup .PrintArea = myRng.Address .Orientation = xlLandscape .PaperSize = xlPaperA4 .Zoom = j Do k = Application.ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(65))") If k = 1 Then Exit Do j = j - 1 .Zoom = j Loop End With .PrintOut Preview:=True '印刷プレビューモード:ON-True, OFF-False または取る .PageSetup.Zoom = 100 End With End Sub '// p.s.質問文を読む限りは、maron1010さんご自身でもコードを組めるレベルに来ているようです。ちょっとの勉強で、特殊なコードを使わない限り、VBAは書けるようになるはずです。
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
maron1010さんへ。 >私の思うものと違うので下に書きます。 私は、以前は、セミプロとしてVBAを書いていた関係上、これ以上は、無料掲示板上では、境界線を越えている感じがします。ある程度、ご自身の課題にしていただけないでしょうか? 体調を崩しているせいか、私は、少し、疲れてしまいました。 勝手なお願いですが、これ以上は、こちらが気が向いたらにしていただけませんか?
お礼
度が過ぎました。すみません。 季節柄、ご自愛ください。
- WindFaller
- ベストアンサー率57% (465/803)
すみません、前回の回答者です。 前回(8562170)の回答の次のリクエストでしたが、実は、言葉だけでは、何度も読み返してみても、わからなくなってしまったからです。それで、回答が付けられなくなってしまいました。 まあ、あまり期待をしないで、お待ちください。(^^; 別の方の回答が良ければ、それでも構いません。 こちらは、図をみて考えてみます。まずは、ご一報だけ。
お礼
ありがとうございます。 前回、素晴らしい回答を頂いたのにも関わらず、自らの不手際で補足にて追加質問などしまして、恐縮していました。 気にかけて頂いているようで、安心しました。 大変理解し難い文章内容かと思いますが、 是非、画像を参考に(・・・なるか分かりませんが)くみ取って頂き、素晴らしい回答を待っています。 よろしくお願いします。
お礼
すみません。 お礼ではないのですが、 印刷で 実行時エラー'1004': PageSetup クラスの Zoom プロパティを設定できません。 と出て j = j - 1 .Zoom = j ←」ここが黄色 で止まります。 ただ、何度かに1度、成功する時もありますが それが何故成功するのかは分かりません。 合わせて宜しくお願いします。
補足
こんにちは。 いつもありがとうございます。 頂いたコードで動かしてみましたが仰る通りメッセージが幾つか出現して 私の思うものと違うので下に書きます。 ・の後がmsgboxで表示されます。()内は注釈 ←不要★ の部分を修正して頂けると助かります。 検索結果がE~I列のいずれかだった場合 C列に何も入ってなくて検索該当セル行のM列が191000####のデータを検索した時 ・(検索該当セル行のM列)191000#### ←不要★ ・指図番号191000####の部品です(上と同じ191000####) ・残りXXX品目です 検索結果がE~I列のいずれかだった場合 C列に何も入ってなくて検索該当セル行のM列が191000####以外のデータを検索した時 ・(検索該当セル行のM列を上に向かった)191000#### ←不要★ ・指図番号191000####の部品です(上と同じ191000####) ・残りXXX品目です 検索結果がE~I列のいずれかだった場合 C列に既に日付が入っていて検索該当セル行のM列が191000####のデータを検索した時 ・リストに存在しません 検索結果がE~I列のいずれかだった場合 C列に既に日付が入っていて検索該当セル行のM列が191000####以外のデータを検索した時 ・リストに存在しません 検索結果がD列だった場合 C列に何も入ってなくて検索結果行のM列が191000####のデータを検索した時 ・(M列の一番上の)191000#### (これは例外です の表示が出ない) ・(検索該当セル行のM列)指図番号191000####の部品です ←不要★ ・残りXXX品目です 検索結果がD列だった場合 C列に何も入ってなくて検索結果行のM列が191000####以外のデータを検索した時 ・(M列の一番上の)191000####これは例外です ・(検索該当セル行のM列を上に向かった)指図番号191000####の部品です ←不要★ ・残りXXX品目です 検索結果がD列だった場合 C列に既に日付が入っていて検索該当セル行のM列が191000####のデータを検索した時 ・リストに存在しません 検索結果がD列だった場合 C列に既に日付が入っていて検索該当セル行のM列が191000####以外のデータを検索した時 ・リストに存在しません '私のアレンジ 部分は興味深いのですが、データが入っている回数分msgboxが出現するのでちょっと・・・ ただ、その時、C列の既に日付が入っているセルの.End(xlToRight).Activateに出来たら助かります。 c.Offset(0, 2).Value = Date c.End(xlToRight).Activate ←ここが無い。ただ、このコードを入れても ここら↓をアクティブにしてしまう。 If c.Offset(, 2).End(xlToRight).Value <> "" Then '右に検索 Call NumberSearch(c.Offset(, 2).End(xlToRight)) '*番号探し2 D列からI列のいずれのデータをアクティブにしたい。 また、印刷についてですが少し変えさせてください。 I列(9)を J列(10)に置き換え J列以降Nまでの幅を AutoFit AからIまでの列幅を 10とさせたいのですが出来ますでしょうか? (AからIは隣合うデータが無い為10でも構わないからです) 無理難題ばかりでしょうが、宜しくお願い致します。