Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA检查列中的空单元格和打印值_Vba_Excel - Fatal编程技术网

VBA检查列中的空单元格和打印值

VBA检查列中的空单元格和打印值,vba,excel,Vba,Excel,在J列中,有空行和值为checked的行 我曾尝试编写VBA代码,在有空单元格的情况下打印“未选中”,这是可行的,但当它碰到有值(已选中)的单元格时,它会停止。它不会下到下一个单元格,可能是因为单元格中有公式,如果没有完全填充,则不会打印任何内容,但它仍然包含该公式。在我的例子中,在J7之前我有空的单元格,然后在J15再次开始。但关于源数据,这可能会不时发生变化 我想这样做的原因是因为我在J列中有一个公式,它已经打印了一些值,然后是一些VBA代码,它检查不同列中的其他值并打印到J列。J列是过滤器

在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的使用),我们做了一些计算时间分析(所以我的论文