使用VBA代码处理Excel中的空白值

我是Excel VBA的新手。 我已经做了一个macros观的Excel来logging调查答复。 每当我运行macros时,某些单元格将被复制(从Sheet1中)并作为另一个工作表(Sheet2)中的行向量存储。

问题是,如果Responder1在响应中有一些空白单元格,那么当我录制另一个响应(Responder2)时,那么对应于Responder1空白variables的值将存储在前一行中。

这是VBA代码

Sub Submit1() Range("A2:C2").Select #in Sheet1 Selection.Copy Sheets("Sheet2").Select Worksheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial End Submit1 

现在有两件事我可以想到:

  1. 如果可以检查前一行是否至less有一个非空白条目,那么新的响应将自动logging在下一行。
  2. 如果以上是不可能的,我们可以给这些空白单元分配一些例如NULL或0的值,以便新的响应可以存储在新的行中。

试试下面的代码:

 Sub Submit1() Dim nextRow As Long With Worksheets("Sheet2") 'Find the last non-empty cell in the worksheet, and determine its row 'Then add 1 to that, so we are pointing at the next row nextRow = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row + 1 'Copy values to "nextRow" Worksheets("Sheet1").Range("A2:C2").Copy .Cells(nextRow, "A") 'Perform other copies as necessary, eg Worksheets("Sheet1").Range("A5:D5").Copy .Cells(nextRow, "D") Worksheets("Sheet1").Range("X4:Z4").Copy .Cells(nextRow, "H") End With End Sub 

关于你的第二个build议:不要这样做。

快速回答:

使用Worksheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial SkipBlanks = False

从MSDN引用:

SkipBlanks如果剪贴板上的空白单元格没有粘贴到目标范围内,则为真。 默认值是False。

但是,使用Select不被认为是好的做法。 考虑阅读这些更多的信息。 对于复制粘贴范围,我不能推荐更多Chip Pearson的页面 。

演示:

 Sub test() Dim LastRow As Long Dim arCopy() As Variant Dim rDest As Range With Sheet2 ' --> Qualify the ranges LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1 End With arCopy = Sheet1.Range("A2:K2").Value Set rDest = Sheet2.Cells(LastRow, "A") Set rDest = rDest.Resize(1, UBound(arCopy, 2)) rDest.Value = arCopy End Sub 

工作表Sheet1:

输入表单

Sheet2之前: Sheet2之前

Sheet2之后: 在这里输入图像说明

上面有额外的好处,你不必担心空白单元格,因为它们默认复制。

我希望这有帮助!

编辑 (处理评论)

  • 确实,既然SkipBlanks = False默认情况下,你的PasteSpecial不会跳过空格。 你确定你的单元格确实是空白的,而且看起来不是空白的吗? 您可以使用ISBLANK()函数进行快速检查。 如果SkipBlanks 似乎只工作了一段时间,那么对于它所应用的单元SkipBlanks定有些不同。
  • With ... End With :这是一个提高可读性的快捷方式构造。 基本上,在同一个对象之下的一组方法或属性,比如

      Sheet1.Range("A1")="Rob" Sheet1.Copy("A2") Sheet1.Rows.Count 

    可以写成

     With Sheet1 .Range("A1") = "Rob" .Copy("A2") .Rows.Count End With 

    这增强了可读性

  • 你的第二个build议

    那么我们可以给这些空白单元分配一些例如NULL或0的值,以便新的响应可以存储在新的行中。

    原则上这是可能的。 但是,您应该确定哪些单元格是空白的,而且我们已经知道一种不跳过空白的方法似乎不起作用,因此识别空白单元格并replace它们是有点捉襟见肘的22.换句话说,如果我们知道如何find这些“空白”单元格,以便我们将它们分配为NULL或0,然后SkipBlanks将以更优雅的方式照顾它们(因为它被devise为完成这个操作)。