如果在运行时单击屏幕,宏会产生不同的结果

时间:2014-06-03 16:08:38

标签: vba excel-vba excel

我有两个包含多个数据字段的文件(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的代码部分之外,有没有办法帮助防止用户以这种方式搞乱宏的结果?

再次感谢。

2 个答案:

答案 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或者你在做什么)。多一点代码,但更强大。