2015-02-05 129 views
0

我正在寻找一些宏代码的帮助。我在列A-E中有数据,但这些列中的行可能会每天都在变化。我需要一种方法来计算列C & E中的最小值以及列D中的最大值。然后在列F中,我想根据列C-E中的值及其与最小/最大值的关系来分配一个分数。例如,如果有29行数据和一个标题,则单元C31将具有在列D &E中具有类似设置的公式“= MIN(C2:C30)”。然后,单元F2将具有公式“= 0.25 *(1 /(C2/$ C $ 31))+ 0.25 * D2/$ D $ 31 + 0.5 * E2/$ E $ 31”。相对和绝对引用

当宏代码使用R [] C []格式并且行号不是静态时,我如何处理绝对单元格值?

+0

您是否知道使用宏的相对参考? – pnuts 2015-02-05 22:01:40

回答

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 

我希望这可以帮助任何有类似问题的人。