2015-09-16 3 views
0

У меня есть неисправность моей собственной функции Excel-VBA, и я не знаю почему. Я хочу применить один полином или другой (коэффициенты которого вычисляются на одном листе в зависимости от некоторых правил) в зависимости от значения входного параметра функции CONVERTemf (E):Неисправность собственной функции Excel-VBA при открытии другого excel-файла

В листе excel у меня есть ячейки named: «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», то функция CONVERTemf (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 
+1

Вам нужно либо: 1. Перевал эти диапазоны в качестве аргументов функции непосредственно; или 2. Квалифицируйте диапазоны с помощью объекта рабочей таблицы. # 1 лучше, на мой взгляд. – Rory

+0

Спасибо Рори. # 1 не представляется возможным (это возобновленная версия, но оригинал имеет более 30 диапазонов). Извините, но я не понимаю # 2. – Shivoham

ответ

0

Это то, что я имел в виду # 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 
+0

Работает! Спасибо!! – Shivoham

0

Range("coef0_1") не указывает, где Range будет. Таким образом, принимается ActiveSheet.Range("coef0_1") или в случае названных диапазонов Application.Range("coef0_1"). Это произойдет, если рабочая книга, в которой выполняется макрос, не является активной рабочей книгой.

Решение, которое указывает специальный рабочий лист, на который ссылается имя, будет работать. Но имя может быть создано не только с объемом одного рабочего листа, но и для всей рабочей книги. Если это так, то это очень уродливо, если тогда необходимо указать конкретный Рабочий лист, к которому действительно относится имя. Например, если coef0_1 относится к Sheet1, но Emin_1 относится к Sheet2, то оно должно быть ThisWorkbook.Sheets("Sheet1").Range("coef0_1"), но ThisWorkbook.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 
+0

Он тоже работает! Большое спасибо! Но тогда у меня есть вопрос: какой вариант лучше с точки зрения памяти и скорости, вашей или другой? Еще раз спасибо! – Shivoham

+0

Лучше с точки зрения памяти и скорости ни один из них, я верю. Я упомянул, почему я думаю, что '.Names (« coef0_1 »). RefersToRange' лучше, на мой взгляд. Пока все имена относятся только к одному листу '. Таблицы (« ваше имя листа »), мое решение не будет лучше, чем другое. –

Смежные вопросы