我在比较 R 列中的值并获取具有最小数字的行并分配 B 列中可用的最大值时遇到了问题,但不知道该怎么做。
在下面的屏幕截图中,我有从“Tarefas e Tempos”按钮获得的数据
使用下一个按钮“Maqs”中的这些数据,我将定义要划分工作负载的机器数量。在这个例子中,我选择了 4 台机器,这是输出
因此,正如您所看到的,程序从 B 列中的最大数字到最小数字。这意味着机器 1 的总数始终是最高的,机器 2 的总数将高于机器 3 的总数,依此类推。
我的问题是如何让程序执行此示例中对 M 列所执行的操作,但在 N 列中找到 R 列中的最低总数并在该行中写入,但在 N 列中写入下一个数字。
在这个例子中它应该变成这样
有人能帮助我吗?
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