【问题标题】:Microsoft Excel 2003 - copying out-of-order descriptionsMicrosoft Excel 2003 - 复制乱序描述
【发布时间】:2013-01-14 23:48:30
【问题描述】:

我已经使用 Microsoft Excel 2003 进行了彻底的搜索,但找不到针对我的特定问题的答案。

我需要通过 svc_itm_cde(服务项目代码)将一个 xls 电子表格(我们称之为 ssA)中的 R 列描述(字母数字)复制到另一个电子表格 (ssB) 中的 L 和 M 列。大约有 300 个 svc_itm_cdes。

三个并发症:

  1. ssA 中的 svc_itm_cde 列与 ssB 中的顺序不同。
  2. ssB 中 L & M 的某些行已经包含描述,必须跳过。
  3. ssB 中的一些 svc_item_cdes 不会出现在 ssA 中,反之亦然。

一位朋友帮助我导出到 cvs 并开始编写 Python 脚本,但这太冗长了。有没有办法用 vba 代码做到这一点(最好)?

非常感谢。

【问题讨论】:

  • R 列中的内容是否进入目标工作表的两列(L 和 M)?似乎vlookup() 应该适用于此。
  • 你可以显示打印屏幕吗?更容易知道您要实现的目标。
  • vlookup 看起来很吸引人,蒂姆。我可能会试一试。抱歉,Alexandre,我忘了提及:不幸的是,这些数据是机密的,所以我可以概括地描述它们,但是打印屏幕会有点过分。我不想惹麻烦。 :(

标签: excel multiple-columns vba


【解决方案1】:

对于 300 条记录,这可能是一种过于复杂的方法,但它对于更大的数据集来说是一种有用的技术...

如果您只需要将所有数据集中在一个位置,以便确定要保留哪些描述以及要丢失哪些描述,那么您可以使用 ADO 并将两个数据集连接在一起。

首先转到 Visual Basic 编辑器(按 Alt+F11)。在那里使用工具 > 引用添加对“Microsoft ActiveX 数据对象 2.8 库”的引用

现在插入 > 模块并粘贴此代码:

Option Explicit

Sub master_list()

    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection

    ' This is the connection string for .xlsx files (Excel 2007 and later)
    With cn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
            "Extended Properties=Excel 12.0 Xml;"
        .Open
    End With

    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    rs.Open "SELECT * FROM [ssA$] LEFT JOIN [ssB$] ON [ssA$].[svc_itm_cde] = " & _
    "[ssB$].[svc_itm_cde] UNION ALL SELECT * FROM [ssA$] RIGHT JOIN [ssB$] ON " & _
    "[ssA$].[svc_itm_cde] = [ssB$].[svc_itm_cde] " & _
    "WHERE [ssA$].[svc_itm_cde] IS NULL;", cn

    Dim i As Integer
    Dim fld As ADODB.Field
    i = 0

    ' Sheet3 should be a blank sheet that we can output the results to
    With Worksheets("Sheet3")
         For Each fld In rs.Fields
             i = i + 1
             .Cells(1, i).Value = fld.Name
         Next fld

        .Cells(2, 1).CopyFromRecordset rs
    End With

    rs.Close
    cn.Close

    End Sub

如果您使用的是 Excel 2003 或更早版本,则连接字符串部分应为:

With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
        "Extended Properties=Excel 8.0;"
    .Open
End With

【讨论】:

  • 非常感谢您的所有回答。我很感激。问题解决了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2018-02-06
相关资源
最近更新 更多