首页 文章

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

提问于
浏览
0

我是Excel VBA的新手 . 我已经制作了一个支持宏的Excel来记录调查回复 . 每当我运行宏时,某些单元格将被复制(从Sheet1)并作为行向量存储在另一个工作表(Sheet2)中 .

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

这是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

现在有两件事我能想到: -

  • 如果可以检查前一行是否至少有一个非空白条目,则新响应将自动记录在下一行中 .

  • 如果无法满足以上条件,我们是否可以为例如指定一些值对于那些空白单元格为NULL或0,以便新响应可以存储在新行中 .

2 回答

  • 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, e.g.
            Worksheets("Sheet1").Range("A5:D5").Copy .Cells(nextRow, "D")
            Worksheets("Sheet1").Range("X4:Z4").Copy .Cells(nextRow, "H")
        End With
    End Sub
    

    关于你的第二个建议:就是不要这样做 .

  • 1

    快速回答:

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

    来自MSDN的参考:

    SkipBlanks True表示剪贴板范围内的空白单元格不会粘贴到目标范围内 . 默认值为False .

    但是,使用 Select 不被视为良好做法 . 考虑阅读this以获取更多信息 . 对于复制粘贴范围,我不能推荐更多Chip Pearson's page .

    演示:

    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:

    Input sheet

    Sheet2之前:
    Sheet2 Before

    Sheet2之后:
    enter image description here

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

    我希望这有帮助!

    EDIT (解决评论)

    • 确实,自 SkipBlanks = False 默认情况下, PasteSpecial 不会跳过空白 . 你确定你的细胞确实是空白的并且看起来不是空白的吗?您可以使用 ISBLANK() 功能快速检查 . 如果 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
    

    这增强了可读性

    • 你的第二个建议

    我们可以为例如指定一些值吗?对于那些空白单元格为NULL或0,以便新响应可以存储在新行中 .

    原则上,这是可能的 . 但是,您应该确定哪些单元格是"blank",并且我们已经知道一个不跳过空白的方法似乎不起作用,因此识别空白单元格并替换它们是一个问题22.换句话说,如果我们知道如何找到这些"blank"单元格,以便我们将它们分配为NULL或0,然后 SkipBlanks 将以更优雅的方式处理它们(因为它的目的就是这样做) .

相关问题