Arrays 如何创建VBA函数以查找数组中每行的最大值

Arrays 如何创建VBA函数以查找数组中每行的最大值,arrays,excel,vba,Arrays,Excel,Vba,我想创建一个自定义函数来查找数组中每个“行”的最大值。例如,我有一个样本5x3维数组,如下所示: [ 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0] 我想得到每一行的最大值,其形式如下: [0 1. 1. 1. 0] 请注意,这只是一个例子。我面临许多矩阵,它们需要完成这项任务。我在网上做了一些研究,但找不到一个简单的解决办法。我发现有一种方法需要在找到最大值之前输出到电子表

我想创建一个自定义函数来查找数组中每个“行”的最大值。例如,我有一个样本5x3维数组,如下所示:

[ 0     0      0
  0     1      1
  1     0      1
  1     1      1
  0     0      0]
我想得到每一行的最大值,其形式如下: [0 1. 1. 1. 0]

请注意,这只是一个例子。我面临许多矩阵,它们需要完成这项任务。我在网上做了一些研究,但找不到一个简单的解决办法。我发现有一种方法需要在找到最大值之前输出到电子表格中(但输出到电子表格中并不可取)。该代码如下:

Function Max_Each_Row(Data_Range As Range) As Variant
    Dim TempArray() As Double, i As Long
    If Data_Range Is Nothing Then Exit Function
    With Data_Range
    ReDim TempArray(1 To .Rows.count)
    For i = 1 To .Rows.count
        TempArray(i) = Application.Max(.Rows(i))
    Next
    End With
    Max_Each_Row = TempArray
End Function
有人能给我指一下正确的方向吗?i、 e.创建一个函数()以查找每行中具有最大值的所需数组,而无需将任何内容输出到电子表格中


谢谢你的帮助

将输入从范围更改为数组:

Function Max_Each_Row(Data_Range() As Variant) As Variant()
    Dim TempArray() As Variant, i As Long
    ReDim TempArray(LBound(Data_Range, 1) To UBound(Data_Range, 1))
    For i = LBound(Data_Range, 1) To UBound(Data_Range, 1)
        TempArray(i) = Application.Max(Application.Index(Data_Range, i + 1, 0))
    Next

    Max_Each_Row = TempArray
End Function
然后你可以直接从这样的潜艇上呼叫它

Sub mxrow()
Dim arr(4, 2) As Variant
Dim outArr() As Variant
arr(0, 0) = 0
arr(0, 1) = 0
arr(0, 2) = 0
arr(1, 0) = 0
arr(1, 1) = 1
arr(1, 2) = 1
arr(2, 0) = 1
arr(2, 1) = 0
arr(2, 2) = 1
arr(3, 0) = 1
arr(3, 1) = 1
arr(3, 2) = 1
arr(4, 0) = 0
arr(4, 1) = 0
arr(4, 2) = 0

outArr = Max_Each_Row(arr)
Dim i As Long
For i = LBound(outArr) To UBound(outArr)
    Debug.Print outArr(i)
Next i

End Sub

将输入从范围更改为数组:

Function Max_Each_Row(Data_Range() As Variant) As Variant()
    Dim TempArray() As Variant, i As Long
    ReDim TempArray(LBound(Data_Range, 1) To UBound(Data_Range, 1))
    For i = LBound(Data_Range, 1) To UBound(Data_Range, 1)
        TempArray(i) = Application.Max(Application.Index(Data_Range, i + 1, 0))
    Next

    Max_Each_Row = TempArray
End Function
然后你可以直接从这样的潜艇上呼叫它

Sub mxrow()
Dim arr(4, 2) As Variant
Dim outArr() As Variant
arr(0, 0) = 0
arr(0, 1) = 0
arr(0, 2) = 0
arr(1, 0) = 0
arr(1, 1) = 1
arr(1, 2) = 1
arr(2, 0) = 1
arr(2, 1) = 0
arr(2, 2) = 1
arr(3, 0) = 1
arr(3, 1) = 1
arr(3, 2) = 1
arr(4, 0) = 0
arr(4, 1) = 0
arr(4, 2) = 0

outArr = Max_Each_Row(arr)
Dim i As Long
For i = LBound(outArr) To UBound(outArr)
    Debug.Print outArr(i)
Next i

End Sub

试试这个,它会很好用的

 Option Explicit
    Option Base 1
    'by jlqmoreno@gmail.com
    Public Function MAX_IN_EACH_ROW(Rango As Object) As Variant
     Dim n%, i%, j%, MR() As Variant
      n = Rango.Rows.Count
       ReDim MR(n)
       For i = 1 To n Step 1
            MR(i) = Application.Max(Application.Index(Rango, i, 0)) '#In here I am slicing the original range into rows
       Next i
         MAX_IN_EACH_ROW = MR
    End Function

希望它有帮助

试试这个,它会很好用的

 Option Explicit
    Option Base 1
    'by jlqmoreno@gmail.com
    Public Function MAX_IN_EACH_ROW(Rango As Object) As Variant
     Dim n%, i%, j%, MR() As Variant
      n = Rango.Rows.Count
       ReDim MR(n)
       For i = 1 To n Step 1
            MR(i) = Application.Max(Application.Index(Rango, i, 0)) '#In here I am slicing the original range into rows
       Next i
         MAX_IN_EACH_ROW = MR
    End Function


希望有帮助

在您必须将矩阵输出到电子表格之前,如何在Excel中输入矩阵?您是否打算将此函数作为将由Excel调用的自定义项(并将输出写入调用它的电子表格单元格)或者只是一个仅从VBA代码中的其他函数/子例程调用的函数?这些矩阵是一些其他矩阵/数组的mmult函数。但由于我有太多这样的计算,所以将它们全部输出是没有效率的。上面显示的样本矩阵并不打算显示在电子表格中。是,该函数旨在成为UDF或由其他VBA代码调用的函数。如果这是不可能的,我需要求助于子程序。在将矩阵输出到电子表格之前,如何在Excel中输入矩阵?您是否打算将此函数作为将由Excel调用的自定义项(并将输出写入调用它的电子表格单元格)或者只是一个仅从VBA代码中的其他函数/子例程调用的函数?这些矩阵是一些其他矩阵/数组的mmult函数。但由于我有太多这样的计算,所以将它们全部输出是没有效率的。上面显示的样本矩阵并不打算显示在电子表格中。是,该函数旨在成为UDF或由其他VBA代码调用的函数。如果这是不可能的,我将需要求助于子程序。谢谢你的帮助。但是,我会有大约20000个这样的矩阵,一个接一个地编写它们是不实际的。你没有问如何填充数组,你问如何在不使用电子表格的情况下找到最大值,第二个代码只是一个例子。如何将矩阵填充到数组取决于您。哦,对不起,我误解了您的回答。我已经测试了代码。它可以作为一个函数在另一个子例程中使用,但不能用作UDF。当我用Max_Each_Row(ArrayA*ArrayB)测试它时,答案似乎不太正确。@DennisLe如果您将该代码(或任何类似的代码)用作自定义项,则需要确保将其作为数组公式输入,其列数与结果数组中的值数相同。因此,对于您的示例,您需要在5列中输入公式(每行最多一列)。如果要将其返回到多行,而不是多列,则需要使用
{=TRANSPOSE(Max_Each_Row(ArrayA*ArrayB))}
是的,这就是我所做的,但它只是一个[0 0 0 0 0 0]或[1 1 1 1 1 1 1 1]数组,而不是[0 1 1 1 0]。我运行了我的子程序,看到了正确的结果,但是电子表格中相同的计算不会给我相同的答案谢谢你的帮助。但是,我会有大约20000个这样的矩阵,一个接一个地编写它们是不实际的。你没有问如何填充数组,你问如何在不使用电子表格的情况下找到最大值,第二个代码只是一个例子。如何将矩阵填充到数组取决于您。哦,对不起,我误解了您的回答。我已经测试了代码。它可以作为一个函数在另一个子例程中使用,但不能用作UDF。当我用Max_Each_Row(ArrayA*ArrayB)测试它时,答案似乎不太正确。@DennisLe如果您将该代码(或任何类似的代码)用作自定义项,则需要确保将其作为数组公式输入,其列数与结果数组中的值数相同。因此,对于您的示例,您需要在5列中输入公式(每行最多一列)。如果要将其返回到多行,而不是多列,则需要使用
{=TRANSPOSE(Max_Each_Row(ArrayA*ArrayB))}
是的,这就是我所做的,但它只是一个[0 0 0 0 0 0]或[1 1 1 1 1 1 1 1]数组,而不是[0 1 1 1 0]。我运行了我的子程序,看到了正确的结果,但是电子表格中相同的计算不会给我相同的答案。谢谢分享。不知怎么的,这不管用。我想上面Scott的答案是我能得到的最好的答案,谢谢分享。不知怎么的,这不管用。我想上面斯科特的答案是我能得到的最好答案