2017-08-04 15 views
0

私はまだVBAを初めて使っていますが、コピーした行と列を別のブックから現在のブックに貼り付けようとしています。私の問題は、選択が宛先の選択よりも大きいので、私が想定しているペーストしようとするとエラーになることです。コードの一部の下に(私が知っている、恐ろしいと選択して):ExcelのVBA貼り付けから見えるセルの選択エラー

dim i as long 

     Workbooks.Open Filename:="C:\Users\...\File1.xls" 
     Range("A15").Select 
     For i = 1 To n 
      ActiveCell.FormulaR1C1 = "=CONCATENATE(RC[1],RC[2])" 
      ActiveCell.Offset(1, 0).Select 
     Next i 
     Range("Q15").Select 
     For i = 1 To n 
     ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-16] ,'[file2.xlsm]DST'!C1:C18,1,0)" 
     ActiveCell.Offset(1, 0).Select 
     Next i 
     ActiveSheet.Range("$A$14:$Q$103").AutoFilter Field:=17, Criteria1:="#N/A" 
     Range("A1").End(xlDown).SpecialCells(xlCellTypeVisible).Copy 
     Windows("File2.xlsm").Activate 
     ThisWorkbook.Worksheets("sheet2").Activate 
     Range("B1").End(xlDown).Offset(1, -1).Select 
     'moves the active cell to the data end of column A 
     Debug.Print "Active cell is " & ActiveCell.Address(False, False) 
     'it puts the cursor correctly here, but it errors out after in the selection 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

基本的に、これはシステムのエクスポートファイル(1)、ユニークな検索キーに新しい列を追加して、コードの一部です。 2番目と3番目の列で構成され、後でVLOOKUP式で欠損した製品があるかどうかを確認し、存在する場合は、レポートファイル(2)に追加されます。列Bは、列Aが数式(選択のために使用できない別のCONCATENATE)を持つために使用されます。

どのようにして選択作業を行うことができますか?

答えて

0

次のコードは解決策ではありませんが、それを含んでいます。

Dim WbTarget As Workbook 
Dim WsT As Worksheet 
Dim Rng As Range 

Set WbTarget = Workbooks("File2.xlsm")   ' must be open 
Set WsT = WbTarget.Worksheets("Sheet2") 
Set Rng = WsT.Range("B1").End(xlDown).Offset(1, -1) 

With ActiveSheet 
    .Range("$A$14:$Q$103").AutoFilter Field:=17, Criteria1:="#N/A" 
    .Range("A1").End(xlDown).SpecialCells(xlCellTypeVisible).Copy Destination:=Rng 
End With 

基本的には、ソースとターゲットが同じサイズであることが必要となる範囲PasteSpecial方法を回避します。

大きな欠陥は、ActiveSheetへの参照です。ここには、ワークブック、ワークシート、および範囲を宣言して設定するためのコードがあります。対象のワークブック、ワークシート、および範囲は決して選択またはアクティブ化されません。私は同じ方法でソースを扱うことをお勧めします。

コードシートの先頭にOption Explicitを設定してください。プロシージャの開始時にすべての宣言を行うことがベストプラクティスであることを忘れないでください。もう1つのアドバイスを許可したい場合は、ワークシート関数ではなく、ワークシート関数の結果をワークシートに書き込むことを検討してください。

関連する問題