打开其他Excel文件时Excel VBA自身功能出现故障

打开其他Excel文件时Excel VBA自身功能出现故障,vba,excel,user-defined-functions,Vba,Excel,User Defined Functions,我自己的Excel VBA函数出现故障,我不知道原因。 我想根据函数CONVERTemf(E)的输入参数值应用一个或另一个多项式(根据某些规则在一张表中计算系数): 在excel工作表中,我将单元格命名为: “coef0_1”、“coef1_1”、“coef2_1”、“Emin_1”、“Emax_1”[对于第一个多项式]; “coef0_2”、“coef1_2”、“coef2_2”、“Emin_2”、“Emax_2”[用于第二个] 如果“E”介于“Emin_1”和“Emax_1”之间,则函数转换

我自己的Excel VBA函数出现故障,我不知道原因。 我想根据函数CONVERTemf(E)的输入参数值应用一个或另一个多项式(根据某些规则在一张表中计算系数):

在excel工作表中,我将单元格命名为: “coef0_1”、“coef1_1”、“coef2_1”、“Emin_1”、“Emax_1”[对于第一个多项式]; “coef0_2”、“coef1_2”、“coef2_2”、“Emin_2”、“Emax_2”[用于第二个]

如果“E”介于“Emin_1”和“Emax_1”之间,则函数转换器EMF(E)将应用第一个多项式,如果“E”介于“Emin_2”和“Emax_2”之间,则必须应用第二个多项式

我已经编写了类似的程序,功能正常,但是,当我打开另一个excel文件(即使是空的!)时,先前计算的值将丢失结果,并显示为“#VALOR!”

多谢各位

Function CONVERTemf(E as Variant)
    c0_1 = Range("coef0_1").Value
    c1_1 = Range("coef1_1").Value
    c2_1 = Range("coef2_1").Value

    c0_2 = Range("coef0_2").Value
    c1_2 = Range("coef1_2").Value
    c2_2 = Range("coef2_2").Value 

    Emfmin_1 = Range("Emin_1").Value
    Emfmax_1 = Range("Emax_1").Value
    Emfmin_2 = Range("Emin_2").Value
    Emfmax_2 = Range("Emax_2").Value

    Select Case E
        Case Emfmin_1 To Emfmax_1
            CONVERTemf = (c2_1 * E ^ 2) + (c1_1 * E) + (c0_1)
        Case Emfmin_2 To Emfmax_2
            CONVERTemf = (c2_2 * E ^ 2) + (c1_2 * E) + (c0_2)
    End Select
End Function
这就是我在评论中所说的#2的意思:

Function CONVERTemf(E as Variant)
  With ThisWorkbook.Sheets("your sheet name")
    c0_1 = .Range("coef0_1").Value
    c1_1 = .Range("coef1_1").Value
    c2_1 = .Range("coef2_1").Value

    c0_2 = .Range("coef0_2").Value
    c1_2 = .Range("coef1_2").Value
    c2_2 = .Range("coef2_2").Value 

    Emfmin_1 = .Range("Emin_1").Value
    Emfmax_1 = .Range("Emax_1").Value
    Emfmin_2 = .Range("Emin_2").Value
    Emfmax_2 = .Range("Emax_2").Value
  End With
    Select Case E
        Case Emfmin_1 To Emfmax_1
            CONVERTemf = (c2_1 * E ^ 2) + (c1_1 * E) + (c0_1)
        Case Emfmin_2 To Emfmax_2
            CONVERTemf = (c2_2 * E ^ 2) + (c1_2 * E) + (c0_2)
    End Select
End Function
范围(“coef0_1”)
未指定
范围的位置。因此假定
ActiveSheet.Range(“coef0\u 1”)
或在命名范围
Application.Range(“coef0\u 1”)
的情况下。如果运行宏的工作簿不是活动工作簿,则此操作将失败

指定名称所指的特殊工作表的解决方案将起作用。但是,不仅可以使用一个工作表的范围创建名称,还可以为整个工作簿创建名称。如果是这样的话,那么如果需要指定该名称真正所指的特定工作表,那就非常难看了。例如,如果
coef0_1
指的是
Sheet1
,而
Emin_1
指的是
Sheet2
,那么它必须是
thiswoolk.Sheets(“Sheet1”).Range(“coef0_1”)
thiswoolk.Sheets(“Sheet2”).Range(“Emin_1”)

如果名称在“工作簿”范围内,则以下内容也应适用:

Function CONVERTemf(E As Variant)
  With ThisWorkbook
    c0_1 = .Names("coef0_1").RefersToRange.Value
    c1_1 = .Names("coef1_1").RefersToRange.Value
    c2_1 = .Names("coef2_1").RefersToRange.Value

    c0_2 = .Names("coef0_2").RefersToRange.Value
    c1_2 = .Names("coef1_2").RefersToRange.Value
    c2_2 = .Names("coef2_2").RefersToRange.Value

    Emfmin_1 = .Names("Emin_1").RefersToRange.Value
    Emfmax_1 = .Names("Emax_1").RefersToRange.Value
    Emfmin_2 = .Names("Emin_2").RefersToRange.Value
    Emfmax_2 = .Names("Emax_2").RefersToRange.Value
  End With
    Select Case E
        Case Emfmin_1 To Emfmax_1
            CONVERTemf = (c2_1 * E ^ 2) + (c1_1 * E) + (c0_1)
        Case Emfmin_2 To Emfmax_2
            CONVERTemf = (c2_2 * E ^ 2) + (c1_2 * E) + (c0_2)
    End Select
End Function

你需要:1。将这些范围作为参数直接传递给函数;或2。使用工作表对象限定范围#我觉得1更好。谢谢你,罗瑞。#1是不可能的(这是一个恢复版本,但原始版本有30多个范围)。对不起,我不明白2。它也能用!非常感谢你!但是,那么,我有一个问题:哪一个选项在内存和速度方面更好,你的还是另一个?再次感谢你!我相信,在记忆力和速度方面都不是更好的。我已经提到了为什么我认为
.Names(“coef0\u 1”).referestorange
在我看来更好。只要所有的名称都只指向一张
.Sheets(“您的工作表名称”)
我的解决方案就不会比另一张更好。