VBAで範囲内の数値を検索する方法について

このQ&Aのポイント
  • VBAを使用して、指定した範囲内の数値を検索する方法をご教示ください。
  • シート2のA1〜A100には1〜4の数値が入っており、それぞれの数値が何個あるかを検索し、シート1に表示したいです。
  • 現在のコードでは、セルを1つずつ検索してカウントしていますが、もっと短く分かりやすい方法があれば教えていただきたいです。
回答を見る
  • ベストアンサー

指定した範囲のセル内の数値を検索したい(VBA)

いつもありがとうございます。 また皆様のお知恵を拝借したいと思い質問をさせて頂きました。 現在VBAを勉強中なのですが、以下の場合、コードはもっと簡単になるでしょうか? 【やりたい事】 プログラムを実行すると、シート2に数値が返されます。  ※数値が返される範囲は「A1~A100」だとします。 シート2の「A1~A100」には「1~4」の数値が返され、それぞれの数値が何個あるかを検索。 検索した結果を、「シート1」の指定したセルに表示する。 【記述したコード】 dim x as integer x = 0 For x = 1 To 101 If Sheets("シート2").Cells(x, 1) = "1" Then 1count = 1count + 1 End If If Sheets("シート2").Cells(x, 1) = "2" Then 2count = 2count + 1 End If If Sheets("シート2").Cells(x, 1) = "3" Then 3count = 3count + 1 End If If Sheets("シート2").Cells(x, 1) = "4" Then 4count = 4count + 1 End If Next x 上記のコードで「"x"count」に数値を加算していき、最終的に以下のように各数値をシート1に表示させています。 Sheets("シート1").Range("A1") = 1count Sheets("シート1").Range("A2") = 2count Sheets("シート1").Range("A3") = 3count Sheets("シート1").Range("A4") = 4count 結果的にはうまくカウントされて、結果も正しく表示されるのですが、 列をまとめて検索してやる方法などがあれば、もっと短く分かりやすく おさまるのではと思い、質問をさせて頂きました。 こうやるともっと簡単にできるよなどがあれば、教えて頂けないでしょうか。 Excelの関数などを使用しても構いません。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんばんは! 横からお邪魔します。 すでに解決済みのようですが・・・ ごく簡単に Sub Sample1() Dim i As Long For i = 1 To 4 Worksheets("シート1").Cells(i, "A") = WorksheetFunction.CountIf(Worksheets("シート2").Range("A:A"), i) Next i End Sub といった具合ではどうでしょうか?m(_ _)m

kumainu555
質問者

お礼

結論から言うと、コレを採用しました…w たしかに、これが一番シンプルで理解しやすかったです。 質問の回答としては、この回答をベストアンサーとさせて頂きます。 ※VBAを始めてまだ3日とか4日なので、他の方にも色々と教えて頂いており、とても助かっています!  tom04さんも他の方も今後ともよろしくお願いいたします><

その他の回答 (8)

回答No.9

No.7 です。連続ですみませんが、補足を。今回の場合 COUNTIF で個数を拾うだけなので、No.4 さんのように range(a:a) で十分であり、....End(xlUp) と記述する意味は、実はありません。説明用とご理解ください。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.8

> For Each c In Sheets("シート2").Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row) > > この部分ですが、少しでいいので詳しく教えて頂けないでしょうか;; > > 特に以下の部分を教えて頂きたいです;; > Range("A" & Rows.Count) For Each~nextは こういうパターンがあると単純に覚えてください。指定したセル範囲のセルを順次変数cに代入してくれます。 Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row) A1からA列の最終データの行までを範囲指定しています。これもこういうパターンですね。 Range("A" & Rows.Count) 質問者さんが解釈されたとおり変数が利用できるということです。 質問にあった Cells(x, 1) でも変数が利用できますが、ぱっと見たときに何列なのか分かりにくいのが難点だと感じていますので、個人的には行が変化する場合にはRange("A" & 変数)を使うことが多いです。列で変数を使う場合にはCells(1, 変数)を使います。 ちなみに、Rows.Countは行の最大数を表す変数でエクセルのバージョンによって最大行数が違うので使っています。 .End(xlUp).Rowは 指定した列(今回はA列)の最終行から検索して最初に見つかったデータが入っているセルの行をさします。

kumainu555
質問者

お礼

何度もありがとうございます。 そして、詳しく教えて頂き大変感謝です…。 >質問にあった Cells(x, 1) でも変数が利用できますが、ぱっと見たときに何列なのか分かりにくい>のが難点だと感じていますので、個人的には行が変化する場合にはRange("A" & 変数)を使うことが多>いです。列で変数を使う場合にはCells(1, 変数)を使います。 >ちなみに、Rows.Countは行の最大数を表す変数でエクセルのバージョンによって最大行数が違うので使>っています。 なるほど…。 変数が利用できるのですね! 知りませんでした^^; しかも、行と列で変数を使用できるのは大変便利ですね! 本当に分かりやすく教えて頂き大変助かります;; これからもよろしくお願いします><

回答No.7

If ステートメントで条件を 4 つ書くなら、If ... ElseIf ... ElseIf (... ElseIf) (... Else) ... End If という構文で書くのが普通です。 「= "1"」などの「""」は、セルの書式などが何であっても、不要です。基本的に数値には常に、「""」を付けないと覚えましょう。 Cells(Rows.Count, "a").End(xlUp).Row というコードについて。どこかのセルにカーソルがあるときにショートカットキー Ctrl+↓を何回か押していると、シートのいちばん下の行にカーソルが移動します。Excel 2007 以降のバージョンなら、1,048,576 行目であるはずです。Excel 2003 以前なら、65,536 行目です。Rows はシートの全ての行であり、Rows.Count というのは、この 1,048,576 あるいは 65,536 のことです。 そのいちばん下の行の A 列にカーソルを置いてください。その位置からショートカットキー Ctrl+↑を 1 回押したときにカーソルが止まった位置のセルが Cells(Rows.Count, "a").End(xlUp) に当たります。Cells(Rows.Count, "a").End(xlUp).Row は、その止まった位置の行番号です。 セルに記入するものが値であるにしろ数式であるにしろ、基本的にワークシート関数を使ってできる処理なら、ループとかカウンターよりも関数のほうが効率的です。次のコードは、コード上で COUNTIF 関数を使い、計算結果の値をセルに記入する一例です。ああ、No.4 さんのご回答とほぼ一緒ですね。 Dim i As Long For i = 1 To 4   Worksheets("シート1").Cells(i, "a").Value = _   WorksheetFunction.CountIf(Worksheets("シート2").Range("a1:a" & Cells(Rows.Count, "a").End(xlUp).Row), i) Next i

kumainu555
質問者

お礼

ご回答ありがとうございます! >「= "1"」などの「""」は、セルの書式などが何であっても、不要です。基本的に数値には常に、 >「""」を付けないと覚えましょう。 なるほど・・・。 たしかに、””をつけるのがクセになってそうな気がします…。 そして、気が付かないうちにエラーとなる・・・と。 プログラムは奥が深いですね;; >セルに記入するものが値であるにしろ数式であるにしろ、基本的にワークシート関数を使ってできる処 >理なら、ループとかカウンターよりも関数のほうが効率的です。 たしかに関数のほうが分かりやすいですし、効率的だと思います。 私も教えられて関数を使用したのですが、なぜか処理が遅くなってしまったのですよね…。 原因が分かりませんw

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.6

横からしゃしゃり出てすいません。 ひとまず・・軽く説明から。   Rows ⇒ 「行」を指定するときに使います。        Rows(1) で1行目、Rows("1:4") とすると1から4行目を意味します。        括弧内を省略すると「全行」を意味します。   .Count ⇒ 「要素の数」を返します。 コレを組み合わせて、「Rows.Count」としてやると、「全行の数」の意味になり、 「2003以前なら65536、2007以降なら1048576」を返します。 さらに「Range("A" & Rows.Count)」と組み合わせることによって、 2007以降の場合「A1048576セル」を意味する呪文に変身します。 さらにさらに「.End(xlUp)」を付けると、 「そこから上に向かって最初に値が入力されているセル」を意味し、 最後に「.Row」を付けると、そのセルの行番号を返してくれます。 つまり、   Range("A" & Rows.Count).End(xlUp).Row コレで「A列の最終行」を調べること呪文を唱えることができるのです。 なので、 > 「シート2!A1:A100」の部分ですが、「A100」の部分が変動するので、 > できれば変数で指定できるようにしたいのです。 としたいなら、     Dim MRow As Long     MRow = Range("A" & Rows.Count).End(xlUp).Row としてやることで、変数「MRow」にA列の最終行を入れることが出来ます。 さて、考え方の一つとしてこんなやり方もありかと。 つまり・・1~4の出現数をシート1のA1~A4セルに入れたい、 と言うことで、もう直接書いてやります。 Sub sample() Dim i As Long     Sheets("シート1").Range("A1:A4").ClearContents     For i = 1 To Sheets("シート2").Range("A" & Rows.Count).End(xlUp).Row         Sheets("シート1").Range("A" & Sheets("シート2").Range("A" & i)).Value = Sheets("シート1").Range("A" & Sheets("シート2").Range("A" & i)).Value + 1     Next End Sub あまりにも横に長くて見辛いので、慣れてきたらWithを使って Sub sample() Dim i As Long With Sheets("シート1")     .Range("A1:A4").ClearContents     For i = 1 To Sheets("シート2").Range("A" & Rows.Count).End(xlUp).Row         With .Range("A" & Sheets("シート2").Range("A" & i))             .Value = .Value + 1         End With     Next End With End Sub こんな感じで同じ意味のコードをちょっとだけスッキリ書けます。 ちなみにコード中の「&」は、文字列を結合する演算子です。 エクセルのワークシート上での使い方と一緒ですよ。

kumainu555
質問者

お礼

細かくご回答頂きありがとうございます! Rows関数…これって結構便利なのでは・・・。 >Rows ⇒ 「行」を指定するときに使います。 >       Rows(1) で1行目、Rows("1:4") とすると1から4行目を意味します。 >       括弧内を省略すると「全行」を意味します。 知ってる人から見ると当たり前でしょうが、私のような初心者には目からうろこです。 さっそく一部のコードをRows関数を用いて修正したいと思います。 >つまり、 >  Range("A" & Rows.Count).End(xlUp).Row >コレで「A列の最終行」を調べること呪文を唱えることができるのです。 私も、tsubuyukiさんのように、たくさんの呪文が唱えられるように頑張りますw ありがとうございました! またお願いします><

noname#184106
noname#184106
回答No.5

こんばんわ。 私なら、ここは関数です。 Sheet1のA1:=COUNTIF(Sheet2!$A$1:$A$100,1) Sheet1のA2:=COUNTIF(Sheet2!$A$1:$A$100,2) Sheet1のA3:=COUNTIF(Sheet2!$A$1:$A$100,3) Sheet1のA4:=COUNTIF(Sheet2!$A$1:$A$100,4) もしマクロにこだわるなら、こんな感じでしょうか。 Sub Count4() Sheets("Sheet1").Range("A1") = Application.WorksheetFunction.CountIf(Sheets("Sheet2").Range("A1:A100"), 1) Sheets("Sheet1").Range("A2") = Application.WorksheetFunction.CountIf(Sheets("Sheet2").Range("A1:A100"), 2) Sheets("Sheet1").Range("A3") = Application.WorksheetFunction.CountIf(Sheets("Sheet2").Range("A1:A100"), 3) Sheets("Sheet1").Range("A4") = Application.WorksheetFunction.CountIf(Sheets("Sheet2").Range("A1:A100"), 4) End Sub うまくいくといいですね。

kumainu555
質問者

お礼

ご回答いただきありがとうございます! >私なら、ここは関数です。 >Sheet1のA1:=COUNTIF(Sheet2!$A$1:$A$100,1) >Sheet1のA2:=COUNTIF(Sheet2!$A$1:$A$100,2) >Sheet1のA3:=COUNTIF(Sheet2!$A$1:$A$100,3) >Sheet1のA4:=COUNTIF(Sheet2!$A$1:$A$100,4) 関数も試したのですが、処理が著しく遅くなってしまい、泣く泣く断念しました;; Formula関数で数式を入れても結果は同じでした。 関数のほうが簡単でラクにできるのでイイんですけどね><

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.3

> あと、「シート2!A1:A100」の部分ですが、「A100」の部分が変動するので、 > できれば変数で指定できるようにしたいのです。 関数は =COUNTIF(シート2!A:A,"1") にすればいいです。 VBAの方は For Each c In Sheets("シート2").Range("A1:A100") のところを For Each c In Sheets("シート2").Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row) に変更してください

kumainu555
質問者

補足

わざわざ補足を頂きありがとうございます。 初心者なので色々教えて頂き大変助かっております。 For Each c In Sheets("シート2").Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row) この部分ですが、少しでいいので詳しく教えて頂けないでしょうか;; 特に以下の部分を教えて頂きたいです;; Range("A" & Rows.Count) 自分なりの解釈では、セルを「A"変数"」みたいに書けるという事でしょうか? もしそうなら、「&」は便利ですね!

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

VBAならこんな感じでも Sub test() Dim MyCount(4) As Integer, i As Integer Dim c As Range For Each c In Sheets("シート2").Range("A1:A100") Select Case c.Value Case "1" MyCount(1) = MyCount(1) + 1 Case "2" MyCount(2) = MyCount(2) + 1 Case "3" MyCount(3) = MyCount(3) + 1 Case "4" MyCount(4) = MyCount(4) + 1 Case Else End Select Next With Sheets("シート1") For i = 1 To 4 .Range("A" & i) = MyCount(i) Next i End With End Sub

kumainu555
質問者

補足

たしかに、Selectでやったほうが分かりやすいですね!! 他の部分でも同じ形式で併用できそうなので、これを採用したいと思います。 ありがとうございました!!!

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

A1に =COUNTIF(シート2!A1:A100,"1") A2に =COUNTIF(シート2!A1:A100,"2") A3に =COUNTIF(シート2!A1:A100,"3") A4に =COUNTIF(シート2!A1:A100,"4") でいかがでしょう。

kumainu555
質問者

補足

ご回答頂きありがとうございます! たしかに、関数のCOUNTIFでうまくいきそうですね! ご教授頂いた内容でうまく表示されましたが、かなり処理速度が低下してしまいました;; VBAのコードで式などを埋め込んだほうが早いのでしょうか…。 そもそも、そんな事ができるか不明ですが;; あと、「シート2!A1:A100」の部分ですが、「A100」の部分が変動するので、 できれば変数で指定できるようにしたいのです。 COUNTIF関数でセルを変数にする事は可能なのでしょうか?

関連するQ&A

  • エクセル マクロ 同じ数値のセルを検索

    教えてください。 sheet2のG1に3と入力しマクロを実行すると、sheet1のA列(通し番号)の3~5の行をコピーして、sheet2のA2にペーストしたいと思ってます。 (sheet1) 番号 数値1 数値2 数値3 数値4   1     5   10   15   20   2    10   15   20   25   3     5   15   20   20   4    10   20   15   25   5     10   15   20   20 ・    ・    ・    ・    ・ ・    ・    ・    ・    ・            ↓ (sheet2) 番号 数値1 数値2 数値3 数値4      3   3    5   15   20    20   4   10   20   15    25   5   10   15   20    20 イメージとしては上の通りです。 まずは、同じsheet1のG1に3を入力して、A列の3(A4)を検索することを目標にしましたが、ここの時点でこけてしまいました。。 Sub 同じ数値のセルを検索() Dim 番号 As String Dim FoundCell As Range Range("A1").Select 番号 = "G1" Set FoundCell = Cells.Find(What:="番号") If FoundCell Is Nothing = False Then FoundCell.Select End If End Sub 笑われると思いますが、これではダメでした。 どうかお助けしていただけないでしょうか。

  • VBAについて質問です。

    VBAについて質問です。 まとまったデータがあるところから検索したい月及び各項目のデータを検索し、項目シート事に抽出するという作業を行なっています。そこで問題がでました。6月にはデータはあるが、5月にはデータはない。 そうすると以下のコードの場合デバックが入り、他の検索が出来ません。 どうしたらよいのでしょうか? 分かる方がいらっしゃいましたらどうかお願い致します。 'シートの変更 Range("B30").Select Sheets("東京").Select '●Sheet2書込み行 Sheets("東京").Range("A5").CurrentRegion.Clear Sheets("東京").Range("A5:F5").Value = _ Array("依頼書No.", "受付日日", "担当者", "枚数", "工数", "備考") Row2 = 5 For R = 2 To Sheets("日報").Cells(Rows.Count, "A").End(xlUp).Row If Sheets("東京").Range("A2") = Sheets("日報").Cells(R, "A") And _ Sheets("東京").Range("B2") = Month(Sheets("日報").Cells(R, "C")) Then Row2 = Row2 + 1 Sheets("東京").Cells(Row2, "A") = Sheets("日報").Cells(R, "B") Sheets("東京").Cells(Row2, "B") = Sheets("日報").Cells(R, "D") Sheets("東京").Cells(Row2, "C") = Sheets("日報").Cells(R, "F") Sheets("東京").Cells(Row2, "D") = Sheets("日報").Cells(R, "I") Sheets("東京").Cells(Row2, "E") = Sheets("日報").Cells(R, "K") Sheets("東京").Cells(Row2, "F") = Sheets("日報").Cells(R, "L") End If Next R '●抽出結果を日付で並べ替え If Row2 = 5 Then MsgBox "該当データなし!" Else Sheets("東京").Range("A5:F" & Row2).Sort _ Key1:=Range("B6"), Order1:=xlAscending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin End If Sheets("東京").Select Range("B5:B200").Select Selection.NumberFormatLocal = "yyyy/m/d"     Rows("5:5").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .MergeCells = False End With このあとに式を入れて、罫線を入れてコピーして、というコードが入っています。 どうぞ宜しくお願い致します。

  • VBA AutoFilter 範囲指定

    いつもお世話になっております 過去に https://okwave.jp/qa/q9707059.html にてワークシートのデータをオートフィルターをかけて別なワークシートにデータを取り出す方法を教えて頂きました 送られてくる元データが変更になって、A3セルの上のA2セルの上にテキスト文字が入るようになったので、範囲指定を正しく出来るようにする方法を https://okwave.jp/qa/q9708868.html にて教えて頂きました 今回、https://okwave.jp/qa/q9707059.htmlで教えて頂いたワークシートのコードを実行させると元データが変更になったデータを利用すると、A1セルまで含まれた範囲がAutoFilter の領域と判断される為正しい結果となりません 添付画像のワークシートで Sub test9() Worksheets("Sheet1").Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=Cells(5, "G").Value End Sub を実行させれば、"秋田”でフィルターがきちんとかけれらた状態になります そこで教えて頂いたコードを下記に変更して実行させてみたのですが Dim i As Long With Worksheets("Sheet1") .Range("B4", .Range("B4").End(xlDown)).Copy .Range("G4").PasteSpecial (xlPasteAll) .Range("G4", .Range("G4").End(xlDown)).RemoveDuplicates Columns:=Array(1), Header:=xlNo For i = 4 To .Cells(Rows.Count, "G").End(xlUp).Row Worksheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = .Cells(i, "G").Value .Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=.Cells(i, "G").Value .Cells(3, 1).CurrentRegion.Copy Destination:=Worksheets(.Cells(i, "G").Value).Cells(3, 1) .AutoFilterMode = False Next .Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=.Cells(i, "G").Value 部分で 実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです になってしまいます 元データがA2セルにテキスト文字が入った状態でも正常にコード動作させるにはどのようにしたらいいのでしょうか よろしくお願い致します

  • セルの値から任意の文字のみを抽出する

    こんにちは。 VBA勉強中です。 どうしても詰まってしまったので力を貸してください。・゜・(ノД`)・゜・。 Sheet1にはA列~J列にデータが入っています(行数は3行目~□行目・・・都度変わります) Sheet2には抽出したい文字の一覧(仮に禁止ワードとします)がB列5行目~○行目まで入ってます。 質問としてはSheet1のB列、D列、F列のそれぞれの値より禁止ワードを抽出する。 1つのセルに禁止ワードが0~最大5つ入っている時にK列から→方向に禁止ワードを並べて行くといった 感じです。 わかりにくくてすみませんが宜しくお願い致します。 以下自分で考えてみたコードです。。 これだと始めのB列のみ抽出に成功しましたがその他の列からは抽出できず・・・。゜(PД`q。)゜。 列Bで使用したコードをD列、F列にも使えると下に数値のみ変えて羅列しただけだからでしょうか;w; 本当に初心者ですみません。。 以下コードです。 Sub 禁止ワード抽出() Dim SR As Integer , LR As Integer, SR2 As Integer , LR2 As Integer , LR3 As Integer , LR4 As Integer Dim i As Long , j As Long , k As Long , m As Long Dim KINSHI As Variant SR = 3 SR2 =5 LR = Sheets("Sheet1").Range("B" Rows.Count).End(xlUp).Row LR2 = Sheets("Sheet1").Range("D" Rows.Count).End(xlUp).Row LR3 = Sheets("Sheet1").Range("F" Rows.Count).End(xlUp).Row LR4 = Sheets("Sheet2").Range("B" Rows.Count).End(xlUp).Row For j = SR2 To LR4 KINSHI = Sheets("Sheet2").Cells(j , 2).Value For i = SR To LR If Sheets(Sheet1).Cells(i , 2).Value Like ("*" & KINSHI & "*") Then If Cells(i , 10) = "" Then Cells(i , 10) = KINSHI Else   If Cells(i , 10 + 1) = "" Then Cells(i , 10 + 1) = KINSHI            Else   If Cells(i , 10 + 2) = "" Then Cells(i , 10 + 2) = KINSHI Else   If Cells(i , 10 + 3) = "" Then Cells(i , 10 + 3) = KINSHI Else   If Cells(i , 10 + 4) = "" Then Cells(i , 10 + 4) = KINSHI End If End If End If End If End If End If Next i , j 以下上記コードをD列、F列バージョンで並べています・・・・ End Sub 恐らくOffsetプロパティを使う方がいいと思いましたが中々うまくいかず 自分なりに色々考えてみてこんな残念な結果になってしまいましたが 皆様のお力添えどうぞ宜しくお願い致します。

  • VBAで複数列からの条件指定でデータを抽出したい

    講習会の受講者名簿を作成しています。(名簿は科目別で3つのシートに分かれています。) 現在下記モジュールで、受講者名・受講者番号を検索出来るようにしていますが、 別シートに次回受講日(例:2014/4/1~2014/4/31)で受講者を抽出できるようにしたいと考えています。 しかし、受講予定日は過去のものも含め複数列(I列~N列)まであります。 このような場合、どのようにしたら受講日で検索が可能になるでしょうか? 宜しくお願いします。 Sub Sample2() Dim k As Long, endRow As Long, wS As Worksheet Set wS = Worksheets("検索&抽出") If wS.Range("B1") = "" And wS.Range("B2") = "" Then MsgBox "検索データを入力してください" Exit Sub End If endRow = wS.Cells(Rows.Count, "A").End(xlUp).Row If endRow > 4 Then wS.Rows(5 & ":" & endRow).ClearContents End If For k = 2 To 4 With Worksheets(k) If wS.Range("B1") <> "" Then .Range("A1").AutoFilter field:=2, Criteria1:=wS.Range("B1") End If If wS.Range("B2") <> "" Then .Range("A2").AutoFilter field:=3, Criteria1:=wS.Range("B2") End If If .AutoFilter.FilterMode Then endRow = .Cells(Rows.Count, "A").End(xlUp).Row If endRow > 2 Then Range(.Cells(3, "A"), .Cells(endRow, "N")).Copy wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If .AutoFilterMode = False End If End With Next k End Sub

  • 検索でのエラー回避について

    検索でのエラー回避について まとまったデータがあるところから検索したい月及び各項目のデータを検索し、項目シート事に抽出するという作業を行なっています。そこで問題がでました。6月にはデータはあるが、5月にはデータはない。 そうすると以下のコードの場合デバックが入り、次の検索が出来ません。 どうしたらよいのでしょうか? 分かる方がいらっしゃいましたらどうかお願い致します。 'シートの変更 Range("B30").Select Sheets("東京").Select '●Sheet2書込み行 Sheets("東京").Range("A5").CurrentRegion.Clear Sheets("東京").Range("A5:F5").Value = _ Array("依頼書No.", "受付日日", "担当者", "枚数", "工数", "備考") Row2 = 5 For R = 2 To Sheets("日報").Cells(Rows.Count, "A").End(xlUp).Row If Sheets("東京").Range("A2") = Sheets("日報").Cells(R, "A") And _ Sheets("東京").Range("B2") = Month(Sheets("日報").Cells(R, "C")) Then Row2 = Row2 + 1 Sheets("東京").Cells(Row2, "A") = Sheets("日報").Cells(R, "B") Sheets("東京").Cells(Row2, "B") = Sheets("日報").Cells(R, "D") Sheets("東京").Cells(Row2, "C") = Sheets("日報").Cells(R, "F") Sheets("東京").Cells(Row2, "D") = Sheets("日報").Cells(R, "I") Sheets("東京").Cells(Row2, "E") = Sheets("日報").Cells(R, "K") Sheets("東京").Cells(Row2, "F") = Sheets("日報").Cells(R, "L") End If Next R '●抽出結果を日付で並べ替え If Row2 = 5 Then MsgBox "該当データなし!" Else Sheets("東京").Range("A5:F" & Row2).Sort _ Key1:=Range("B6"), Order1:=xlAscending, _ Header:=xlYes, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, SortMethod:=xlPinYin End If Sheets("東京").Select Range("B5:B200").Select Selection.NumberFormatLocal = "yyyy/m/d"     Rows("5:5").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .MergeCells = False End With このあとに式を入れて、罫線を入れてコピーして、というコードが入っています。 どうぞ宜しくお願い致します。

  • excel vbaでリストの範囲設定

    よろしくおねがいします。 Sub 科目自動入力() Sheets("出納帳テンプレート").Select Application.ScreenUpdating = False 'ww列最終行取得 Dim vv As Long ' Sheets("科目シート").Select vv = Sheets("科目シート").Range("v" & Rows.Count).End(xlUp).Row Sheets("出納帳テンプレート").Select 'B列最終行取得 Dim aa As Long '式をフィルダウン aa = Range("B" & Rows.Count).End(xlUp).Row Range("H6").AutoFill Destination:=Range("H6:" & "H" & aa + 100), Type:=xlFillDefault '開始行設定 Dim a As Integer a = 6 kList = Worksheets("科目シート").Range("U2:V127") 'D列「月」欄が空白になるまで繰り返す '一覧に空白が出るか、一致する項目があるまで繰り返す Do Until Cells(a, 4).Value = "" For i = 1 To UBound(kList) If kList(i, 1) = "" Then Exit For '空白だったら抜ける If Cells(a, 7) <> "" Then Exit For 'すでに科目が入力されていれば抜ける If Cells(a, 4).Value Like "*" & kList(i, 1) & "*" Then Cells(a, 7).Value = kList(i, 2) Exit For End If Next i a = a + 1 Loop End sub このようなマクロを組んでいてうまく動作しております。 科目シートにリストがあり 現在はリストをkList = Worksheets("科目シート").Range("U2:V127") と範囲決め打ちしています。 これを範囲可変にしてみようと考えてみたのですが、 kList = Worksheets("科目シート").Range(Cells(2, "U"), Cells(vv, "V")) としても実行時エラー 1004と出てうまくいきません。 ちなみに開始セルは「U2」で変わりません。 終点セルを変数vvで表現したいです。 どうかよろしくお願いします。

  • VBAでのシート選択について

    いつもお世話になります。 VBA初心者で、基本的な質問をしているかもしれませんが、 どうかお付き合いください;; たとえば、以下のようなコードがあったとします。 例) Function Sample() dim x As Integer dim y As Integer x=10 y=100 If x > sheets("シート2").Range("A1") AND y < sheets("シート2").Range("A1") Then 処理 End If End Function 例えば上記のコードのようなものがあったとして、 シート名を省いて文字数を減らす方法はあるでしょうか? 1つのFunction内では「このシート」しか参照しないというような指定が出来ると、 If x > Range("A1") AND y < Range("A1") Then というように簡単にできますよね? 他のFunctionでは、シートの指定はさせたくないので、 End Functionの手前で、「シート指定終了」というのを 記述できればベストなのですが…。 どうかよろしくお願いいたします。

  • VBA 検索するSheetの位置の変更

    現在、グループの数だけユーザー名の合計数をSheet2に抽出するという 事をやっているのですが....... コードの方は下記になります Sub Sample3() Dim i As Long, j As Long, k As Long, lastRow As Long, lastCol As Long Dim wS2 As Worksheet, wS3 As Worksheet Set wS2 = Worksheets("Sheet1") Set wS3 = Worksheets("Sheet2") Application.ScreenUpdating = False If wS2.Range("Y1") = "" Then wS2.Range("Y1") = "ダミー" End If With Worksheets("Sheet1") If .Range("A4") = "" Then .Range("A4") = "ダミー" End If lastRow = .Cells(Rows.Count, "B").End(xlUp).Row Range(.Cells(5, "B"), .Cells(lastRow, "B")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("B:B"), _ wS2.Cells(7, (i - 2) * 8 + 3)) If WorksheetFunction.CountIf(wS2.Columns((i - 2) * 8 + 2), wS2.Cells(k, (i - 2) * 8 + 2)) > 1 Then wS2.Cells(k, (i - 2) * 8 + 2).Resize(, 2).Delete shift:=xlUp End If Next k Next i wS2.Range("B1").CurrentRegion.Borders.LineStyle = xlContinuous wS2.Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole .Cells.Replace what:="ダミー", replacement:="", lookat:=xlWhole wS3.Cells.Clear .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub このコードで検索をかけるSheet1のセルBの文字をセルCに移動して検索かけたいという事なのですが、下記の用なコードでBをCに変更してみた結果エラーが発生してしまいます。 lastRow = .Cells(Rows.Count, "C").End(xlUp).Row Range(.Cells(5, "C"), .Cells(lastRow, "C")).AdvancedFilter Action:=xlFilterCopy, copytorange:=wS3.Range("A1"), unique:=True '★ For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells(7, (i - 2) * 8 + 3) = wS3.Cells(i, "A") .Range("A4").AutoFilter field:=2, Criteria1:=wS3.Cells(i, "A") Range(.Cells(5, "AA"), .Cells(lastRow, "AA")).SpecialCells(xlCellTypeVisible).Copy wS2.Cells(7, (i - 2) * 8 + 2) For k = wS2.Cells(Rows.Count, (i - 2) * 8 + 2).End(xlUp).Row To 7 Step -1 wS2.Cells(k, (i - 2) * 8 + 3) = WorksheetFunction.CountIfs(.Range("AA:AA"), wS2.Cells(k, (i - 2) * 8 + 2), .Range("C:C"), _ どなたかご教授の方お願い致します。

  • VBAで複数列からの条件指定でデータを抽出したい

    講習会の受講者名簿を作成しています。(名簿は科目別で3つのシートに分かれています。) 現在下記モジュールで、受講者名・受講者番号を個々に入力し検索出来るようにしていますが、 受講日(例:2014/4/1~2014/4/31の間)で受講者を抽出できるようにしたいと考えています。 しかし、受講予定日は過去のものも含め複数列(I列~N列)まであり、受講者によって受講日の入力されている列がI列~N列間でまちまちです。 このような場合、どのようにVBAを変更したら受講日で検索が可能になるでしょうか? 宜しくお願いします。 Sub Sample2() Dim k As Long, endRow As Long, wS As Worksheet Set wS = Worksheets("検索&抽出") If wS.Range("B1") = "" And wS.Range("B2") = "" Then MsgBox "検索データを入力してください" Exit Sub End If endRow = wS.Cells(Rows.Count, "A").End(xlUp).Row If endRow > 4 Then wS.Rows(5 & ":" & endRow).ClearContents End If For k = 2 To 4 With Worksheets(k) If wS.Range("B1") <> "" Then .Range("A1").AutoFilter field:=2, Criteria1:=wS.Range("B1") End If If wS.Range("B2") <> "" Then .Range("A2").AutoFilter field:=3, Criteria1:=wS.Range("B2") End If If .AutoFilter.FilterMode Then endRow = .Cells(Rows.Count, "A").End(xlUp).Row If endRow > 2 Then Range(.Cells(3, "A"), .Cells(endRow, "N")).Copy wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) End If .AutoFilterMode = False End If End With Next k End Sub

専門家に質問してみよう