在不同工作表中查找列的最大值,并在结果表中报告

时间:2014-01-15 07:14:46

标签: excel excel-vba vba

我想在Column ASheet2Sheet3Sheet4中查看Sheet5 A1:A365 )并找到每个单元格的最大值。比较A1Sheet2Sheet3Sheet4中的Sheet5,找到最大值,并在结果页的A1中进行报告。同样在单元格B1中报告此最大值的相应表格。这将继续Column A A1:A365

enter image description here

我使用的代码如下:

    Worksheets("sheet2").Range("A1").Value = a
    Worksheets("sheet3").Range("A1").Value = b
    Worksheets("sheet4").Range("A1").Value = c
    Worksheets("sheet5").Range("A1").Value = d
    MaxValue = Application.Max(a, b, c, d)
    Range("A1").Value = MaxValue

4 个答案:

答案 0 :(得分:3)

  

是的我只有4张 - Mohsen 11分钟前

非VBA解决方案

在Sheet1,Cell A1中,放置此公式

=MAX(Sheet2!A1,Sheet3!A1,Sheet4!A1,Sheet5!A1)

在Sheet1,Cell B1中,放置了这个可怕的公式。我确信有更好的方法可以找到工作表名称。

=IF(Sheet1!A1=Sheet2!A1,RIGHT(CELL("filename",Sheet2!A1),LEN(CELL("filename",Sheet2!A1))- FIND("]",CELL("filename",Sheet2!A1),1)),IF(Sheet1!A1=Sheet3!A1,RIGHT(CELL("filename",Sheet3!A1),LEN(CELL("filename",Sheet3!A1))- FIND("]",CELL("filename",Sheet3!A1),1)),IF(Sheet1!A1=Sheet4!A1,RIGHT(CELL("filename",Sheet4!A1),LEN(CELL("filename",Sheet4!A1))- FIND("]",CELL("filename",Sheet4!A1),1)),IF(Sheet1!A1=Sheet5!A1,RIGHT(CELL("filename",Sheet5!A1),LEN(CELL("filename",Sheet5!A1))- FIND("]",CELL("filename",Sheet5!A1),1)),""))))

但强烈要求谨慎。要使用RIGHT(CELL("filename",Sheet2!A1),LEN(CELL("filename",Sheet2!A1))- FIND("]",CELL("filename",Sheet2!A1),1)),您需要保存工作簿。

我的Sheet2,A1有1,Sheet3,A1有2,Sheet4,A1有2.5,Sheet5,A1有3

enter image description here

VBA解决方案

Sub Sample()
    Dim ws As Worksheet
    Dim i As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        .Range("A1:A365").Formula = "=MAX(Sheet2!A1,Sheet3!A1,Sheet4!A1,Sheet5!A1)"
        .Range("A1:A365").Value = .Range("A1:A365").Value
        For i = 1 To 365
            Select Case .Range("A" & i)

            Case ThisWorkbook.Sheets("Sheet2").Range("A" & i).Value: .Range("B" & i).Value = "Sheet2"
            Case ThisWorkbook.Sheets("Sheet3").Range("A" & i).Value: .Range("B" & i).Value = "Sheet3"
            Case ThisWorkbook.Sheets("Sheet4").Range("A" & i).Value: .Range("B" & i).Value = "Sheet4"
            Case ThisWorkbook.Sheets("Sheet5").Range("A" & i).Value: .Range("B" & i).Value = "Sheet5"

            End Select
        Next i
    End With
End Sub

答案 1 :(得分:1)

快速解决方案

根据Sidd的回答,这是我的非VBA解决方案,没有可怕的公式

  1. 将此公式放在Sheet1!A1:=MAX(Sheet2:Sheet5!A1)
  2. 由于工作表名称不一定要灵活(我假设您不经常更改),您可以在B1中使用此公式:
    =IF(Sheet2!A1=A1,"Sheet2",
    IF(Sheet3!A1=A1,"Sheet3",
    IF(Sheet4!A1=A1,"Sheet5",
    "Sheet5")))
    
  3. 更多结构性解决方案(更适合许多工作表):

    如果你有很多工作表,你可以考虑这个替代方案。

    1. 列出工作表中存储的相关工作表。 (在示例中,我将列表放在E3:E7中)。将此范围命名为Sheets。 (类似于Sidd的可怕公式,我使用CELL公式动态获取每个工作表名称。但是,这在静态模型中不是必需的)
    2. (与上面的步骤1相同):将此公式放在Sheet1!A1:=MAX(Sheet2:Sheet5!A1)
    3. 将此公式放在A2中:

      =INDEX(Sheets,MATCH(1,COUNTIF(INDIRECT("'"&Sheets&"'!A1"),A1),0))

      将其作为数组公式输入,即按 Ctrl - Shift - 输入而不是输入

    4. 我上传了第二个解决方案here

      感谢this instruction

答案 2 :(得分:1)

由于要复制公式,您不希望在Peter Albert的公式中对A1中的单元格INDIRECT进行硬编码。您可以使用CELL("address",A1)来获取可以复制的A1的引用。

您还可以通过使用LOOKUP返回结果而不是INDEX&来避免数组输入公式的需要。 MATCH。 请注意,LOOKUP将返回上一个工作表的名称,如果出现平局,则返回最大值。

以下公式使用命名范围表格以及每个工作表的名称

=MAX(Sheet2:Sheet5!A1)        returns max value (identical to Peter Albert's formula)
=LOOKUP(2,1/COUNTIF(INDIRECT("'" & Sheets & "'!" & CELL("address",A1)),A1),Sheets)      returns name of sheet with max value

答案 3 :(得分:0)

制作两张新单张,其中一张标题为“ First ”,另一张为“ Last ”。通过包含宏的按钮为您的项目创建新工作表,以在“ First Last ”之间添加重复的工作表。然后,只需在报告单元格中添加其中一个简单公式:=SUM(First:Last!K28)=MAX(First:Last!K28)

相关问题