Excel-VBA:代码正在生成意外数字(0)

Excel-VBA:代码正在生成意外数字(0),excel,vba,Excel,Vba,我被困在这个问题上,我不明白为什么代码会在D列中添加那些额外的零;我做错了什么 代码: 输入: 输出: 避免选择对象。它被创建为用户和VBA之间通过屏幕进行通信的媒介。VBA可以直接访问Excel工作簿,因此不需要它。请尝试此代码 Private Sub InsertThreeColumns() Dim Rl As Long ' last used row Dim Rng As Range With Workshee

我被困在这个问题上,我不明白为什么代码会在D列中添加那些额外的零;我做错了什么

代码:

输入:

输出:


避免选择
对象。它被创建为用户和VBA之间通过屏幕进行通信的媒介。VBA可以直接访问Excel工作簿,因此不需要它。请尝试此代码

Private Sub InsertThreeColumns()

    Dim Rl          As Long         ' last used row
    Dim Rng         As Range

    With Worksheets("NewTest")      ' change to suit
        Rl = .Cells(.Rows.Count, "B").End(xlUp).Row
        .Columns(2).Copy
        .Columns(1).Insert Shift:=xlToRight
        Application.CutCopyMode = False
        .Columns("A:B").Insert Shift:=xlToRight

        .Columns(5).EntireColumn.Delete
        On Error Resume Next
        ' next line will cause a crash if there are no blanks
        Set Rng = .Range(.Cells(2, "D"), .Cells(Rl, "D")).SpecialCells(xlCellTypeBlanks)
        If Err = 0 Then
            Rng.FormulaR1C1 = "=R[-1]C[6]"
            Rng.Copy
            Rng.PasteSpecial xlPasteValues
        End If
        On Error GoTo 0
        With .Cells(1, "D")
            .Value = Time
            .NumberFormat = "h:mm:ss"
        End With
    End With
End Sub

困扰您的额外零是由定义希望公式提供单元格内容的范围的方法引起的。在您的代码中,该范围是
选择的派生。在上面的代码中,它由起始单元格和结束单元格定义。结果应该是一样的。这并不是因为通过
选择
对象的路径迂回且难以遵循。

范围(“D2:D2”和last)
是原因。如果last=3,则除了您应该阅读的内容外,还将引用D2:D23
Private Sub InsertThreeColumns()

    Dim Rl          As Long         ' last used row
    Dim Rng         As Range

    With Worksheets("NewTest")      ' change to suit
        Rl = .Cells(.Rows.Count, "B").End(xlUp).Row
        .Columns(2).Copy
        .Columns(1).Insert Shift:=xlToRight
        Application.CutCopyMode = False
        .Columns("A:B").Insert Shift:=xlToRight

        .Columns(5).EntireColumn.Delete
        On Error Resume Next
        ' next line will cause a crash if there are no blanks
        Set Rng = .Range(.Cells(2, "D"), .Cells(Rl, "D")).SpecialCells(xlCellTypeBlanks)
        If Err = 0 Then
            Rng.FormulaR1C1 = "=R[-1]C[6]"
            Rng.Copy
            Rng.PasteSpecial xlPasteValues
        End If
        On Error GoTo 0
        With .Cells(1, "D")
            .Value = Time
            .NumberFormat = "h:mm:ss"
        End With
    End With
End Sub