繁体   English   中英

一个程序,它将在最后一行中找到具有最小值的列,并将其在第一行中的值分配给变量? [Excel VBA]

[英]A program that will find the column with a minimum value in its last row and assign its value in the first row to a variable? [Excel VBA]

在我发布的关于此问题的最后一个帖子中,我得到了很多非常有用的建议,但它的效果并不好,所以我想我会得到更多的帮助。

所以我有一个看起来像这样的图表。 假设左上角值1在单元格A1中:

x=    1    2    3    4    5    6    7    8

      4    3    2    1    2    3    4    5

      9    8    7    6    7    8    9    10

      8    7    6    5    4    3    2    1

Sum= 21   18   15   12   13   14   15    16

第一行由1到8的x值组成。行2,3和4是使用等式中第一行中的x值得到的值。 第五行是第2,3行和第4行的总和。

我需要我的程序做的是,使用VBA,遍历Sum行,第五行,并检测最小值。 在这种情况下它将是12.然后它应该将该列的x值分配给变量X-Min。 最后,它应该将X-Min左侧和右侧的x值分配给它们自己的变量X-Left和X-Right。

因此,对于此示例,它将通过sum行并找到最小值为12.因此对于该列,它将转到第1行,并将值4分配给X-Min。 然后它将向左偏移并指定X-Left = 3,然后向右偏移并指定X-Right = 5。

这看起来很简单,但我遇到了很多问题。

从我上一篇文章中,我发现在sum行上使用MIN()函数会找到最小的值。 然后,MATCH()函数可以给出该值的列号。 此时,由于我知道x值全部在第一行,我可以使用ADDRESS()函数并使用MATCH()函数的结果,获得我想要的X-Min值的地址。 使用INDIRECT()函数,我可以将该地址的值分配给X-Min。

我遇到了一些问题。 首先,我无法让它在VBA中实际工作。 我不断收到数据不匹配错误。 其次,我不确定如何使用此方法来查找和分配X-Left和X-Right的值。 我正在考虑使用地址输出,然后向左和向右偏移,但我也在那里得到数据不匹配错误。

我想我的主要问题是我不确定如何实际输出这些东西,一旦它确实如此,就按照我需要的方式使用输出。

我对VBA很新,其中很多都开始过头了。 我理解每个部分单独做什么,但当他们走到一起并给我错误时,我并不完全理解为什么。

例如,我试图在使用VBA之前在excel电子表格中使用它,只是因此我知道我在做什么。 投入:

=CELL(ADDRESS(5,MATCH(MIN(A5:H5),A5:H5,0)))

进入一个单元格的公式给了我一个#VALUE! 错误。

我只是很困惑,很感激帮助!

我刚刚看到你发布了一个新问题。 继续我在上一个解决方案中的评论并满足您的新请求,您可以修改旧代码来执行此操作

Sub Sample()
    '~~> This will give you the value from row 1 in the same column
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(A4:H4,MATCH(MIN(A4:H4),A4:H4,0)))")).Column).Value
    '~~> This will give you the value from row 1 in immediate left column
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(A4:H4,MATCH(MIN(A4:H4),A4:H4,0)))")).Column - 1).Value
    '~~> This will give you the value from row 1 in immediate right column
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(A4:H4,MATCH(MIN(A4:H4),A4:H4,0)))")).Column + 1).Value
End Sub

跟进

Sub Sample()
    Dim Counter As Long

    Counter = Application.InputBox(Prompt:="Please enter a number", Type:=1)

    If Counter = False Or _
    Counter > ActiveSheet.Rows.Count -2 Then Exit Sub

    '~~> This will give you the value from row 1 in the same column
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(" & Counter + 2 & ":" & Counter + 2 & _
    ",MATCH(MIN(" & Counter + 2 & ":" & Counter + 2 & ")," & Counter + 2 & ":" & Counter + 2 & ",0)))")).Column).Value

    '~~> This will give you the value from row 1 in immediate left column
    '~~> You will have to put an error check here if the current column is 1
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(" & Counter + 2 & ":" & Counter + 2 & _
    ",MATCH(MIN(" & Counter + 2 & ":" & Counter + 2 & ")," & Counter + 2 & ":" & Counter + 2 & ",0)))")).Column - 1).Value

    '~~> This will give you the value from row 1 in immediate right column
    '~~> You will have to put an error check here if the current column is the same as total columns count
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(" & Counter + 2 & ":" & Counter + 2 & _
    ",MATCH(MIN(" & Counter + 2 & ":" & Counter + 2 & ")," & Counter + 2 & ":" & Counter + 2 & ",0)))")).Column + 1).Value
End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM