I have a malfunction of my own Excel-VBA function and I don't know why. I want to apply one polynomial or another (which coeficients are calculated in one sheet depending on some rules) depending on the value of the input parameter of the function CONVERTemf(E):
In the excel-sheet I have cells named: "coef0_1", "coef1_1", "coef2_1", "Emin_1", "Emax_1" [for the first polynomial]; "coef0_2", "coef1_2", "coef2_2", "Emin_2", "Emax_2" [for the second one].
If "E" is between "Emin_1" and "Emax_1" the function CONVERTemf(E) will apply the first polynomial, if "E" is between "Emin_2" and "Emax_2" it must apply the second one.
I have programmed something like this and it functions ok, BUT, when I open another excel-file (even an empty one!) the values previously calculated lose the result and appears "#¡VALOR!".
Thank you very much!
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
The
Range("coef0_1")
does not specify where theRange
shall be. So theActiveSheet.Range("coef0_1")
or in the case of named rangesApplication.Range("coef0_1")
is assumed. This will fail if the Workbook in which the Macro runs is not the active Workbook.A solution which specifies the special Worksheet to which the name refers to will work. But a name can be created not only with scope of one Worksheet but also for the whole Workbook. If so then it is very ugly if it is then needed to specify the specific Worksheet to which the name really refers to. For example if
coef0_1
refers toSheet1
butEmin_1
refers toSheet2
then it has to beThisWorkbook.Sheets("Sheet1").Range("coef0_1")
butThisWorkbook.Sheets("Sheet2").Range("Emin_1")
.If the names are in the scope "Workbook" then the following should also work:
This is what I meant by #2 in my comment: