2017-01-23 61 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