2017-07-05 9 views
2

vlookup、ピボットテーブルはよく慣れていますが、これはVBAで実行できるように感じられます。ここでEXCEL VBA - 条件に一致する列をあるワークシートから書式設定されたワークシートにコピー

は私がやろうとしているものです:

Sheet 1:ヘッダを持つデータシート。 Sheet 2:特定の外観とデータでフォーマットされたサマリーシートは、row 10から始まるシートにのみ貼り付けることができます。

  • sheet 2, B5には、名前を選択できるドロップダウンリストがあります。
  • Sheet 2 B5の値がSheet 1 Column Aと一致するかどうかを誰かが確認できるようにしたい。
  • コードはデータシート(sheet 1)に戻り、Sheet 2 B5と一致する場合はcolumn Aにチェックインします。
  • Sheet 2 B5場合、row 10から始まるsheet 2 INTO、Sheet 1B, C, D, E, H, I, J, K, L, M, N, R, S, T, U, V, W, X, Y、その試合Sheet 2 B5値をコピーし、Sheet 1Column A一致します。

他のノート - Sheet 1からフォーマットはSheet 2にコピーすることはできません。私は内容が必要です。 - コードを実行するボタンはsheet 2です。 (したがって、sheet 2は、マクロ実行時のアクティブシートです)。

私のコード今のところ...

Sub Report() 
Dim finalrow As Integer, i as Integer, name as String 
Sheets("Sheet 2").Range("A10:N29").ClearContents 
name = Sheets("Sheet 2").Range("B5").Value 
For i = 2 To Sheets("Sheet 1").Range("B" & Rows.Count).End(xlUp).Row 
If Cells(i, 1) = name Then 
Range(Cells(i, 2), Cells(i, 25)).Select 
Selection.Copy 
Worksheets("Sheet 2").Select 
erow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row 
ActiveSheet.Cells(erow, 1).Select 
ActiveSheet.PasteSpecial xlPasteFormulasAndNumberFormats 
End If 
Next i 
End Sub 

しかし、私は

ランタイムエラー9

+0

あなたは選択とアクティブ化を避ける必要があります。 – Masoud

答えて

0

実行時エラーは、ほとんどが原因適切細胞に対処しないように起こり得続けます。明示的なコーディングを使用すると、これらのエラーが発生する可能性が低くなり、コードも読みやすくなります。また、コメントを使用します。

Option Explicit 

Sub Report() 

'Declare variables 
    Dim name as String 
    Dim wsh1 As Worksheet, wsh2 As Worksheet 
    Dim erow As Long, i as Long 

'Set the sheets 
    Set wsh1 = ThisWorkbook.Worksheets("Sheet 1") 
    Set wsh2 = ThisWorkbook.Worksheets("Sheet 2") 

'clean destination worksheet 
    wsh2.Range("A10:N29").ClearContents 

    name = wsh2.Range("B5").Value 'condition for copying 

'loop over reference sheet 
    For i = 2 To wsh1.Range("B" & Rows.Count).End(xlUp).Row 

    'Check if the row meets the condition 
    If wsh1.Cells(i, 1) = name Then 

     wsh1.Range(wsh1.Cells(i, 2), wsh1.Cells(i, 25)).Copy 'copy the row 

     erow = wsh2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row 'find last row in wsh2 

     wsh2.Cells(erow, 1).PasteSpecial xlPasteFormulasAndNumberFormats 'paste only values 

    End If 

    Next i 

End Sub 

更新:

OPはそれが行10に常にあるべきであることを述べたように、これは最後の行を使用してより良好なアプローチであろう:

コードの開始時および外部forループ定義erow = 10。 ifブロックは次のようになります。

If wsh1.Cells(i, 1) = name Then 'Check if the row meets the condition 

    wsh1.Range(wsh1.Cells(i, 2), wsh1.Cells(i, 25)).Copy 'copy the row 

    wsh2.Cells(erow, 1).PasteSpecial xlPasteFormulasAndNumberFormats 'paste only values 

    erow = erow + 1 

End If 
+0

Masoud、ありがとう!私はOption Explicitを調べていましたが、以前はそれを試したことがないので不安でした。本当に助けに感謝します。 1つの質問 あなたのアプローチを取った後、私のフォーマットされたセルの下にコピーする必要があります。しかし、私のフォーマットされた細胞が保護されている場合、これは起こるでしょうか? – MAJ10

+0

@ MAJ10あなたの質問があるかどうかわかりません。 *あなたのアプローチを取った後、自分のフォーマットされたセルの下にコピーする必要があります(その素晴らしいことに関係なく)!*どういう意味ですか? – Masoud

+0

シート2では、シート全体がすでに空白のワークシートではないようにフォーマット済みです。何らかの理由で、値がシート2の行30から貼り付けられます。 シート2の1〜29行に書式が設定されています。行30ではなく行10から値を貼り付ける方法を理解したいと思っていました。 感謝しています。ありがとうございます! – MAJ10

関連する問題