vba - 从其他工作簿导入数据而不会丢失日期格式

时间:2016-08-09 09:45:19

标签: vba excel-vba excel

我使用以下代码将数据从一个(已关闭)工作簿(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':下标超出范围。

我不明白为什么它超出了范围。 为什么会出现此错误?是否与使用单元格有关?

1 个答案:

答案 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