-1

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

На скриншоте ниже у меня есть данные, которые я получил от кнопки "Tarefas e Tempos"

http://prntscr.com/hikhix

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

https://prnt.sc/hikj82

Таким образом, как вы можете видеть, программа переходит от наибольшего к наименьшему числу в столбце B. Это означает, что машина 1 всегда будет иметь наибольшее общее количество, общее количество от машины 2 будет выше, чем машина 3 и так далее.

Мой вопрос заключается в том, как я могу заставить программу делать то, что делает в этом примере для столбца M, но в столбце N найти наименьшую сумму в столбце R и записать в этой строке, а в столбце N следующее число.

В этом примере это должно стать

http://prntscr.com/hikpnh

Кто-нибудь может мне помочь?

Private Sub CommandButton3_Click() 

    Worksheets("Sheet1").Activate

    Range("A1").Value = "j"
    Range("B1").Value = "pj"
    Range("E3").Value = "ultima celula em A"
    Range("E4").Value = Range("A1").End(xlDown).Row
    Range("E1").Value = "total tarefas"
    Range("E2").Value = Cells(4, 5).Value - 1

    Columns("A:B").Select                                                       
    Selection.Sort Key1:=Range("B2"), Order1:=xlDescending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal


    Range("L1").Value = "máqs a usar?"                                          
    Dim M As Long
    M = Application.InputBox(Prompt:="N maq?", Type:=1)

    Do While M < 2
    M = Application.InputBox(Prompt:="N maq? ", Type:=1)
    Loop

    If M > Rows.Count Then
        M = Rows.Count
    End If


    Range("F1").Value = "total maqs"
    Range("F2").Value = M
    Range("F3").Value = "colunas a fazer"
    colunasAfazer = Range("E2").Value / Range("F2").Value
    Range("F4").Value = colunasAfazer
    Range("F5").Value = "arredondamento"
    Range("F6").Value = Round(colunasAfazer + 0.44)
    arredondado = Range("F6").Value


    For i = 2 To M + 1                                                        
        Cells(i, 12) = i - 1
    Next i


    contador = 0

    Range("R1").Value = "Total"
    Range("R2").Value = 0
    Range("R3").Value = 0


    Dim j, q As Integer
    For j = 12 To arredondado + 11 
        For i = 2 To M + 1
            q = i - 1

            Range("R" & i) = WorksheetFunction.Sum(Range("M" & i & ":Q" & i))

            If (Cells(i, j)) <> "" Then

                contador = contador + 1

                Cells(i, j + 1) = WorksheetFunction.Large(Columns(2), contador) 

                Range("R" & i) = WorksheetFunction.Sum(Range("M" & i & ":Q" & i))

            End If   
        Next i
    Next j

End Sub

1 ответ1

1

Это в основном ваш вопрос. В остальном добавлена информация.

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

Итак, позвольте мне разбить его на несколько вопросов:

  • Сравнение значений в VBA

    В большинстве сценариев поиска VBA excel вы создадите цикл, который будет перемещаться по строкам столбца для поиска значений. Это сделано так:

    For row = 1 to Range("'Sheetname'!A1").End(xlDown).Row - 1
    
    next
    

    Диапазон ("Имя листа"!A1).End (xlDown).Часть строки перейдет в самую нижнюю ячейку этого столбца, который содержит данные.

    Теперь, используя эту технику, вы можете пойти вниз и получить значения. Чтобы сравнить со значением другого столбца, используйте цикл аналогичной структуры внутри этого.

    For row = 1 to Range("'Sheetname'!A1").End(xlDown).Row - 1
        For row2 = 1 to Range("'Sheetname'!B1").End(xlDown).Row - 1
    
        next
    next
    

    Теперь это облегчает сравнение. Вы могли бы сделать что-то вроде:

    If Range("'Sheetname'!A" & row).value = Range("'Sheetname'!B" & row2).value then
    'Do Stuff
    End If
    
  • Получение наименьшего числа в столбце

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

    Dim smallest as integer
    smallest = 10000
    

    Сначала установите значение по умолчанию действительно высоким, чтобы всегда находилось что-то меньшее, а затем просто проходите через сравнение:

    For row = 1 to Range("'Sheetname'!A1").End(xlDown).Row - 1
        If Range("'Sheetname'!A" & row).value < smallest then
            smallest = Range("'Sheetname'!A" & row).value
        End If
    next
    

    Чтобы получить строку с наименьшим значением, просто измените вышеприведенное значение примерно так:

    Dim smallestrow as integer
    smallestrow = -1
    
    For row = 1 to Range("'Sheetname'!A1").End(xlDown).Row - 1
        If Range("'Sheetname'!A" & row).value < smallest then
            smallest = Range("'Sheetname'!A" & row).value
            smallestrow = row
        End If
    next
    
    If smallestrow = -1 then
        'No row found for some reason
    Else
        'smallest row found at smallestrow
    End If
    
  • Получение наибольшего значения

    Идентичен примеру с наименьшим числом, только наоборот.

  • Присвоение значений

    Чтобы назначить значения, в любом месте цикла или вне его просто сделайте что-то вроде этого:

    Range("'Sheetname'!A" & row).value = "some value"
    

    или же

    Range("'Sheetname'!A" & row).value = smallest
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .