• 締切済み

キーワード検索後、部分一致した行のみコピーする方法について

  通達番号  発効日     通達名称   発行部署   (1) 2009001 2009年08月01日 営業推進1   営業部 (2) 2009002 2009年08月02日 予算通知1   経理部 (3) 2009003 2009年08月02日 営業先支援   営業部 (4) 2009004 2009年08月03日 人事異動   人事部     フォームを作成し、キーワード検索をし、部分一致した行のみ 別シートへコピーする仕組みを構築したいと考えております。 現在、下記コードを作成中です。 1行中に同じ用語が複数存在する場合(例:「営業」を検索)、 別シートへは2行のみ((1)と(3))表示したいところ、4行表示 されてしまいます。((1)(1)と(3)(3))というようになります。 どのようにコード変更すればよろしいでしょうか? Option Explicit Private Sub 検索_Click() Dim ws1 As Worksheet, ws2 As Worksheet Dim rng As Range Dim myStr, ra, rr Dim number As Integer Dim cnt As Integer Dim cntstart As Integer Dim cntend As Integer Dim endrows As Integer myStr = TextBox1.Value rr = 2 number = 0 If myStr = "" Then MsgBox "検索する語句を入れてください。" Exit Sub End If Set ws1 = Worksheets(2) Set ws2 = Worksheets(3) With ws1.Range(Cells(3, 1), Cells(100, 10)) Set rng = .Find(What:=myStr, LookAt:=xlPart, After:=.Cells(.Cells.Count)) If rng Is Nothing Then 'なかったら MsgBox "データは見つかりませんでした" Else 'あったら ra = rng.Address '最初に見つかったセルアドレス Do rr = rr + 1 'カウント rng.EntireRow.Copy Destination:=ws2.Cells(rr, 1) '行のコピペ Set rng = .FindNext(rng) '連続検索 Loop While rng.Address <> ra '繰り返し Set rng = Nothing End If End With rr = rr - 2 If rr = 0 Then Else cntstart = 3 cntend = rr + 2 For cnt = cntstart To cntend number = number + 1 Worksheets(3).Range("A" & cnt).Value = number Next cnt End If MsgBox rr & "件を抽出しました。" Set ws1 = Nothing Set ws2 = Nothing End Sub Private Sub 閉じる_Click() UserForm1.Hide End Sub

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

まず考えられるのは 「通達名称」列(項目)で営業が見つかったとき、別シートに書き出し、 「発行部署」列(項目)で営業が見つかったとき、別シートに書き出ししていませんか。==>どうもこれではないらしい。 ーー ロジックは 「通達名称」列で見つからないと脱出(「発行部署」で見つかっても条件満たさず) 見つかったときは「発行部署」列をチェック 見つかったときは別シートに書き指し 見つからないときは脱出 ーー 検索セル=列のセルを限定して検索しないとダメで、質問ではそのセルより先のセル全部を検索対象になっていませんか。それであるなしを判断するとではそのセルより先のセルの(別行でも)通達列と営業列のどちらか一方でも、「営業」があれば、条件を満たしてしまう。 ーー 本件では、各行の2つのセルの問題なので Findメソッド(xlPart)よりINSTR関数がお勧めです。 aaは本件では"営業"。 Sub test02() For i = 1 To 4 p = InStr(Cells(i, 1), "aa") If p <> 0 Then MsgBox i & "行目 aa含む" End If Next i End Sub Findは判定にもIs Nothing の知識が要って初心者向けではない。 使わなければならない場合が多々あるが、本件は1行の2セル限定で考えるべきなので。 ーー Like演算子で Sub test01() For i = 1 To 4 If Cells(i, 1) Like "*aa*" Then MsgBox i & "行目 aa含む" End If Next i End Sub のような方法もある。 例データ(A列) aass qqaaw sdaws sdfadaa

全文を見る
すると、全ての回答が全文表示されます。
  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

文字列が対象の場合、簡易的に[フィルタオプション]を使っても良いかもしれません。 Dim ws1  As Worksheet Dim ws2  As Worksheet Dim myStr As String myStr = Me.TextBox1.Text If myStr = "" Then   MsgBox "検索する語句を入れてください。"   Exit Sub End If Set ws1 = Worksheets(2) Set ws2 = Worksheets(3) ws2.UsedRange.Clear '■注意。ws2をクリアします。 ws1.Range("IV1").Value = "検索条件" ws1.Range("IV2").Formula = "=COUNTIF(A2:J2,""*" & myStr & "*"")>0" ws1.Range("A1").CurrentRegion.Resize(, 10) _         .AdvancedFilter Action:=xlFilterCopy, _                 CriteriaRange:=ws1.Range("IV1:IV2"), _                 CopyToRange:=ws2.Range("A1"), _                 Unique:=False ws1.Range("IV2").ClearContents MsgBox ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row - 1 & "件を抽出しました。" Set ws1 = Nothing Set ws2 = Nothing 検索対象リストはws1.Range("A1").CurrentRegion.Resize(, 10)としてますので 適宜変更してください。 【参考】 [XL2002]複雑な検索条件を使用してリストデータを抽出する方法(「II. 計算検索条件」) http://support.microsoft.com/kb/402757/ja

全文を見る
すると、全ての回答が全文表示されます。
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

シートの1行目が項目名でデータは2行目からとしています。 参考程度に Private Sub 検索_Click()   Dim ws1 As Worksheet, ws2 As Worksheet   Dim rng As Range, myR As Long   Dim myStr As String   myStr = TextBox1.Value   If myStr = "" Then     MsgBox "検索する語句を入れてください。"     Exit Sub   End If   Set ws1 = Worksheets(2)   Set ws2 = Worksheets(3)   myR = 2   For Each rng In ws1.Range("A2", ws1.Cells(Rows.Count, 1).End(xlUp)).Resize(, 4).Rows     If Application.CountIf(rng, "*" & myStr & "*") > 0 Then       rng.Copy ws2.Cells(myR, 1)       ws2.Cells(myR, 1).Value = myR - 1       myR = myR + 1     End If   Next   If myR = 2 Then     MsgBox "データは見つかりませんでした"   Else     MsgBox "データは、" & myR - 2 & "件、見つかりました"   End If End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>別シートへは2行のみ((1)と(3))表示したいところ、4行表示されてしまいます。 表示される以前にエラーがでて動かないでしょう >With ws1.Range(Cells(3, 1), Cells(100, 10)) ↓ With ws1.Range(ws1.Cells(3, 1), ws1.Cells(100, 10))

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

ざっと見た限りですが、 >Set rng = .FindNext(rng) '連続検索 を Set rng = .FindNext(Cells(rng.Row, 10)) '連続検索 とする。 ⇒見つかったセルの同行の10列目の次を検索開始位置としてしまう。 と言うのもありですかね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 検索後、行を抽出するマクロ 2

    はじめまして マクロ初心者です、自分で出来ませんのでやりたいことに合うマクロをネットで探してやっておりますが、どうにもなりませんどなたかご教授お願いします。 下記のマクロで結果はOKなのですが、インプットボックスでは無く特定のセル(”A1”)の値から検索したいのです、また、結果の出る("Sheet2") を1回全てクリアにしてから結果が出る様にしたいのですが、どなたかご教授お願いします。 >Sub test01() >Dim ws1 As Worksheet, ws2 As Worksheet >Dim rng As Range Dim myStr, ra, rr myStr = InputBox("検索する文字", " (´^∇^)σ 入力してください", "") If myStr = "" Then MsgBox "検索文字未指定", vbCritical, " Σ( ̄ロ ̄lll)" Exit Sub End If Set ws1 = Sheets("Sheet1") '検索 シート Set ws2 = Sheets("Sheet2") '貼付先シート With ws1.Columns("A") '部分一致で検索(A列) Set rng = .Find(What:=myStr, LookAt:=xlPart, After:=.Cells(.Cells.Count)) If rng Is Nothing Then 'なかったら MsgBox "ありません", vbCritical, myStr & "? ( ̄~ ̄;)う~ん  " Else 'あったら ra = rng.Address '最初に見つかったセルアドレス Do rr = rr + 1 'カウント rng.EntireRow.Copy Destination:=ws2.Cells(rr, 1) '行のコピペ Set rng = .FindNext(rng) '連続検索 Loop While rng.Address <> ra '繰り返し Set rng = Nothing End If End With MsgBox rr & "件をSheet2に抽出しました。", vbInformation, " ( ̄ー ̄)v" Set ws1 = Nothing Set ws2 = Nothing End Sub

  • 検索後、行を抽出するVBAのProcedureで、

    いつも、参考にさせて頂いております。本当に有難く思っております。 下記のProcedureを使わせていただきたいのですが、検索シートのRange("A1:S1")に見出し行が、ありまして、貼り付け先シートにも見出し行をコピーして、その下の行から Do Loopでコピペしたいのですが、どうしても、記述の仕方がわかりません。MerlionXX様、及び、他にお解りになる方、どうか、お教えください。 1行目に行を挿入したり、Selection.Offset(1, 0).Select で1行さげて、そこへ見出し行をコピペしたりしましたが、貼り付け先シートの1行目のデータが、消えてしまうのです。そのデータの上に見出し行が、貼り付けられてしまうのです。    Selection.Insert Shift:=xlDown これもダメでした。 夜も眠れません。どなたか、下記のProcedure をどのように書き換えたら、貼り付け先シートに見出し行がコピペされ、その次の行から、 検索した行が、繰り返し貼り付けられるようになるのか、お教えください。 Sub test01() Dim ws1 As Worksheet, ws2 As Worksheet Dim rng As Range Dim myStr, ra, rr myStr = InputBox("検索する文字", " (´^∇^)σ 入力してください", "") If myStr = "" Then MsgBox "検索文字未指定", vbCritical, " Σ( ̄ロ ̄lll)" Exit Sub End If Set ws1 = Sheets("Sheet1") '検索 シート Set ws2 = Sheets("Sheet2") '貼付先シート With ws1.Columns("A") '部分一致で検索(A列) Set rng = .Find(What:=myStr, LookAt:=xlPart, After:=.Cells(.Cells.Count)) If rng Is Nothing Then 'なかったら MsgBox "ありません", vbCritical, myStr & "? ( ̄~ ̄;)う~ん  " Else 'あったら ra = rng.Address '最初に見つかったセルアドレス Do rr = rr + 1 'カウント rng.EntireRow.Copy Destination:=ws2.Cells(rr, 1) '行のコピペ Set rng = .FindNext(rng) '連続検索 Loop While rng.Address <> ra '繰り返し Set rng = Nothing End If End With MsgBox rr & "件をSheet2に抽出しました。", vbInformation, " ( ̄ー ̄)v" Set ws1 = Nothing Set ws2 = Nothing End Sub 宜しくお願い申し上げます。m(-_-)m

  • エクセル 最終行からの連続コピー

    * すぐに回答を! エクセルC20からI51までデータを1日1行ずつ入力します。 データが入力されている最終行から上に連続する10行(最終行含む)をコピーしたいのですが、最終行から10行上をどのように認識させたらいいのか、わかりません。Offsetなど試してみましたがダメでした。 よろしくお願いします。 Sub dataコピー() Dim i As Long Dim j As Integer Dim rng As Range '最後尾から10行前までを選択 With Worksheets("月").Range(Cells(20, 3), Cells(51, 10)) For i = Cells(Rows.Count, 1).End(xlUp).Row To -10? If rng Is Nothing Then Set rng = .Rows(i) End If j = j + 1 If j >= 10 Then Exit For Next i 'コピー If Not rng Is Nothing Then rng.Copy Range("M1") Beep Else MsgBox "該当行は存在しません。", 48 End If End With Set rng = Nothing End Sub コードはこちらを参考にしました ​http://questionbox.jp.msn.com/qa5440189.html

  • エクセル 最終行からの連続コピー

    エクセルで最終行から上に連続する10行(最終行含む)をコピーしたいです。 途中、空白行が含まれている場合でも、最終行を特定し、コピーできるようにするには、下記のコードにどう手を加えたらよいでしょうか? どなたかアドバイスをお願いします。 Sub Test()   Dim i As Long   Dim j As Integer   Dim rng As Range   With ActiveSheet     'フィルタ     .Range("A1").CurrentRegion.AutoFilter Field:=1          '行選択     With .AutoFilter.Range       For i = .Cells(.Cells.Count).Row To 2 Step -1         If .Rows(i).Hidden = False Then           If rng Is Nothing Then             Set rng = .Rows(i)           Else             Set rng = Union(rng, .Rows(i))           End If           j = j + 1         End If         If j >= 10 Then Exit For       Next i       'コピー       If Not rng Is Nothing Then         rng.Copy Worksheets("Sheet2").Range("A1")         Beep       Else         MsgBox "該当行は存在しません。", 48       End If     End With   End With   Set rng = Nothing なお、コードはこちらを参考にさせていただきました。 http://okwave.jp/qa3552420.html?ans_count_asc=1

  • ExcelVBA一致しない場合その他の行に集計する

    「ExcelVBA複数条件一致後別シートに結果表示」という質問を以前させていただき、丁寧にコードを解説していただきました。 ※その節はありがとうございました。 ●ファイルの内容(概要)配下の通りの構成です。  <Sheet1>   A列:性別(男性:1、女性:2でコード化)   B列:死因コード(数値5~6桁)   C列:年齢   D列:市町村(3桁でコード化「201」等)  <Sheet2>Sheet1で条件に一致したものを以下の通り表を作成する   ・「セルA1」に表にしたい市町村コードをあらかじめ入力しておく   ・セルB1~セルEC1まで死因コード   ・セルA2~セルA132まで年齢0~130   ・セル範囲B2~EC132に「A1」に入力した市町村コードの男性の値が入る   ・セルB133~セルEC133まで死因コード   ・セルA134~A264まで年齢0~130   ・セル範囲B134~EC264に「A1」に入力した市町村コードの女性の値が入る そして、以下のコードを教えていただきました。 **************************************************** Dim r As Long Dim i As Integer, j As Integer, k As Integer Dim Wsf As Object Dim SCode As Range, Nenrei As Range Dim Ws1 As Worksheet, Ws2 As Worksheet Set Ws1 = Worksheets("sheet1") Set Ws2 = Worksheets("sheet2") Set Wsf = Application.WorksheetFunction Application.ScreenUpdating = False Ws2.Range(Ws2.Cells(2, 2), Ws2.Cells(132, 133)).ClearContents Ws2.Range(Ws2.Cells(134, 2), Ws2.Cells(264, 133)).ClearContents With Ws2 Set SCode = .Range(.Cells(1, 1), .Cells(1, 133))  ↑ここはこのように書いていただいたのから、  指定の死因分類があったためシートから参照するようコードを変えています。  手元にファイルが無くてかけないのが初心者の情けないところです。  申し訳ありません。※シートは同一ファイル内におくようにしています。 End With r = 2 Do While Ws1.Cells(r, 1).Value <> "" If Ws1.Cells(r, 4).Value = Ws2.Cells(1, 1).Value Then If Ws1.Cells(r, 1).Value = 1 Then i = 1 ElseIf Ws1.Cells(r, 1).Value = 2 Then i = 134 End If With Ws2 Set Nenrei = .Range(.Cells(i, 1), .Cells(i + 130, 1)) End With j = i + Wsf.Match(Ws1.Cells(r, 3).Value, Nenrei, 0) - 1 k = Wsf.Match(Ws1.Cells(r, 2).Value, SCode, 0) Ws2.Cells(j, k).Value = Ws2.Cells(j, k).Value + 1 Else End If r = r + 1 Loop Application.ScreenUpdating = True Set Scode = Nothing Set Nenrei = Nothing Set Wsf = Nothing Set Ws1 = Nothing Set Ws2 = Nothing End Sub **************************************************** 表はあらかじめ作成しておくので、そこに集計結果が入ります。 実行していたら、古いファイルに不詳の死因コードが登場し、 どうしたらいいかと考えた結果、死因コードの列の最後に「その他」を設け、 死因コードに一致しない場合にはそこに集計結果をカウントすることは できないか?という考えに至りました。 自分で考えるのが一番勉強になると分かっていても試行錯誤している時間が無く、 急ぎのためお知恵のある方々にご協力を頂ければと思い、 再度質問させていただいた次第です。 前の質問は↓こちらです。 http://okwave.jp/qa/q8356291.html 何卒よろしくお願い申し上げます。

  • VBA 検索して一致したセルへジャンプさせたい

    Excelにて、シート1のA列とシート2のA列のデータにNoを入れます。 シート1のA列のNoをクリックすると、シート2のA列の同じNoにジャンプするマクロを組みたいです。 現在組んでいるマクロは、 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Sht As Worksheet Dim Rng1 As Range Dim Rng2 As Range Dim FindCell As Range Set Sht = Worksheets("シート2") Set Rng1 = Range("A2:A100") Set Rng2 = Sht.Range("A2:A100")If Intersect(Target, Rng1) Is Nothing Then Exit Sub If Target.Count > 1 Then Exit Sub Set FindCell = Rng2.Find(Target.Value) If Not FindCell Is Nothing Then Application.Goto Reference:=FindCell, Scroll:=False End If End Sub です。 一応マクロは実行されますが、そうすると、シート1のA列の編集(Noを追加したり変更したり・・・)できません。 編集や変更もできて、検索マクロも実行できるというマクロの組み方はありますでしょうか?

  • 検索マクロ

    下記のマクロは、検索文字でシートを検索し、そのセルアドレス情報を シートを追加して表示する機能ですが、BOOK全体に検索し、シート名を含めて表示するには、xxxxのところをどのように変更すればいいか。よろしくお願いします。 Sub kennsaku_Macro1() Dim ret Dim r As Range Dim adr As String Dim cnt As Long Dim psw As Boolean Dim mySht, adSht, ws As Worksheet Set mySht = ActiveSheet ret = Application.InputBox("検索文字列を入力してください") If TypeName(ret) <> "Boolean" Then With mySht.Cells Set r = .Find(ret, LookIn:=xlValues, lookat:=xlPart) If Not r Is Nothing Then adr = r.Address cnt = 2 '2行目から表示 xxxxxxxxxxxxx For Each ws In Worksheets If ws.Name = "検索結果" & ret Then psw = True Exit For End If Next ws If psw Then Set adSht = ws adSht.Cells.ClearContents Else Set adSht = Worksheets.Add adSht.Name = "検索結果" & ret End If adSht.Cells(cnt, 1).Value = r.Value adSht.Cells(cnt, 2).Value = xxxx 'シート名 adSht.Cells(cnt, 3).Value = adr Do Set r = .FindNext(r) If r.Address = adr Then Exit Do Else cnt = cnt + 1 adSht.Cells(cnt, 1).Value = r.Value adSht.Cells(cnt, 2).Value = xxxx 'シート名 adSht.Cells(cnt, 3).Value = r.Address End If Loop End If End With End If adSht.Cells(1, 1).Value = "項目" adSht.Cells(1, 2).Value = "シート名" adSht.Cells(1, 3).Value = "セルアドレス" mySht.Activate End Sub

  • VBAを使って検索をしたい

    VBAを使って検索をしたい EXCEL2007を使っております。 フォームを立ち上げて日付を入れるとシートの検索を行い、リスト内にその日付のA~Gまでのセルの内容が表示され、それらを別シートに貼り付けるといったことをしたいのですが、複数のセルの情報をリスト内に表示をするのが、よくわからず教えていただきたく思います。 フォーム内のテキストボックスに検索する日付を入れると 画像でいうところのA列を検索し、その日付内のA~Gをリストに表示して、ボタンを押すと貼り付けるといった、動きにしたいのですが、お願いします。 現状検索BOXに以下の記述をしてます これでは、A列のものだけが出てきます。お助けください。 ************************* Private Sub TextBox1_Change() Dim r As Range, FirstCell As Range, rng As Range Dim vnt As Variant Dim prow As Long Dim s As Worksheet Dim cnt As Long Set s = Sheets("sheet2") Set rng = Intersect(s.Range("a:a"), s.UsedRange) '検索キー Set r = rng.Find(What:=TextBox1.Text) If r Is Nothing Then MsgBox "見つかりませんよ" GoTo Exit_sub End If Set FirstCell = r ReDim vnt(0) vnt(0) = s.Cells(r.Row, 1).Resize(1, 5).Value '検索位置 prow = r.Row cnt = 1 Do Set r = rng.FindNext(r) If Not r Is Nothing And (r.Address <> FirstCell.Address) _ And (FirstCell.Row <> r.Row) And (prow <> r.Row) Then ReDim Preserve vnt(UBound(vnt) + 1) vnt(UBound(vnt)) = s.Cells(r.Row, 1).Resize(1, 5).Value '検索位置 prow = r.Row cnt = cnt + 1 End If Loop While r.Address <> FirstCell.Address ' If cnt = 1 Then vnt = s.Cells(FirstCell.Row, 1).Resize(1, 5).Value '検索位置 If cnt > 1 Then vnt = Application.Transpose(Application.Transpose(vnt)) ListBox1.List = vnt ' Set FirstCell = Nothing Erase vnt Exit_sub: If cnt = 0 Then ListBox1.Clear Set r = Nothing Set rng = Nothing Set s = Nothing End Sub

  • VBA OR条件での検索について教えてください。

    VBA初心者です。また質問させてください。 以前、下記のような表で、『小計』の文字を検索して行を挿入したり、斜め線を引くという内容をVBAでやる方法を教えていただきました。 その節はありがとうございました。 *************************************************************   A    B       C    D 1  2  項目 品名       数量   単位 3     内訳(別紙明細) 1     式 4     ブレーカ      1     ヶ 5     消耗品       1     式   6             7 8           小計 ************************************************************* 今度は『小計』だけでなく『合計』があった場合も、同じ処理をするVBAを作成したいのですがうまくいきません。 以下が記述です。 ************************************************************* Private Sub 斜め線描画_Click() Dim myLine As Shape Dim c As Range Dim cnt As Integer Dim i As Integer cnt = WorksheetFunction.CountIf(Cells, "*小   計*") Set c = Cells.Find(What:="小   計", LookIn:=xlFormulas, LookAt:=xlPart) If Not c Is Nothing Then i = 1 Call LineArranging(c) Do If i >= cnt Then Exit Sub 'カウントでチェック Set c = Cells.FindNext(c) If c Is Nothing Then Exit Sub Call LineArranging(c) i = i + 1 Loop End If Set c = Nothing End Sub Sub LineArranging(rng As Range) Dim BX As Double, BY As Double, EX As Double, EY As Double Dim rngStart As Range, rngEnd As Range Dim myLine As Shape rng.Select ActiveCell.Rows("1:2").EntireRow.Select Selection.Insert Shift:=xlDown rng.Offset(1, 0).Select ActiveCell.Rows("1:2").EntireRow.Select Selection.Insert Shift:=xlDown rng.Offset(-2, 0).Select Selection.EntireRow.Insert ActiveCell.EntireRow.Select Selection.RowHeight = 2 rng.Offset(1, 0).Select Selection.EntireRow.Insert ActiveCell.EntireRow.Select Selection.RowHeight = 2 Set rngStart = rng.Offset(1, -1) Set rngEnd = rng.Offset(-2, 0) BX = rngStart.Left BY = rngStart.Top EX = rngEnd.Left + rngEnd.Width EY = rngEnd.Top Set myLine = Sheet4.Shapes.AddLine(BX, BY, EX, EY) BX = BX + 151.5 BY = BY - 27 EX = EX - 152.25 EY = EY + 26.25 Set myLine = Sheet4.Shapes.AddLine(BX, BY, EX, EY) Set rngStart = Nothing Set rngEnd = Nothing Set myLine = Nothing End Sub ************************************************************* 『または』なのでorを使うのかと思ったのですが、エラーになりうまくいきません。どうしたらいいのか教えてください。 よろしくお願いします。

  • For~Next ループ内でUnionメソッドを使うとエラーになります。

    下記の記述で2行おきのセル範囲から0以下のセルを除外したセル範囲を取得しようとすると Set Rng = Application.Union(r, Rng) の行でエラーが発生します。 'Set Rng = Range(Cells(12, 7), Cells(12, 7)) の行のコメントアウトをはずすと動きますが、 cells(12,7)の値が0以下だと本来の目的 である0以下のセル範囲を除外するという目的が果たせません。 Union(r,Rng)のRngがnothingになっているとエラーの原因になるのでしょうか? Private Sub test() Dim r As Range Dim Rng As Range 'Set Rng = Range(Cells(12, 7), Cells(12, 7)) For i = 12 To 27 Step 3 If Cells(i, 7) > 0 Then Set r = Range(Cells(i, 7), Cells(i, 7)) Set Rng = Application.Union(r, Rng) End If Next i Rng.Select End Sub 以上教えてください。 お願いします。