2015-12-27 42 views
0

我有以下表功能:如果有8個條件

tables

左邊的第一個是我後,我手動編寫Excel中的數據。右邊的第二個是參考表。

基本上我想要的是一個多重if函數,它使我能夠識別我的訓練計劃的目標。

例如,我做了3套和10次重複,強度爲66%,其餘時間爲150秒。基於此,我想要一個快速功能,告訴我這個程序是否爲力量,力量,耐力或肥大而設計。

如果您在閱讀右邊的表格時遇到困難,這可以讓您更好地理解如何閱讀它:爲了訓練「Power Single」,您應該從2到6組進行訓練,少於或等於6次訓練,強度超過85%,休息120到300秒。

感謝您的幫助

P.S.我相信if函數是一個很好的解決方案,無論如何,如果你有其他的東西可以隨時告訴我。

+0

如果它匹配多個項目? 4套,2個代表,87%和120s-300s至少會匹配前兩項,Power單和Power Multiple。 –

+0

是的,但後來我需要添加其他列強度肥大耐力 – AlbF

+0

你是否無視「休息(s)」列?如果你數一數,你的例子並不符合「Hypertrophy」行的所有部分。 – BaldEagle

回答

0

下面是一個公式,我可以把它放在一起工作。請注意,它只適用於表格中存在正確的四個變量。當然,您可以在其周圍放置IfError(),以便在不匹配的情況下返回所需內容。

其中一個注意事項:爲了使其工作,您需要將數值範圍「分解」爲兩列,如屏幕截圖中所示。這是因爲查找將搜索兩列,以查找數字落在哪裏。

黃線是我自己的線,表明如果一個「混合」是正確匹配,它會返回一個培養目標:

enter image description here

首先,我將打破公式向下。它基本上是一堆「If()」語句相乘的組合。 (對不起,但我不能肯定它是如何工作的,所以其他人可以親切地對此發表評論!)

=INDEX(G2:G6,MATCH(1,IF(A2>=H2:H6,IF(A2<=I2:I6,1)),0))

所以,你的指數將在G2進行設置:G6。 Match()中的If()聲明將返回在該範圍中找到您的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")

+0

當我編寫第一個公式時,我認爲所有「找不到完全匹配」 – AlbF

+0

@AngM - 如果需要,您是否調整了範圍?你確定數據*會返回一個嗎?如果你在我的例子中使用這些數字,那麼它仍然不起作用? – BruceWayne

+0

是的,我做了同樣的例子!我不知道如何在這裏放置一個截圖來展示結果。 – AlbF

0

,你同時運行範圍將返回符合您要求的任意組合之間的cross join query考慮一個SQL解決方案。 Excel可以使用VBA ADO和Jet/ACE引擎在工作簿中運行SQL查詢。

要執行以下操作,請將一個表移動到選項卡Workout中,並將另一個表移動到另一個選項卡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 

TrainingAim

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 

VBA宏

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 

結果

Sets Reps PctIRM Recovery TrainingAim SetsMin SetsMax RepsMin RepsMax PctIRMmin PctIRMmax RestMin RestMax 
6  6  0.9  150  Power Single 2  6  6  999  0.85  1   120  300 
+0

我真的很感謝你的工作,但我不知道怎麼做代碼工作,我需要粘貼它的位置?我需要一個按鈕嗎?老實說我是一個VBA初學者,我還沒有很好地掌握它。 – AlbF

+0

如前所述,將你的鍛鍊數據從A1單元格開始放在標籤中從TrainingAim選項卡的A1單元格開始的「Workout」和TrainingAim數據,然後創建一個新選項卡「Results」,並在第一行放置兩個表的所有列標題(Sets - RestMax)。查詢結果將從A2單元格開始。 – Parfait

+0

現在,輸入代碼,按Alt-F11打開VBA IDE窗口,雙擊uppe中的ThisWorkbook對象左面板。在右側的空白區域粘貼VBA代碼。在菜單欄上,單擊調試/編譯VBA項目。現在返回到主工作簿,在View圖標下,找到Macros(或Alt-F8),在這裏你可以選擇運行RunSQL。 – Parfait