【问题标题】:Difficulties getting 'Worksheetfunction.Index' to work (Excel 2010)使“Worksheetfunction.Index”工作的困难(Excel 2010)
【发布时间】:2016-10-15 05:19:35
【问题描述】:

我正在尝试使用 VBA 中的 index 命令运行宏。它是关于风险矩阵中的风险变量,基于“机会”和“影响”变量。我正在创建一个工具来帮助我的组织进行风险评估。

用户为机会和效果变量(X 和 Y 轴)提供输入。应根据此输入从矩阵中选择总和。矩阵是在不同的工作表上创建的。

到目前为止,我得到了这个:

Dim ws2 As Worksheet
Set ws2 = Worksheets("RisicoMatrix")

Dim effectIniVar As Long
Dim waarschijnlijkheidIniVar As Long
Dim risicoIniVar As Long

effectIniVar = WorksheetFunction.Match(comboIniEffect, ws2.Range("A3:A10"), 0)

waarschijnlijkheidIniVar = WorksheetFunction.Match(comboIniWaarschijnlijkheid, ws2.Range("B2:I2"), 0)

risicoIniVar = Application.WorksheetFunction.Index(ws2.Range("b3:I10"), effectIniVar, waarschijnlijkheidIniVar)

前两个 Match 命令工作正常并给我正确的值,但索引行不起作用。当我运行宏时,我得到一个 runtime-13 错误,一个类型不匹配错误,并且在我调试时突出显示“索引”行。我知道这条线可能不太正确,但我不明白我在论坛上找到的例子。

我想在 VBA 中完成此操作,因为这是从表单域运行的宏。风险矩阵只是其中的元素之一。

任何帮助将不胜感激。

提前感谢您的时间和精力。

【问题讨论】:

  • 您在第二个实例中似乎拼错了Match。除此之外,您需要提供比“不起作用”更多的信息。
  • 感谢您的回复。将其复制到帖子时,拼写错误滑入。不起作用的是:它给出了“runtime-13 > type mismatch”错误,并且在我调试时“index”行被标记为黄色。我知道这条线是错误的。我的问题是:如何在不使用“匹配”的情况下在 VBA 中应用“索引”?
  • 那么我建议您修复代码并澄清“不起作用”的确切是什么意思。 ;)
  • 再次感谢您的宝贵时间。我需要帮助修复代码,因为我不明白如何在 VBA 中使用“索引”。我解释了“不起作用”的含义。我收到运行时错误 13。
  • 我的意思是修正你的问题中的错字,并在那里添加额外的信息。类型不匹配错误表明返回的值不能强制转换为 Long 数据类型。

标签: vba excel indexing excel-2010


【解决方案1】:

关于返回值不能隐式转换为 Long 类型,我很赞同 Rory。

您可以单步执行代码并查看Index(ws2.Range("b3:I10"), effectIniVar, waarschijnlijkheidIniVar) 返回的值

或者你放一个错误处理程序,主要是(我相信)用于调试目的

此外,Match() 函数可能会产生一些“副作用”,只要涉及“数字”与“字符串”匹配,这可以通过 Range 对象的 Find() 方法最有效地处理

所以你可以像下面这样:

Option Explicit

Sub main2()
    Dim effectIniVar As Long
    Dim waarschijnlijkheidIniVar As Long
    Dim risicoIniVar As Long
    Dim comboIniEffect As String, comboIniWaarschijnlijkheid As String '<--| just a guess
    Dim myVal As Variant '<--| variable to hold value returned by Index function

    comboIniEffect = 3 '<--| following on my guess
    comboIniWaarschijnlijkheid = "D" '<--| following on my guess

    With Worksheets("RisicoMatrix")
        If Not FindIndex(.Range("A3:A10"), comboIniEffect, "R", effectIniVar) Then Exit Sub '<--| try finding the row match, otherwise exit
        If Not FindIndex(.Range("B2:I2"), comboIniWaarschijnlijkheid, "C", waarschijnlijkheidIniVar) Then Exit Sub '<--| try finding the column match, otherwise exit
        myVal = Application.WorksheetFunction.index(.Range("b3:I10"), effectIniVar, waarschijnlijkheidIniVar) '<--| get value by Index function
        On Error GoTo errorhandler '<--| set your error handler
        risicoIniVar = CLng(myVal) '<--| try forcing value returned by Index into a Long type
        On Error GoTo 0 '<--| resume standard error handling
    End With

    MsgBox effectIniVar & ", " & waarschijnlijkheidIniVar & ", " & risicoIniVar '<--| if everything has worked, then show: row, column and value
    Exit Sub

errorhandler:
    MsgBox "Error: " & Err.Number & vbCrLf & Err.Description & vbCrLf & "while forcing '" & myVal & "' into a Long" '<--| show error conditions
End Sub


Function FindIndex(rng As Range, val As Variant, rowOrCol As String, index As Long) As Boolean
    Dim found As Range

    With rng
        Set found = .Find(what:=val, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False)
        If Not found Is Nothing Then
            FindIndex = True
            index = IIf(UCase(rowOrCol) = "R", found.Row - .Rows(1).Row + 1, found.Column - .Columns(1).Column + 1)
        End If
    End With
End Function

【讨论】:

  • 感谢您的信息丰富和广泛的回复。我将所有变量转换为字符串并工作。我将更多地研究您的代码,以了解您的确切建议。再次感谢!
  • 不客气。如果您发现我回答了您的需求,请将我的回答标记为已接受。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-05-28
  • 2011-10-10
  • 2011-02-22
  • 2018-11-21
  • 2014-04-26
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
相关资源
最近更新 更多