为什么我的VBA PasteSpecial,Operation:= xlAdd将单元格值加倍?

时间:2019-03-28 10:10:35

标签: excel vba

我正在运行一个非常简单的宏,该宏从每个时间表的同一单元格中获取值,然后使用选择性粘贴功能将这些值添加到汇总表中。

没有错误出现,但最终值是应该的两倍。我误解了xladd的工作原理还是我的代码以某种方式运行了两次?

For Each ws In ThisWorkbook.Worksheets
  If ws.Name <> "Summary" Then
        ws.Range("D13:E14").Copy     
        ThisWorkbook.Sheets("SUMMARY").Range("D13:D14").PasteSpecial 
        Paste:=xlAll, Operation:=xlAdd, SkipBlanks:=True, Transpose:=False
  End If
Next

作为一个例子,我期望单元格D13 = 1的6张纸的输出为6小时。我实际上得到的是12个小时。

3 个答案:

答案 0 :(得分:1)

当我创建一个空工作簿,命名一个工作表摘要并添加其他工作表时,您提供的代码可以正常工作。 我相信您的代码正在浏览其他工作表,这些工作表包含不应添加的值。

检查工作簿中的内容:

  • 隐藏的床单
  • 所有隐藏的工作表(在VBE中)

我的测试代码如下:

Sub test()
Dim ws As Worksheet

ThisWorkbook.Sheets("SUMMARY").Range("D13:D14").Clear

For Each ws In ThisWorkbook.Worksheets
  If ws.Name <> "Summary" Then
        ws.Range("D13:E14").Copy
        ThisWorkbook.Sheets("SUMMARY").Range("D13:D14").PasteSpecial _
            Paste:=xlAll, Operation:=xlAdd, SkipBlanks:=True, Transpose:=False
  End If
Next

End Sub

答案 1 :(得分:0)

您可以使用以下内容测试是否有问题。如果是非数字值,则会出错,因为变量存储的总和被声明为双精度。

Option Explicit

Sub test()

    Dim ws As Worksheet
    Dim D13 As Double, D14 As Double, E13 As Double, E14 As Double

    With ThisWorkbook

        For Each ws In .Worksheets
            With ws
                If .Name <> "Summary" Then
                    D13 = D13 + .Range("D13").Value
                    D14 = D14 + .Range("D14").Value
                    E13 = E13 + .Range("E13").Value
                    E14 = E14 + .Range("E14").Value
                End If
            End With
        Next ws

        With .Worksheets("SUMMARY")
            .Range("D13").Value = D13
            .Range("D14").Value = D14
            .Range("E13").Value = E13
            .Range("E14").Value = E14
        End With

    End With

End Sub

答案 2 :(得分:0)

如果“摘要”是工作簿中的第一个选项卡,则您的代码将产生正确的结果。如果“摘要”在第一个选项卡之后,则“摘要”中的所有内容都会添加到自身中,因为If ws.Name <> "Summary"返回TRUE-String的{​​{1}}和"SUMMARY"不相同,因此您的{ {1}}语句在"Summary"上循环时在表上运行。

此外,如果您在运行代码时未包含在向其添加任何值之前清除IF的命令,它将在每次迭代中添加值。

在代码中引用`Sheets(“ Summary”)确实有用,因为VBA中的Sheet和Range名称不区分大小写。

Worksheets("SUMMARY")