2017-08-04 184 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),其中唯一的搜索关键词追加新的列代码的一部分由第二列和第三列组成,稍后在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。请记住,最好的做法是在过程开始时进行所有声明,如果您想允许我提供更多的建议,请考虑将工作表函数的结果写入工作表而不是工作表函数。