VBAのスピードについてご教示ください

このQ&Aのポイント
  • VBAを使用してエクセル2010で作成したマクロは、エクセル2007では極端にスピードが遅くなります。理由や早くする方法について教えてください。
  • エクセル2007では、VBAのスピードがエクセル2010と比べて遅いです。その理由や対策方法について教えてください。
  • エクセル2007を使用していると、VBAの処理が遅くなることがあります。なぜ遅くなるのか、またどのように早くすることができるのか教えてください。
回答を見る
  • ベストアンサー

VBAのスピードについてご教示ください

下記マクロは、シートAに氏名、郵便番号、住所・・・、と横に住所録を整理していて、列11番目に「対象」と入力されている行を順番にコピーして、シート「送付先一覧」に貼り付けるマクロをコピーしてエクセル2010で使用させていただいてるのですが、職場のエクセル2007では極端にスピードが遅くなります。 エクセル2007では、2010のように早くはならないのでしょうか? 2007を使用してるパソコンが、少し古いからでしょうか? 素人でよくわかりません。 遅くなる理由、また早くする方法があればご教示ください。 Sub 対象抽出() Dim i, LastRow As Long LastRow = Cells(Rows.count, 11).End(xlUp).Row For i = 1 To LastRow If Cells(i, 11) = "対象" Then Rows(i).Copy Sheets("送付先一覧").Cells(Rows.count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

たびたびすみません。#3、4、cjです。 訂正が一点、補足が一点、です。 #4、Sub Re8097433c()の 2つめの' 追加(5行)が編集ミスで誤った記述になっていました。 正しくは、 ' ' ============================== Sub Re8097433c()   Dim i, LastRow As Long, PrintRow As Long   With Application ' 追加(5行)     .ScreenUpdating = False ' 描画更新抑止     .EnableEvents = False ' イベント発行停止     .Calculation = xlCalculationManual ' 再計算手動化   End With   LastRow = Cells(Rows.Count, 11).End(xlUp).Row ' 追加   With Sheets("送付先一覧") ' 追加     PrintRow = .Cells(Rows.Count, 1).End(xlUp).Row ' 追加     For i = 1 To LastRow       If Cells(i, 11) = "対象" Then         PrintRow = PrintRow + 1 ' 追加         Rows(i).Copy .Cells(PrintRow, 1) ' 変更       End If     Next i   End With ' 追加   With Application ' 追加(5行)     .ScreenUpdating = True ' 描画更新再開     .EnableEvents = True ' イベント発行再開     .Calculation = xlCalculationAutomatic ' 再計算自動化   End With End Sub ' ' ============================== でした、以上訂正お願いします。     また、 #3、Sub Re8097433s()の   With ActiveSheet ' (2/2択) についてですが、 標準モジュールの記述として書いています。 ひょっとして、Sheetモジュールで使ってた場合は   With Me ' (2/2択) と書き換える必要があります。 こちらは、オプショナルな話ですけれど。 失礼しました。

natase211
質問者

お礼

何度もありがとうございました。 また、お礼が遅くなって申し訳ありませんでした。 皆さんからご教示いただいたものを参考にして、作成することができました。 本当にありがとうございました。

その他の回答 (4)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

#3、cjです。 ご提示のコードの骨格は変えずに、 無駄を減らして、遅くなる原因への手当てを幾つか追加して いくらか速くして、また、2007と2010での速度差を減らす方向で 考えてみました。 オブジェクトへのアクセスを簡単にすることがテーマですが、 元コードの形を留めるように意識して書いています。 ' ' ============================== Sub Re8097433c()   Dim i, LastRow As Long, PrintRow As Long   With Application ' 追加(5行)     .ScreenUpdating = False ' 描画更新抑止     .EnableEvents = False ' イベント発行停止     .Calculation = xlCalculationManual ' 再計算手動化   End With   LastRow = Cells(Rows.Count, 11).End(xlUp).Row ' 追加   With Sheets("送付先一覧") ' 追加     PrintRow = .Cells(Rows.Count, 1).End(xlUp).Row ' 追加     For i = 1 To LastRow       If Cells(i, 11) = "対象" Then         PrintRow = PrintRow + 1 ' 追加         Rows(i).Copy .Cells(PrintRow, 1) ' 変更       End If     Next i   End With ' 追加   With Application ' 追加(5行)     .ScreenUpdating = False ' 描画更新再開     .EnableEvents = False ' イベント発行再開     .Calculation = xlCalculationManual ' 再計算自動化   End With End Sub ' ' ============================== #3の補足ですが         .Rows(rngFoundTop.Row & ":" & nFoundBtmRow).Copy Sheets("送付先一覧").Cells(1) ' ● これ↑だと、常にSheets("送付先一覧")の先頭から書き出すようになっています。 そうではなくてSheets("送付先一覧")のA列最下行に続けて出力するということでしたら、         .Rows(rngFoundTop.Row & ":" & nFoundBtmRow).Copy Sheets("送付先一覧").Cells(Rows.count, 1).End(xlUp).Offset(1, 0) ' ● と書き換える必要があります。 /// #3では雑に書いてしまいましたが、コピーする必要、についてです。 例えば、 書式をコピーする必要があるか、 例えば、 入力規則が設定されているなら、それもコピーする必要があるか、 例えば、 ボタンなどのコントロールや各種図形が配置されているなら、それもコピーする必要があるか 例えば、 コピー元に数式を設定してある場合、数式のまま貼り付けするか、値のみ貼り付けするか、 とか、、、 こういうこと、ひとつひとつ不要なものをはずしていくことで、 遅さの解消の見込みは立ってくると思いますので。 以上です。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

こんにちは。お邪魔します。 Excel一般機能を使うのでしたら、  並べ替えて  "対象"範囲を一塊りでコピペ  並べ替えを元に戻す という手順が速そうです。 一応、26列*20000行 のダミーサンプルを基準に作成、 XL2010で動作確認しています。 当方、XL2007では試していませんが、理論上同等の効果は出せる筈です。 遅くなる理由はよくわかりませんが、コピー対象となるシェイプが複数あるとか? 何れにしてもコピーしなくていいものはコピーしないように検討してもいいかも。 Excel一般機能フル活用版です。 マクロの記録で得たコードの組み合わせ・アレンジです。 VBAは知らなくてもExcelを知ってる人なら手作業でできるような 基本テクニックしか使っていません。 一応、速くする、方向でお応えしていますが、 こちらでニーズを読み違えているようでしたらご指摘ください。 Sub Re8097433s() ' ' ●要指定:4カ所   Dim rngSearch As Range ' ' UsedRange 内の検索対象列   Dim rngSearchBtm As Range ' ' UsedRange の最下セル   Dim rngReSortKey As Range ' ' 並べ替え復旧用のキー列   Dim rngFoundTop As Range ' 検索最上セル   Dim tnRows As Long ' ' UsedRange の行数   Dim nReSortKeyCol As Long ' ' 並べ替え復旧用のキー列位置   Dim nFoundBtmRow As Long ' 検索最下セルの行位置   Application.ScreenUpdating = False ' お好みで '  With Sheets("Sheet1") ' (1/2択)●元データシートをシート名で指定!!   With ActiveSheet ' (2/2択)     With .UsedRange       tnRows = .Rows.Count       Set rngSearch = .Columns(11) ' ●       Set rngSearchBtm = rngSearch.Cells(tnRows)       nReSortKeyCol = .Columns.Count + 1       Set rngReSortKey = .Columns(nReSortKeyCol)       With rngReSortKey         .Value = "=ROW()"         .Value = .Value       End With       .Resize(, nReSortKeyCol).Sort Key1:=rngSearch, Order1:=xlDescending, Header:=xlNo       Set rngFoundTop = rngSearch.Find(What:="対象", After:=rngSearchBtm, LookAt:=xlWhole, SearchOrder:=xlByRows) ' ●       If Not rngFoundTop Is Nothing Then         nFoundBtmRow = .Range(rngFoundTop, rngSearchBtm).ColumnDifferences(rngFoundTop).Row - 1         .Rows(rngFoundTop.Row & ":" & nFoundBtmRow).Copy Sheets("送付先一覧").Cells(1) ' ●       End If       .Resize(, nReSortKeyCol).Sort Key1:=rngReSortKey, Order1:=xlAscending, Header:=xlNo       rngReSortKey.ClearContents     End With     nFoundBtmRow = .UsedRange.Row   End With   Set rngSearch = Nothing:  Set rngSearchBtm = Nothing:  Set rngReSortKey = Nothing:  Set rngFoundTop = Nothing End Sub

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

処理を早くしたいなら、画面描画を抑止するのが効果ありです。 For i = 1 To LastRow ……の前に↓を、 Application.ScreenUpdating = False Next i ……の後に↓を Application.ScreenUpdating = True 入れてみてください。

natase211
質問者

お礼

ご教示ありがとうございました。 また、お礼が遅くなり申し訳ありません。 ご教示頂いたもので、かなり早くなりました。 今後、他で利用させていただきます。 皆さんからのご教示を参考に、かなり早いものを作成することができました。 ありがとうございます。

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

こんばんは! データ量にもよりますが、For~Nextでループするより、オートフィルタを使った方が早いと思います。 おそらく、「送付先一覧」Sheetの2行目以降に表示するコードだと思いますので、 元データがあるSheetのシートモジュールにしてマクロを実行してみてください。 Sub Sample1() Dim i As Long With ActiveSheet .Rows(1).Insert .Cells(1, 11) = "ダミー" .Cells(1, 11).AutoFilter field:=11, Criteria1:="対象" i = .Cells(Rows.Count, 11).End(xlUp).Row .Rows(2 & ":" & i).Copy Worksheets("送付先一覧").Cells(2, 1) .AutoFilterMode = False .Rows(1).Delete End With End Sub 少しは早くなると思います。m(_ _)m

natase211
質問者

お礼

お礼が遅くなって申し訳ありません。 また、早速のご教示ありがとうございました。 ご教示いただいたものを参考に、作成るすことができました。 やはりオートフィルタを使った方法が一番早い感じですね。 ありがとうございました。

関連するQ&A

  • マクロ 行を切り取ってペーストでエラーになる

    J列に「0」と「#N/A」の行を切り取って集計対象外シートに貼り付けるといったコードです。 何故か途中でエラーになります。 どこが間違っておりますか? 宜しくお願いします。 Dim LastRow As Long LastRow = Cells(Rows.Count, 10).End(xlUp).Row For i = 1 To LastRow If Cells(i, 10) = "0" Or Cells(i, 10) = "#N/A" Then Rows(i).Cut Sheets("集計対象外").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i

  • vba エクセル

    2行目から、最終行までEmptyにしたいのにならないです。 1行目はフィールド行なのに、そのままにしたいのですが 2行目から最終行は空白にしたいです。 なので Sub TEST() With Sheets("log") lastRow = .Cells(.Rows.Count, "b").End(xlUp).Row LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column .Range(.Cells(2, LastCol), .Cells(lastRow, LastCol)) = Empty End With End Sub としたのですが、何も起こりません。 lastRowは100、LastColは5なのですが、 このマクロを実行しても何も起こらないです。 なぜでしょうか?

  • EXCEL VBA 早く処理をする

    よろしくお願いします 下の構文を標準モジュールに書き込み、callで実行しているのですが 処理に時間がかかります。 処理を早くする方法と構文の簡素化のご教示をお願いします。 Application.ScreenUpdating = False For i = 1 To 12 With Worksheets(i) .Select LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A8:G" & LastRow).Sort Key1:=Range("A8"), order1:=xlAscending .Range("G8:G" & LastRow - 1).Formula = "=G7+E8-F8" LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A" & LastRow).Select Dim EndRow As Long EndRow = .Range("A" & Rows.Count).End(xlUp).Row Cells(Rows.Count, 1).End(xlUp).Offset(1, 3) = .Name & "合計" Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) = Application.WorksheetFunction.Sum(Range("E7:E" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) = Application.WorksheetFunction.Sum(Range("F7:F" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(2, 3) = "前月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) = .Range("G7") Cells(Rows.Count, 1).End(xlUp).Offset(2, 5) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 4) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 3) = "次月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(4, 3) = "合計" Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) - Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(4, 4) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) Cells(Rows.Count, 1).End(xlUp).Offset(4, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(1, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(2, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(4, 6) = Cells(Rows.Count, 1).End(xlUp).Offset(0, 6) .Range("C7").End(xlDown).Select Selection.Offset(4, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 2).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 3).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 4).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(0, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 2).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 2).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 3).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 3).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 4).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 4).Borders(xlEdgeBottom).Weight = xlThin End With Next i Application.ScreenUpdating = True

  • マクロで複数の行をまとめて切り取りする方法

    Iの列のセルに「テスト」があったら、その行を切り取ってシート2に貼り付ける といった流れのコードが下記です。 Sub 切り取り() Dim i, LastRow As Long LastRow = Cells(Rows.Count, 9).End(xlUp).Row For i = 1 To LastRow If Cells(i, 9) = “テスト” Then Rows(i).Cut Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub ●Iの列のセルに「テスト」と「課題」があったら、その行を切り取ってシート2に貼り付ける といったものをしたいのです。 1. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト,課題” Then 結果エラー 2. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト&課題” Then 結果エラー 正常なコードを教えてくださいますか? 宜しくお願いします。

  • VBA RemoveDuplicatesが動かない

    以下のマクロを実行しても動きません。 RemoveDuplicatesの行でエラーとなります。 メッセージ:アプリケーション定義またはオブジェクト定義のエラーです。 何が間違ってるのでしょう? エクセル2013 Windows8 E列の重複を削除するマクロです。不要なWithを使っているのは、別マクロから切り出したものだからです。 Sub test() Dim Colref As Long, LastRow As Long With Worksheets("Sheet1") Colref = 5 LastRow = Cells(Rows.Count, Colref).End(xlUp).Row Range(.Cells(1, Colref), .Cells(LastRow, Colref)).RemoveDuplicates Columns:=CVar(Colref), Header:=xlNo End With End Sub

  • VBA 変数を使うべき?

    VBA 変数を使うべき? VBAを独学で勉強中のものです。 エクセルVBAでデータが入っている行数分処理を行いたい場合などに ------------------------------------------------ lastRow = cells(rows.count,1).end(xlup).row for i = 1 to lastRow ・・・ next i ------------------------------------------------ などと最終行を変数に代入して使う場合と ------------------------------------------------ for i = 1 to cells(rows.count,1).end(xlup).row ・・・ next i ------------------------------------------------ などと直接for文の中で指定する場合とでは結果は同じと思うのですが 結果以外の部分で見た場合どちらで行うほうがいいのでしょうか?

  • マクロ 入力する文字に色を付けたい

    Sub CountUp(ByVal mCol1 As String, mCol2 As String) Dim LastRow1 As Long Dim LastRow2 As Long Dim mRow As Long With Sheets("プレーヤー") LastRow1 = .Cells(Rows.Count, mCol1).End(xlUp).Row LastRow2 = .Cells(Rows.Count, mCol2).End(xlUp).Row If LastRow1 > LastRow2 Then mRow = LastRow1 Else mRow = LastRow2 End If If LastRow1 = 1 Then LastRow1 = 2 End If .Cells(mRow + 1, mCol1).Value = .Cells(LastRow1, mCol1) + 1 End With End Sub このコードに文字の色の指定をしたいです Selection.Font.ColorIndex = 3を入れたら赤色文字で入力できるかなと思ったのですがうまくいきませんでした(エラーにはならないのですが、色が付かなかったです)

  • Excel2013にしたらVBAがすごく重くなった

    会社のPCがExcel2010からExcel2013に変更されたのですが、Excel2010の環境で作成していたVBAマクロの処理がもの凄く遅くなってしまいました。 Excel2010では10秒ほど待てば終わった処理が30分以上かかるようになってしまい、業務効率を上げるために作ったVBAが逆に非効率になってしまい困っております。 (フリーズしたような感じになりますが、長時間までは処理は終わり、エラーは出ておりません) Excel2013で重くなった箇所を調べていたら、下記コード部分の繰返し処理で重くなっているのが分かりました。 処理の概要は、「全体」シートの指定列の最終行のセルから指定された番号(12345)があるか1行ずつ調べていき、ヒットしたらその行を全体を切取り、「●●」シートの最終行に貼り付けていく単純なものです。 「全体」シート行数は8000~10000行あります。 ・重くなっている処理の箇所 ================================== Application.ScreenUpdating = False ActiveWorkbook.Worksheets("全体").Activate LastRow = Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To LastRow If Cells(i, 5).Value Like "12345" Then Rows(i).Cut Sheets("●●").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i ================================== Excel2010で問題のなかった処理がExcel2013になって途端に重くなった原因自体も分かりませんが、問題点の回避方法や処理速度を改善する方法はありませんでしょうか。 よろしくお願いいたします。

  • 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"), _ どなたかご教授の方お願い致します。

  • 【Excel VBA】データ貼り付けの開始位置について

    Excel2003を使用しています。 先日、こちらでアドバイスをいただきながら、下記のようなマクロを作りました。内容はあるセルの値と同じ名前のシートへデータをコピーするというものです。 Sheet1に貼り付け元のデータが表形式であり、必要なデータのみ該当のシートへコピーします。マクロ実行後は、別の新しいデータをSheet1へコピペして、またマクロを実行するのですが、その際、データの貼り付け開始位置を前回マクロを実行して貼り付けられたデータから2行空けたいのですが、可能でしょうか? ________________________________________________________________________________________________________________________________ Sub test3() Dim n As Long Dim i As Long Dim j As Long  Worksheets("Sheet1").Activate   For n = 4 To Cells(Rows.Count, 2).End(xlUp).Row    If Cells(n, 3).Value <> "" Then     With Worksheets(CStr(Cells(n, 3).Value))       i = .Cells(Rows.Count, 3).End(xlUp).Row + 1       Cells(n, 2).Copy .Cells(i, 2)       Cells(n, 7).Resize(, 2).Copy .Cells(i, 4)       Cells(n, 11).Copy .Cells(i, 3)     End With    End If    If Cells(n, 13).Value <> "" Then     With Worksheets(CStr(Cells(n, 13).Value))       j = .Cells(Rows.Count, 3).End(xlUp).Row + 1       Cells(n, 12).Copy .Cells(j, 2)       Cells(n, 17).Copy .Cells(j, 4)       Cells(n, 18).Copy .Cells(j, 6)       Cells(n, 11).Copy .Cells(j, 3)     End With    End If   Next n End Sub

専門家に質問してみよう