Excel用户窗体中的VBA和数据透视表/用户窗体

我有0经验与Visual Basic,但来自PHP / MySQL的。

我有一个创build一个用户表单的要求,可以select多个产品,并输出这些成分的原料列表。

我创build了一个rawingredients表,产品表和一个数据透视表。

我已经尽可能多的产品名称填充多选列表框,我需要一种方法来分配值(行号),并使用它来查找所有成分的数据透视表,并将其添加到文本区域。

Private Sub Userform_Initialize() ListBox1.List = sheets(2).Range("B1:B9").Value End Sub 

我试图用google的方式给值赋予一个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个产品名称的列表框,可以select任意数量的这些产品。 一旦完成select一个button将通过查找哪些成分属于数据透视表上的产品生成一个文本框与成分。

我希望这个更清楚。

我可能不需要使用数据透视表,但从我的背景下,这是如何在PHP / MySQL中实现。

您正试图将关系基础逻辑放入Excel中,而Excel不支持这样的想法。 下面的解决scheme是最好的,我可以想出。

 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的表格Sheet1 ,在表格中可以看到图片。 您可以通过更改工作表名称和范围轻松地将其适用于您的工作簿。

PIC1