2017-01-23 138 views
0

我對Visual Basic有0經驗,但來自PHP/MySQL。在Excel用戶窗體中的VBA和數據透視表/用戶表單

我有一個要求創建一個用戶窗體,其中可以選擇多個產品,並輸出這些成分的原料列表。

我已經創建了rawingredients表,產品表和一個數據透視表。我得到儘可能多的選擇列表框與產品名稱,我需要一種方法來分配值的id(行號),並用它來查找所有成分的數據透視表,並將這些添加到一個文本區域。

Private Sub Userform_Initialize() 

ListBox1.List = sheets(2).Range("B1:B9").Value 

End Sub 

我曾試着用搜索引擎分配一個ID,值的方式,但我在努力,並想知道如果我解決這個問題的方法是不正確的,這是我會怎樣實現它作爲一個網站。

任何方向都會收到。

編輯

ingredient_id name 
1 fishmeal 
2 fish oil 
3 soya bean meal 
4 guar meal 
5 soya bean oil 
6 salt 
7 meat and bone meal 
8 green dye 

product_id name 
1 Expander Pellets 
2 Feed Pellets 
3 Green Pellets 

product_id ingredient_id 
1 1 
1 2 
1 3 
1 4 
2 1 
2 5 
2 3 
2 6 
3 7 
3 8 
3 2 

使用我需要含有3個產品名稱的列表框上表中的數據,可以選擇任何數量的這些產品。一旦完成選擇一個按鈕,將通過查找哪些成分屬於數據透視表上的產品來生成帶有這些成分的文本框。

我希望這個更清楚。

我可能不需要使用數據透視表,但從我的背景,這是如何在PHP/MySQL中實現。

+1

請再解釋一次,也許是點,你想達到什麼目的。你把4個獨立的東西放在一個句子中,這使得他們每一個特定的東西都有點神祕。 – Limak

+0

添加編輯有希望清除它? – Philwn

+0

您正在將這些表格存儲在一些Excel表格中,對嗎? – Limak

回答

1

您正試圖將關係基礎邏輯放入Excel中,其中Excel不支持這樣的想法。以下解決方案是我能想到的最佳解決方案。

Private Sub Userform_Initialize() 
    ListBox1.List = Sheets("Sheet1").Range("E2:E4").Value 
End Sub 

Private Sub CommandButton1_Click() 
Dim prod_id As Integer 
Dim output As String 
Dim r As Integer 
Dim ingrArr() As Variant 

With Sheets("Sheet1") 
    For i = 0 To ListBox1.ListCount - 1 
     If ListBox1.Selected(i) Then 
      prod_id = Sheets("Sheet1").Range("D" & i + 2).Value 
      j = 2 
      Do While Sheets("Sheet1").Range("G" & j).Value <> "" 
       If Sheets("Sheet1").Range("G" & j).Value = prod_id Then 
        r = Sheets("Sheet1").Columns("A:A").Find(What:=Sheets("Sheet1").Range("H" & j).Value, LookIn:=xlValues, LookAt:=xlWhole, SearchFormat:=False).Row 

        If Not IsInArray(.Range("A" & r).Value, ingrArr) Then 
         output = output & Sheets("Sheet1").Range("B" & r).Value & vbNewLine 
         On Error GoTo ErrHand2: 
          ReDim Preserve ingrArr(1 To UBound(ingrArr) + 1) 
         On Error GoTo 0 
ErrHand2: 
         If Err <> 0 Then 
          Err = 0 
          ReDim Preserve ingrArr(1 To 1) 
         End If 
         ingrArr(UBound(ingrArr)) = .Range("A" & r).Value 
        End If 

       End If 
       j = j + 1 
      Loop 
     End If 
    Next i 
End With 

MsgBox output 

End Sub 

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    On Error GoTo ErrHand1: 
     IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
    On Error GoTo 0 
ErrHand1: 
    If Err <> 0 Then 
     Err = 0 
     IsInArray = False 
    End If 
End Function 

我把我的數據在一個名爲Sheet1一個表,在表格你可以在圖片中看到。您可以通過更改工作表名稱和範圍,輕鬆地將其適用於您的工作簿。

pic1

+0

這真是太棒了,非常感謝你。我懷疑我可能一直試圖以錯誤的方式去做。我不明白代碼的每一位,但我可以醫治它,我已經將它輸出到一個文本框,並且輸出中的每個值都是逗號分隔的。 – Philwn

+0

有沒有簡單的方法從輸出中刪除重複的原料? – Philwn

+0

我看到的最乾淨的解決方案是使用'ingredient_id'創建數組,每次檢查當前的'ingredient_id'是否在此列表中。 – Limak