Excel公式将条件应用于同一整列的所有图纸

Excel公式将条件应用于同一整列的所有图纸,excel,excel-formula,openoffice-calc,Excel,Excel Formula,Openoffice Calc,这个问题可以看作是几个小问题,但主要目的只有一个 TL;博士 我想在工作表N中应用excel公式,该公式将考虑所有其他工作表中的所有对应列,同时对所有列应用相同的条件 详细信息: 我的电子表格是一个非常简单和基本的费用核算,它有许多按年份和日期排列的表格,分别命名为2015.04,2015.05,2015.06等。 第一行始终为标题(时间、日期、金额、项目、类别等),各列始终对应(例如,在所有表格中,H列为类别,D列为金额) 起始公式为: =SUMIF('2015.07'.H2:H67;

这个问题可以看作是几个小问题,但主要目的只有一个

TL;博士

我想在工作表N中应用excel公式,该公式将考虑所有其他工作表中的所有对应列,同时对所有列应用相同的条件

详细信息:

我的电子表格是一个非常简单和基本的费用核算,它有许多按年份和日期排列的表格,分别命名为
2015.04
2015.05
2015.06
等。 第一行始终为标题(时间、日期、金额、项目、类别等),各列始终对应(例如,在所有表格中,
H
列为类别,
D
列为金额)

起始公式为:

    =SUMIF('2015.07'.H2:H67;C20;'2015.07'.D2:D67)
// C20 is only a search condition like "travel", or "F&B"
它在这种简化的手动模式下工作,但由于我们有计算机,我有一个程序员M.O,我想让它自动化一点,因此我的问题是:

1-如何将此公式应用于所有图纸,即使后来添加/删除了一些图纸,例如等效于“图纸通配符”

2-由于列的长度不同,所以应用手动范围似乎很愚蠢,所以我尝试了

  =SUMIF('2015.07'.H:H;C20;'2015.07'.D:D) 
=SUMIF('2015.07'.H1:H67;C20;ISNUMBER('2015.07'.D1:D99) )// err 504
但它给了我几个不同的错误

3-我能理解的一个错误是,第一行标题不是数字,所以我尝试了

  =SUMIF('2015.07'.H:H;C20;'2015.07'.D:D) 
=SUMIF('2015.07'.H1:H67;C20;ISNUMBER('2015.07'.D1:D99) )// err 504
也试过了

=SUMIF('2015.07'.H1:H67;C20;IF(ISNUMBER('2015.07'.D1:D99) ))// err 509

现在,我知道我可以采用简单的工作起始公式,将其放在每一页中,选择不带标题的确切范围,然后在最后一个夏季页面上引用所有其他内容-但说真的,我也可以使用
算盘
,这不是excel等工具被发明的原因。还是我对这个工具估计太多了?有那么原始吗?不知何故,我拒绝相信它,只是责怪自己不知道它以及我应该

我也知道我可以编写一个
VBA
宏,但在这一点上,我将花费更少的精力和时间在库中编写一些PHP行,将所有内容转储到SQL中并正确执行。但再说一遍,这是我的错(可能)还是excel的错

p.S>。使用OpenOffice Calc(如果有必要的话),但也尝试了excel中的所有操作,更改了语法和不同的错误代码

编辑I-解决方案

在看了@Axel Richards的答案后,即使它并没有帮助我解决问题,但它确实帮助我找到了很多方法

首先,我发现我犯的错误是由于工作表本身的命名。 显然,像
2005.07
(一个点)这样的名称将给出
err 501
2005-07
(连字符)将给出
err 502
。这让我明白,我先前的一些尝试实际上是正确的——但命名方案造成了错误

最后一个公式,对我有效的是。 请注意,这是一个数组公式,因此需要使用
CTRL+SHIFT+ENTER
输入,而不仅仅是
ENTER
,这会产生花括号(我以前不知道…)

不存在通配符的事实只是半正确的,因为解决方案是定义一个起始周期和结束周期,并且公式将在中间计算所有的电子表格。就我而言,这是某种通配符

像这样:

{=SUMIF((INDIRECT("start"&".H"&ROW(A$1:A$500)));$J16;INDIRECT("END"&".D"&ROW(A$1:A$500)))}
使用
列(C$1:I$1)
实际上是创建一个数组(3-9),而
行(A$1:A$500)
告诉公式要考虑500行的所有内容

这几乎不是一个灵活或优雅的解决方案,但它可以工作。

尝试一下这段代码:

Sub CreateSumIfFormulaForAllSheets()
  Tmp = ""
  For i = 1 To Sheets.Count
    Tmp = Tmp & IIf(Tmp = "", "=SUMIF('" & Sheets(i).Name & "'!H:H,C20,D:D)", "+SUMIF('" & Sheets(i).Name & "'!H:H,C20,D:D)")
  Next i
Range("A1").Formula = Tmp
End Sub
假设您试图在所有图纸上获得D列中所有值的一个和,其中C20在所有图纸的H列中,这将起作用。只需将“A1”更改为公式通常包含的任何单元格。除非D列中有错误值,否则您不必担心ISNUMBER,因为SUMIF忽略文本


如果您确实需要定义这些列范围(如H2:H67),而不是只查看整个列,那么在将其编码到此宏中之前,您需要指定用于进行确定的标准。你说的是“整栏”,这肯定是整栏

我将尝试回答您的问题

  • 工作表通配符
  • 这是不可能的。为什么?因为
    '2015.07'.H2:H67
    中的工作表名称不仅仅是一个字符串,而是一个引用。如果在“任意”中将图纸名称从“2015.07”更改为“任意”,则所有引用此图纸的公式中的所有引用都将更改

  • 引用整列和/或整行
  • 这在Openoffice(Libreoffice)中是不可能的。在Excel中,
    =SUMIF('2015.07'!H:H,C20,'2015.07'!D:D)
    将起作用。在Openoffice中,我们必须引用第一个单元格和最后一个单元格
    =SUMIF($H$1:$H$1048576,C20,$D$1:$D$1048576)

    顺便说一句:如果在Openoffice中尝试
    =SUMIF('2015.07'.H:H;C20;'2015.07'.D:D)
    ,错误应该是
    #NAME?
    ,因为H和D不是定义的名称。这与是否不是数字无关
    SUMIF
    可以处理其总和范围内的非数字内容,但错误值除外

  • 错误代码的含义
  • 所以我要做的是:

    假设以下示例(在我的Libreoffice中,逗号是公式参数分隔符):

    如您所见,
    K2
    中的公式是

    =SUMIF($H$1:$H$1048576,$J2,$D$1:$D$1048576)
    
    =SUM(Begin.K2:End.K2)
    
    J2
    中的公式为

    =$'Sheet N'.$C$20
    
    这是对“活页N”单元C20的参考

    活页N看起来像:

    D20
    中的公式为

    =SUMIF($H$1:$H$1048576,$J2,$D$1:$D$1048576)
    
    =SUM(Begin.K2:End.K2)
    
    这是一个三维参考。将汇总从工作表“开始”到工作表“结束”的所有工作表中的所有单元格
    K2

    工作表“开始”和“结束”只是空工作表

    现在你可以复制她了
    Public Function SUMIFOS(sSheetName as String, lColSearch as Long, vSearchValue as Variant, lColSum as Long) as Variant
    
      oDoc = Thiscomponent
      sFormula = ""
      vResult = 0
    
      oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")
      oOptions = CreateUnoStruct("com.sun.star.util.SearchOptions")
      oOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
      oOptions.searchString = sSheetName
      oTextSearch.setOptions(oOptions)
    
      For Each oSheet in oDoc.Sheets
       oFound = oTextSearch.searchForward(oSheet.Name, 0, Len(oSheet.Name)) 
       If  oFound.subRegExpressions <> 0 then
    
        sPath = ThisComponent.URL
        sSearchColumn = oSheet.Columns(lColSearch-1).AbsoluteName  
        sSumColumn = oSheet.Columns(lColSum-1).AbsoluteName  
        sSearchColumn = "'" & sPath & "'#" & sSearchColumn
        sSumColumn = "'" & sPath & "'#" & sSumColumn
    
        sFormula = "=SUMIF(" & sSearchColumn & ";""" & vSearchValue & """;" & sSumColumn & ")"
    
        oDocTMP = CreateUnoService("com.sun.star.sheet.SpreadsheetDocument")
    
        oSheetTMP = oDocTMP.createInstance("com.sun.star.sheet.Spreadsheet")
        oDocTMP.Sheets.insertByName("MySheet", oSheetTMP)
        oRangeTMP = oSheetTMP.getCellRangeByName("A1")
        oRangeTMP.Formula = sFormula    
    
        vResult = vResult + oRangeTMP.Value
    
        oDocTMP = Nothing
        oSheetTMP = Nothing
        oRangeTMP = Nothing
    
       End If
      Next  
    
      SUMIFOS = vResult
    
    End Function
    
    Public Function SUMIFOS(sSheetName As String, lColSearch As Long, vSearchValue As Variant, lColSum As Long) As Variant
    
      Set oWB = ThisWorkbook
    
      vResult = 0
    
      Set oRegExp = CreateObject("vbscript.regexp")
      oRegExp.Pattern = sSheetName
    
      For Each oSheet In oWB.Sheets
       If oRegExp.test(oSheet.Name) Then
        Set rSearchColumn = oSheet.Columns(lColSearch)
        Set rSumColumn = oSheet.Columns(lColSum)
    
        vResult = vResult + WorksheetFunction.SumIf(rSearchColumn, vSearchValue, rSumColumn)
    
       End If
      Next
    
      SUMIFOS = vResult
    
    End Function
    
    =SUMIFOS("2015.0[1,4]",8,C20,4)