我有三个字段的用户表单(COMNAME; COMCOMPANY; TXTVALUE)当COMNAME和COMCOMPANY(组合框)值与列C和D中的行值匹配时,我试图将值从列F传递到TXTVALUE(文本框)。
Dim var1 As Integer
Dim var2 As Integer
With Application.WorksheetFunction
var1 = .Match(Me.COMCOMPANY.Value, sheet.range("C7:C10"), 0)
var2 = .Match(Me.COMNAME.Value, sheet.range("D7:D10"), 0)
TXTVALUE.Value = .Index(sheet.range("F7:F10"), var1, var2)
End With
表格如下
column C |column D |Column F
PA | CT | 750
RS | HA | 550
PA | CS | 358
当我执行这个宏时,txtvalue中的结果是好的,如果选择PA(COMCOMPANY)和CT(COMNAME) - TXTVALUE是750但是当我选择PA(COMCOMPany)和CS(COMNAME)时 - 宏返回错误& #34;无法获取WorksheetFunction类"的索引属性。
如何使此代码或代码能够正常工作。谢谢
答案 0 :(得分:0)
你似乎对索引函数(以及可能的匹配函数)的工作方式有些困惑。
匹配功能的工作原理如下:
MATCH(x, rng, intExact)
表示在x
范围内找到FIRST值rng
,intExact
参数定义您是否希望第一个值小于,等于或大于该值x
。在您的情况下intExact
= 0并且您正在搜索完全相等的值。此函数将返回找到第一个匹配项的行号,从范围的顶部开始。
假设您在案例中显示了单元格D6:F9
,则var1将为PA
返回1。 Var2将为CT
返回1,为CS
返回3。两个变量之间没有关系。 Var1正在D
列中搜索您的输入,Var2正在F
列中搜索您的第二个输入。
INDEX
函数的工作原理如下:
INDEX(rng, lngRow, lngCol)
表示进入rng
并从范围的左上角开始获取指定的行lngrow
和列lngcol
。在第一种情况下,您选择范围F7:F10
中的第1行和第1列,恰好是750
。这是巧合,因为E列中的匹配恰好位于第一行。
在第二种情况下,您尝试选择第1行和第3列中的值,但您的范围中只有1列,因此您会收到错误。
您需要将其与查阅列结合使用。
column C |column D |Column F | Column Z
PA | CT | 750 | PACT
RS | HA | 550 | RSHA
PA | CS | 358 | PACS
并使用功能:
Var1 = .Match(Me.COMCOMPANY.Value & Me.COMNAME.Value, _
sheet.range("Z7:Z10"), 0)
TXTVALUE.Value = .Index(sheet.range("F7:F10"), var1)
您可以省略Index函数的column参数。
如果您不确定发生了什么,最好逐步完成代码,注意变量是什么。在WorksheetFunction
函数的情况下,您可以实际将函数放在单元格中,并提供变量所需的值来解决问题。
答案 1 :(得分:0)
使用Application.Match
函数来避免抛出可能的错误并在Variant
类型
Dim var1 As Variant
Dim var2 As Variant
With Application
var1 = .Match(Me.COMCOMPANY.Value, sheet.range("C7:C10"), 0)
If Not IsError(var1) Then
var2 = .Match(Me.COMNAME.Value, sheet.range("D7:D10"), 0)
If Not IsError(var2) And var1 = var2 Then Me.TXTVALUE.Value = sheet.range("F7:F10").Rows(var1)
End If
End With