如何停止循环如果当前单元格选择为空?

时间:2017-11-23 11:00:40

标签: excel vba excel-vba loops

如果当前选择为空,我想停止循环。我尝试过以下方法:

If (IsEmpty(Sheets("Sheet3").ActiveCell)) Then Exit Do

If Sheets("Sheet3").Selection.Value = "" Then Exit Do ;tried to replace "" with Empty and Nothing but didn't work either

If Sheets("Sheet3").Activecell.Value is Empty Then Exit Do

If Sheets("Sheet3").Selection is blank Then Exit Do

问题是,如果我不以某种方式停止循环它会永远持续下去。

我希望有人能在这里帮助我。

编辑:

这是我的代码:

Public Sub CopyFilteredData()

  Do
    Sheets("Sheet4").Select
    ActiveSheet.Range("$A$1:$R$25239") _
      .AutoFilter _
        Field:=5, _
        Criteria1:=Sheets("Sheet3").Application.Selection.Value
    Range("A1").Select
    ActiveCell.CurrentRegion.Select
    Selection.Copy
    Sheets("Sheet5").Select
    Range("A1").Select
    ActiveCell.End(xlDown).Select
    Selection.Offset(1, 0).Select
    ActiveSheet.Paste
    Range("A1").Select
    ActiveCell.End(xlDown).Select
    Selection.Offset(1, 0).Select
    ActiveCell.FormulaR1C1 = "+"
    Sheets("Sheet3").Select
    Selection.Offset(1, 0).Select
    ' This is where the code to stop the loop needs to go
  Loop

End Sub

5 个答案:

答案 0 :(得分:2)

这个问题是XY Problem的经典案例。

Y解决方案

您的四次尝试检测空单元格的主要原因是缺乏对SelectionActiveCell实际上是什么的理解。它们是Application对象的属性,并返回以下内容

  • Selection - 活动工作表的选定对象 (最顶层的工作表)

  • ActiveCell - 活动工作表的活动单元格 (最顶层的工作表)

您无法使用Sheets("Sheet3").ActiveCellSheets("Sheet3").Selection,因为Sheet对象没有这些属性。

可以使用的内容包括Application.ActiveCellApplication.Selection,或者更简单地说,ActiveCellSelection。当然,这仅在激活Sheet3后才有效。

我首选的方法是:

Sheets("Sheet3").Activate
If (IsEmpty(ActiveCell)) Then Exit Do

您的代码也包含与此位类似的问题:

Criteria1:=Sheets("Sheet3").Application.Selection.Value

虽然代码正确获取Selection对象,但它实际上并未激活Sheet3,与写入完全相同:

Criteria1:=Application.Selection.ValueCriteria1:=Selection.Value

通过将Sheet3选择值存储在变量中来解决此问题,可以得到以下工作代码:

Option Explicit
'(v0.2)
Public Sub Y_Fixed_BUT_VERY_VERY_VERY_BAD_CODE()

  ' Added three lines and changed a fourth to fix the incorrect usage of "Selection" for the criteria
  ' Changed a fifth line to add the correct loop exit code
  Sheets("Sheet3").Activate ' Fix#1 Not necessary if the code is always run from Sheet3
  Dim varSheet3ActiveCellValue As Variant ' Fix#2
  Do
    varSheet3ActiveCellValue = ActiveCell.Value2 ' Fix#3
    Sheets("Sheet4").Select
    ActiveSheet.Range("$A$1:$R$25") _
      .AutoFilter _
        Field:=5, _
        Criteria1:=varSheet3ActiveCellValue ' Fix#4
    Range("A1").Select
    ActiveCell.CurrentRegion.Select
    Selection.Copy
    Sheets("Sheet5").Select
    Range("A1").Select
    ActiveCell.End(xlDown).Select
    Selection.Offset(1, 0).Select
    ActiveSheet.Paste
    Range("A1").Select
    ActiveCell.End(xlDown).Select
    Selection.Offset(1, 0).Select
    ActiveCell.FormulaR1C1 = "+"
    Sheets("Sheet3").Select
    Selection.Offset(1, 0).Select ' Fix#5
    If IsEmpty(ActiveCell) Then Exit Do
  Loop

End Sub

X解决方案

正如您在回答第一个发布的问题时提到的那样,您确实 需要学习如何避免使用.SelectThis Stack Overflow post是一个很好的起点。

以下代码与上述代码相同,不使用单个.Select.ActivateSelectionActiveCell 。它还包括一种更好的方法来查找列中的最后一个值。 (除非在第一个单元格之后至少有一个单元格包含值,否则您的方法将失败。)

了解代码如何工作的一种有用方法是在其中选择一个单词,例如With并按 F1 。这将显示与该单词相关的Excel帮助,并附有说明和示例。

'============================================================================================
' Module     : <in any standard module>
' Version    : 1.0
' Part       : 1 of 1
' References : N/A
' Source     : https://stackoverflow.com/a/47468132/1961728
'============================================================================================
Option Explicit

Public Sub X__GOOD_CODE()

  Dim rngFilterCriteriaList As Range
  With Sheets("Sheet3").Range("A3")
    Set rngFilterCriteriaList = Range(.Cells(1), .EntireColumn.Cells(Rows.Count).End(xlUp))
  End With
  Dim rngCell As Range
  For Each rngCell In rngFilterCriteriaList
    Sheets("Sheet4").Range("A1:R25239") _
      .AutoFilter _
        Field:=Range("E:E").Column, _
        Criteria1:=rngCell.Value2
    Sheets("Sheet4").Range("A1").CurrentRegion.Copy _
      Destination:=Sheets("Sheet5").Range("A:A").Cells(Rows.Count).End(xlUp).Offset(1)
    Sheets("Sheet5").Range("A:A").Cells(Rows.Count).End(xlUp).Offset(1).Value2 = "+"
  Next rngCell
  Sheets("Sheet4").Cells.AutoFilter

End Sub

答案 1 :(得分:-1)

选择可包含1个或多个细胞。如果要检查选择中的所有单元格是否为空,可以使用工作表函数countblank返回空单元格的数量。如果选择中的空单元格数等于选择中的单元格数,则选择中的所有单元格都为空。您的测试可以像这样进行调整

    If Application.WorksheetFunction.CountBlank(Selection) = Selection.Count Then Exit Do

答案 2 :(得分:-1)

如果你不能指定范围,那么必须激活sheet3然后它的工作参考如下:

ThisWorkbook.Worksheets("Sheet3").Activate
If ActiveCell = "" Then
Exit Do
End If

答案 3 :(得分:-1)

如果您未在代码中使用.select更改单元格,则您的选择不会更改,因此可能会导致无限循环。但是在代码中使用.select并不是一种好的做法,因为它会减慢过程。

我建议使用For...each循环,如下所示。

Dim rng as Range
For each rng in selection
    If Len(rng.Value) = 0 then Exit Sub '\\ Exit at first blank cell
    '\\ Do process here
Next rng

答案 4 :(得分:-2)

您的解决方案是here。 从MrExcel.com致信mvptomlinson

正确的代码是

'Your code to loop through copying sheets
    If ActiveSheet.Range("A1").Value = "" Then Exit Sub
'Your code to continue if A1 isn't empty