引用具有多个条件的表

时间:2015-06-06 14:03:15

标签: excel vba sorting selection

我会尽可能准确地解释我的情况。

    1       2       3       4       5
1   3352    3635    4458    4137    4690

2   3352    3635    4458    4137    4690

3   3352    3635    4458    4137    4690

4   3352    3635    4458    4137    4690

5   3352    3635    4458    4137    4690

所以上表纯粹是为了说明我的问题。我的实际表格将包含不断变化的值。

我为我提供了一些值,例如:2和5。

所以基本上我只想搜索编号为2和5的列。我想知道最小值。

现在对于棘手的部分,在最小成本旁边,我希望它返回值相应的行号(左边的1-5)。现在最重要的是。如果有两个相同的值,则应选择行号最高的值。所以最小值将是相同的,但它将返回最高的行号。

我已经用常规的excel功能尝试了几周,并没有得到我想要的东西。我们的想法是拥有一个可以使用不同的输入(不同的参考列)拖动和计算多次的函数。虽然所有的功能我都能找到复杂的复制位置。

我希望有人有个主意。我目前正在关注VBA,但我还没有能够构建有效的东西。

提前致谢!

1 个答案:

答案 0 :(得分:1)

创建要检查的列数组,然后获取这些列的总分:

Sub MinFromColumns()
   Dim ColumnsToCheck(1 To 3) As Long
   Dim wf As WorksheetFunction
   Set wf = Application.WorksheetFunction

   ColumnsToCheck(1) = 2
   ColumnsToCheck(2) = 5
   ColumnsToCheck(3) = 7

   overallmin = wf.Min(Columns(ColumnsToCheck(1)))
   For i = 2 To 3
      If wf.Min(Columns(ColumnsToCheck(i))) < overallmin Then overallmin = wf.Min(Columns(ColumnsToCheck(i)))
   Next i
   MsgBox overallmin
End Sub

修改#1:

以下是从工作表单元格中获取列选择器的示例:

Sub MinFromColumns()
   Dim ColumnsToCheck(1 To 3) As Long
   Dim wf As WorksheetFunction
   Set wf = Application.WorksheetFunction

   ColumnsToCheck(1) = Sheets("Sheet3").Range("K1")
   ColumnsToCheck(2) = Sheets("Sheet3").Range("L1")
   ColumnsToCheck(3) = Sheets("Sheet3").Range("M1")

   overallmin = wf.Min(Columns(ColumnsToCheck(1)))
   For i = 2 To 3
      If wf.Min(Columns(ColumnsToCheck(i))) < overallmin Then overallmin = wf.Min(Columns(ColumnsToCheck(i)))
   Next i
   MsgBox overallmin
End Sub

修改#2:

周一比预期更早到达。
删除旧代码并将其替换为:

Sub MinFromColumns()
   Dim OverallMin As Variant
   Dim ColumnsToCheck(1 To 3) As Long
   Dim wf As WorksheetFunction, r As Range
   Dim addy As String, rColumn As Range
   Set wf = Application.WorksheetFunction

   ColumnsToCheck(1) = Sheets("Sheet3").Range("K1")
   ColumnsToCheck(2) = Sheets("Sheet3").Range("L1")
   ColumnsToCheck(3) = Sheets("Sheet3").Range("M1")

   OverallMin = wf.Min(Columns(ColumnsToCheck(1)))

   For i = 2 To 3
      Set rColumn = Columns(ColumnsToCheck(i)).Cells
      If wf.Min(rColumn) < OverallMin Then
         OverallMin = wf.Min(rColumn)
         Set r = rColumn.Find(what:=OverallMin)
         addy = r.Address(0, 0)
      End If
   Next i

   MsgBox OverallMin & vbCrLf & addy
End Sub

addy 给出最小值的确切位置(行和列)