一个程序,它将在最后一行中find最小值的列,并将其第一行中的值赋给variables?

在我发布的最后一篇文章中,我得到了很多非常有用的build议,但是效果并不好,所以我想我可以多一些帮助。

所以我有一个图表,看起来像这样。 假设左上angular的值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值得到的值。 第五行是第二,三,四行的总和。

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

所以对于这个例子来说,它会经过总和行,find最小的值是12.所以对于那个列,它将进入第1行,并将值4分配给X-Min。 然后它将偏移到左侧,并指定X-Left = 3,然后向右偏移并指定X-Right = 5。

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

从我上一篇文章中,我发现在总和行上使用MIN()函数会发现我是最小的值。 然后,MATCH()函数可以给出当前值的列号。 在这一点上,由于我知道x值都在第一行,所以我可以使用ADDRESS()函数并使用MATCH()函数的结果得到X-Min所需的值的地址。 使用INDIRECT()函数,我可以将该地址的值分配给X-Min。

我有几个问题。 首先,我不能在VBA中实际工作。 我不断收到数据不匹配错误。 其次,我不知道如何使用这个方法来查找和分配X-Left和X-Right的值。 我正在考虑使用地址输出,然后左右偏移,但是我也不断收到数据不匹配错误。

我想我的主要问题是,我不知道如何实际做出这个输出的东西,一旦它,以我需要的方式使用输出。

我对VBA非常陌生,很多这一点已经开始让我有点头痛了。 我明白每个部分单独做什么,但是当他们聚在一起给我错误时,我不完全明白为什么。

例如,我试图在甚至使用VBA之前让它在Excel电子表格中工作,只是让我知道我在做什么。 join:

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

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

我只是很困惑,并会感谢帮助!

我刚刚看到你已经发布了一个新的问题。 继续我在以前的解决scheme的评论,并适应您的新要求,你可以修改旧的代码来做到这一点

 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