隐藏行后,VBA代码会停止执行而不出错

我有一些代码曾经很好地工作的斗争。 在我的一个潜艇中,我隐藏了一堆行(准确的说是1599),然后取消隐藏我需要的行,通常在200左右。查看代码:

Private Sub HideUnneededRows(numberToShow As Integer) Dim thisSheet As Worksheet Dim allHideableRows As String, rowsToShow As String Dim firstRow As Integer Dim secondRow As Integer Dim lastRow As Integer Dim lastRowToShow As Integer Set thisSheet = ThisWorkbook.Sheets(1) firstRow = thisSheet.Range("mass1").row secondRow = firstRow + 1 lastRow = firstRow - 1 + maxNumberOfRows lastRowToShow = firstRow - 1 + numberToShow '//numberToShow is usually 200 '//THIS NEXT LINE RUNS, BUT STOPS EXECUTING AFTER THE ACTION IS PERFORMED Range("A" + CStr(secondRow) + ":A" + CStr(lastRow)).EntireRow.Hidden = True Range("A" + CStr(secondRow) + ":A" + CStr(lastRowToShow)).EntireRow.Hidden = False End Sub 

一切都很好,直到代码隐藏行(“范围(”A“+ ….)。隐藏”线)的第一个。 它执行隐藏操作就好了,但是不会到达下一行代码,这将是取消隐藏一组不同的行。 我试过的东西:

  • 硬编码范围string(即Range("A25:A1623")而不是Range("A" + CStr(secondRow) + ":A" + ....)
  • 通过Rows对象执行这两个隐藏操作(即Rows("25:1623").Hidden = True
  • 将这两个隐藏行放入新模块中的button_click事件中,查看它是否与当前所在的模块有关

所有这些都产生了完全相同的结果 – 在1599行被隐藏之后,代码将停止所有执行。

帮帮我?!

下面的代码片段用于debugging目的很好(隐藏/取消隐藏行)

 Private Sub HideUnneededRows() Dim thisSheet As Worksheet Dim allHideableRows As String, rowsToShow As String Dim firstRow As Integer Dim secondRow As Integer Dim lastRow As Integer Dim lastRowToShow As Integer 'for debugging purpose numberToShow = 200 maxNumberOfRows = 300 '-------------------- Set thisSheet = ThisWorkbook.Sheets(1) 'firstRow = thisSheet.Range("mass1").Row ' for debugging purpose firstRow = 1 secondRow = firstRow + 1 lastRow = firstRow - 1 + maxNumberOfRows lastRowToShow = firstRow - 1 + numberToShow '//numberToShow is usually 200 '//THIS NEXT LINE RUNS, BUT STOPS EXECUTING AFTER THE ACTION IS PERFORMED Range("A" + CStr(secondRow) + ":A" + CStr(lastRow)).EntireRow.Hidden = True Range("A" + CStr(secondRow) + ":A" + CStr(lastRowToShow)).EntireRow.Hidden = False End Sub 

检查所有的“幻数”,如maxNumberOfRowsvariables(设置为300,用于debugging目的:来自/声明?)和来自“神秘”范围“mass1”的firstRow

注意 :在VBA代码中,string连接通常使用与符号“ & ”来完成,但是这种语法也可以正常工作:

 Range("A" + CStr(secondRow) + ":A" + CStr(lastRow)) 

希望这将解决您的问题。

看起来你是从C#/ Java端 – 使用+来连接string,在VBA中,使用&符号。

假设maxNumberOfRows是一个全局variables或函数,请在下面尝试。

 Private Sub HideUnneededRows(numberToShow As Integer) Dim firstRow As Long, secondRow As Long Dim lastRow As Long, lastRowToShow As Long Dim lCalcMode As Long firstRow = ThisWorkbook.Names("mass1").RefersToRange.Row secondRow = firstRow + 1 lastRow = firstRow - 1 + maxNumberOfRows lastRowToShow = firstRow - 1 + numberToShow '//numberToShow is usually 200 lCalcMode = Application.Calculation Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Rows(secondRow & ":" & lastRow).Hidden = True Rows(secondRow & ":" & lastRowToShow).Hidden = False Application.Calculation = lCalcMode Application.ScreenUpdating = True End Sub 

将行相关的数据types更改为Long (保存Excel做转换)。

感谢@PeterT,我的问题的解决scheme是在运行代码之前closures屏幕更新,然后在代码完成运行之后将其重新打开。 新的代码是这样的:

 Private Sub HideUnneededRows(numberToShow As Integer) Dim thisSheet As Worksheet Dim firstRow As Integer Dim secondRow As Integer Dim lastRow As Integer Dim lastRowToShow As Integer Set thisSheet = ThisWorkbook.Sheets(1) firstRow = thisSheet.Range("mass1").row secondRow = firstRow + 1 lastRow = firstRow - 1 + maxNumberOfRows lastRowToShow = firstRow - 1 + numberToShow '//numberToShow is usually 200 '//Turn off ScreenUpdating Application.ScreenUpdating = False '//THIS NEXT LINE WAS GIVING ME TROUBLES Range("A" + CStr(secondRow) + ":A" + CStr(lastRow)).EntireRow.Hidden = True Range("A" + CStr(secondRow) + ":A" + CStr(lastRowToShow)).EntireRow.Hidden = False '//Turn ScreenUpdating back on Application.ScreenUpdating = True End Sub