2017-01-03 6 views
3

これは、範囲A2を最後の行まで1つのブックからコピーし、別のブックに貼り付けるための単純なマクロコードです。私は初心者で、たくさんのページをグーグルで見つけましたが、自己を助けることに失敗しました。コードをデバッグする際 Excelマクロ実行時エラー '9':範囲外の(Forループ内コピー)

`

Result-

Sub TC_Creation_Sample() 
Dim aPath As String, aFile As String, bFile As String 
Dim FinalRow As Integer, x As Integer 

With Application 
    .ScreenUpdating = False 
    .DisplayAlerts = False 
End With 

aPath = "C:\temp\" 
aFile = aPath & "Config" 
bFile = aPath & "TC_Template" 
Workbooks.Open (aFile) 
Sheets("Config").Activate 
'FinalRow = Cells(Rows.Count, "A").End(xlUp).Row 
FinalRow = Worksheets("Config").Range("A2").End(xlDown) 

For x = 2 To FinalRow 
      Worksheets("Config").Range("A" & x).Select 
      Selection.Copy 
      Workbooks.Open (bFile) 
      Worksheets("TestCases").Range("A" & x).Select 
      ActiveSheet.Paste 
Next x  
End Sub 

` below-貼り付けられ、コードが正常で貼り付けA2値をコピーすることがわかっています。ただし、実行時エラー9がスローされます:添字が範囲外です。ワークシート( "Config")。Range( "A" & x).SelectがNext xの後に2回目に実行されているときにエラーが発生します。私は本当にこのエラーを引き起こしているのか分かりません。親切なアドバイス。

+0

あなたは一度だけ実行する必要がある作業を何度もやっているようです。ブックを開くのが好きです。また、1つ1つループするのではなく、フルレンジを貼り付けて貼り付けようとします。 – CallumDA

+0

** Forループ**は、垂直方向に1つのレコードセルを1つ後に貼り付けられるデータを見る必要があるため実装されています。 – Anshu

答えて

1

これはもっと良いですか? workbooksworkbook variablesに割り当て、selectcopyの方法を取り出しました。他にも提案したように.Rowを追加しました。

Sub TC_Creation_Sample() 
    Dim aPath As String, aFile As String, bFile As String 
    Dim FinalRow As Long, x As Long 
    Dim wbA As Workbook, wbB As Workbook 

    With Application 
     .ScreenUpdating = False 
     .DisplayAlerts = False 
    End With 

    aPath = "C:\temp\" 
    aFile = aPath & "Config" 
    bFile = aPath & "TC_Template" 

    Set wbA = Workbook.Open(aFile) 
    Set wbB = Workbooks.Open(bFile) 

    FinalRow = wbA.Worksheets("Config").Range("A2").End(xlDown).Row 
    'FinalRow = wbA.Worksheets("Config").Cells(Rows.Count, "A").End(xlUp).Row 

    For x = 2 To FinalRow 
     wbB.Worksheets("TestCases").Range("A" & x).Value = wbA.Worksheets("Config").Range("A" & x) 
    Next x 
End Sub 
+0

@ CallumDA-問題を解決しただけでなく、簡単に理解できる提案をありがとう!さらに、FinalRowおよびxはLongに変更されます。 – Anshu

+0

お手伝いいただけると幸いです。問題が解決した場合は、この回答の左側のチェックマークをクリックして回答を受け入れてください。 – CallumDA

1

行番号をFinalRow変数に割り当てていません。試してください:

FinalRow = Worksheets("Config").Range("A2").End(xlDown).Row 
+0

.Rowを追加しようとしましたが、2回目のforループの同じ位置で同じエラーが発生しました。 – Anshu

1

多くの点が言及されています。

ファースト - Excelワークブックには、行の数百万を含めることができます - しかし、あなたは整数としてFinalRowとXの両方を定義しているので、あなたのコードは、のみ32,768行に制限されています。開いているワークブックの1つに32,000を超える行がある場合は、Long Integersを代わりに使用します(Dim XはLong、FinalRowはLong)。

エラーの原因になりました。 2番目のForループを使用してコードを実行すると、アクティブなブックがbFileであり、bFile(aFile上にある)にConfigタブが存在しないため、システムがハングします。 (間違った場所を探しているため、正しいタブが見つからないため)エラーメッセージが表示されてクラッシュします。

ちなみに、あなたのコードは、For..Nextループがトリガーするたびに(bFile)開こうとします。毎回ファイルを開く必要がありますか?確かに、1つのシートから次のシートに詳細をコピーするのは単なるケースですか?

エラー処理も必要です。 aFileに[構成]タブがない場合、またはbFileに[テストケース]タブがない場合、コードがクラッシュします。これらのインスタンスを処理する際にエラー処理を行うことを強くお勧めします。

+0

@ AdzzzUK-コードの誤りを指摘していただきありがとうございます。 – Anshu

関連する問題