使用循环使用VBA选择变化范围

时间:2017-04-12 08:27:46

标签: excel vba excel-vba loops

我试图一次选择三列数据(例如A:C,行2174)以复制到主文件中,其中在Excel中进行额外的计算。然后我想转到原始文件中的下三列(例如D:F)并重复该过程。对于该过程的第一部分,我有以下代码:

For i = 1 To 72 Step 3

Workbooks(Filename).Sheets("Sheet1").Range(Cells(1, i), Cells(2174, i + 2)).Select
Selection.Copy

代码在此处停止,错误“下标超出范围”,尽管“单元格”引用了正确的单元格和文件名从前面的代码正确输入(或者当它被更改为直接引用文件名时)。

任何明确的原因都不清楚。

修改

我认为错误是由于使用整个文件目录而不仅仅是名称而发生的,添加Filename定义已删除“下标超出范围”错误,但我现在有了

  

运行时错误'438':对象不支持此属性或方法

"With Workbooks(Filename).Sheet1"

整个代码如下:

Sub TestImport()

Dim i As Integer

'creates file directory in specified cell
DataFile = Application.GetOpenFilename

Application.ScreenUpdating = False
'removes right click options
Cancel = True

'clear past data
Range("B48:D5000").ClearContents

'open data file
Workbooks.OpenText Filename:=DataFile, _
    Origin:=437, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
    xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, Semicolon:=False, _
    Comma:=True, Space:=True, Other:=False, FieldInfo:=Array(1, 1), _
    TrailingMinusNumbers:=True

Filename = Right(DataFile, 13)

With Workbooks(Filename).Sheet1
    For i = 1 To 13 Step 3
        .Range(Cells(1, i), Cells(2174, i + 2)).Copy
        Windows("Data Processing.xlsm").Activate
        Range("B48").Select
        Selection.PasteSpecial Paste:=xlPasteAll
        Workbooks.Open DataFile
        ActiveWorkbook.Close savechanges:=False

        'copy key variable from front sheet to Db
        Sheets("Front Sheet").Range("F51:Z53").Copy
        Sheets("Db_KeyVariable").Range("B10000").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues

        'copy summary into Db
        Sheets("Calculations").Range("AO4:BL15").Copy
        Sheets("Db_StrokeData").Range("B10000").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
        Next i
End With

End Sub        

1 个答案:

答案 0 :(得分:0)

您的错误原因是,(Cells(1, i), Cells(2174, i + 2))未获得Workbooks(Filename).Sheets("Sheet1")资格。

此外,无需Select然后使用Selection.Copy,只需直接复制Range(所有Select都是“花费”大量运行 - 时间)。

尝试以下代码:

With Workbooks(Filename).Sheets("Sheet1")
    For i = 1 To 72 Step 3
        .Range(.Cells(1, i), .Cells(2174, i + 2)).Copy
        ' rest of your code goes here...

    Next i
End With