我使用以下代码将数据从一个(已关闭)工作簿(test.xlsx)导入另一个(打开)工作簿:
Sub Macro1()
Dim FilePath As String
Dim StartRow As Integer
Dim rep As Integer
Dim ws As Worksheet
Dim SourceWb As Workbook
Dim LastRow As Range
FilePath = "C:\Users\koteletje\Documents\test.xlsx"
StartRow = 1
Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
Set SourceWb = Workbooks.Open(FilePath, True, True)
Set LastRow = SourceWb.Worksheets("Sheet1").Cells.Find(What:="*", After:=SourceWb.Worksheets("Sheet1").Cells(1, 1), _
LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
For rep = StartRow To LastRow.Row
ws.Range("A" & rep & ":II" & rep).Formula = _
SourceWb.Worksheets("Sheet1").Range("A" & rep & ":II" & rep).Formula
Next rep
End Sub
某些列(事先未知)包含日期。复制数据时(参见代码末尾的循环),我无法将日期保留为原始格式;例如'13 / 11/2009 10:09:44'变成'40130.4234259259'。 是否有一种简单的方法可以保留原始格式?
我实际上还有第二个与此代码相关的问题。我没有在循环中使用字母引用'II',而是想使用引入数据的最后一列的数字('II'只是一个被认为足够高的列字母,从不会遇到麻烦)
Set LastColumn = SourceWb.Worksheets("Sheet1").Cells.Find(What:="*", After:=SourceWb.Worksheets("Sheet1").Cells(1, 1), _
LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
并按如下方式更新循环:
For rep = StartRow To LastRow.Row
Worksheets(ws.Name).Range(Cells(rep, 1), Cells(rep, LastColumn.Column)).Formula = _
SourceWb.Worksheets("Sheet1").Range(Cells(rep, 1), Cells(rep, LastColumn.Column)).Formula
Next rep
不幸的是,这会产生错误:运行时错误'9':下标超出范围。
我不明白为什么它超出了范围。 为什么会出现此错误?是否与使用单元格有关?
答案 0 :(得分:2)
您还应该为单元格编写工作表:
ws.Range(ws.Cells(rep, 1), ws.Cells(rep, LastColumn.Column)).Formula = _
SourceWb.Worksheets("Sheet1").Range(SourceWb.Worksheets("Sheet1").Cells(rep, 1), SourceWb.Worksheets("Sheet1").Cells(rep, LastColumn.Column)).Formula
您还可以使用With
获取更轻的代码并省略工作表但保留点:
With SourceWb.Worksheets("Sheet1")
ws.Range(ws.Cells(rep, 1), ws.Cells(rep, LastColumn.Column)).Value = _
.Range(.Cells(rep, 1), .Cells(rep, LastColumn.Column)).Value
End With