Получить максимальное значение столбцов в Excel с помощью макроса - PullRequest
1 голос
/ 19 декабря 2011

Прежде всего, я не имею понятия писать макросы в Excel, но теперь я должен написать код для друга. Итак, поехали. В моей таблице Excel у меня есть таблица, в которой некоторые производители представлены в виде столбцов, а 12 месяцев года - в виде строк. В их пересекающейся ячейке написано количество продуктов, произведенных производителем за этот месяц. Теперь мне нужно найти максимальные и минимальные значения произведенных товаров в течение каждого месяца и вывести производителей этих товаров. Я нашел код для аналогичной проблемы, но я не понимаю его ясно, и в нем есть ошибки. Вот код:

Sub my()
Dim Rng As Range, Dn As Range, Mx As Double, Col As String
Set Rng = Range(Range("A1"), Range("A6").End(xlUp))
ReDim ray(1 To Rng.Count)

For Each Dn In Rng
Mx = Application.Max(Dn)
    Select Case Mx
        Case Is = Dn.Offset(, 0): Col = "A"
        Case Is = Dn.Offset(, 1): Col = "B"
        Case Is = Dn.Offset(, 2): Col = "C"
        Case Is = Dn.Offset(, 3): Col = "D"
    End Select
        ray(Dn.Row - 1) = Col
Next Dn

Sheets("Sheet2").Range("A2").Resize(Rng.Count) = Application.Transpose(ray)
End Sub

Я получаю следующую ошибку: Run-time error'9': Subscript out of range. Поэтому мой вопрос: что означает эта ошибка и что мне нужно изменить в этом коде, чтобы она работала?

EDIT1 : ОК, теперь ошибка исчезла. Но где я могу получить результаты?

EDIT2 Я знаю, что эта строка отвечает за вставку результатов в указанное место, но я не вижу их после выполнения. Что с этим не так?

Ответы [ 3 ]

1 голос
/ 19 декабря 2011

Ошибка означает, что массив, к которому вы пытаетесь получить доступ, не был определен так, чтобы содержать искомый порядковый номер: например, массив 10 имеет позиции 0-9, поэтому, если я попытаюсь получить доступ к массиву (10), он выдаст эту ошибку или массив (-1) будет выдавать эту ошибку.

Я не могу вспомнить, является ли excel массивом из 0 или 1.

Возможно изменить

ray(Dn.Row - 1) = Col

до

if dn.row-1<> 0 then ' or set it to <0 if zero based.
 ray(Dn.Row - 1) = Col
end if
0 голосов
/ 19 декабря 2011

Я использовал эти функции довольно широко, и они очень надежны и быстры:

Public Function CountRows(ByRef r As Range) As Integer
    CountRows = r.Worksheet.Range(r, r.End(xlDown)).Rows.Count
End Function

Public Function CountColumns(ByRef r As Range) As Integer
    CountColumns = r.Worksheet.Range(r.End(xlToRight), r).Columns.Count
End Function

Дайте ему ссылку (например, "A2"), и она вернет заполненные ячейки вниз илидо тех пор, пока не будет найдена пустая ячейка.

Чтобы выбрать несколько продаж, я обычно делаю что-то вроде

Set r = Range("A2")
N = CountRows(r)
Set r = r.Resize(N,1)
0 голосов
/ 19 декабря 2011

Вам не нужен VBA (макрос), чтобы сделать это.Это можно сделать с помощью формулы рабочего листа.

Например:

Если вашими производителями являются P1, P2, P3, P4 и ваш лист выглядит следующим образом: -

      A        B    C    D    E    F
   +-------------------------------------------
1  |  Month    P1   P2   P3   P4   Top Producer
2  |  Jan      5    4    3    2    
3  |  Feb      2    3    5    1
4  |  Mar      6    4    4    3
...
...

Следующая формула, помещенная в ячейки F2, F3, F4, ..., выберет лучшего производителя в каждом месяце.

=INDEX($B$1:$E$1,MATCH(MAX(B2:E2),B2:E2,0))

Как правило, лучше по возможности использовать встроенные функции Excel.Прибегайте к VBA, только если вам это действительно нужно.Даже если бы вы использовали верхние данные о производителе / ​​месяце для какой-либо другой операции, которая возможна только в VBA, по крайней мере для вас будет произведен по крайней мере вывод данных о главном производителе / ​​месяце с помощью рабочего листа, что упростит VBA, требуемый для всего процесса..

Транспонирование диапазона также может быть выполнено с использованием формулы листа с помощью функции TRANSPOSE () .

Кстати: я не уверен, что вы хотите сделатьесли два производителя имеют одинаковое выходное значение.В примере VBA в вашем вопросе логика выглядит следующим образом: - если два производителя достигли единой вершины в месяц, выберите первого, с которым столкнулись.Формула, которую я дал выше, должна повторять эту логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...