我正在运行一个非常简单的宏,该宏从每个时间表的同一单元格中获取值,然后使用选择性粘贴功能将这些值添加到汇总表中。
没有错误出现,但最终值是应该的两倍。我误解了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个小时。
答案 0 :(得分:1)
当我创建一个空工作簿,命名一个工作表摘要并添加其他工作表时,您提供的代码可以正常工作。 我相信您的代码正在浏览其他工作表,这些工作表包含不应添加的值。
检查工作簿中的内容:
我的测试代码如下:
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")