我有两个包含多个数据字段的文件(Microsoft Excel 97-2003工作表)。我有一个宏将打开这两个文件,从其中一个文件中复制数据(没有标题),并将数据粘贴到另一个文件中的数据下面。合并数据后,我将组合文件保存为新工作簿。我有一个稍微简化的代码版本(抱歉这是低效的;我写的时候才开始VBA):
Sub Combine()
' Combine Macro
' Turn some things off to speed things up
Application.ScreenUpdating = False
Application.StatusBar = False
Application.EnableEvents = False
' Set to directory where files to combine exist
ChDir "C:\Users\Me\Desktop\Macro Work"
' Variable Declarations
Dim EmptyRow As Long
Dim FileA, FileB As String
Dim Day as Integer
Day = 1
' Loop and combine the two files for each day of the month (if they exist)
Do Until (Day > 31)
' Get FileA and FileB names
FileA = "FileA" & Day & ".xls"
FileB = "FileB" & Day & ".xls"
' Open files A and B; handle error if file doesn't exist
On Error Resume Next
Workbooks.Open FileName:=FileA
If Err.Number = 1004 Then
GoTo NoFile
End If
Workbooks.Open FileName:=FileB
If Err.Number = 1004 Then
GoTo NoFile
End If
On Error GoTo 0
'Copy data from FileB and paste into FileA
EmptyRow = Workbooks(FileA).Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1
Range(Range("A2"), Range("A2").End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy Workbooks(FileA).Worksheets(1).Range("A" & EmptyRow)
' Save combined workbook as FileName in Excel format
Workbooks(FileA).SaveAs FileName:="CombinedFile" & Day, FileFormat:=51
' Close the workbooks
Workbooks("CombinedFile" & Day).Close SaveChanges:=False
Workbooks(FileB).Close SaveChanges:=False
NoFile:
Day = Day + 1
Loop ' End of Loop
MsgBox "PAUSE - End of Macro"
End Sub
我的问题不是Macro不会运行或抛出错误。相反,如果我运行它并且不做任何其他事情,我会得到一组结果。但是如果我运行它并在它运行时单击VBA编辑器窗口,我会得到一组不同的结果。
在宏运行时,您是否应该在计算机上执行其他操作?或者我是否忽略了添加一段代码来保持宏的结果一致,无论我是否坐着观看或点击VBA编辑器窗口?
提前致谢,如果我能提供进一步澄清,请告诉我。
扎卡里
编辑:
很难准确找出组合文件出了什么问题,但我可以看到行数不同。单击编辑器窗口时生成的组合文件比我刚观看它时运行的数千行少。而且我需要撤回我之前声称我可以始终如一地产生同样错误的说法。我可以不断重现错误,但结果可能不同(也许我只缺少4995行而不是5000行)。
利亚姆,你的反应对我有意义。但是,我有一个几乎相同的宏跳过这一部分:'Copy data from FileB and paste into FileA
EmptyRow = Workbooks(FileA).Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1
Range(Range("A2"), Range("A2").End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy Workbooks(FileA).Worksheets(1).Range("A" & EmptyRow)
因为有时我使用的文件只有“FileA”,所以我没有组合任何内容,而是使用宏打开文件并使用新名称SaveAs FileFormat = 51。显然,删除代码中我在文件中选择数据的部分。但点击时我仍会收到不同的结果。可能导致这种情况的原因是什么?
最后,除了删除使用Selection
的代码部分之外,有没有办法帮助防止用户以这种方式搞乱宏的结果?
再次感谢。
答案 0 :(得分:3)
因为你使用:
Range(Range("A2"), Range("A2").End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
仅仅因为screenupdate是假的,并不意味着excel不会执行你的点击。如果您选择其他内容,则无法引用选择并希望不会更改
更新问题的答案
您可以轻松删除"选择"单元格通过在一个范围内定义它们并引用您的新范围。这将消除用户点击和搞乱脚本流程的可能性
'Copy data from FileB and paste into FileA
Dim R1 as Range
Dim R2 as Range
EmptyRow = Workbooks(FileA).Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1
Set R1 = Range(Range("A2"), Range("A2").End(xlDown))
Set R2 = Range(R1, R1.End(xlToRight))
R2.Copy Workbooks(FileA).Worksheets(1).Range("A" & EmptyRow)
这将与原始代码相同,而不使用选择
答案 1 :(得分:0)
消除这些问题的一种方法是在您的调用中引用工作表(Sheets(1).Range(...)),并最小化选择(而不是.Select然后选择。,只需放置Range.Copy或者你在做什么)。多一点代码,但更强大。