0

在我发布的最后一个帖子中,我得到了很多非常有用的建议,但效果不太好,所以我想我会在这方面得到更多帮助。

所以我有一个看起来像这样的图表。假设左上角的值 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 值组成。第二行、第三行和第四行是使用方程式中第一行中的 x 值得出的值。第五行是第二行、第三行和第四行的总和。

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

所以对于这个例子,它将遍历求和行并找到最小值为 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 电子表格中工作,这样我就知道我在做什么。投入:

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

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

我只是很困惑,希望能得到帮助!

4

1 回答 1

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
于 2012-07-27T15:56:27.087 回答