VBA检查列中的空单元格和打印值
在J列中,有空行和值为checked的行 我曾尝试编写VBA代码,在有空单元格的情况下打印“未选中”,这是可行的,但当它碰到有值(已选中)的单元格时,它会停止。它不会下到下一个单元格,可能是因为单元格中有公式,如果没有完全填充,则不会打印任何内容,但它仍然包含该公式。在我的例子中,在J7之前我有空的单元格,然后在J15再次开始。但关于源数据,这可能会不时发生变化 我想这样做的原因是因为我在J列中有一个公式,它已经打印了一些值,然后是一些VBA代码,它检查不同列中的其他值并打印到J列。J列是过滤器主列排序。我想这就是我必须要做的 我现在的代码是VBA检查列中的空单元格和打印值,vba,excel,Vba,Excel,在J列中,有空行和值为checked的行 我曾尝试编写VBA代码,在有空单元格的情况下打印“未选中”,这是可行的,但当它碰到有值(已选中)的单元格时,它会停止。它不会下到下一个单元格,可能是因为单元格中有公式,如果没有完全填充,则不会打印任何内容,但它仍然包含该公式。在我的例子中,在J7之前我有空的单元格,然后在J15再次开始。但关于源数据,这可能会不时发生变化 我想这样做的原因是因为我在J列中有一个公式,它已经打印了一些值,然后是一些VBA代码,它检查不同列中的其他值并打印到J列。J列是过滤器
Sub DoIfNotEmpty()
Dim ra As Range, re As Range
With ThisWorkbook.Worksheets("Sheet1")
Set ra = .Range("J:j25")
For Each re In ra
If IsEmpty(re.Value) Then
re.Value = "unchecked"
End If
Next re
End With
End Sub
如果单元格中包含一个公式,而在这种情况下,该公式有一个未填充的
if
语句,我是否可以打印到空单元格?您可以利用范围对象的特殊单元格()方法:
Sub DoIfNotEmpty()
ThisWorkbook.Worksheets("Sheet1").Range("J1:J25").SpecialCells(xlCellTypeBlanks).Value = "unchecked"
End Sub
或者,如果公式返回空白,则AutoFilter()
“空白”单元格并写入其中
Sub DoIfNotEmpty()
With ThisWorkbook.Worksheets("Sheeet1").Range("J1:J25") '<--| reference your range (first row must be a "header")
.AutoFilter Field:=1, Criteria1:="" '<--| filter its empty cells
If Application.WorksheetFunction.Subtotal(103, .cells) > 1 Then .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Value = "unchecked" '<--| if any cell filtered other than headers then write "unchecked" in them
.Parent.AutoFilterMode = False
End With
End Sub
Sub DoIfNotEmpty()
使用此工作簿.Worksheets(“Sheeet1”).Range(“J1:J25”)可以利用Range
对象的Specialcells()
方法:
Sub DoIfNotEmpty()
ThisWorkbook.Worksheets("Sheet1").Range("J1:J25").SpecialCells(xlCellTypeBlanks).Value = "unchecked"
End Sub
或者,如果公式返回空白,则AutoFilter()
“空白”单元格并写入其中
Sub DoIfNotEmpty()
With ThisWorkbook.Worksheets("Sheeet1").Range("J1:J25") '<--| reference your range (first row must be a "header")
.AutoFilter Field:=1, Criteria1:="" '<--| filter its empty cells
If Application.WorksheetFunction.Subtotal(103, .cells) > 1 Then .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Value = "unchecked" '<--| if any cell filtered other than headers then write "unchecked" in them
.Parent.AutoFilterMode = False
End With
End Sub
Sub DoIfNotEmpty()
使用此工作簿.Worksheets(“Sheeet1”).Range(“J1:J25”)”时,除了@Maxime Porté指出它应该是.Range(“J1:J25”)
。我猜这些细胞看起来只是空的,但它们不是
包含空字符串“”
”的单元格不再是空的,但看起来是空的。您可以这样测试它:
在新的工作表中,用A1:=”
(中间没有空格!)
复制A1和A1中的特殊粘贴值。A1现在看起来是空的
在VBA中运行Debug.Print IsEmpty(范围(“A1”).Value)
,您会得到一个FALSE
单元格A1不再为空,因为它包含一个空字符串
你能做什么?
Sub DoIfNotEmpty()
Dim ra As Range, re As Range
With ThisWorkbook.Worksheets("Sheet1")
Set ra = .Range("J1:J25")
For Each re In ra
If IsEmpty(re.Value) or re.Value = vbNullString Then
re.Value = "unchecked"
End If
Next re
End With
End Sub
这也会将伪空单元格标记为“未选中”。但请注意,它也会杀死导致空字符串的公式,“
”,除了@Maxime Porté指出它应该是.Range(“J1:j25”)
。我猜这些细胞看起来只是空的,但它们不是
包含空字符串“”
”的单元格不再是空的,但看起来是空的。您可以这样测试它:
在新的工作表中,用A1:=”
(中间没有空格!)
复制A1和A1中的特殊粘贴值。A1现在看起来是空的
在VBA中运行Debug.Print IsEmpty(范围(“A1”).Value)
,您会得到一个FALSE
单元格A1不再为空,因为它包含一个空字符串
你能做什么?
Sub DoIfNotEmpty()
Dim ra As Range, re As Range
With ThisWorkbook.Worksheets("Sheet1")
Set ra = .Range("J1:J25")
For Each re In ra
If IsEmpty(re.Value) or re.Value = vbNullString Then
re.Value = "unchecked"
End If
Next re
End With
End Sub
这也会将伪空单元格标记为“未选中”。但是请注意,它也会杀死导致空字符串的公式,“
”您必须通过.Range(“J1:j25”)
更改.Range(“J1:j25”)
,但除了这个问题,我尝试了您的代码,它仍然有效。你确定问题不是在第25排之后出现的吗?啊哈,我想我知道问题出在哪里了。因为我在单元格中有一个公式,我认为excel相信我在这些单元格中有一个值。它在某些情况下起作用的原因是,我在某些时候删除了这些单元格中的值。你们现在知道这有什么解决办法了吗?@DanneL看到我的答案了吗?你们必须通过.Range(“J1:j25”)
来更改.Range(“J1:j25”)
,但除了这个问题,我试过你们的代码,它是有效的。你确定问题不是在第25排之后出现的吗?啊哈,我想我知道问题出在哪里了。因为我在单元格中有一个公式,我认为excel相信我在这些单元格中有一个值。它在某些情况下起作用的原因是,我在某些时候删除了这些单元格中的值。你们现在知道这有什么解决办法了吗?@DanneL请看我的回答,在某些情况下,运行for/each循环比使用自动筛选更快。不久前,我在一个相当大的Excel表格中尝试了这个方法,for/each比autofilter快得多,之后关闭autofilter。这在范围(“J1:J25”)
中可能不是问题,但在大数据表中却是问题。@Peh,这实际上是我第一次听说范围中每个单元格的循环都比自动筛选()
快,而在我的经验中,情况总是相反……我没有一个最小的例子来证明我所说的。是的,在某些情况下autofilter确实很快,但我的Excel表格在计算过程中达到了32位Excel的极限(因为ram的使用),我们做了一些计算时间分析(所以我的论文是基于数字而不是主观感觉)因此,在某些情况下,我们可以通过不使用过滤器将计算时间提高3倍。哦,在某些情况下,运行for/each循环比使用自动过滤器更快。不久前,我在一个相当大的Excel表格中尝试了这个方法,for/each比autofilter快得多,之后关闭autofilter。这在范围(“J1:J25”)
中可能不是问题,但在大数据表中却是问题。@Peh,这实际上是我第一次听说范围中每个单元格的循环都比自动筛选()
快,而在我的经验中,情况总是相反……我没有一个最小的例子来证明我所说的。是的,在某些情况下autofilter确实很快,但我的Excel表格在计算过程中达到了32位Excel的极限(因为ram的使用),我们做了一些计算时间分析(所以我的论文