Программа, которая найдет столбец с минимальным значением в последней строке и присвоит его значение в первой строке переменной? [Excel ВБА]

Я получил много очень полезных советов в последней теме, которую я опубликовал об этом, но это не работает слишком хорошо, поэтому я подумал, что получу дополнительную помощь по этому вопросу.

Итак, у меня есть диаграмма, которая выглядит примерно так. Предположим, что верхнее левое значение 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

Первая строка состоит из значений x от 1 до 8. Строки вторая, третья и четвертая представляют собой значения, полученные в результате использования значений x в первой строке в уравнении. Пятая строка является суммой второй, третьей и четвертой строк.

Что мне нужно, чтобы моя программа делала, используя VBA, чтобы просмотреть строку суммы, строку пять и определить наименьшее значение. В этом случае это будет 12. Затем он должен присвоить значение x для этого столбца переменной X-Min. Наконец, он должен присвоить значения x слева и справа от X-Min их собственным переменным, X-Left и X-Right.

Таким образом, для этого примера он просматривает строку суммы и находит наименьшее значение, равное 12. Таким образом, для этого столбца он переходит к строке 1 и присваивает значение 4 X-Min. Затем он сместится влево и присвоит X-Left = 3, а затем сместится вправо и присвоит X-Right = 5.

Кажется, это было бы очень просто, но у меня много проблем.

Из моего последнего сообщения я обнаружил, что использование функции MIN() в строке суммы найдет мне наименьшее значение. Затем функция ПОИСКПОЗ() может указать номер столбца, которым является значение. На этом этапе, поскольку я знаю, что все значения x находятся в первой строке, я могу использовать функцию ADDRESS() и, используя результаты функции MATCH(), получить адрес значения, которое я хочу для X-Min. Используя функцию ДВССЫЛ(), я могу получить значение этого адреса, присвоенное X-Min.

У меня есть несколько проблем. Во-первых, я не могу заставить это работать в VBA. Я продолжаю получать ошибки несоответствия данных. Во-вторых, я не уверен, как использовать этот метод, чтобы найти и присвоить значения для X-Left и X-Right. Я думал об использовании вывода адреса, а затем смещении влево и вправо, но я также продолжаю получать ошибки несоответствия данных.

Думаю, моя главная проблема в том, что я не уверен, как на самом деле сделать этот вывод, и как только он это сделает, использую вывод так, как мне нужно.

Я очень новичок в VBA, и многое из этого начинает немного ускользать от меня. Я понимаю, что делает каждая часть по отдельности, но когда они собираются вместе и выдают мне ошибки, я не совсем понимаю, почему.

Например, я пытаюсь заставить это работать в электронной таблице Excel, прежде чем даже использовать VBA, просто чтобы я знал, что делаю. Ввод:

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

в формулу для ячейки дает мне #ЗНАЧ! ошибка.

Я просто очень запутался и был бы признателен за помощь!


person TheTreeMan    schedule 27.07.2012    source источник


Ответы (1)


Я только что увидел, что вы опубликовали новый вопрос для этого. В продолжение моего комментария к предыдущему решению и для удовлетворения вашего нового запроса вы можете изменить старый код, чтобы сделать это.

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
person Siddharth Rout    schedule 27.07.2012
comment
Быстрый вопрос: поэтому я изменил его так, чтобы он искал всю строку, и изменил его на строку 5. Но как мне изменить диапазон с помощью переменной? Итак, для этого примера предположим, что у меня есть переменная с именем Counter, которая основана на пользовательском вводе, и в данном случае она равна трем. Вместо диапазона 5:5 он должен быть Counter+2:Counter+2. Я пытался вставить Counter+2:Counter+2, но это не сработало. Я пробовал заключать его в кавычки и пробовал использовать модификатор &, но это тоже не сработало. Я просто напортачил, вставляя его, или я должен сделать это особым образом? - person TheTreeMan; 27.07.2012
comment
один момент... обновление сообщения выше. - person Siddharth Rout; 27.07.2012