• ベストアンサー

マクロのループが次へ進みません!!

Sub 不要な行を削除() Dim fWord As String, fAdd, c, wb As Workbook fWord = "ああ"  '←"ああ"の行は複数あります '下記3行はなくてもよいかも。以前、あったほうがうまく実行できましたので。 Workbooks("てすと.xls").Activate Rows("1:1").Select Selection.Insert Shift:=xlDown With Workbooks("てすと.xls").Worksheets(1).Range("A:A") Set c = .Find(fWord, LookIn:=xlValues) If Not c Is Nothing Then fAdd = c.Address Do   c.Offset(-1, 0).EntireRow.Delete    c.Offset(-1, 0).EntireRow.Delete   c.Offset(0, 0).EntireRow.Delete   Set c = .FindNext(c)  '←ここからエラーとなってしまいます Loop While Not c Is Nothing And c.Address <> fAdd End If End With End Sub --- 「実行時エラー’1004’  Range クラスのFindNextプロパティを取得できません。」 とエラー表示されてしまいます。 --- 複数ある「"ああ"の行」の最上の1行だけにのみ実行されるだけです。 間違い箇所をご教示下さいませ。 よろしくお願い致します。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

この処理は"ああ"が含まれる行の2行上から、その行までを削除する処理ですか? まず最初に変だと思うのは >Dim fWord As String, fAdd, c, wb As Workbook です。fAddはc.Addressを代入しているので「As String」であるべきですし、またcは.Find(fWord, LookIn:=xlValues)をSetしているので「As Range」のなるはずです。これで動きましたか? 次に >  c.Offset(0, 0).EntireRow.Delete でFindで見つけたc自体を削除しています。だから > Set c = .FindNext(c)  ではエラーになります。.FindNextメソッドに与えるcが不定値になっているからです。  Sub Macro1() Dim c As Range  Do   Set c = Range("A:A").Find(what:="ああ", LookIn:=xlValues, lookat:=xlWhole)   If c Is Nothing Then Exit Do   c.Offset(-2, 0).Resize(3, 1).EntireRow.Delete  Loop End Sub おそらく質問文の内容の処理では「fAdd」は必要ありません。以上でいけると思います。ただし"ああ"を含む行を削除する条件がもう少し複雑なら「fAdd」が必要かもしれませんが、そこまでは質問文からは読み取れませんでした。

oshietecho-dai
質問者

お礼

早速のご回答、ご詳細、誠に有難うございました。 >この処理は"ああ"が含まれる行の2行上から、その行までを削除する処理ですか? おっしゃられる通りでございます。 下記の3行のみ削除されただけでした。 4 2 5   ←削除 3   ←削除 ああ ←削除 8 5 6 1 9 ああ 3 5 5 1 ああ 説明不足で申し訳ありませんでした。 Resize ですよね、頭がまわりませんでした。 自分としては、非常に難しいコードですので、時間をかけて、解読したいと思います。 でも、全ては、解読できないと思っております。

oshietecho-dai
質問者

補足

ご回答されたコードは、一部のコードだと思ったのですが、 全部に、実行できてしまいました。 こんなにも、短縮してしまっていいんですね!! 私には、点数判定ができないようです・・・  皆様、最良回答です。

その他の回答 (2)

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

コードをそのまま質問に書いて読者・回答者に解読させるのでなく、処理の内容ぐらい文章で説明を添えるべきだ。 それとこの質問は、マクロの記録で、編集ー検索の操作を取れば、ヒントが得られるはず。 見つかったときの、処理内容は理解できなかったので略し、MSGBOXだけにしている。 質問はSheet1と限定してもよかろう。自分で修正できる内容は質問から省いて、コードを短くしてほしい。長いコードはかなわない。 Sub test01() Range("A1").Activate fword = "a" With Worksheets(1).Range("A:A") Set c = .Find(fword, LookIn:=xlValues) If c Is Nothing Then Exit Sub c.Activate MsgBox c.Address fAdd = c.Address '最初見つかったセル番地 Do Set c = .FindNext(after:=ActiveCell) MsgBox c.Address c.Activate Loop While Not c Is Nothing And c.Address <> fAdd 'End If End With End Sub ーー 要点(推奨点、普通は検索は下記でやると言うこと。FindとFindNextを組み合わせるやり方。その場合は下記だということ)違うやり方Find一本やりも考えられそうだが。 (1)c.Activateにして、その後FindNext(after:=ActiveCell)が使えるようにする。 (2).FindNextは同じ文字列などを探すので .FindNext(c) はしない。 私は別質問の回答で、VBAで検索をやるのは難しいですよと注意喚起している。).FindNextはクセが有るように思う。

oshietecho-dai
質問者

お礼

早速のご回答、ご詳細、誠に有難うございました。 説明不足で、申し訳ありませんでした。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 見つけた行をそのつど、削除してまったら、c に確保したRangeオブジェクトを見失ってしまうので、エラーが発生します。なるべく、元のコード自体は維持したまま、修正してみました。 Sub 不要な行を削除R()   Dim fWord As String, fAdd As String, c As Range, wb As Workbook   Dim ur As Range      fWord = "ああ"      Workbooks("てすと.xls").Activate   Rows("1:1").Select   Selection.Insert Shift:=xlDown      With Workbooks("てすと.xls").Worksheets(1).Range("A:A")     Set c = .Find(fWord, LookIn:=xlValues)     If Not c Is Nothing Then       fAdd = c.Address       Do         If c.Row = 2 Then '2行目で発見したら           Set ur = c.Offset(-1).Resize(2)         ElseIf ur Is Nothing Then           Set ur = c.Offset(-2).Resize(3)         Else           Set ur = Union(c.Offset(-2).Resize(3), ur)         End If         Set c = .FindNext(c)       Loop While Not c Is Nothing And c.Address <> fAdd     End If     If Not ur Is Nothing Then       ur.EntireRow.Delete     End If   End With End Sub

oshietecho-dai
質問者

お礼

早速のご回答、誠に有難うございます。 ひょっとして、当方の説明不足もあったかもと思いましたが、 不思議ですね、キッチリ動作しました。

関連するQ&A

  • 「変数の宣言」 が違うのでしょうか?

    Excel 2002 です 下記コードはなんとか動作するんですが、 例えば、「Cells(1, 8).Value」が「2」の時、 「"G:G"」列の「12」にも動作してしまうので、 必ず、「2」だけに動作させたいんですが、 どのように記述すればよいでしょうか? 「Cells(1, 8).Value」と「"G:G"」列は、1~20までの数字しかありません。 他に、おかしな記述箇所がありましたら、教えて下さいませ。 何卒よろしくお願い致します。 ---------------------- Sub 一セルずつ貼付ける() Dim fWord As Integer, fAdd, c fWord = Cells(1, 8).Value With Workbooks("ああ.xls").Worksheets(1).Range("G:G") Set c = .Find(fWord, LookIn:=xlValues) If Not c Is Nothing Then fAdd = c.Address Do c.Offset(0, 5).Copy Worksheets(Worksheets.Count).Range("D65536").End(xlUp). _ Offset(1, 0).PasteSpecial Paste:=xlAll, _ Transpose:=True Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> fAdd End If End With End Sub

  • Excelでマクロ実行後、編集→置換をクリック→問題が発生!

    Windows XP Home Edition Excel 2002 下記1のマクロの実行後に必ず、 編集→置換をクリックしますと、画像の画面が出ます。 そしてExelを再起動すると、編集→置換をクリックしても問題なく使用できます。 しかし、再度、下記1のマクロを実行後、 ●編集→置換をクリック→画像の画面が出ます。 何回、行ってみても同じです。←このような事はよくあるのでしょうか? 下記1のマクロ自体は、正常に動作します。 しかし、 次の作業で、別のマクロを実行しますと、動作はするのですが、 下記2の一部のコードの「置換」が行われなくなります。 素通りしてしまいます。非常に困ります。 しかし、この「別のマクロ」に On Error Resume Next を追記すると  動作します(コードの「置換」も行われます)。  しかし、この直後も必ず、●編集→置換をクリック→画像の画面が出ます。 下記1の「いい」マクロだけを除いて実行するマクロは問題はありません。 ですから、次の作業で、下記2の一部のコード(置換)も、 On Error Resume Next を追記しなくても正常動作してくれます。 どうも、「下記1」の「いい」に問題があるように思いますが・・・ つなぎ合わせ過ぎでしょうか・・・ 原因がはっきり解かりませんが、ただ、今までに、マクロの実行作業中にあまり、 「編集→置換をクリック」の操作はしたこはないので、発覚することがなかったのかもしれません。 ●をなんとか解決できませんでしょうか? 参考:下記2の#DIV/0! #VALUE! は、数値以外の空白セル 、0 、文字等の為になります。    (これは直接的な原因ではないと思います) 何卒、よろしくお願い致します。   Call 下記1 Private Sub 下記1()   Call いい   Call うう   Call ええ   Call おお End Sub Private Sub いい() Dim i As Integer Dim nin As Range Windows("123.xls").Activate   Sheets.Add after:=Worksheets(Worksheets.Count), Count:=1  For i = 1 To Worksheets.Count - 1  Worksheets(i).Activate  With Worksheets(i)   For Each nin In .Range("B4", .Range("B4").End(xlDown))   If nin.Cells.Value = 1 Then    nin.Offset(0, -1).Copy Cells(2, 6)   End If  Next nin End With   Call かか    Range("A23", Range("A23").End(xlDown)).Copy _    Destination:=Worksheets(Worksheets.Count).Range("IV3").End(xlToLeft).Offset(0, 1) Next i End Sub Private Sub かか() Dim fWord As Integer, fAdd, c   fWord = Cells(2, 6).Value    Range("L3").Copy Range("A23")  With Range("G:G")    Set c = .Find(fWord, LookIn:=xlValues, LookAt:=xlWhole)    If Not c Is Nothing Then     fAdd = c.Address     Do      c.Offset(0, 5).Copy      Range("A65536").End(xlUp). _      Offset(1, 0).PasteSpecial Paste:=xlAll, _       Transpose:=True      Set c = .FindNext(c)      Loop While Not c Is Nothing And c.Address <> fAdd     End If     Set c = Nothing  End With   '次に、同様にH列にも動作させる  With Range("H:H")    Set c = .Find(fWord, LookIn:=xlValues, LookAt:=xlWhole)    If Not c Is Nothing Then     fAdd = c.Address     Do     c.Offset(0, 4).Copy     Range("A65536").End(xlUp). _     Offset(1, 0).PasteSpecial Paste:=xlAll, _      Transpose:=True     Set c = .FindNext(c)     Loop While Not c Is Nothing And c.Address <> fAdd    End If     Set c = Nothing   End With End Sub ーーーーーーーーーーーーーーーーーーーーー '下記2   With Range(Range("A2").End(xlDown).Offset(3, 6), Range("A65536").End(xlUp).Offset(0, 25))    .Replace What:="#DIV/0!", Replacement:="0.0", LookAt:=xlPart, _     SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _     ReplaceFormat:=False    .Replace What:="#VALUE!", Replacement:="0.0", LookAt:=xlPart, _     SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _     ReplaceFormat:=False  End With

  • このコードのチェックをお願い致します。

    2種類のブックのデータを → 追加した1つのブックに貼り付けます。 下記 「'------ここからエラーになる----」 からエラーになります。 エラー番号 91 「オブジェクト変数またはWith ブロック変数が設定されていません」 以上 下記コードのチェックをお願い致します。 ------------------------------ Sub tes1() Dim fWord As String, fAdd, c, wb As Workbook fWord = "1" Set wb = Workbooks.Add(xlWBATWorksheet) Workbooks("ああ.CSV").Activate Rows("1:1").Select Selection.Insert Shift:=xlDown With Workbooks("ああ.CSV").Worksheets(1).Range("F:F") Set c = .Find(fWord, LookIn:=xlValues) If Not c Is Nothing Then fAdd = c.Address Do c.Offset(0, 2).Resize(8, 1).Copy wb.Worksheets(1).Range("B65536").End(xlUp). _ Offset(1, 0).PasteSpecial Paste:=xlAll, _ Transpose:=True Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> fAdd End If End With Application.CutCopyMode = False Call tes2 End Sub '-------------------- Sub tes2() Dim aWord As String, aAdd, c, wb As Workbook aWord = "1" Workbooks("いい.CSV").Activate With Workbooks("いい.CSV").Worksheets(1).Range("A:A") Set c = .Find(aWord, LookIn:=xlValues) If Not c Is Nothing Then aAdd = c.Address Do c.Offset(0, 23).Resize(1, 1).Copy '------ここからエラーになる------------------------ wb.Worksheets(1).Range("B65536").End(xlUp). _ Offset(1, 0).PasteSpecial Paste:=xlAll, _ Transpose:=True Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> aAdd End If End With Application.CutCopyMode = False End Sub

  • コードの、どこが間違ってますか?

    下記は、選択した1つのシートだけしか、実行されませんが、どこが間違ってますか? よろしくお願い致します。 ---- Sub 不要な行を削除する() Dim i As Integer On Error Resume Next For i = 9 To Worksheets.Count Worksheets(i).Range(Cells(4, 6).End(xlDown).Offset(2, 0).EntireRow, Cells(4, 6).End(xlDown).Offset(12, 0).EntireRow).Select Selection.Delete Shift:=xlUp Next i  End Sub ----

  • Excel2000のマクロが上手くいきません

    はじめまして、よろしくお願いします。 仕事で下記のような条件のマクロを作っています。 全くの初心者ですが、 いろんなHPを見て例文を書き写したりしながらなんとか作ってみたのですが、 ですが、どうしても上手く実行されません。 お恥ずかしい話ですが、 ものすごく根本的な簡単なミスをしているだと思うのですが、 どの部分が間違っているかも正直分からなくなってきました。 ご教授いただければ幸いです。 「AAファイルのS1シートのA2~B10をBBファイルのS2シートA2~B10へコピーし、 BBのS2シートB2~B10までの中でデータの入っていない行は削除する」 マクロはBBファイルに書き込んでいます。 また、AAとBBの両方を開いて実行もしています。 Sub Workbooks("AA.xls").Worksheets("S1").Range("A2:B10").Copy _ Workbooks("BB.xls").Worksheets("S2").Range("A2") Application.ScreenUpdating = False On Error Resume Next With Columns("A2:A10") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = True .SpecialCells(xlCellTypeVisible).EntireRow.Delete .EntireRow.Hidden = False End With Application.ScreenUpdating = True End Sub お手数おかけいたしますが、よろしくお願いいたします。

  • マクロで困ってます!

    マクロでセル検索かけたらそのセルに設定していたハイパーリンクが外れてしまいます。 どうすればいいでしょうか・・?お力を貸してください! バージョンは2007です! コードは下記になります! 同一ブック内の「データ」というシートにあるものを「検索更新」というシートで検索をかけるというものです。 宜しくお願いします!! Sub 検索2() myLAST = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row + 1 If myLAST < 5 Then myLAST = 5 Range("A5:F" & myLAST).ClearContents Set myC = Sheets(1).Columns(3) _ .Find(What:=Range("E2").Value, _ LookIn:=xlValues, LookAt:=xlPart) ' If myC Is Nothing Then Exit Sub myCa = myC.Address Do myLAST = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row + 1 Range("A" & myLAST) = myC.Row Range("B" & myLAST) = myC.Offset(0, -1) Range("C" & myLAST) = myC.Offset(0, 0) Range("D" & myLAST) = myC.Offset(0, 1) Range("E" & myLAST) = myC.Offset(0, 2) Range("F" & myLAST) = myC.Offset(0, 3) Set myC = Sheets(1).Columns(3).FindNext(myC) If myC Is Nothing _ Or myCa = myC.Address Then Exit Do Loop Set myC = Nothing End Sub Sub 更新() myLAST = Range("A" & ActiveSheet.Rows.Count).End(xlUp).Row If myLAST < 5 Then myLAST = 5 For Each myC In Range("A5:A" & myLAST) If myC.Value = "" Then Exit Sub With Sheets(1) .Range("B" & myC.Value) = myC.Offset(0, 1) .Range("C" & myC.Value) = myC.Offset(0, 2) .Range("D" & myC.Value) = myC.Offset(0, 3) .Range("E" & myC.Value) = myC.Offset(0, 4) .Range("F" & myC.Value) = myC.Offset(0, 5) End With Range("A" & myC.Row & ":F" & myC.Row).ClearContents Next MsgBox "更新しました" End Sub

  • Excelのマクロについて教えてください。

    Excelのマクロについて教えてください。 下記のマクロがあります。 With Range("A" & Rows.Count).End(xlUp) .EntireRow.Copy .Offset(1) .Offset(1).EntireRow.SpecialCells(xlCellTypeConstants).ClearContents .Offset(1).Value = .Value + 1 End With 実際にデータが入っているのはA列~E列までで .EntireRow(行全体)ではなく A?:E? と範囲を指定して上記を実行させたいのですが どのように変更するといいでしょうか。 よろしくお願いします。

  • VBA_マクロ内でマクロ実行

    独学でVBAをやってる初心者です。 よろしくお願いします。 EXCEL2003を使ってます。 例) <A.xlsファイル> Sub File_A () Workbooks.Open Filename:="B" Call File_B Range("A1").Select Selection.Paste End Sub <B.xlsファイル> Sub File_B () Range("A2:T5").Select Selection.Copy End Sub A.xlsファイルを開きマクロFile_Aを実行させると B.xlsファイルのマクロFile_Bを実行することができません。 どうしたらうまく実行できますか? 教えてください。

  • EXCELのマクロについて

    お世話になっております。 以下のマクロを1万行分繰り返したいのですが、回数を1万回と指定する構文を 教えてください。よろしくお願いします。 Sub Macro16() ' ' Macro16 Macro ' ' Keyboard Shortcut: Ctrl+Shift+Z ' ActiveCell.Offset(1, 0).Rows("1:1").EntireRow.Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove ActiveCell.Offset(-1, 0).Range("A1:M1").Select Selection.Copy ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste ActiveCell.Offset(-1, 2).Range("A1").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "7/5/1905" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "7/6/1905" ActiveCell.Offset(1, -2).Range("A1").Select End Sub

  • このコードの修正を、何卒よろしくお願い致します。

    EXEL 2002 です。 下記コードの修正を、何卒よろしくお願い致します。 ------ Sub コピー() Dim i As Integer For i = 1 To 2 Workbooks("コピー元.xls").Activate Worksheets(i).Range("A1", Range("C65536").End(xlUp).Offset(0, 168)).Copy _ Destination:=Workbooks("コピー先.xls").Worksheets(Workbooks("コピー先.xls").Sheets(1).Range("A1")) Next i End Sub

専門家に質問してみよう