从列传递数据

时间:2016-07-29 20:45:59

标签: vba

我有三个字段的用户表单(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类"的索引属性。

如何使此代码或代码能够正常工作。谢谢

2 个答案:

答案 0 :(得分:0)

你似乎对索引函数(以及可能的匹配函数)的工作方式有些困惑。

匹配功能的工作原理如下:

MATCH(x, rng, intExact)

表示在x范围内找到FIRST值rngintExact参数定义您是否希望第一个值小于,等于或大于该值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