如果函数有8个条件

时间:2015-12-27 14:28:47

标签: excel if-statement

我有以下表格:

tables

左边的第一个是我在excel中手动写入数据后的内容。右边的第二个是参考表。

基本上我想要的是一个multi-if功能,让我能够认识到我的训练计划的目标。

例如,我做了3组和10次重复,强度为66%,其余为150秒。基于此我想要一个快速的功能,告诉我这个程序是否是为力量,力量,耐力或肥大而设计的。

如果您在阅读右侧的表格时遇到问题,这可以让您更好地理解如何阅读它:为了培训" Power Single"你应该做2到6套,少于或等于6次,强度超过85%,休息120到300秒。

感谢您的帮助

P.S。我相信if功能是一个很好的解决方案,无论如何,如果你有别的东西可以随意告诉我。

2 个答案:

答案 0 :(得分:0)

这是一个我能够组合起来的公式。但请注意,只有在表中存在正确的四个变量时,它才有效。当然,你可以在它周围放一个IfError()来返回你想要的东西。

一个注意事项:为了实现这一点,您需要将数字范围“分解”为两列,如屏幕截图所示。这是因为查找将搜索两列,以查找数字介于两者之间的位置。

黄线是我自己的线,表明如果“混合”匹配正确,它将返回训练目标:

enter image description here

首先,我会打破公式。它基本上是一堆“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