【问题标题】:Excel VBA: Error handling only works for one passExcel VBA:错误处理仅适用于一次通过
【发布时间】:2013-04-15 09:11:01
【问题描述】:

我已经搜索了许多资源来尝试解决我的问题,但是我没有成功。我是 VBA 的初学者,所以我的代码很可能看起来很乱。为了提出问题,我会尽量减少表格中的信息

我有两张纸,“数据”和“原始数字”。
数据包含标题为“属性”和“电话号码”的列,但只有“属性”中有数据。
原始号码包含相同的列,但缺少一些“属性”值,因为它仅包含与这些属性关联的一定数量的电话号码。

数据表:
财产 。 . . .号码
艾达街 1 号
2 艾达街
3 艾达街
艾达街 4 号
艾达街 5 号
6 艾达街

原始数字表:
财产 。 . . .号码
1 艾达街。 . . . 12345678
2 艾达街。 . . . 12356322
5 艾达街。 . . . 12551122
6 艾达街。 . . . 12212112

我有一个代码可以自动将数字导入数据表,但是一旦达到 3 Ada St,它就会返回错误 (400),因为原始数字上没有 3 Ada St。我包含了一个错误处理程序,但它在再次返回错误之前只工作一次。
到目前为止,这是我的代码:

Sub Button_Click()
Worksheets("Data").Range("B4").Select  'B4 is the Number column in the data sheet
    Do While ActiveCell.Offset(0, -1) <> ""
    On Error GoTo ErrorHandler
                ActiveCell.Value = Application.WorksheetFunction.IfError(WorksheetFunction.VLookup(ActiveCell.Offset(0, -1), ThisWorkbook.Worksheets("Raw Numbers").Range("Numbers"), 2, False), "")

ErrorHandler:
                ActiveCell.Offset(1, 0).Select
   Loop

End Sub

我以这种方式编写代码是因为我最初使用的是函数而不是代码,但这太混乱了。 IfError 函数在那里,因为如果地址没有附加数字,我希望单元格为空白。我尝试将其转换为错误处理程序的一部分,但它最终给了我一个错误。

有人请帮帮我!!如果您需要更多信息,我很乐意提供。我会一直关注这个话题!

【问题讨论】:

    标签: vba loops excel error-handling


    【解决方案1】:

    函数不应该太杂乱。 IFERRORVLOOKUP 的组合应该可以工作。

    公式看起来像这样:

    =IFERROR(VLOOKUP(A2,RawData!A:B,2,FALSE),"")
    

    在 VBA 中,我会编写如下代码:

    Option Explicit
    
    Sub test()
    Dim Result
    
    On Error Resume Next
    Result = Application.WorksheetFunction.VLookup([A3], [RawData!A:B], 2, False)
    If Err.Number = 1004 Then ' data not found, or some other formula error
        Result = ""
    Else
        MsgBox Err.Number & "-" & Err.Description
        Exit Sub
    End If
    
    [B3] = Result
    End Sub
    

    【讨论】:

    • 我使用公式没有问题,但是我将使用这些值做其他事情,并且需要用文本而不是公式填充单元格。
    • @LukeBeacon,添加了 VBA 形式的函数 - [] 用于快速和肮脏的 Range 引用,它们等同于 Range("??")
    【解决方案2】:

    在代码中使用公式并在后面粘贴值。

    ActiveCell.FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],Numbers,2,FALSE),"""")"
    ActiveCell.Value = ActiveCell.Value
    

    未经测试...

    【讨论】:

    • 这并不完全奏效,但我最终使用了公式和这段代码的组合。我将公式放入单元格中,然后将“ActiveCell.Value = ActiveCell.Value”部分添加到填充结果的按钮中。这使我可以立即将单元格转换为它们的值而不是公式。谢谢!!我希望我能找到一个合适的解决方法。我现在遇到的问题是,当我单击“清除”按钮时,它不会将公式放回那些单元格中。如果我要使用我的专业知识通过代码来做到这一点,那么命名每个单元格会非常乏味。
    • 找到了解决办法!谢谢大家
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2017-02-16
    • 2023-04-03
    相关资源
    最近更新 更多