Vba 如果存在,则使用tab1,否则使用tab2

Vba 如果存在,则使用tab1,否则使用tab2,vba,excel,Vba,Excel,您好,我目前从Excel文件的“值”选项卡中提取了数字。但如果Tab2存在于该文件中,我想从Tab2中提取它。如果存在Tab2,可以先使用Tab2,否则使用Value选项卡吗 Workbooks(wkbk_value).Sheets("Value").Select amount= WorksheetFunction.Match("Date", Rows("5:5"), 0) price = WorksheetFunction.Match("Calculated", Rows("4:4"), 0)

您好,我目前从Excel文件的“值”选项卡中提取了数字。但如果Tab2存在于该文件中,我想从Tab2中提取它。如果存在Tab2,可以先使用Tab2,否则使用Value选项卡吗

Workbooks(wkbk_value).Sheets("Value").Select
amount= WorksheetFunction.Match("Date", Rows("5:5"), 0)
price = WorksheetFunction.Match("Calculated", Rows("4:4"), 0)
time= WorksheetFunction.Match("Selected", Rows("3:3"), 0)

注意事项:

  • Option Explicit
    放在代码顶部,并确保声明所有变量。例如,
    wkbk_值
    在哪里声明和分配
  • 避免使用
    。选择
    并使用
    语句来处理工作表
  • 考虑为未找到的匹配添加错误处理,方法是声明变量,然后测试这些变量的值以查找错误值
  • 通常使用
    工作表
    集合而不是工作表,除非希望包括图表工作表
  • 匹配,如果找到,将返回一个数字(在范围中找到的位置)。看起来更像是要返回一个值,所以请注意这一点

  • 代码:

    使用方法

    选项显式
    公共子测试()
    
    Dim amount As Variant,Price As Variant,Time As Variant,wkbk_value As String'您可以尝试以下方法

    我已将变量声明为variant,并使用应用程序更改了WorksheetFunction,这样,如果找不到查找值,变量将保留错误号,以便您可以检查Match函数是否返回值或错误(如果需要)

    Dim ws As Worksheet
    Dim Amount, Price, Time
    
    On Error Resume Next
    Set ws = Workbooks(wkbk_value).Sheets("Tab2")
    On Error GoTo 0
    If ws Is Nothing Then Set ws = Workbooks(wkbk_value).Sheets("Value")
    With ws
        Amount = Application.Match("Date", .Rows("5:5"), 0)
        Price = Application.Match("Calculated", .Rows("4:4"), 0)
        Time = Application.Match("Selected", .Rows("3:3"), 0)
    End With
    End Sub
    
    您编辑的代码:

    Dim ws As Worksheet
    Dim Amount, Price, Time
    On Error Resume Next
    Set ws = Workbooks(wkbk_value).Sheets("Tab2")
    Amount = Application.Match("Date", ws.Rows("5:5"), 0)
    On Error GoTo 0
    If ws Is Nothing Then
        Set ws = Workbooks(wkbk_value).Sheets("Value")
        Amount = Application.Match("Date", ws.Rows("5:5"), 0)
    End If
    

    请注意,在您的代码中,有两行代码在计算金额,好像您首先集中精力设置工作表(ws),您只需写入该行一次,即可根据前面设置的工作表正确计算该行,如第一个代码所示。

    您是在查看另一个工作簿还是在使用代码所在的工作簿?在工作簿:)此方法仍适用于您。只需将任何工作簿引用更改为您需要的引用。嗯,我曾尝试将其合并到现有的marco中,但没有成功。也许是因为我要把它插入一个长宏?谢谢你说的不起作用是什么意思?以上内容相当简单。这是要运行的基本内容。我是否将其插入宏的其余部分(我没有发布所有代码)?或者前两行应该在最上面?你能在另一个已经存在的结束子中结束子吗?谢谢嗯,当我试着运行它的时候,它说了没有if的else?嗯,我试着将它合并到现有的marco中,但它没有起作用。也许是因为我要把它插入一个长宏?谢谢你知道如何设置工作表并在代码中使用它吗?这是你最初的问题。我想我理解你的代码,不知道如何将它们整合到我收到的很长的代码中(我只是在问题中复制并粘贴了一小块代码)。因此,如果找到了选项卡2,我可以这样做吗?-“将ws作为工作表调整金额、价格、出错时间恢复下一步设置ws=工作簿(wkbk_值)。工作表(“Tab2”)金额=应用程序。匹配(“日期”),.Rows(“5:5”),0)错误转到0如果ws为空,则设置ws=工作簿(wkbk_值)。工作表(“值”)ws金额=应用程序。匹配(“日期”),.Rows(““是的,如果你理解了逻辑,你可以使用它。顺便说一句,您不需要对单行语句使用With block。您可以删除它,只需使用
    Amount=Application.Match(“日期”,ws.Rows(“5:5”),0)
    。另外,您发布的代码缺少一个
    结尾If
    ,我相信您已经意识到了这一点。我还编辑了我的答案,并添加了您的代码以及一些解释。
    Dim ws As Worksheet
    Dim Amount, Price, Time
    On Error Resume Next
    Set ws = Workbooks(wkbk_value).Sheets("Tab2")
    Amount = Application.Match("Date", ws.Rows("5:5"), 0)
    On Error GoTo 0
    If ws Is Nothing Then
        Set ws = Workbooks(wkbk_value).Sheets("Value")
        Amount = Application.Match("Date", ws.Rows("5:5"), 0)
    End If