首页 > 解决方案 > 如何使用索引和匹配来引用单独的工作表?

问题描述

背景:

我有以下测试代码正在工作,其中 H 列等于 B 列与 D 列中的内容

Range("H2:H17") = "=INDEX(D2:D17,MATCH(B2:B17,B2:B17,0))"

温度1

问题:

我如何在代码中使用它来引用一个名为“temp”的单独工作表来做同样的事情。这个想法是每次代码查找“目标”时,它都会执行索引并匹配检查列 B 以等于列 D 中的内容,因此如果值 A 被传递,那么它将成为 Test1?

我尝试了以下代码,但目标没有得到任何值的更新。

变暗目标变体

With Application
    Target = .Index(Sheets("Temp").Range("D2:D17"), .Match(Sheets("Temp").Range("B2:B17"), Sheets("Temp").Range("B2:B17"), 0))
End With

调试显示以下目标

目标观察

任何帮助表示赞赏!

标签: excelvbaindexingmatch

解决方案


MatchWorksheetFunction接口的成员;您需要一个WorksheetFunction对象实例来调用它 - 一个With块可以为您保存该对象引用,因此您只需键入一次:

With Application.WorksheetFunction
    Target = .Index(sheet.Range("D2:D17"), .Match(sheet.Range("B2:B17"), sheet.Range("B2:B17"), 0))
End With

哪里sheet是要使用的Worksheet变量,或者是Worksheet您的过程的参数。

但是,第一个参数看起来有些问题Matchlookup_value想要成为单个值:早期绑定方法对于它愿意与Application.WorksheetFunction.Match哪些子类型很好地配合使用相当挑剔,并且会按原样抛出类型不匹配错误。Variant

后期绑定的版本(注意拼写错误!Option Explicit不能让你免于后期绑定的代码!)使用范围/数组查找值参数按预期工作,并产生一个Variant()数组:

With Application
    Target = .Index(sheet.Range("D2:D17"), .Match(sheet.Range("B2:B17"), sheet.Range("B2:B17"), 0))
End With

确保Target是 a Variant,因为如果查找失败,这个后期绑定Match将产生一个Variant/Error值(早期绑定版本会引发运行时错误) -如果您尝试分配给除一个Variant


推荐阅读