簡體   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