我正在寻找宏代码方面的一些帮助。我在A-E列中有数据,但这些列中的行可能每天都在变化。我需要一种方法来计算C和C列中的最小值。 E,以及D列中的最大值。然后在F列中,我想根据C-E列中的值及其与最小值/最大值的关系来分配分数。
例如,如果有29行数据和标题,则单元格C31将具有公式" = MIN(C2:C30)"列D& D中的类似设置E.然后,单元格F2将具有公式" = 0.25 *(1 /(C2 / $ C $ 31))+ 0.25 * D2 / $ D $ 31 + 0.5 * E2 / $ E $ 31"。
当宏代码使用R [] C []格式且行号不是静态时,如何处理绝对单元格值?
答案 0 :(得分:0)
所以这是我拼凑的代码。它不漂亮,但它可以工作并完成应该做的事情。我们非常感谢社区提供的任何格式提示。
Sub WeightedScore()
'
' WeightedScore Macro
'
' This will allow me to use a dynamic range of rows when sorting the table toward the end of the macro.
Dim LastRow As Integer
' This part is just some asthetic cleanup from the report that is generated
Rows("4:4").Select
Selection.Delete Shift:=xlUp
Columns("D:F").Select
Selection.Delete Shift:=xlToLeft
' These are the weights to be applied to each factor
Range("A1").Select
ActiveCell.FormulaR1C1 = "0.25"
Range("B1").Select
ActiveCell.FormulaR1C1 = "0.25"
Range("C1").Select
Selection.FormulaR1C1 = "0.5"
' This part essentially counts the rows to be sorted in the table toward the end of the macro
LastRow = Range("E3").CurrentRegion.Cells(Range("E3").CurrentRegion.Cells.Count).Row
' This code allows for the minimum and maximum values in the data column regardless of number of rows
Range("C4").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.FormulaR1C1 = "=MIN(R4C3:R[-1]C)"
Range("D4").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.FormulaR1C1 = "=MAX(R4C4:R[-1]C)"
Range("E4").Select
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.FormulaR1C1 = "=MIN(R4C5:R[-1]C)"
' This part is essentially admitting defeat, copying the min/max values below a variable number
' of rows, and then pasting them into static cells at the top of the sheet.
Range("C3").Select
Selection.End(xlDown).Select
Selection.Copy
Range("C2").PasteSpecial xlPasteValues
Range("D3").Select
Selection.End(xlDown).Select
Selection.Copy
Range("D2").PasteSpecial xlPasteValues
Range("E3").Select
Selection.End(xlDown).Select
Selection.Copy
Range("E2").PasteSpecial xlPasteValues
' This part names the "Score" column and applies the absolute weights and absolute min/max values
' to the relative cell values.
Range("F3").Select
Selection.FormulaR1C1 = "Score"
Range("F4").Select
Selection.FormulaR1C1 = _
"=1/(RC[-3]/R2C3)*R1C1+RC[-2]/R2C4*R1C2+RC[-1]/R2C5*R1C3"
Selection.NumberFormat = "#,##0.00"
Selection.Copy
ActiveCell.Offset(0, -1).Range("A1").Select
Selection.End(xlDown).Select
ActiveCell.Offset(-1, 1).Range("A1").Select
Range(Selection, Selection.End(xlUp)).Select
ActiveSheet.Paste
' This is where the data is selected and sorted based on the "Score" value above. The LastRow
' function as described earlier allows for a dynamic range of rows.
Range("A3:F" & LastRow).Select
ActiveWorkbook.Worksheets("Reports").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Reports").Sort.SortFields.Add Key:=Range("F4:F" & LastRow _
), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Reports").Sort
.SetRange Range("A3:F" & LastRow)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' This last part ends the macro with the highest "Score" selected
Range("F4").Select
End Sub
我希望这可以帮助任何有类似问题的人。