Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 交叉表总和和速度性能_Excel_Vba - Fatal编程技术网

Excel 交叉表总和和速度性能

Excel 交叉表总和和速度性能,excel,vba,Excel,Vba,我正在尝试将大量的工作表(11-12)汇总到一个名为“总资源”的主表中。我有多个范围,我不想一个单元格一个单元格地汇总,但是我似乎找不到一个解决方案来添加需要添加到sht中的多个范围。范围?我也经历了巨大的速度问题时,试图添加不同的范围,如这。。。是否有更好、更直接的方法来完成代码中描述的相同操作 使用更多范围 速度性能 For Each Sht In ThisWorkbook.Worksheets If Sht.Name Like "*- Resources" Then

我正在尝试将大量的工作表(11-12)汇总到一个名为“总资源”的主表中。我有多个范围,我不想一个单元格一个单元格地汇总,但是我似乎找不到一个解决方案来添加需要添加到sht中的多个范围。范围?我也经历了巨大的速度问题时,试图添加不同的范围,如这。。。是否有更好、更直接的方法来完成代码中描述的相同操作

  • 使用更多范围
  • 速度性能

    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你跑得很快!谢谢:)太棒了。