debugging 在VBA中检测分页符仅在单步执行代码时有效

niknxzdl  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(182)

我创建了一个函数,该函数返回工作表上发生分页符的行号。当我单步执行每一行代码时,该函数工作得很好,但当我在没有任何断点的情况下运行代码时,它的行为就不同了。此外,使用此函数的子例程会调用它两次。
在没有任何中断或“单步执行”(F8)的情况下运行代码时,第一个函数调用总是正确的,但第二个函数调用总是不正确的。当通过单步执行每一行代码来运行子例程时,第一个和第二个函数调用会产生正确的结果。为什么会这样?

Private Function COA_FindNextPageBreak(r As Long) As Long
'Purpose: Find the next pagebreak on COA sheet,
'Function returns the first cell address on page (first row of new page)
'r is the last row of data on COA sheet.
Dim ws As Worksheet
Dim pb As HPageBreak    'Page Break loc = top left cell.
Set ws = ThisWorkbook.Worksheets("CORE_COA")

'Add cell value to the next 50 rows (col A)
'HPageBreaks detects page breaks within the rows
'all rows after row "r" have row height = 10
ws.Range(ws.Cells(r + 1, "A"), ws.Cells(r + 51, "A")).Value = "x"

With ws
    'Find the next page break after the last row of data
    For Each pb In ws.HPageBreaks
        Debug.Print "pb row: " & pb.Location.Row
        
        If pb.Location.Row > r Then
            COA_FindNextPageBreak = pb.Location.Row
            Exit For
        End If
    Next pb
End With

'Remove the x's - No longer needed.
ws.Range(ws.Cells(r + 1, "A"), ws.Cells(r + 51, "A")).Value = ""
End Function

下面是运行子例程两次的结果。第一次打印输出是通过运行代码(没有步骤/中断),第二次打印输出是通过子例程和函数调用进行单步执行。第一次调用所讨论的函数(COA_FindNextPageBreak)时,将通过名为COA_FindLastRowOnPage的 Package 函数调用它,该 Package 函数返回COA_FindNextPageBreak中的行号减1。第二个函数调用,当通过F5运行代码时,总是导致FRNewPage等于0。有一些事情正在发生与HPageBreaks,但我不知道为什么。

Code ran via F5
LRPage - FindLastRowOnPage (Lrow = 34)
r: 34
pb row: 21
pb row: 40
LRPage: 39
(LPRage == 39)

FRNewPage - FindNextPageBreak (Lrow = 34)
r: 34
pb row: 21
FRNewPage: 0
(FRNewPage = 40)

-----------------------------------------------
Code ran via Step Into (F8)
LRPage - FindLastRowOnPage (Lrow = 34)
r: 34
pb row: 21
pb row: 40
LRPage: 39
(LPRage == 39)

FRNewPage - FindNextPageBreak (Lrow = 34)
r: 34
pb row: 21
pb row: 40
FRNewPage: 40
(FRNewPage = 40)
mum43rcc

mum43rcc1#

可能不是解决方案,但考虑到分页符需要根据更改重新计算,除非您添加Doevents,否则EXCEL将无法在代码执行期间执行它,您应该尝试添加:

Application.Calculate
Do While 
  Application.CalculationState <> xlDone
  DoEvents
Loop

在值/格式的最后一次更新和分页符的循环之间。

相关问题