使用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
现在有两件事我可以想到:
- 如果可以检查前一行是否至less有一个非空白条目,那么新的响应将自动logging在下一行。
- 如果以上是不可能的,我们可以给这些空白单元分配一些例如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之后:
上面有额外的好处,你不必担心空白单元格,因为它们默认复制。
我希望这有帮助!
编辑 (处理评论)
- 确实,既然
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为完成这个操作)。