如果当前选择为空,我想停止循环。我尝试过以下方法:
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
答案 0 :(得分:2)
这个问题是XY Problem的经典案例。
您的四次尝试检测空单元格的主要原因是缺乏对Selection
和ActiveCell
实际上是什么的理解。它们是Application
对象的属性,并返回以下内容
Selection
- 活动工作表的选定对象 (最顶层的工作表)
ActiveCell
- 活动工作表的活动单元格 (最顶层的工作表)
您无法使用Sheets("Sheet3").ActiveCell
或Sheets("Sheet3").Selection
,因为Sheet
对象没有这些属性。
可以使用的内容包括Application.ActiveCell
和Application.Selection
,或者更简单地说,ActiveCell
和Selection
。当然,这仅在激活Sheet3
后才有效。
我首选的方法是:
Sheets("Sheet3").Activate
If (IsEmpty(ActiveCell)) Then Exit Do
您的代码也包含与此位类似的问题:
Criteria1:=Sheets("Sheet3").Application.Selection.Value
虽然代码正确获取Selection
对象,但它实际上并未激活Sheet3
,与写入完全相同:
Criteria1:=Application.Selection.Value
或Criteria1:=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
正如您在回答第一个发布的问题时提到的那样,您确实 需要学习如何避免使用.Select
。 This Stack Overflow post是一个很好的起点。
以下代码与上述代码相同,不使用单个.Select
,.Activate
,Selection
或ActiveCell
。它还包括一种更好的方法来查找列中的最后一个值。 (除非在第一个单元格之后至少有一个单元格包含值,否则您的方法将失败。)
了解代码如何工作的一种有用方法是在其中选择一个单词,例如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