对于 IF Else 循环在单元格为空时不会停止
Posted
技术标签:
【中文标题】对于 IF Else 循环在单元格为空时不会停止【英文标题】:For IF Else loop not stopping when cells are empty 【发布时间】:2019-10-29 08:22:21 【问题描述】:我正在创建几个宏来根据公式在 Excel 工作表中填充值,这样文件就不会变得繁重而难以处理。
我在if
语句中使用if else
条件来检查单元格本身和另一列中的单元格是否为空。如果这些单元格为空,则不需要在目标单元格中输入任何值。
如果单元格不为空,我首先填写公式,然后确保只保留值。
但对于不需要填写的单元格,则填写公式。
我尝试了几种类型的循环,我也导出了模块,删除它们并再次导入它们,但这不起作用。
我从下面的代码开始:
Sub ActionCI()
i = 4
x = 4
' x is column number of column which needs to be filled in
For i = 4 To 100
If (ThisWorkbook.Sheets("CHECK IN").Cells(i, x).Value = "" And _
IsEmpty(ThisWorkbook.Sheets("CHECK IN").Cells(i, 2).Value)) Then Exit For
End if
Sheets("CHECK IN").Cells(i, x).Value = "=IFNA(INDEX('PLANNED FOR ARRIVAL'!G:G,MATCH([@REFERENCE],'PLANNED FOR ARRIVAL'!D:D,0)),"""")"
Sheets("CHECK IN").Cells(i, x).Value = Sheets("CHECK IN").Cells(i, x).Value
Next i
End Sub
然后我尝试了:
Sub ActionCI()
i = 4
x = 4
' x is column number of column which needs to be filled in
For i = 4 To 100
If (ThisWorkbook.Sheets("CHECK IN").Cells(i, x).Value = "" And _
IsEmpty(ThisWorkbook.Sheets("CHECK IN").Cells(i, 2).Value)) Then _
ThisWorkbook.Sheets("CHECK IN").Cells(i, x).Value = ""
Exit For
Else
Sheets("CHECK IN").Cells(i, x).Value = "=IFNA(INDEX('PLANNED FOR ARRIVAL'!G:G,MATCH([@REFERENCE],'PLANNED FOR ARRIVAL'!D:D,0)),"""")"
Sheets("CHECK IN").Cells(i, x).Value = Sheets("CHECK IN").Cells(i, x).Value
End If
Next i
End Sub
我可以更改/添加什么来完成这项工作?
我期待细胞 f.ex。在第 10 行第 4 列中,如果之前为空,并且第 10 行第 2 列中的单元格为空,则保持为空。 然而,公式 IFNA... 被插入到这个单元格中(直到第 100 行)
【问题讨论】:
我无法从您提供的内容中重现您的问题。您确定第 2 列中的单元格实际上是空的吗?并且不包含非打印字符或公式?此外,您编写的代码将在遇到第一对空/空白单元格时停止并退出宏,并且不处理范围的其余部分。这就是你想要的吗? 嘿,罗恩,我确定这些单元格中没有字符,因为我先使用清除了需要为空的单元格 Sheets("CHECK IN").Range("B4:B1000").Clear Sheets("CHECK IN").Range("D4:Q1000").Clear 我确实希望代码在遇到第一对空/空白单元格时停止 我没主意了。我复制了你的代码;更改工作表名称,并将公式更改为某个字符串。它的行为与您预期的一样:在 B 列或 D 列中存在非空白的 D 列中填写,然后停止。 【参考方案1】:我会做什么:
-
将
IsEmpty
替换为LenB(Trim(...)
,因为它可以处理从外部源导入或复制数据时可能出现的“不可见”字符
在单元格中插入公式时使用Cells().FormulaLocal
使用 var 作为工作表参考,这在您的情况下是正确的,但需要输入过多且出错的机会
在处理单个工作表/工作簿/等时使用 With
所以代码看起来像这样:
Sub ActionCI()
Dim sh as WorkSheet
i = 4
x = 4
Set sh = ThisWorkbook.Sheets("CHECK IN")
With sh
For i = 4 To 100
If LenB(Trim(.Cells(i, x).Value)) = 0 And _
LenB(Trim(.Cells(i, 2).Value)) = 0 Then
.Cells(i, x).ClearContents ' it is a copy from code but makes no sense for the cell is empty anyway
Exit For
Else
.Cells(i, x).FormulaLocal = "=IFNA(INDEX('PLANNED FOR ARRIVAL'!G:G,MATCH([@REFERENCE],'PLANNED FOR ARRIVAL'!D:D,0)),"""")"
End If
Next i
End With
End Sub
【讨论】:
它们不等价。如果单元格包含公式、空格或空字符串,LenB(Trim(cell_ref))=0
将返回 True
,而 IsEmpty(cell_ref)
将返回 False
@Ron Rosenfeld 绝对正确。但在这种特殊情况下,我认为来自某些外部来源的原始数据不包含公式(@CoKa 将插入它们),但它确实包含无用的空格、空字符串或其他一些可以用LenB(Trim(
有效检测到的空格。跨度>
与此同时,我收到提示,这可能与我使用表格有关。我已经改变了我的桌子的范围,它现在似乎确实可以工作以上是关于对于 IF Else 循环在单元格为空时不会停止的主要内容,如果未能解决你的问题,请参考以下文章