【问题标题】:Excel VBA to match and line up rowsExcel VBA 匹配和排列行
【发布时间】:2011-05-21 17:19:54
【问题描述】:

我有一个包含 A 到 J 列的 Excel 文档。我有一个包含相关数据但未对齐的列 K 到 N 的 Excel 文档。

我需要将 F 列中的值与 K 列中的值进行匹配,以便它们对齐。当我换K时,我必须同时换L,M,N。

我无法对 A 到 J 列进行排序 - 它们必须保留在原位。

之前的示例:

A     B     C     D     E     F        G     H     I     J     K       L     M     N

data  data  data  data  data  record1  data  data  data  data  record3 data  data  data

data  data  data  data  data  record2  data  data  data  data  record1 data  data  data

data  data  data  data  data  record3  data  data  data  data  

data  data  data  data  data  record4  data  data  data  data

之后的示例:

A     B     C     D     E     F        G     H     I     J     K       L     M     N

data  data  data  data  data  record1  data  data  data  data  record1 data  data  data

data  data  data  data  data  record2  data  data  data  data  

data  data  data  data  data  record3  data  data  data  data  record3 data  data  data

data  data  data  data  data  record4  data  data  data  data  

【问题讨论】:

    标签: excel excel-2007 vba


    【解决方案1】:

    最简单的方法可能是 ADO。

    Dim cn As Object
    Dim rs As Object
    Dim strFile As String
    Dim strCon As String
    Dim strSQL As String
    Dim s As String
    Dim i As Integer, j As Integer
    
    ''This is not the best way to refer to the workbook
    ''you want, but it is very convenient for notes
    ''It is probably best to use the name of the workbook.
    
    strFile = ActiveWorkbook.FullName
    
    ''Note that if HDR=No, F1,F2 etc are used for column names,
    ''if HDR=Yes, the names in the first row of the range
    ''can be used.
    ''This is the Jet 4 connection string, you can get more
    ''here : http://www.connectionstrings.com/excel
    
    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
        & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
    
    ''Late binding, so no reference is needed
    
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    
    cn.Open strCon
    
    strSQL = "SELECT * " _
           & "FROM [Sheet2$A1:J5] a " _
           & "LEFT JOIN [Sheet2$K1:N5] b " _
           & "ON a.F=b.k "
    
    rs.Open strSQL, cn, 3, 3
    
    
    ''Pick a suitable empty worksheet for the results
    
    Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rs
    
    ''Tidy up
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    

    【讨论】:

    • 大家好,这很好,我想我会尝试 ADO,我必须通过代码来完成,因为在此之前我有一些东西(在 K-N 中填充值)。 Remou 的一个问题,我不知道行数,所以我不能使用“Sheet2$A1:J5”和“Sheet2$K1:N5”,它超过 5 行,并且会不时更改。我如何指定尽可能多的记录而不是 5 个(类似于“recordCount”)。提前致谢。
    • 您可以使用列引用[Sheet2$A:J] 或命名范围& "FROM ANamedRange a "
    • 您好 Remou,我尝试了您的代码,但在“rs.Open strSQL, cn, 3, 3”上出现错误,调试器向我抛出“没有为一个或多个必需参数提供值”。代码与我所做的唯一更改相同的是“Sheet2$A1:J5”(以及“K-N”)到“Sheet1$A1:J10”。谢谢
    • 您的列上有标题吗?如果是这样,您应该在此处使用列标题:a.F=b.k,其中 F= 具有记录集 1 键和 k= 记录集 2 键的列名称,如果不是,您必须更改连接字符串以显示 HDR=No 并使用F1,F2,F3 等用于列名,这将给出a.F6=b.F11
    • 嗨 Remou,我有 A 到 J 的标题,但没有 K 到 N 的标题。所以我更改了代码,我得到了同样的错误。这正是我正在使用的: strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";" Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open strCon strSQL = "SELECT * " _ & "FROM [Sheet1$A:J] a " _ & "LEFT JOIN [Sheet1$K:N] b " _ & "ON a.F6=b.F11 " rs.Open strSQL, cn, 3, 3 Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rs
    【解决方案2】:

    对列 K - M 排序并将它们移到更远的位置(如 X-Z)

    在 K-M 列中添加 VLOOKUP() 函数以根据 F 列从 X-Z 提取数据。

    为了让它漂亮地使用INDEX() 函数拉出行#,并且只有在找到时才使用MATCH() 函数将数据从 X-Z 复制到 K-L。否则返回一个空字符串。

    A-J 列包含数据,F 列包含查找值

    X-Z 列,其中 X 包含循环匹配值的引用表

    =MATCH((Value in F),(XYZ Table),FALSE) 添加一列N 这会产生 #N/A 或行号

    带有=IF( NOT( ISNA(Value in N) ), INDEX((X Table), (Value in N) ), "")的K列

    带有=IF( NOT( ISNA(Value in N) ), INDEX((Y Table), (Value in N) ), "")的L列

    带有=IF( NOT( ISNA(Value in N) ), INDEX((Z Table), (Value in N) ), "")的M列

    除非您想在 VBA 中执行此操作,否则这是可行的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多