VBA Excel - 查找字符串,总和对应值,跨多个表格的可变位置;在可变位置汇总小计

时间:2017-09-15 16:24:04

标签: excel vba excel-formula

我花了好几个小时试图编写一个excel公式,但无济于事。我只是决定编写一个VBA宏,但VBA经验很少,而且我很难适应其他(类似但不太相似)的答案来满足我的需求。

我有一个模板工作簿用于订购库存,每页都有小计。我需要摘要表来输出总金额(每张表中的小计总和)。附上一个简单的测试工作簿。其形式如下:

  

Sheet 1中

     

列[LOCATION1 UNKNOWN] |下一栏

     

StringOfInterest。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。|值_1

     

     

Sheet 2中

     

列[LOCATION2 UNKNOWN] |下一栏

     

StringOfInterest。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。|值_2

     

...

  

     

SummarySheet

     

列N |列N = 1

     

StringOfInterest | Value_1 + Value_2 + ... + Value_m

注意:页数会发生变化,而StringOfInterest实际上是一行高两列宽的合并单元格。

特定限制: 包含StringOfInterest" Subtotal"并且其在相邻列中的对应值位于每个薄片之间的任意位置。 "小计" string实际上位于合并为单个单元格的两个相邻列单元格中。我不能对纸张本身进行任何编辑,除了(1)必要时添加新纸张,(2)在摘要表中输入所需的总和。 这需要具备以下功能:添加新的库存表,删除旧的库存表,更改工作表名称以及更改任何工作表上小计的位置。

看起来应该很简单:匹配字符串"小计"在所有工作表中,将每个匹配的单元格偏移一列(可能是两列,具体取决于excel处理合并单元格的方式),并对这些值求和。

我尝试使用SUM(IF()),SUMIF(),SUMIFS(),SUMPRODUCT()的各种组合,利用INDIRECT(),MATCH(),VLOOKUP(),OFFSET()等。无济于事。在这一点上,我不介意给我的主管一个宏来运行这个计算并将总数输出到他的摘要页面上的一个定义的单元格中。

我已经添加了一个简化的工作簿来明确显示我需要的内容。名为Summary的工作表7有一个单元格,其中包含感兴趣的字符串名称,以及输出总数的位置。如果需要,我可以更改“摘要”页面,以避免单元格与搜索字符串相同(例如," Subtotals SUMMED"而不是"小计" ...或,"你好总结了#34;而不是"你好",在这个简化的工作簿中),和/或我可以为占位符添加一个页面(但它必须能够响应上面提到的潜在变化,而不是我制作每次强制编辑)

感谢您的帮助!

(注意:使用Excel for Office 365)

编辑:由于Stack Overflow不支持附加文件,因此将文件上传到Google工作表:https://docs.google.com/spreadsheets/d/1RGpQ-4KSYYuwbpWGb0DPAI6qhxLQ0d4CqLwW2gOns2A/edit?usp=sharing

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用Index()Match()组合公式。

http://www.randomwok.com/excel/how-to-use-index-match/

尝试使用此代码段,它应该执行您正在寻找的内容:

Dim ws As Worksheet
Dim myArr() As Variant
Dim rng As Range

'Finds all the cells where "Hello" is found and stores them in an array
ReDim myArr(0)
For Each ws In ActiveWorkbook.Worksheets

    With ws.Cells
        Set rng = .Find(What:="Hello", LookIn:=xlValues, LookAt:=xlPart _
        , SearchOrder:=xlByRows, SearchDirection:=xlNext)
        If Not rng Is Nothing Then
            myArr(UBound(myArr)) = rng.Offset(0, 1).Value
            ReDim Preserve myArr(UBound(myArr) + 1)
        End If
    End With

Next

'loop through array to sum everything up
For i = 0 To UBound(myArr)
    'do math
Next

答案 1 :(得分:0)

R上。 Roe用一个非常简单的VBA宏给出了我问题的完美解决方案!我对这个答案发表了评论,但对于未来的Stack Overview潜伏者来说,这可能更为明显......

如果任何VBA超级小号发现这一点,请不要忘记开始 Public Sub Arbitrary_Name_Of_Macro() 在Dim声明之前,以及结束 End Sub 为最后一行。我决定手动将结果插入到第7页的“Total”列中(将第7页的row2col1上的条目从“hello”更改为“hello total”)后,通过:

Dim iRow As Integer, iCol As Integer ... iRow = 2 iCol = 2 Cells(iRow, iCol).Value = myArr_Tot