在Excel

时间:2016-02-17 22:15:20

标签: database excel excel-formula relational-database

我正在使用excel中的数据库。我会尽量让它变得简单。

例如,

我有一个vlookup系列/水果系列,谁喜欢每种水果。

    Fruit - Person
1.  Apple – DeShoun
2.  Apple – John
3.  Apple – Scott
4.  Pear – Scott
5.  Strawberries – John… ect

在我的数据库中,我有一份水果清单和销售它的供应商

    Fruit - Vendor
1.  Apple – Sprouts
2.  Apple – Walmart
3.  Apple – Trader Joe’s
4.  Strawberries – Abel Farms
5.  Banana – Sprouts
6.  Pear – Sprouts…. ect

我需要能够在我的数据库中找到水果“apple”,并在数据库中创建新的信息行,使其看起来如下所示。

    Fruit - Vendor - Person
1.  Apple – Sprouts - DeShoun
2.  Apple – Walmart - DeShoun
3.  Apple – Trader Joe’s - DeShoun
4.  Apple – Sprouts - John
5.  Apple – Walmart – John
6.  Apple – Trader Joe’s - John
7.  Apple – Sprouts - Scott
8.  Apple – Walmart - Scott
9.  Apple – Trader Joe’s – Scott
10. Strawberries – Abel Farms - John
11. Banana – Sprouts - #N/A
12. Pear – Sprouts - Scott

由于我将处理至少1000多行,我需要知道是否存在以任何方式加速这一过程的过程。

有没有人有任何建议或链接/文章可以指出我正确的方向?

随意发表评论或提出任何有助于获得良好答案的问题。

由于

3 个答案:

答案 0 :(得分:1)

让我们说你的Fruit-Person表是表2,Fruit-Vendor是表3. Fruit是表格中的常用字段。您需要使用Fruit列中的唯一值构建表1。 (有许多方法可以构建具有唯一值的表格,如果您不知道,它们应该可以在线获取)

我列出了Excel-2013的流程,旧版本可能略有不同。

第0步:

根据之前的说明,您有3个表。 Table 1 has unique values

第1步:

逐个将它们全部转换为表格。 Alt + N>> T,或者,选择A1:A5>>插入>>表。 勾选选择我的表有标题。 enter image description here

对所有3个表重复此过程。他们应该是这样的: enter image description here

第2步:

在多个范围上创建数据透视表 A)在表1上创建数据透视表(插入>>数据透视表)。勾选检查"将此数据添加到数据模型"。的 IMP enter image description here

B)在数据透视表字段下,ALL;你应该看到所有3个表 enter image description here

步骤3:

创建关系 在“分析”选项卡中,单击“关系”。一个表示管理关系的框应该打开。我们的想法是建立关系。

A)尝试在表1和表2之间建立关系。 新>>选择以下选项:

表:表2

专栏(外国):水果

相关表格:表1

相关栏(小学):水果 enter image description here

B)让我们尝试在表1和表1之间建立它。 3 新>>选择以下选项:

表:表3

专栏(外国):水果

相关表格:表1

相关栏(小学):水果

应该如下所示: enter image description here

第4步:

形成枢轴 A)从表1中得到水果,表2中的人,表3中的供应商(按此顺序)作为行标签 enter image description here

B)现在,Table2 / Fruit和Table3 / Fruit需要作为Value Labels。 enter image description here

这样形成的桌子几乎就是决赛桌。您想要的行将是,其中D列和E都为1 。您可以通过过滤/粘贴值来关闭这些行。

(作为一个过程,粘贴图像似乎不是流行的方法,但如果没有它们,我无法在视觉上更好地解释它)

答案 1 :(得分:0)

一开始可能很难掌握,但我建议您查看INDEX MATCH函数。一起使用它们可以完成vlookup的功能,但是稍微了解它们会更灵活,可能更适合您的需求:)  http://fiveminutelessons.com/learn-microsoft-excel/how-use-index-match-instead-vlookup

可能会有帮助,或谷歌找到适合你的教程

特别针对您的问题,最困难的部分是匹配每个供应商,每个水果的人......可能需要VBA

答案 2 :(得分:0)

我对VBA很新,但是有点小提琴,这似乎与你描述的一样(作为一个潜在的例子......)。已将每个数据表放在单独的工作表中。

Sub FruityPerson_Matching()

Dim strFruit As String, strPerson As String, strVendor As String  'to hold text.
Dim myWB As Workbook, myWS_P As Worksheet, myWS_V As Worksheet, myWS_C As Worksheet
Dim LastRow As Integer, n As Integer, iNewRow As Integer
Dim rFruit As Range, checkCell As Range

Set myWB = Application.ActiveWorkbook
Set myWS_P = myWB.Worksheets("Person")
Set myWS_V = myWB.Worksheets("Vendor")
Set myWS_C = myWB.Worksheets("Combined")

LastRow = myWS_P.Cells(myWS_P.Rows.Count, "A").End(xlUp).Row    

首先循环遍历人员列表,在供应商列表中找到他们的第一个水果实例:

For n = 2 To LastRow
        strFruit = Cells(n, 1).Value
        strPerson = Cells(n, 2).Value 

    Set rFruit = myWS_V.Range("A:B").Find(What:=strFruit, LookIn:=xlValues, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)

    If Not rFruit Is Nothing Then
        Set checkCell = rFruit    'For checking when findnext gets back to original cell.
        strVendor = myWS_V.Cells(rFruit.Row, 2).Value

在最终的组合数据表中将其添加到新行(以确保它为空):

        iNewRow = myWS_C.Range("A" & myWS_C.Rows.Count).End(xlUp).Offset(1).Row

        myWS_C.Range("A" & iNewRow).Value = strFruit
        myWS_C.Range("B" & iNewRow).Value = strVendor
        myWS_C.Range("C" & iNewRow).Value = strPerson   

由于每个水果的潜在多个供应商,现在为同一个人循环:

        Do
            Set rFruit = myWS_V.Range("A:B").FindNext(After:=rFruit)

            If Not rFruit Is Nothing Then
                If rFruit.Address = checkCell.Address Then Exit Do  
                         'Shows: are back at start.
                strVendor = myWS_V.Cells(rFruit.Row, 2).Value

                iNewRow = myWS_C.Range("A" & myWS_C.Rows.Count).End(xlUp).Offset(1).Row

                myWS_C.Range("A" & iNewRow).Value = strFruit
                myWS_C.Range("B" & iNewRow).Value = strVendor
                myWS_C.Range("C" & iNewRow).Value = strPerson

            Else
                Exit Do
            End If
        Loop
    Else
        'What do if strFruit not found...?
        Exit Sub
    End If

    Next

End Sub

最后转到下一个人循环等,直到到达最后一行数据。

像你想到的那样?