• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルの行の削除を配列で高速化したい)

エクセルの行を高速に削除する方法

このQ&Aのポイント
  • エクセルの行の削除を配列で高速化する方法を教えてください。
  • A列のID番号が同じで、上の属性がA、下の属性がBの場合に、下の行のC列の数値データを上の行のC列の数値に加算して、下の行を削除する方法を教えてください。
  • データ数が多いため、現在のマクロでは1分以上かかってしまいます。配列に取り込んで処理することで高速化できると思われますが、具体的な処理方法について教えてください。

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

  • ベストアンサー
  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.2

試してみて Sub 集計() Dim i As Long, r As Long, j As Long Dim v, vv With ThisWorkbook.Sheets("Sheet1") r = .Cells(65536, 1).End(xlUp).Row Application.ScreenUpdating = False v = .Range("A1").Resize(r, 3).Value '一行多く取得 ReDim vv(1 To UBound(v), 1 To 3) For i = 2 To r If v(i - 1, 1) = v(i, 1) And _ v(i - 1, 2) = "A" And v(i, 2) = "B" Then vv(j, 3) = vv(j, 3) + v(i, 3) Else j = j + 1 vv(j, 1) = v(i, 1) vv(j, 2) = v(i, 2) vv(j, 3) = v(i, 3) End If Next i .Range("A2").Resize(r - 1, 3).ClearContents .Range("A2").Resize(j, 3).Value = vv Application.ScreenUpdating = True End With End Sub

emaxemax
質問者

お礼

遅い時間にありがとうございました。 Sub 集計2()と同データで試してみましたところ大変なスピードで成功しました。 何と1秒ちょっとです!! 配列にての方法を今1行ずつ勉強しています。 タイトル行を含め一度配列vに取り込んで、2行目以降で条件に一致しないデータを別の配列vvにいれて、次行データが条件に一致した場合だけ3列目のデータに加算しているのですね?

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

その他の回答 (4)

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

>このような質問方法はルールに反しているのでしょうか? そうではなくて、車の運転で、横から、スロー・イン・ファースト・アウトを使ってとか、裏道があるから、そちらを使ってとか言われたら、行けると思うなら貴方が運転したら、と言われてしまうと思います。おまけに、#1のお礼のコードで書いたコードは、プロパティの.Value を入れれば、後は、問題ないように思います。なおさら、なぜ、ここまで出来て、自分自身で、配列でトライしないのかって言われかねないと思ってしまいます。こういうことは、お互いの立場を替えれば、分かるような気がしますけれども……。 それに、いろんな事情があって、配列を使えるかどうかは、判断出来ないことがあります。最初にテキストデータのリストだということで、初めて配列での処理をすることはあっても、セル上のリストを、配列上で処理して、それを一旦消して、セル上に貼り付けるというような実務上のコードは、覚えがありません。 私が、こんなことを言いながら、ミスしていれば、世話ないけれどもね。エラーした理由は、単に、同じようなことをしたくなかったので、新しいテクを探しました。このテクニックを読んで使う人はないとは思いますが、まだ一度も出したことのないテクニックです。配列を配列の一括処理を求めました。まだ、実験段階です。このままでは、みっともないので、直しました。まだ、問題があるかもしれません。 '// Sub TestArray2R() Dim arA, arB, arC, x, i As Long, j As Long Const COL As Integer = 3 '←列数 Const A As String = "A" '←分類A Const B As String = "B" '←分類B  For i = 1 To COL   x = x & "," & i  Next i  x = Split(Mid(x, 2), ",")  arA = Range("A2", Cells(Rows.Count, 1).End(xlUp).Offset(1, COL)).Value  ReDim arB(1 To UBound(arA, 1), 1 To 1)  ReDim arC(1 To UBound(arA, 1), 1 To UBound(arA, 2))  j = 1  For i = LBound(arA, 1) To UBound(arA, 1) - 1    If i = UBound(arA, 1) - 1 Then     arB(j, 1) = i    ElseIf arA(i, 1) <> arA(i + 1, 1) Then     arB(j, 1) = i    ElseIf arA(i, 1) = arA(i + 1, 1) And _     arA(i, 2) <> A Or arA(i + 1, 2) <> B Then     arB(j, 1) = i    ElseIf arA(i, 1) = arA(i + 1, 1) And _     arA(i, 2) = A And arA(i + 1, 2) = B Then     arA(i, 3) = arA(i, 3) + arA(i + 1, 3)     arB(j, 1) = i     i = i + 1    End If    j = j + 1  Next  arC = Application.Index(arA, arB, x)  Application.ScreenUpdating = False  Range("A2").Resize(i, 3).ClearContents  Range("A2").Resize(j - 1, COL).Value = arC  Application.ScreenUpdating = True End Sub

emaxemax
質問者

お礼

Sub TestArray2R()は期待通りの動きをしてくれました。 中身はぜんぜん解読できませんが何度もありがとうございます。 > 行けると思うなら貴方が運転したら、 そんな意地悪言わないでくださいな。 裏道知ってる人に「裏道で行ってみて、覚えたいから」ってよくお願いしますよ。 > なぜ、ここまで出来て、自分自身で、配列でトライしないのか 配列にトライしたいから配列で高速化したいと質問したんじゃありませんか。 もちろん質問する前に、「行削除」、「高速化」などのキーワードで検索しましたよ。 それで配列を使った方が飛躍的に早いと知ったわけで・・・。 でも、自分で調べた範囲では、行や列の削除のようなことが配列でどうやれば出来るのか調べられなかったのです。 それで吉田兼好さんもおっしゃるように「何事にも先達はあらまほしきもの」と思い質問させていただきました。 今回はありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

前述のは、 「早くしたい」という観点で気づいたことを回答させてもらいました。 >「配列」を使えば比較にならないくらい早くなるということは、このサイトや他の情報などで聞いておりましたから。 それなら、 「配列の使い方」ということに絞って質問すれば良かったのでは?と思います。 調べるのをもっとがんばればわかったかもしれません・・・。 データ量、マシンの性能などあって同じ「1秒」近くになるとも限りません。 環境や性能のことに絡んでくると、 再現できないので完全なる答えは期待できないこともあります。 必要な部分だけヒントをもらってあとは自システムへ導入、のが堅いです。 早くなって配列も理解できたと思うので結果は良しですが・・・。

emaxemax
質問者

お礼

> 前述のは、「早くしたい」という観点で気づいたことを回答させてもらいました。 はい、おかげさまで削除行にマークして並べ替えるという方位方を覚えました。 ありがとうございます。 勉強になりました。

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

最初、直接の回答ではありませんので読み捨てしていただいて良いのですが、少し私の考え方を言わせてもらいます。 >配列での方法を知りたいです。 もし、回答者にコーディング内容に、「配列」などと、スタイル要求するなら、自分でコードを分かる範囲に書いてくたさい。 #2さんには悪いけれども、初級の内容だと思います。VBAをひと通り使えるようになるには、今回は使っていませんが動的配列までは、覚えなくてはなりません。 こちらで試験したら、3列-3万行で、#2さんのコードで、0.7秒程度で完成するはずです。しかし、個別の書式情報などがあると、別に配列に記録したりしたら、かなり面倒なことになります。 ただ、いずれにしても、今回のようなものは実験コードの一種だと思います。レーシング上でチューンされたマシーンと、そのテクニックで、果たして公道でも使えるかということになるのでは、と余計なことを考えてしまいます。 私は、基本的に、掲示板のマクロのスピード競争には参加しないことにしています。 マクロの完成時間というのは、速いことにこしたことはありませんが、概して感覚的・相対的なものですから、使いやすさが大事なのではないかと思います。 もちろん、そんなことは手前勝手なことですから、人には関係ないかもしれませんが、ただ、ループの考え方がきちんと出来ていれば、配列を処理するのは、それほど難しいものではありません。しかし、元のデータが、外部からではなく、もともとがExcelの生データの場合は、いろんな付随情報が加わえているはずです。そうすると、こうした配列を使うわけにはいきません。 なお、こんなことを書く人間は、多くは生ぬるいコードを書く人が多いので、一応、こちらの技量の証拠だけは書いておきます。いろんな状況を調べてはいませんから、完全とは言えないとは思います。ただ、このコードには、特殊なテクニックを使っています。おそらく、#2さんほどには速くないはずです。しかし、列数の可変が利きます。 '// Sub TestArray2() Dim a, b, x, i As Long, j As Long Const COL As Integer = 3 '列数の設定  For i = 1 To COL   x = x & "," & i  Next i  x = Split(Mid(x, 2), ",")  a = Range("A2", Cells(Rows.Count, 1).End(xlUp).Offset(, COL)).Value  ReDim b(1 To UBound(a, 1), 1 To 1)  ReDim c(1 To UBound(a, 1), 1 To UBound(a, 2))  j = 1  For i = LBound(a, 1) To UBound(a, 1) - 1    If a(i, 1) <> a(i + 1, 1) Then     b(j, 1) = i     j = j + 1    ElseIf a(i, 1) = a(i + 1, 1) Then     a(i, 3) = a(i, 3) + a(i + 1, 3)     b(j, 1) = i     i = i + 1: j = j + 1    End If  Next  c = Application.Index(a, b, x)  Application.ScreenUpdating = False  Range("A2").Resize(i, 3).ClearContents  Range("A2").Resize(j - 1, COL).Value = c  Application.ScreenUpdating = True End Sub

emaxemax
質問者

お礼

ご回答ありがとうございます。 配列ではない方法、ワークシートで実際に行を削除するやり方は質問に掲示したようにもうできていて、それではちょっと時間がかかりすぎるので配列を利用する方法を知りたいという質問でした。 #1さんのアドバイスを見て自分でコードを書き換えて時間は短縮できたのですが、それでもまだ遅かったのでまた「配列での方法を知りたいです」とお願いしたのです。 「配列」を使えば比較にならないくらい早くなるということは、このサイトや他の情報などで聞いておりましたから。 このような質問方法はルールに反しているのでしょうか? であれば、回答者の方に「配列で高速化したい」などとわがままな書き方をしてしまい申し訳ありませんでした。 教えていただきましたSub TestArray2()を試してみました。 時間はやはり1秒ちょっとで早いのですが、結果が違いました。 特殊なテクニックとのことで解読できていませんが、結果から見るとB列の属性についての判定がされず、A列のID番号が上下で一致すれば下の行が削除されてしまうようです。

全文を見る
すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

終わりの Application.ScreenUpdating = TRUE かな?。 削除する行が決まれば、そこにマークしておいて、 削除マークで並べ替えなりフィルタすれば一気に削除。 「削除」「再描画表示」 こういうのが遅くしている可能性あります。

emaxemax
質問者

お礼

> 削除する行が決まれば、そこにマークしておいて、 > 削除マークで並べ替えなりフィルタすれば一気に削除。 なるほどと思いやってみました。 Sub 集計2() Dim i As Long, r As Long r = Cells(65536, 1).End(xlUp).Row Application.ScreenUpdating = False For i = 2 To r Cells(i, 4) = i If Cells(i, 1) = Cells(i - 1, 1) Then If Cells(i - 1, 2) = "A" And Cells(i, 2) = "B" Then Cells(i - 1, 3) = Cells(i, 3) + Cells(i - 1, 3) Cells(i, 4).ClearContents End If End If Next Range(Range("A2:D2"), Range("A2:D2").End(xlDown)).Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlNo, _ Orientation:=xlTopToBottom Application.ScreenUpdating = True End Sub 確かに早くはなりましたがそれでも30秒程度かかります。 配列での方法を知りたいです。

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

関連するQ&A

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 2).Value = Cells(ii, 2).Value _ And Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 5).Value = Cells(ii, 5).Value Then Dim iii As Byte iii = 1 Rows(ii).Delete Shift:=xlUp End If Next ii If iii = 1 Then Rows(i).Delete Shift:=xlUp iii = 0 Next i End Sub データーが下の表のように入っております。     A    B    C    E    F 1  1/26  a1234  fdsa  5000  C1 2  1/27  a4567  sdfa  4000  T2 3  1/28  a1234  dfsa  5000  C1 4  1/30  b4567  asdf  6600  A2 5  2/10  b4567  fsda  6600  A2 6  2/10  a1234  afds  5000  C1 B列、E列、F列が完全一致(重複1行目と3行目と6行目・4行目と5行目)で削除し結果的に2行目だけ残る方法がしたいのですが、このマクロですと少ないデータですとうまく動くのですが、『大量のデータを一気に削除出来ない』、『同じ重複が3つ以上のデータが多数ある場合データが削除されずに残ってしまう』エラーが出てしまいます。どうかお教えください。

  • Excel VB 任意のセルから、最終行までの数式のコピー

    任意のセルに、計算式を入力しております。  A   B   C 1 個数 金額  基準単価 2 5  15000  3000 3 123 25780          4 ・ ・ 600 C2には、B2/A2という計算式が入っております。 この計算式を、C600(浮動)までコピーしたいのですが、 どうしてもうまくいきません。。 Sub 基準単価() Dim i As Integer Application.ScreenUpdating = False  '1行目で検索 For i = Range("IV1").End(xlToLeft).Column To 1 Step -1   If InStr(Cells(1, i).Value, "基準単価") > 0 Then    Cells(2, i).FormulaR1C1 = B2/A2    Cells(2, i)Selection.AutoFill Destination:=    Range("Cells(2, i).End(xlDown)).Type:=xlFillDefault End If  Next i  Application.ScreenUpdating = False End Sub どうぞよろしくお願いします!!  

  • 条件に合った行を削除するマクロについて

    こんにちは 今、現在、とある条件にあった行を削除するマクロ作っているのですが、 インターネットを調べてみると後ろから探索して、1行ずつ消していくのがいいと書いてありました。 まぁ、その理屈はわかるんですが、それなら 「Unionでセルの範囲を結合してから、最後に一度に消してしまった方が速いのでは」 (消す作業が1度だけで済むから) と思い試してみたんですが、実際試したところ・・・ ものすごく遅かったです。 (ちなみに、1万件のデータで削除した行数は6000ほどでした) 何故Union結合だと遅いのでしょうか? 速いマクロを作成するには、やはり後ろから探索して、1行ずつ消していくしかないのでしょうか? 以下は試したマクロです。 (test が unionで試したマクロ、test2が後ろから1行ずつ削除したマクロ) Option Explicit Public Sub test() Dim r As Range Dim r1 As Range 'Cells.Replace "-", " " For Each r In Range("A2", Range("A65536").End(xlUp)) If r = r.Offset(1, 0) And r.Offset(0, 1) < r.Offset(1, 1) Then If r1 Is Nothing Then Set r1 = r Else Set r1 = Union(r1, r) End If End If Next r1.EntireRow.Delete ' r1.Select End Sub Public Sub test2() Dim r As Range Dim r1 As Range Dim i As Integer 'Cells.Replace "-", " " Application.ScreenUpdating = False For i = Range("A65536").End(xlUp).Row To 1 Step -1 If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) < Cells(i + 1, 2) Then Cells(i, 1).EntireRow.Delete End If Next Application.ScreenUpdating = True End Sub

  • VBAで削除を早くしたいのですが…

    Excel2007のVBAです。キー記録を眺めながら四苦八苦しております。 数千行あるデータで、A列が"d"以外の行を削除したいのですが PCスペックが低いせいか、時間がかかってしまいます。 簡単に効率化することは可能でしょうか? よろしくお願いします。 ※1行目はタイトル列、全体行数は可変です。 Sub A05_A列がd以外は削除する() Application.ScreenUpdating = False Dim sh2 As Worksheet Set sh2 = Worksheets("削list") For i = Cells(Rows.Count, "C").End(xlUp).Row To 2 Step -1 If sh2.Cells(i, "A").Value <> "d" Then Rows(i).Delete End If Next Application.ScreenUpdating = True End Sub

  • VBAで空白行を削除する

    VBAでリストの空白行を削除するための適当なコードを探しているのですがどんぴしゃのものが中々見つかりません。ご教授下さい。 ブックBのシートBのリストにはA2~AN●まで値が入っています。 別のブックAからVBAで値を取り出し貼り付けています。 いくつかの方法を試しました。 (1)ブックを開いたときに空白行を削除 Sub Auto_Open() '空白行を削除 Dim lRow As Long Dim i As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = lRow To 2 Step -1 If Cells(i, 1).Value = "" Then Range(i & ":" & i).Delete End If Next i Application.ScreenUpdating = True End Sub 5分以上砂時計のままで結局終わりません。 強制終了させ再度ブックを開くと空白行は削除されているのですが、こんな動作では使うことができません。 (2)ブックAの値を貼り付けた後、空白行を削除し上書き保存する Sub エクスポート() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Range(Cells(5, 7), Cells(79, 46)).Select Selection.Copy 'コピー Workbooks.Open Filename:="\\パス\ブックB.xlsm" '貼り付け先ファイルオープン Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '貼り付け Dim lRow As Long Dim i As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = lRow To 2 Step -1 If Cells(i, 1).Value = "" Then Range(i & ":" & i).Delete End If Next i Application.ScreenUpdating = True  '空白行を削除 ActiveWorkbook.Save '上書き保存 Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub (3)空白行を削除の部分は以下のコードも試しました Worksheets("SheetB").Range("A1").Select Set currentCell = Worksheets("sheetB").Range("A1") Do While Not IsEmpty(currentCell) Set nextCell = currentCell.Offset(1, 0) If Not IsEmpty(currentCell) Then 'カレントセルが空白でなく、 If IsEmpty(nextCell) Then '次のセルが空白のとき nextCell.EntireRow.Delete End If End If Set currentCell = currentCell.Offset(1, 0) Loop '空白行削除 宜しくお願い致します。

  • VBAで教えてください。

    以前ここで教えていただいたVBAで http://jisaku.155cm.com/src/1371930716_9b9006528605642980beed48a8998013b0731e4b.jpg のようにA列のテスト4をクリックしたときにC列のテスト4が一発で解るようにしたいです。 もちろん、テスト11をクリックしたときは、テスト4塗りつぶしは解除され、 テスト11が塗りつぶされるようにしたいです。 写真は塗りつぶししていますが、解るようにしたいだけなので、塗りつぶしにはこだわっていません。 あと、E、F、G列は解りやすく並べているだけで、実際はA、B、C列だけです。 それと、C列は関数を使って表示してあります。 という質問で Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'この行から Dim i As Long Range("C:C").Interior.ColorIndex = xlNone If Application.Intersect(Target, Range("A:A")) Is Nothing Or Target.Count <> 1 Then Exit Sub On Error Resume Next Application.ScreenUpdating = False ActiveSheet.Cells.interio.ColorIndex = xlNone For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, "C") = Target Then Cells(i, "C").Interior.ColorIndex = 3 End If Next i Application.ScreenUpdating = True End Sub 'この行まで をシートのコードに張り付ければいいですよ。と教えてくれたものがあるのですが、 A列でクリックした文字をC列からすべて見つけて反転してくれないようです。何個か反転してくれない ものが出てきてしまいました。 C列が何百行とかなってしまうと、すべての同じ文字を検索してくれないのでしょうか? ちなみに列がここに掲載しているものと違うので Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'この行から Dim i As Long Range("R:R").Interior.ColorIndex = xlNone If Application.Intersect(Target, Range("B:B")) Is Nothing Or Target.Count <> 1 Then Exit Sub On Error Resume Next Application.ScreenUpdating = False ActiveSheet.Cells.interio.ColorIndex = xlNone For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, "R") = Target Then Cells(i, "R").Interior.ColorIndex = 3 End If Next i Application.ScreenUpdating = True End Sub 'この行まで のCをRにAをBに変更して使ってます。 これがいけないのかな? よろしくお願いします。

  • エクセルマクロ行削除

    エクセル2013です。 以下の行削除マクロを作りました。 取得した 最終行が20行目として 最終列がZ列として セル Z20 の値が 1以上なら問題なく動作するのですが セル Z20 の値が 0 だとループして終了しません。 どこを修正しても、思うように動作しません。 どこを修正すれば、いいのでしょうか? よろしくお願いします。 Sub 行削除() Dim 最終行 Dim 最終列 Dim 対象行 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 For 対象行 = 10 To 最終行 If Cells(対象行, 最終列) = 0 Then Rows(対象行).Delete 最終行 = 最終行 - 1 '削除により最終行が1行減ったので最終行の値を1行減らす 対象行 = 対象行 - 1 '削除により対象行が1行繰り上がったので対象行の値を1行減らす Else End If Next 対象行 Application.ScreenUpdating = True '画面切替停止解除 End Sub

  • 二つの条件を満たす行を削除の方法教えて下さい(><)

    エクセルは基本的な事しか分からないのですが、 どうしても仕事で必要で、土日に持ち帰ってきたのですが うまくできません。どなたか教えて下さい。 A B C D 1 3 2 1 4 2 2 2 3 2 2 1 5 4 4 1 3 4 5 2 2 1 2 ちょっと見づらいですが、上記のような表があるとして A列が2 かつ C列が2の行を削除したいです。 条件がひとつだと For R = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1 If Cells(R, "A").Value <> "" ThenIf Cells(R, "A").Value = 2 Then 'Rows(R).Delete xlShiftUp End IfEnd IfNext R で消せたのですが、二つだとうまくいきません。 どなたか教えて下さい。よろしくお願いいたします。

  • 条件にて行削除をするをマクロで高速化したい

    シート(最初)のA,B,C列を連結した値と シート(残)のA,B,C列を連結した値を照合させ 同じ値の場合は シート(残)の該当行を削除です。 シート(最初)は6,182行 シート(残)は7,561行です。 VLookupを使って処理時間5分です。 VLookupを使わない記述で25分です。 20,000行位のデータを処理したいのですが時間が不安です。 別スレで 「VLookupで処理3分をdictionaryオブジェクトで1秒以内にする方法」を 教えていただきましたが、流用ができません。 シート(残)内にもシート(最初)内にも重複行はありません。 私の記述は「F列を検索用に使用」となっていて F列にデータがある場合、都度記述を書換えないと 使えないので、そこも対応したいです。 照合させる値はA,B,Cの連結値というのは変わらないのですが データがある範囲は都度変化する為です。 ・A~E列とかA~H列とか ・シート残はA~E列、シート最初はA~G列とか 記述そのものを教えてください。よろしくお願いします。 Sub 自動重複削除F列使用() 'シート(最初)のA,B,C列とシート(残)のA,B,C列が一致した行は 'シート残の行を削除 'F列を検索値として使用。 Dim Line As Long Dim LastRow As Long Dim myRange As Range Dim Flag 'シート「最初」のF1に、A,B,C列を結合した値を転記 With Sheets("最初") Set myRange = .Range("F2:F" & .Cells(Rows.Count, "A").End(xlUp).Row) .Range("F2").FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]" 'シート「最初」のF2からデータのあるところまで 'F1の規則でデータ貼付 .Range("F2").AutoFill Destination:=myRange End With 'シート「残」のF1に、A,B,C列を結合した値を転記 Sheets("残").Select LastRow = Cells(Rows.Count, "A").End(xlUp).Row Range("F2").FormulaR1C1 = "=RC[-5]&RC[-4]&RC[-3]" 'シート「最初」のF2からデータのあるところまで 'F1の規則でデータ貼付 Range("F2").AutoFill Destination:=Range("F2:F" & LastRow) On Error Resume Next '双方のシートのF列を照合させ、ヒットした行は 'シート「残」から行削除をする For Line = LastRow To 2 Step -1 Flag = WorksheetFunction.VLookup(Cells(Line, 6).Value, myRange, 1, 0) If Err.Number = 0 Then Rows(Line).Delete xlUp Else Err.Clear End If Next Line '検索に使用したF列を削除 Sheets("残").Select Columns("F:F").Select Selection.Delete Shift:=xlToLeft Sheets("最初").Select Columns("F:F").Select Selection.Delete Shift:=xlToLeft Sheets("残").Select Range("A1").Select End Sub ●別方法 Sub 自動重複行削除F列未使用超遅() 'VLOOKUP無 'シート(最初)のA,B,C列とシート(残)の 'A,B,C列が一致した行はシート(残)の行を削除 Dim ws1, ws2 As Worksheet Dim i, j As Long Set ws1 = Worksheets("最初") Set ws2 = Worksheets("残") For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For j = ws2.Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If ws1.Cells(i, 1) = ws2.Cells(j, 1) And ws1.Cells(i, 2) = ws2.Cells(j, 2) And _ ws1.Cells(i, 3) = ws2.Cells(j, 3) Then ws2.Rows(j).Delete (xlUp) End

  • ExcelにおけるVBAで、データの振り分けをしたい

    Sub a() Dim i As Long Dim s As Long Dim b As Worksheet Dim c As Worksheet Dim maxi As Long Dim maxs As Long Application.ScreenUpdating = False With ThisWorkbook Set b = .Worksheets("bbb") Set c = .Worksheets("ccc") End With maxi = b.Range("A1").CurrentRegion.Rows.Count maxs = c.Range("A1").CurrentRegion.Rows.Count For i = maxi To 2 Step -1 For s = maxs To 2 Step -1 If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then c.Cells(s, 14) = b.Cells(i, 3) End If Next s Next i Application.ScreenUpdating = True End Sub ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

専門家に質問してみよう