【问题标题】:Excel VBA function B not showing result of called function AExcel VBA函数B不显示调用函数A的结果
【发布时间】:2021-09-04 08:54:12
【问题描述】:

我正在改进我的 Excel 表格以跟踪我分享过的威士忌酒桶,但我遇到了一个奇怪的问题,至少对我来说这很奇怪。

我创建的 caskinfoBySKU 函数有效,基本上是一个 INDEX MATCH(row) MATCH(column) 函数。

第二个函数 caskinfoBySKU_DYN 也可以工作,但无法显示它应该从 caskinfoBySKU 函数获得的结果。 caskinfoBySKU_DYN 为某些取决于付款类型(初始与最终)的列排序需要与 caskinfoBySKU 函数一起使用的列名称。

我不是经常在 VBA 中编程,在搜索了一周的解决方案之后,我目前一直在寻求使其正常工作。

有人知道我哪里出错了吗?

我确实怀疑问题出在我如何调用原始函数...我尝试了几种在搜索过程中找到的方法,但不幸的是没有成功让它工作:/

我用下面的 VBA 代码和一些测试数据创建了我的 Excel 文档的修剪副本。可以从我的Google Drive下载。

(当然,当您看到使 VBA 代码更好/更快的方法时,也请随时向我指出。)

Public Function caskinfoBySKU(SKU, colname) As Variant

    On Error GoTo CleanFail

    Dim indexResult As Variant
    Dim rowMatch, colMatch As Long
    
    SKU = Trim(SKU)
    colname = Trim(colname)
    
    If SKU = "" Or colname = "" Then
        GoTo CleanFail
    End If
           
    'in which row do we find the SKU
    rowMatch = WorksheetFunction.Match(SKU, Range("tbl_caskinfo[SKU]"), 0)

    'is rowMatch an integer?
    If Int(rowMatch) = rowMatch Then
        
        'in which column do we find the colname
        colMatch = WorksheetFunction.Match(colname, Range("tbl_caskinfo[#headers]"), 0)
    
        'is colMatch an integer?
        If Int(colMatch) = colMatch Then
            'get result
            indexResult = WorksheetFunction.Index(Range("tbl_caskinfo"), rowMatch, colMatch)

            If Not indexResult = "" Then
                GoTo ReturnResult
            Else 'no result found
                GoTo CleanFail
            End If
        
        Else 'colname not found in colnames row
            GoTo CleanFail
        End If
    
    Else 'SKU not found in SKU column
        GoTo CleanFail
    End If

CleanFail:
    caskinfoBySKU = "•" 'ALT+0149
    Exit Function

ReturnResult:
    'MsgBox rowMatch & "," & colMatch & ":   " & indexResult
    caskinfoBySKU = indexResult
End Function

Public Function caskinfoBySKU_DYN(key, payment, SKU) As Variant
' redirect to Est. Yield / Act. Yield column or Initial Payment / Act. Final Payment
    On Error GoTo CleanFail
    
    Dim colname As Variant
    
    payment = Trim(payment)
    
    If payment = "" Then
        GoTo CleanFail
    End If
    
    Select Case UCase(key)
        Case "YIELD"
            Select Case LCase(payment)
                Case "initial"
                    colname = "Est. Yield"
                    GoTo CallParent
                Case "final"
                    colname = "Act. Yield"
                    GoTo CallParent
                Case Else
                    GoTo CleanFail
            End Select
    
        Case "UNIT PRICE", "PRICE"
            Select Case LCase(payment)
                Case "initial"
                    colname = "Initial Payment"
                    GoTo CallParent
                Case "final"
                    colname = "Act. Final Payment"
                    GoTo CallParent
                Case Else
                    GoTo CleanFail
            End Select
    
        Case Else
            GoTo CleanFail
    End Select
    
CleanFail:
    caskinfoBySKU_DYN = "•" 'ALT+0149
    Exit Function
    
CallParent:
    Call caskinfoBySKU(SKU, colname)
End Function

【问题讨论】:

  • 您是否尝试逐步运行代码(使用 F8)来研究您的数据值并查看程序在哪些地方没有按预期运行?您可以在caskinfoBySKU_DYN 的开头添加一个断点来帮助您实现此功能。
  • 您有Call caskinfoBySKU(SKU, colname),但没有将返回值分配给caskinfoBySKU_DYN
  • @Vincent 还没有做 F8,但确实在代码中添加了一个 msgbox 行,所以我知道它确实正确执行了调用的函数但它没有反馈数据。
  • @CDP1802 这也是我的结论,但是如何将返回值分配给 caskinfoBySKU_DYN?如何捕获Call caskinfoBySKU(SKU, colname) 的结果以便我可以执行caskinfoBySKU_DYN = <the result from the call>
  • caskinfoBySKU_DYN = caskinfoBySKU(SKU, colname)

标签: excel vba call


【解决方案1】:

caskinfoBySKU_DYN = caskinfoBySKU(SKU, colname) 而不是 Call caskinfoBySKU(SKU, colname) 成功了。

感谢 CDP1802

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 2012-10-25
    • 2010-09-05
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多