VBA:如何比较一列中的值并写入另一列

VBA:如何比较一列中的值并写入另一列

我在比较 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

这基本上就是您的问题。其余的是补充信息。

我在比较 R 列中的值并获取具有最小数字的行并分配 B 列中可用的最大值时遇到了问题,但不知道该怎么做。

因此,让我将其分解为几个问题:

  • 在 VBA 中比较值

    在大多数 VBA Excel 查找场景中,您将创建一个循环来遍历列的行以查找值。 操作如下:

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

    Range('Sheetname'!A1).End(xlDown).Row 部分将转到包含数据的该列的最底部单元格。

    现在使用这项技术,您可以向下获取值。要与另一列的值进行比较,请在此列内使用类似结构的循环。

    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
    

相关内容