为什么此vba代码的工作方式取决于我是调试还是运行它?

时间:2019-07-15 20:25:34

标签: vba

我正在尝试对宏进行编码,以将特定值从工作表复制到另一个。当我运行代码时,它可以正常运行,但是如果运行,它就不能运行。

该想法是将所有行从一个工作簿复制到一个新工作簿,但一次仅复制两个行中的某些单元。我用一些琐碎的验证制作了一个宏,然后调用一个函数进行复制。 (可以在“ espaciosEnBlanco”为0或具有正值的情况下调用该函数,并且columnaValorTotal可以是两个不同的列)

参数为:

originWorksheet:原始工作簿

newWorksheet:命运工作簿

valueColumn:我需要其中之一值的列

iFirstRow:索引(从0开始)

blankRows:保留空白行的索引(当您调用该函数并且不需要保留空行时,在此fild中发送0)

iWithoutTitle:另一个索引(从2开始,每次迭代递增1)

nextRowsNeedBlankSpaces:布尔值,表示您需要保留空白行

我试图以多种方式复制它们;复制它们,匹配值,将单元格更改为Range并将值与Range匹配。 我还尝试导入Sleep函数并将其放在所有行之间,并与wait相同,以防万一它没有足够的时间来复制值,但是它也不起作用。

我不明白的是,当我逐行调试它时,它工作得很好。

Public Function CopiarRegistros(originWorksheet, newWorksheet, valueColumn, iFirstRow, blankRows, iWithoutTitle, nextRowsNeedBlankSpaces)

If (Cells((iWithoutTitle + iFirstRow), valueColumn).Value < 0) Then

     originWorksheet.Cells((iWithoutTitle + iFirstRow), "T").Copy Destination:=newWorksheet.Cells((iWithoutTitle - 1 + iFirstRow + blankRows), "B")
     originWorksheet.Cells((iWithoutTitle + 1 + iFirstRow), "T").Copy Destination:=newWorksheet.Cells((iWithoutTitle + 1 - 1 + iFirstRow + blankRows), "B")
     originWorksheet.Cells((iWithoutTitle + 1 + iFirstRow), valueColumn).Copy Destination:=newWorksheet.Cells((iWithoutTitle - 1 + iFirstRow + blankRows), "K")

     newWorksheet.Range("I" & (iWithoutTitle - 1 + iFirstRow + blankRows)).Value = "D"
     newWorksheet.Range("I" & (iWithoutTitle + 1 - 1 + iFirstRow + blankRows)).Value = "C"

Else
     originWorksheet.Cells((iWithoutTitle + iFirstRow), "T").Copy Destination:=newWorksheet.Cells((iWithoutTitle - 1 + iFirstRow + blankRows), "B")
     originWorksheet.Cells((iWithoutTitle + 1 + iFirstRow), "T").Copy Destination:=newWorksheet.Cells((iWithoutTitle + 1 - 1 + iFirstRow + blankRows), "B")
     originWorksheet.Cells((iWithoutTitle + 1 + iFirstRow), valueColumn).Copy Destination:=newWorksheet.Cells((iWithoutTitle - 1 + iFirstRow + blankRows), "K")

     newWorksheet.Range("I" & (iWithoutTitle - 1 + iFirstRow + blankRows)).Value = "C"
     newWorksheet.Range("I" & (iWithoutTitle + 1 - 1 + iFirstRow + blankRows)).Value = "D"

End If

    iFirstRow = iFirstRow + 1

    If (nextRowsNeedBlankSpaces) Then
        blankRows = blankRows + 2
    End If

End Function

2 个答案:

答案 0 :(得分:4)

在标准代码模块中:

Cells((iWithoutTitle + iFirstRow), valueColumn).Value

将引用活动表中的任何内容-通常会导致错误的结果或错误。引用范围时,您需要更加具体-始终指定要涉及的工作表。

答案 1 :(得分:0)

它也可能是微不足道的。我在调试时复制数据时遇到问题。我的代码在调试模式下运行顺利,但是当我尝试运行它时,我得到了不同的结果。这让我发疯,我花了几个小时寻找原因。事实证明,它是折叠的列分组,在调试和运行中改变了代码的行为。为了防止它发生,在工作表中的数据操作之前使用 ThisWorkbook.Sheets("Your sheet name").Outline.ShowLevels ColumnLevels:=8 。