2017-03-02 96 views
0

亲爱的SO超级大师!VBA检查列中的空单元格和打印值

在J列中存在空行和行,其值等于选中的值。

我试图写一个VBA代码,打印“未经检查”,哪里有一个空单元格,这个工程,但是当它击中一个单元格的值(选中)它停止。并且不会进入下一个单元格,可能是因为我在单元格中输入了公式,如果不是全填充,但它仍然包含该公式。在我的情况下,我有空细胞,直到J7,然后再从J15开始。但是这可能会随时关于源数据的变化。

我想这样做的原因是因为我在J列中有一个公式,已经打印了一些值,然后是一些VBA代码,用于检查不同列中的其他值并打印到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 

我可以打印到空白单元格,如果单元格中包含在这种情况下,公式至极有如果未填写声明?

+0

你必须用'.Range(“J1:j25”)''改变'.Range(“J:j25”)'',但除了这个问题,我试过了你的代码,它工作。你确定它不是25行之后存在的问题吗? –

+0

Ahhaaa我想我找出了问题所在。因为我在单元格中有一个公式,我认为excel相信我在这些单元格中有价值。它在某些工作的原因是因为我在某些时候删除了这些单元格中的值。现在如果有解决方法,你们大家吗? – DL1

+0

@DanneL看到我的回答 –

回答

2

除了从@Maxime门的指出它应该是.Range("J1:j25")我猜这些单元格只显示为空,但它们不是。

包含空字符串""的单元格不再为空,但看起来像。在A1

  1. 在新的工作表写:你可以这样测试=""(存在之间没有空格!)
  2. 复制A1和A1特殊粘贴值。 A1现在看起来是空的。
  3. 在VBA中运行Debug.Print IsEmpty(Range("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 

这将标记伪空单元格为“未选中”。但请注意,它也会杀死导致空字符串""的公式。

+0

就像老板一样工作!谢谢你!! – DL1

+1

只需要点''“= vbNullString',避免VBA编译器为每个'''''创建一个变量,从而提高性能! ;)@DanneL – R3uK

+1

有趣的是,将单元格的值设置为'“”'将使单元格变为Empty(例如'Cells(1,1).Value =“a”:Debug.Print IsEmpty(Cells(1,1) ):Cells(1,1).Value =“”:Debug.Print IsEmpty(Cells(1,1))') – YowE3K

2

你可以利用方法对象的RangeSpecialcells()

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 
+0

Ouh,在某些情况下,运行for/each循环比使用autofilter更快。我前一段时间在一个非常大的Excel工作表中尝试过,并且每个都比自动过滤器快得多,然后关闭自动过滤器。这可能不是Range(“J1:J25”)中的问题,但是在大型数据表中。 –

+0

@Peh,这实际上是我第一次听说'For Each Cell In Range'循环比'Autofilter()'快,而且根据我的经验,它总是相反的...... – user3598756

+0

我没有有一个最小的例子来证明我所说的。是的,在某些情况下,自动过滤器确实很快,但是我的Excel表单在计算过程中达到了32位Excel的极限(因为RAM的使用),并且我们做了一些计算时间分析(因此我的论文是基于不在主观感受),所以我们可以通过在某些情况下不使用3次过滤器来提高计算时间。 –