对不同数量的工作表中的同一张表求和

时间:2020-10-29 11:00:52

标签: excel vba formula

因此,我有一个excel文件,可以在其中输入要分析的不同项目以及文件的位置。然后是一个代码,用于获取文件并为输入的每个项目生成2张纸(从我创建的模板),并填充数据。这些项目可以更改名称和数量。

当我尝试做一个总桌时,我的问题出现了。我要去哪里,从不同工作表中的相同单元格得到值并将它们相加。工作表的数量可以更改,因此我没有设法使用sheets.count,但是与此操作相关的工作表的名称均以“ Total_”开头。

所以到目前为止,我的代码开头是:

`Sub refresh()

 Parametre

    Dim nbOnglet As Integer
    Dim nbProjet As Integer
    
    Dim name As String
    Dim nametot As String
    Dim A As String
    Dim B As String
            
    Dim idx As Integer
    Dim iDebut As Integer
    
    Dim values As Variant
    Dim rng As Range
    
    Dim xRng As Range
    Dim x As Long
    Dim vArray As Variant
    Dim dSum As Double
  
 Initialisation
    iDebut = 9

 Déterminer le nombre d'onglets du Classeur
    nbOnglet = Sheets.Count

 Déterminer le nombre de projet à traiter
    folderpath = Range("C3").Value
    Sheets("Sommaire").Select
    nbLigne = Cells(10, "A").Value

x = 0

For idx = 1 To nbLigne
     activate Récapitulatif
        Sheets("Récapitulatif").Select
        
     Define the variable name - tab name
        A = "Total_"
        B = Sheets("Sommaire").Cells(iDebut + idx, "D").Value
        name = B
        nametot = A & B`

然后对于太阳,我尝试了不同的选择,但是似乎没有一个适合整个桌子。通过使用以下命令,我设法获得了一个单元的良好结果:

x = x + sheets(nametot).range("F7").Value2

但是不能在所有范围内都使用它(F7:CI31)。

我尝试过的其他公式是:

Set xRng = ThisWorkbook.Sheets(nbLigne).Range("K7:CI31")
xRng.FormulaR1C1 = "=SUM('" & ThisWorkbook.Sheets(nametot).name & "'!RC+'" & ThisWorkbook.Sheets(nametot).name & "'!RC)"

尽管这给出了我想要的方程式,因为它正在循环中运行,但它为每张图纸计算相同的结果,并在最后确定的那张图纸上停止...因此,我没有做我想做的事情:将相同的单元格相加不同的工作表名为“ Total_XXXX”,并在“Récapitulatif”工作表中显示值。

我一直在浏览互联网,但我真的想不出办法。 你有什么想法? 提前谢谢你

example of the table

1 个答案:

答案 0 :(得分:0)

合并工作表

链接(Microsoft文档)

说明

  • 在包含此代码(ThisWorkbook)的工作簿中,以下内容将合并(在本例中为(xlSum))所有工作表中所有相同范围(srcRange),其中从指定单元格(srcLead开始的另一个工作表(tgtName)中以指定字符串(tgtFirst开头的名称)。

代码

Option Explicit

Sub consolidateWorksheets()
    
    ' Define constants.
    Const srcRange As String = "K7:CI31"
    Const srcLead As String = "Total_"
    Const tgtName As String = "Récapitulatif"
    Const tgtFirst As String = "A1"
    
    ' Define workbook.
    Dim wb As Workbook
    Set wb = ThisWorkbook
    
    ' Define Target Worksheet.
    Dim tgt As Worksheet
    Set tgt = wb.Worksheets(tgtName)
    
    ' Define R1C1-Style Source Ranges Address.
    Dim rcRng As String
    rcRng = tgt.Range(srcRange).Address(ReferenceStyle:=xlR1C1)
    
    ' Define Consolidation Array.
    Dim Data As Variant
    ReDim Data(1 To wb.Worksheets.Count)
    
    ' Declare variables.
    Dim ws As Worksheet         ' Current Source Worksheet
    Dim CurrentName As String   ' Current Source Worksheet Name
    Dim n As Long               ' Current Element in Consolidation Array
    
    ' Write full paths of Source Worksheets to Consolidation Array.
    For Each ws In wb.Worksheets
        CurrentName = ws.Name
        If InStr(1, CurrentName, srcLead, vbTextCompare) = 1 Then
            n = n + 1
            Data(n) = "'" & ws.Name & "'!" & rcRng
        End If
    Next ws
    
    ' Validate and resize Consolidation Array.
    If n = 0 Then
        MsgBox "No worksheets to consolidate.", vbCritical, "Fail"
        Exit Sub
    End If
    ReDim Preserve Data(1 To n)
    
    ' Consolidate.
    tgt.Range(tgtFirst).Consolidate Sources:=Data, _
                                    Function:=xlSum
    
    ' Inform user.
    MsgBox "Data consolidated.", vbInformation, "Success"

End Sub