我正在设置一些自动化,以便将两个数据库合并到Excel中。每一行都有一个唯一的标识符(C列)。我已经编写了一些可以工作的代码,但是它既笨重又丑陋,不能适应更大的问题。
当前,如果找到结果,则代码循环遍历目标表和匹配项中的行。如果没有结果,则使用错误跳过转到下一列。它可以工作,但我希望能够移动很多列,并且为每一列添加另一条重复行和错误处理程序是不好的。
如果任何提示都能类似于DO While循环中的代码,将不胜感激。
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发布于 2019-06-06 16:08:04
使用find的示例,在对post的注释中描述(未经测试):
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还将重述评论的第一句:
Replace `WorkSheetFunction.` with `Application.` to trap the error.这是由于每个人的行为。WorksheetFunction将错误视为错误并停止代码,跳到调试模式。对于Application.,VBA将将错误赋值为变量,并转移到下一个变量。
Edit1: Mat's Mug前几天更好地解释了WorkSheetFunction和Application在https://stackoverflow.com/a/56383812/1188513中的区别(从他的评论中复制链接)
https://stackoverflow.com/questions/56481117
复制相似问题