在VBA公式中使用IFERROR

我试图使用VBA从一个文件夹中的各种不同文件复制信息,然而,在一些文件中标题是“networking零售价格”,在一些“NRP”中。

我的代码查找标题文本来查找列,然后从该列复制信息。 我需要一种方式来search“networking零售价格”,然后如果它找不到“NRP”的search。

到目前为止,我可以寻找“净零售价格”,如果没有find它,它search“NRP”。 但是,如果这是相反的(即标题是净零售价格),则会引发错误。

Sub Test() Dim wb As Workbook Dim Masterwb As Workbook Dim sh As Worksheet Dim Mastersht As Worksheet Dim PasteRow As Long Dim lnRow As Long Dim lnCol As Long 'Copy out NRP lnRow = 3 On Error GoTo ErrorHandler lnCol = sh.Cells(lnRow, 1).EntireRow.Find(What:="Net Retail Price", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column ErrorHandler: lnCol = sh.Cells(lnRow, 1).EntireRow.Find(What:="NRP", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column sh.Range(Cells(lnRow + 2, lnCol), Cells(i, lnCol)).Copy Mastersht.Range("F" & PasteRow).PasteSpecial xlPasteValues End Sub 

我build议摆脱error handling程序,而不是代码为每个scheme:

 Option Explicit Sub Test() Dim wb As Workbook Dim Masterwb As Workbook Dim sh As Worksheet Dim Mastersht As Worksheet Dim PasteRow As Long Dim lnRow As Long Dim lnCol As Long 'New variables Dim i As Long Dim rngFound As Range 'Copy out NRP lnRow = 3 Set rngFound = sh.Cells(lnRow, 1).EntireRow.Find(What:="Net Retail Price", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) If rngFound Is Nothing Then Set rngFound = sh.Cells(lnRow, 1).EntireRow.Find(What:="NRP", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) If rngFound Is Nothing Then MsgBox "Couldn't find neither NRP nor Net Retail Price." & Chr(10) & "Aborting..." Exit Sub Else lnCol = rngFound.Column End If Else lnCol = rngFound.Column End If sh.Range(sh.Cells(lnRow + 2, lnCol), sh.Cells(i, lnCol)).Copy Mastersht.Range("F" & PasteRow).PasteSpecial xlPasteValues End Sub 

变化:

  • 试着首先find“净零售价格”
  • 如果发现相应设置lnCol
  • 如果没有find,请尝试find“NRP”
  • 如果发现相应设置lnCol
  • 如果没有find,那么传出一个消息框,既没有被发现也没有被终止

我build议插入

 On Error Goto 0 Exit Sub 

到你的代码

 Sub Test() Dim wb As Workbook Dim Masterwb As Workbook Dim sh As Worksheet Dim Mastersht As Worksheet Dim PasteRow As Long Dim lnRow As Long Dim lnCol As Long 'Copy out NRP lnRow = 3 On Error GoTo ErrorHandler lnCol = sh.Cells(lnRow, 1).EntireRow.Find(What:="Net Retail Price", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column On Error Goto 0 sh.Range(Cells(lnRow + 2, lnCol), Cells(i, lnCol)).Copy Mastersht.Range("F" & PasteRow).PasteSpecial xlPasteValues Exit Sub ErrorHandler: lnCol = sh.Cells(lnRow, 1).EntireRow.Find(What:="NRP", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Column Resume Next End Sub 

你也没有定义variables我在

 sh.Range(Cells(lnRow + 2, lnCol), Cells(i, lnCol)).Copy 

请注意,有可能有另一个error handling程序来处理第一个error handling程序中的错误。

我将在OnError处理程序中设置两个variables:

 Col1: NPR; Col2: Net Retail Price. 

然后,我会提示macros在OnError处理程序中复制这两个列。