如何以SELECT方式选择Excel VBA表的子集 - > FROM - >哪里

时间:2010-02-02 22:28:16

标签: excel-vba vba excel

道歉这是经典的新手问题,但我找不到具体的答案。

我对Excel VBA和一般的编程都很陌生。我要做的是从一个大的excel表中选择一个大致采用这种格式的数据子集:

    Name          Data One     Data Two    Data N
    ----------------------------------------------------
    Person One       x            x          x
    Person One       x            x          x
    Person One       x            x          x
    Person Two       x            x          x
    Person Two       x            x          x
    Person Three     x            x          x

每隔几天我会有一张新的表格来处理,但我不知道会有多少人会被列入其中,或者每个人的参赛人数会有多少。

我的最终目标(现在......)是获取Person One的所有数据并将其复制到名为Person One的新工作表(在同一工作簿中),将Person Two的所有数据复制到新工作表叫做Person Two,等等。

如果我对SQL的基本理解是正确的,我将能够以SELECT data FROM table WHERE Person = Person One的形式使用命令。

但是,我无法在Excel中找到一种简单的方法。我可以看到有一些方法可以通过使用循环遍历行来记录数据从“Person One”变为“Person Two”然后定义这些范围的点。

我还看到我可以使用AutoFilter功能选择我想要的数据 - 我可以在第二张纸上过滤第一列的唯一记录,然后在AutoFilter设置中循环显示每个人的名字。

我还想到,我可以使用循环来遍历第一列中的条目,并在每个条目下插入一个空白行,因此表选择函数将为每个人选择每个数据块。

有没有更好的方法来完成我的目标?我本来以为这种情况很常见,但要么它不是,要么我正在寻找错误的东西。

干杯!

斯蒂芬

1 个答案:

答案 0 :(得分:4)

您可以使用ADO:

Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String

strFile = ActiveWorkbook.FullName

''Note HDR=No, then F1,F2 etc is used for column names
''If HDR=Yes, the names in the first row of the range
''can be used.
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")


cn.Open strCon

'Case sensitive
strSQL = "SELECT [Name],[Data One],[Data Two],[Data N] FROM [Sheet1$] " _
       & "WHERE [Name]='Person 1'"


rs.Open strSQL, cn, 3, 3
Worksheets("Sheet2").Cells(2, 1).CopyFromRecordset rs

请注意,您可以选择不同的[名称]并在结果记录集中循环以获取每个人的工作表。