我有以下表格:
左边的第一个是我在excel中手动写入数据后的内容。右边的第二个是参考表。
基本上我想要的是一个multi-if功能,让我能够认识到我的训练计划的目标。
例如,我做了3组和10次重复,强度为66%,其余为150秒。基于此我想要一个快速的功能,告诉我这个程序是否是为力量,力量,耐力或肥大而设计的。
如果您在阅读右侧的表格时遇到问题,这可以让您更好地理解如何阅读它:为了培训" Power Single"你应该做2到6套,少于或等于6次,强度超过85%,休息120到300秒。
感谢您的帮助
P.S。我相信if功能是一个很好的解决方案,无论如何,如果你有别的东西可以随意告诉我。
答案 0 :(得分:0)
这是一个我能够组合起来的公式。但请注意,只有在表中存在正确的四个变量时,它才有效。当然,你可以在它周围放一个IfError()
来返回你想要的东西。
一个注意事项:为了实现这一点,您需要将数字范围“分解”为两列,如屏幕截图所示。这是因为查找将搜索两列,以查找数字介于两者之间的位置。
黄线是我自己的线,表明如果“混合”匹配正确,它将返回训练目标:
首先,我会打破公式。它基本上是一堆“If()”语句相乘的组合。 (对不起,但我不太确定它是如何工作的,所以其他人可能会对此发表评论!)
=INDEX(G2:G6,MATCH(1,IF(A2>=H2:H6,IF(A2<=I2:I6,1)),0))
因此,您的索引将设置为G2:G6。 If()
中的Match()
语句将返回您在该范围内找到Set
的行。 (这就是为什么你需要为范围创建两列的原因)。
然后,您只需重复该If()
语句,更改参数以匹配您要匹配的新数据。瞧!输入为数组, CTRL + SHIFT + ENTER :
=IFERROR(INDEX($G$2:$G$6,MATCH(1,(IF($B2>=$J$2:$J$6,IF($B2<=$K$2:$K$6,1))*IF($A$2>=$H$2:$H$6,IF($A2<=$I$2:$I$6,1))*IF($C2>=$L$2:$L$6,IF($C2<=$M$2:$M$6,1))*IF($D2>=$N$2:$N$6,IF($D2<=$O$2:$O$6,1))),0)),"No exact match found")
或者,更好的易读性的另一个选择是命名范围。然后它可能看起来像这样:
=IFERROR(INDEX(Training_Aim,MATCH(1,(IF($B2>=Sets_Min,IF($B2<=Sets_Max,1))*IF($A$2>=Reps_Min,IF($A2<=Reps_Max,1))*IF($C2>=RM_Min,IF($C2<=RM_Max,1))*IF($D2>=Rest_Min,IF($D2<=Rest_Max,1))),0)),"No exact match found")
答案 1 :(得分:0)
考虑一种SQL解决方案,您可以在两个范围之间运行cross join query,这将返回符合您需求的任何组合。 Excel可以使用VBA ADO和Jet / ACE引擎在工作簿中运行SQL查询。
要在下面实施,请将一个表格移至选项卡SELECT stuff
FROM table
WHERE MONTH(date) BETWEEN 11 AND 12
AND YEAR(date) = 2015
ORDER BY DATE DESC
,将另一个表格移至另一个标签Workout
中,然后运行该宏。您需要将范围分解为最小值和最大值。结果显示,多个匹配将叠加在一起。但根据发布的数据,一项培训匹配:Power Single。
<强>锻炼强>
TrainingAim
<强> TrainingAim 强>
Sets Reps PctIRM Recovery
3 10 0.66 150
6 2 0.55 300
2 13 0.35 150
3 15 0.45 300
6 6 0.9 150
2 4 0.85 300
5 2 0.75 300
3 11 0.65 400
1 13 0.6 450
2 6 0.7 150
VBA宏
TrainingAim SetsMin SetsMax RepsMin RepsMax PctIRMmin PctIRMmax RestMin RestMax
Power Single 2 6 6 999 0.85 1 120 300
Power Multiple 3 5 1 2 0.8 0.9 120 300
Strength 3 5 3 5 0.75 0.85 120 300
Hypertrophy 3 6 6 12 0.67 0.85 30 90
Endurance 2 3 12 999 0.67 1 0 30
结果
Sub RunSQL()
On Error GoTo ErrHandle
Dim conn As Object
Dim rst As Object
Dim strConnection As String, strSQL As String
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
& "DBQ=C:\Path\To\Workbook.xlsm;"
'strConnection = "DRIVER={Microsoft Excel Driver (*.xls)};" _
'& "DBQ=C:\Path\To\Workbook.xls;"
'strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _
'& "Data Source='C:\Path\To\Workbook.xlsm';" _
'& "Extended Properties=""Excel 8.0;HDR=YES;"";"
'strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" _
'& "Data Source='C:\Path\To\Workbook.xls';" _
'& "Extended Properties=""Excel 8.0;HDR=YES;"";"
strSQL = " SELECT [Workout$].*, [TrainingAim$].*" _
& " FROM [Workout$], [TrainingAim$]" _
& " WHERE [Workout$].Sets BETWEEN [TrainingAim$].SetsMin AND [TrainingAim$].SetsMax" _
& " AND [Workout$].Reps BETWEEN [TrainingAim$].RepsMin AND [TrainingAim$].RepsMax" _
& " AND [Workout$].PctIRM BETWEEN [TrainingAim$].PctIRMmin AND [TrainingAim$].PctIRMmax" _
& " AND [Workout$].Recovery BETWEEN [TrainingAim$].RestMin AND [TrainingAim$].RestMax;"
' OPEN THE CONNECTION
conn.Open strConnection
rst.Open strSQL, conn
' OUTPUT SQL RESULTS IN RESULTS TAB
Worksheets("Results").Range("A2").CopyFromRecordset rst
rst.Close
conn.Close
' CLOSE THE CONNECTION
MsgBox "Successfully ran SQL query!", vbInformation
Exit Sub
ErrHandle:
MsgBox Err.Number & " = " & Err.Description, vbCritical
Exit Sub
End Sub