Excel 交叉表总和和速度性能
我正在尝试将大量的工作表(11-12)汇总到一个名为“总资源”的主表中。我有多个范围,我不想一个单元格一个单元格地汇总,但是我似乎找不到一个解决方案来添加需要添加到sht中的多个范围。范围?我也经历了巨大的速度问题时,试图添加不同的范围,如这。。。是否有更好、更直接的方法来完成代码中描述的相同操作Excel 交叉表总和和速度性能,excel,vba,Excel,Vba,我正在尝试将大量的工作表(11-12)汇总到一个名为“总资源”的主表中。我有多个范围,我不想一个单元格一个单元格地汇总,但是我似乎找不到一个解决方案来添加需要添加到sht中的多个范围。范围?我也经历了巨大的速度问题时,试图添加不同的范围,如这。。。是否有更好、更直接的方法来完成代码中描述的相同操作 使用更多范围 速度性能 For Each Sht In ThisWorkbook.Worksheets If Sht.Name Like "*- Resources" Then
- 使用更多范围
- 速度性能
For Each Sht In ThisWorkbook.Worksheets If Sht.Name Like "*- Resources" Then For Each cell In Sht.Range("G11:G46")'Add another range "G22:G46","F46.."? Cast = cell.Address Sheets("Total - Resources").Range(Cast) = Sheets("Total - Resources").Range(Cast) + cell.Value Next cell End If Next Sht
- 定义应该汇总的地址
SumAddresses
- 按区域处理这些地址。
地址
由两个区域组成:A1:C4,A7:C10
和A1:C4
A7:C10
- 使用数组。这意味着将每个区域中的数据读取到一个数组中。然后使用数组执行求和计算,最后将该数组写入
工作表中的目标区域。使用阵列比使用范围快得多Total
所以你最终会得到这样的结果:
- 我建议如下:
Option Explicit
Public Sub SumResourceSheets()
Dim SumAddresses As String
SumAddresses = "A1:C4,A7:C10,D5" 'note this is limited to 255 characters!
Dim ResultRange As Range
Set ResultRange = ThisWorkbook.Worksheets("Total - Resources").Range(SumAddresses)
ResultRange.ClearContents 'make result range epmty
ReDim SumAreas(1 To ResultRange.Areas.Count) As Variant
Dim iArea As Long
For iArea = LBound(SumAreas) To UBound(SumAreas)
SumAreas(iArea) = ResultRange.Areas(iArea).Cells.Value 'read area into array
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Name Like "*- Resources" And ws.Name <> "Total - Resources" Then 'exclude Total - Resources
If ws.Range(ResultRange.Areas(iArea).Address).Cells.CountLarge = 1 Then
'handle single cell areas…
SumAreas(iArea) = SumAreas(iArea) + ws.Range(ResultRange.Areas(iArea).Address).Value
Else
'this is for multi cell areas …
'read data area into array
Dim DataArea() As Variant
DataArea = ws.Range(ResultRange.Areas(iArea).Address).Value
'sum data into sum array
Dim iRow As Long
For iRow = LBound(DataArea, 1) To UBound(DataArea, 1)
Dim iCol As Long
For iCol = LBound(DataArea, 2) To UBound(DataArea, 2)
If IsNumeric(DataArea(iRow, iCol)) Then
SumAreas(iArea)(iRow, iCol) = SumAreas(iArea)(iRow, iCol) + DataArea(iRow, iCol)
Else
MsgBox "The cell '" & ResultRange.Areas(iArea).Cells(iRow, iCol).Address & "' in worksheet '" & ws.Name & "' does not contain a number!", vbCritical
Exit Sub
End If
Next iCol
Next iRow
End If
End If
Next ws
ResultRange.Areas(iArea).Cells.Value = SumAreas(iArea) 'write area into cell
Next iArea
End Sub
选项显式
公共子消费资源表()
将地址设置为字符串
SumAddresses=“A1:C4,A7:C10,D5”'注意,此限制为255个字符!
Dim ResultRange As范围
Set-ResultRange=ThisWorkbook.Worksheets(“Total-Resources”).Range(SumAddresses)
ResultRange.ClearContents的生成结果范围epmty
将ReDim SUMRAREA(1到ResultRange.Areas.Count)作为变量
长的
对于iArea=LBound(集水区)至UBound(集水区)
SumAreas(iArea)=ResultRange.Areas(iArea).Cells.Value'将区域读取到数组中
将ws设置为工作表
对于此工作簿中的每个ws。工作表
如果ws.Name像“*-Resources”和ws.Name像“Total-Resources”,那么“排除Total-Resources”
如果ws.Range(ResultRange.Areas(iArea.Address).Cells.CountLarge=1,则
'处理单细胞区域…
SumAreas(iArea)=SumAreas(iArea)+ws.Range(ResultRange.Areas(iArea.Address).Value
其他的
'这适用于多单元区域…
'将数据区域读入数组
Dim DataArea()作为变量
DataArea=ws.Range(ResultRange.Areas(iArea.Address).Value
'将数据求和到求和数组中
暗淡无光
对于iRow=LBound(数据区,1)到UBound(数据区,1)
如长
对于iCol=LBound(数据区,2)到UBound(数据区,2)
如果是数字(数据区(iRow,iCol)),则
SumAreas(iArea)(iRow,iCol)=SumAreas(iArea)(iRow,iCol)+数据区(iRow,iCol)
其他的
MsgBox“单元格”&ResultRange.Areas(iArea).Cells(iRow,iCol).Address&“工作表中的”&ws.Name&“不包含数字!”,VBR
出口接头
如果结束
下一个iCol
下一步
如果结束
如果结束
下一个ws
ResultRange.Areas(iArea).Cells.Value=SumAreas(iArea)'将区域写入单元格
下一个iArea
端接头
Perfect..快得多:O但是我在第二次尝试时遇到了一个类型不匹配错误:Dim iCol只要iCol=LBound(DataArea,2)到UBound(DataArea,2)SumAreas(iArea)(iRow,iCol)=SumAreas(iArea)(iRow,iCol)+DataArea iRow,iCol)'类型不匹配错误在哪一行?如果在此行中:SumAreas(iArea)(iRow,iCol)=SumAreas(iArea)(iRow,iCol)+DataArea(iRow,iCol)
则数据区域中可能存在非数值。检查您的工作表数据。•或者您的地址列表中是否只有一个单元格SumAddresses
?这是否意味着只接受值。不是数字格式,例如百分比?@Kaizan数字格式的数字实际上保存为数字(不是文本),但如果您有真实文本,则无法使用文本进行计算(显然)。你也没有回答我的问题。检查我编辑的代码,它也可以处理单细胞区。我是慢的方式为您。。它绝对出色:D你跑得很快!谢谢:)太棒了。