首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型数据集的跨多列索引匹配

大型数据集的跨多列索引匹配
EN

Stack Overflow用户
提问于 2019-06-06 15:50:58
回答 1查看 87关注 0票数 0

我正在设置一些自动化,以便将两个数据库合并到Excel中。每一行都有一个唯一的标识符(C列)。我已经编写了一些可以工作的代码,但是它既笨重又丑陋,不能适应更大的问题。

当前,如果找到结果,则代码循环遍历目标表和匹配项中的行。如果没有结果,则使用错误跳过转到下一列。它可以工作,但我希望能够移动很多列,并且为每一列添加另一条重复行和错误处理程序是不好的。

如果任何提示都能类似于DO While循环中的代码,将不胜感激。

代码语言:javascript
复制
Public Sub HistoryTransfer()

    Application.ScreenUpdating = False

    'copies last month's history information into this months RAG spreadsheet
    Dim HistoryWS As Worksheet
    Set HistoryWS = ActiveWorkbook.Sheets("RAG History")

    Dim RAGspreadsheet As Worksheet
    Set RAGspreadsheet = ActiveWorkbook.Sheets("RAG Spreadsheet")

    Dim lastRow As Integer
    lastRow = HistoryWS.Cells(Rows.Count, "A").End(xlUp).Row

    Dim RAGlastRow As Integer
    RAGlastRow = RAGspreadsheet.Cells(Rows.Count, "A").End(xlUp).Row

    Dim i As Integer
    i = 11
    Do While i < RAGlastRow
        On Error GoTo Errorhandler
        RAGspreadsheet.Range("Z" & i) = WorksheetFunction.Index(HistoryWS.Range("N11", "N" & lastRow), Application.Match(RAGspreadsheet.Range("C" & i).Value, HistoryWS.Range("C11", "C" & lastRow), 0))
Errorskip:
        On Error GoTo Errorhandler2
        RAGspreadsheet.Range("AA" & i) = WorksheetFunction.Index(HistoryWS.Range("O11", "O" & lastRow), Application.Match(RAGspreadsheet.Range("C" & i).Value, HistoryWS.Range("C11", "C" & lastRow), 0))
Errorskip2:
        On Error GoTo Errorhandler3
        RAGspreadsheet.Range("AB" & i) = WorksheetFunction.Index(HistoryWS.Range("P11", "P" & lastRow), Application.Match(RAGspreadsheet.Range("C" & i).Value, HistoryWS.Range("C11", "C" & lastRow), 0))
Errorskip3:
        i = i + 1
    Loop

Exit Sub

Errorhandler:
    Resume Errorskip:

Errorhandler2:
    Resume Errorskip2:

Errorhandler3:
    Resume Errorskip3:

    Application.ScreenUpdating = True

End Sub
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 16:08:04

使用find的示例,在对post的注释中描述(未经测试):

代码语言:javascript
复制
arr = array("26", "27", "28") 'Z, AA, AB
For i = 11 to RAGlastrow
    Set rng = HistoryWS.Columns(3).Find(RAGspreadsheet.Cells(i,3).Value, lookin:=xlValues)
    If NOT rng = Nothing then
        For j = lbound(arr) to ubound(arr)
            RAGspreadsheet.Cells(i,arr(j)) = HistoryWS.Cells(rng.Row,arr(j)-12)
        Next j
    End If
Next i

还将重述评论的第一句:

代码语言:javascript
复制
Replace `WorkSheetFunction.` with `Application.` to trap the error.

这是由于每个人的行为。WorksheetFunction将错误视为错误并停止代码,跳到调试模式。对于Application.,VBA将将错误赋值为变量,并转移到下一个变量。

Edit1: Mat's Mug前几天更好地解释了WorkSheetFunctionApplicationhttps://stackoverflow.com/a/56383812/1188513中的区别(从他的评论中复制链接)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56481117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档