我在上一篇关于此帖的帖子中得到了很多非常有用的建议,但是效果不好,所以我想我会对此有所帮助。
所以我有一个看起来像这样的图表。假设左上角的值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!错误。
我很困惑,也很感激帮助!
答案 0 :(得分:2)
我刚刚看到您发布了一个新问题。继续我之前的解决方案中的评论并适应您的新请求,您可以修改旧代码来执行此操作
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