2017-11-10 18 views
1

次のコードは、さまざまなブック間でコピーしてペーストします。私はなぜそれが "Source.Activate"と "Master.Activate"行なしで動作しないのか分かりませんか?つまり、最初に宣言され、設定されたにもかかわらず、ワークブックのアクティブ化が必要な理由は何ですか?事前にブックをアクティブ化せずにコピーして貼り付ける

Dim Source As Worksheet 
Set Source = Workbooks("Source.xlsx").Worksheets("Settlements") 
Dim Master As Worksheet 
Set Master = Workbooks("Master.xlsm").Worksheets(Sheets.Count) 

Source.Activate '??? 

For Each cell In Source.Columns("M").Cells 
    If cell <> "" Then 
     Master.Activate '??? 
      For Each cell2 In Master.Columns("J").Cells 
       If cell2 <> "" Then 
        If cell = cell2 Then 
         cell2.Offset(0, 9).Value = cell.Offset(0, -2).Value 
         cell2.Offset(0, 8).Value = cell.Offset(0, -8).Value 
        End If 
       End If 
      Next cell2 
    End If 
Next cell 

おかげで、 Bartek

+2

必要はありません。あなたはそれが 'Activate'行なしでは動作しないと言っていますか?それは非常に厄介に見えます - あなたは100万個の細胞をループしています。 – SJR

+0

はい、「有効化」せずに動作しません。 – barciewicz

+0

どうしますか?エラー? – SJR

答えて

1

ソースどちらもリンク先のブックは、コピー/貼り付けを実行するために有効にする必要があります。例:

Sub Macro1() 
    Dim b1 As Workbook, b2 As Workbook 
    Dim r1 As Range, r2 As Range 

    Workbooks.Open Filename:="C:\TestFolder\1\1.xlsx" 
    Set b1 = ActiveWorkbook 
    Set r1 = b1.Sheets("Sheet1").Range("A1") 

    Workbooks.Open Filename:="C:\TestFolder\1\2.xlsx" 
    Set b2 = ActiveWorkbook 
    Set r2 = b1.Sheets("Sheet1").Range("A1") 

    ThisWorkbook.Activate 
    r1.Copy r2 
End Sub 
1

アクティブなブックを使用する場合、アクティブ化する必要はありません。 しかし、マスターファイル内のすべてのセルをループする代わりに、matchまたはfindを使用する必要があります。

Not IsErrorは、不一致をスキップするためのものです。一致が見つからないと、Matchはエラーをスローするためです。 Match関数は、見つかった最初の一致の行番号を返します。

もう1つ.Worksheets(Sheets.Count)は、ワークブック内の最後のワークシートを返します。ソースと同じようにワークシート名に設定してください。

Dim Source As Worksheet 
Dim Master As Worksheet 
Set Source = Workbooks("Source.xlsx").Worksheets("Settlements") 
Set Master = Workbooks("Master.xlsm").Worksheets(Sheets.Count) 

For Each c In Source.Columns("M").Cells 
    If c <> "" Then 

        If Not Application.WorksheetFunction.IsError(Application.Match(c, Master.Columns("J"), 0)) Then 
         crow = Application.Match(c, Master.Columns("J"), 0) 
         Master.Range("J" & crow).Offset(0, 9).Value = c.Offset(0, -2).Value 
         Master.Range("J" & crow).Offset(0, 8).Value = c.Offset(0, -8).Value 
        End If 
       'End If 
      'Next cell2 
    End If 
Next c