首页 文章

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

提问于
浏览
-1

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

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

Sheet1列[LOCATION1 UNKNOWN] |下一列StringOfInterest . . . . . . . . . . . . . . . . | Value_1 . Sheet2列[LOCATION2 UNKNOWN] |下一列StringOfInterest . . . . . . . . . . . . . . . . | Value_2 .

...

. 摘要表列N |列N = 1 StringOfInterest | Value_1 Value_2 ... Value_m

注意:页数更改,StringOfInterest实际上是一行高两列宽的合并单元格 .

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

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

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

我已经包含了一个简化的工作簿,以明确显示我需要的内容 . 名为Summary的工作表7有一个单元格,其中包含感兴趣的字符串名称,以及输出总数的位置 . 如果需要,我可以更改“摘要”页面以避免在搜索字符串中使用相同的单元格(例如,“Subtotals SUMMED”而不是“Subtotal”...或者“hello summed”而不是“hello”,在此简化工作簿中),和/或我可以为占位符添加页面(但它必须能够响应上面提到的潜在更改,而不是每次都进行强制性编辑)

谢谢您的帮助!

(注意:使用Excel for Office 365)

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

2 回答

  • 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
    
  • 0

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

    如果任何VBA super-noobs发现这一点,请不要忘记在Dim语句之前以 Public Sub Arbitrary_Name_Of_Macro() 开头,并以最后一行的 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

相关问题