最好的方式来存储表/表的行/列?

我有一个工作簿,从其他几个工作表中提取数据。 通常,数据存储在每张表中的表格中。 在这种情况下,一个表是一个数据连接到我们的数据库,我们的订单存储在那里。

为了成功地从每张纸上获取正确的数据,我创build了一个如下所示的“Data”子文件:

Dim Wb(1 To 10) As Workbook Dim Sh(1 To 10) As Worksheet Dim Lo(1 To 10) As ListObject Dim Ii&(1 To 10), Jj&(1 To 10), Kk&(1 To 10) Sub Data() Set Wb(1) = ThisWorkbook Set Sh(1) = Wb(1).Worksheets("Input") Set Lo(1) = Sh(1).ListObjects("Input") With Lo(1) Ii(1) = .ListColumns("Date").Range.Column Ii(2) = .ListColumns("ArtNo").Range.Column Ii(3) = .ListColumns("ArtName").Range.Column Ii(4) = .ListColumns("ArtUnits").Range.Column ' Units in the article Ii(5) = .ListColumns("ArtLitres").Range.Column ' Litres in the article Ii(6) = .ListColumns("Quantity").Range.Column Ii(7) = .ListColumns("SumUnits").Range.Columne ' Units * Quantity Ii(8) = .ListColumns("SumLitres").Range.Columne ' Litres * Quantity End With ' Table from Database containing the orders Set Sh(2) = Wb(1).Worksheets("Orders") Set Lo(2) = Sh(2).ListObjects("Orders") With Lo(2) Jj(1) = .ListColumns("Date").Range.Column Jj(2) = .ListColumns("ArtNo").Range.Column Jj(6) = .ListColumns("Quantity").Range.Column End With ' Database containing detailed information on the articles Set Sh(3) = Wb(1).Worksheets("ArtData") Set Lo(3) = Sh(3).ListObjects("ArtData") With Lo(3) Kk(2) = .ListColumns("ArtNo").Range.Column Kk(3) = .ListColumns("ArtName").Range.Column Kk(4) = .ListColumns("ArtUnits").Range.Column ' Units in the article Kk(5) = .ListColumns("ArtLitres").Range.Column ' Litres in the article End With End Sub 

所以,当我运行Data子时,我知道所有相关列在哪里。 我已经看到,每个数字代表相同的列名称。 我的意思是说,Ii(2),Jj(2)和Kk(2)等于每个表中名为“ArtNo”的列。

我开始使用数组,因为他们更快地声明。 而不是像“ArtNo1”,“ArtNo2”,“ArtNo3”或ArtNo(1到3)那样声明单独的整数,我只是知道每个表中的数字(1)等于ArtNo,而且我会使用一个数组(“Ii”,“Jj”,“Kk”)。 我只需要知道每个数字代表什么和最坏的情况; 我将滚动到数据子,并得到答案。

为了获得数据我会做这样的事情:

 Sub TransferData() Dim dDate As Date Dim Str$ Dim Cel As Range Dim X&, Y& CalcOff Data Wb(1).RefreshAll ' Updates the Order data connection X = Lo(1).DataBodyRange.Row ' Get input row for the data Str = Format(dDate, "yyyy-mm-dd", vbMonday, vbFirstFourDays) ' Used for filtering the table ' Filtering the order database, showing only the chosen date Lo(2).AutoFilter.ShowAllData Lo(2).Range.AutoFilter Field:=Jj(1), Operator:=xlFilterValues, Criteria2:=Array(2, Str) With Sh(1) For Each Cel In Lo(2).ListColumns(Jj(2)).DataBodyRange.SpecialCells(xlCellTypeVisible) ' Transferring from the Order database .Cells(X, Ii(1)) = dDate .Cells(X, Ii(2)) = Cel .Cells(X, Ii(6)) = Sh(2).Cells(Cel.Row, Jj(6)) ' Find the 'ArtNo' row from the Info database Y = Lo(3).ListColumns(Kk(2)).Find(Cel, LookIn:=xlValues, LookAt:=xlWhole).Row ' Transferring from the Info database .Cells(X, Ii(3)) = Sh(3).Cells(Y, Kk(3)) .Cells(X, Ii(4)) = Sh(3).Cells(Y, Kk(4)) .Cells(X, Ii(5)) = Sh(3).Cells(Y, Kk(5)) ' Calculating units and litres .Cells(X, Ii(7)) = .Cells(X, Ii(6)) * .Cells(X, Ii(4)) .Cells(X, Ii(8)) = .Cells(X, Ii(6)) * .Cells(X, Ii(5)) X = X + 1 Next Cel End With CalcOn End End Sub Function CalcOff() Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Application.EnableEvents = False End Function Function CalcOn() Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Application.EnableEvents = True End Function 

我的问题是:

有没有更简单的方法来传输这样的数据? 我正在考虑上课,但是我从来没有和他们合作过,所以我非常感谢,如果有人能够举一个例子来说明如何在这样的转移中实现类。

请注意,代码只是一个很快写的例子。 我已经把所有的表格放在每张表格的“A1”中,否则我将不得不为每一列做下列事情:

 Ii(1) = .ListColumns("Date").Range.Column - .Range.Column + 1 

是。 使用Microsoft Query 。 它不需要安装PowerQuery,因为它可以像来自Excel本地的数据库链接一样使用。 以下在工作表之间传输数据的示例:

 SELECT * FROM [Input$] as I INNER JOIN [AnotherWorksheet$] as A ON I.ArtNo = A.ArtNo 

然后从VBA更新查询:

 ActiveSheet.QueryTables(1).Refresh BackgroundQuery:=False 

您可以从数据function区选项卡(从其他来源)或使用我的加载项(仅用于创build查询) 链接创build一个Microsoft Query。

这里是一个例子,说明如何使用Iif来返回基于星期几的不同值:

 SELECT Iif( DatePart ("w", #05/07/2015#,2) = 1, 1,0) as StartMonday, Iif( DatePart ("w", #05/07/2015#,2) = 2, 1,0) as StartTuesday, Iif( DatePart ("w", #05/07/2015#,2) = 3, 1,0) as StartWednesday, Iif( DatePart ("w", #05/07/2015#,2) = 4, 1,0) as StartThursday, Iif( DatePart ("w", #05/07/2015#,2) = 5, 1,0) as StartFriday 

这将返回类似于:

 StartMonday | StartTuesday | StartWednesday | StartThursday | StartFriday 0 | 0 | 0 | 1 | 0