2015-05-13 3 views
0

Простая функция VBA. Когда я пытаюсь использовать его на своем листе, все, что я получаю, независимо от того, что я делаю, - «Это имя недопустимо». У меня нет идей.«Это имя недействительно» для моей функции VBA в Excel/Mac

Sub FindABV(temperature) 
With Worksheets("Sheet1") 
    .Range("C28").GoalSeek _ 
    Goal:=temperature, _ 
    ChangingCell:=.Range("B28") 
End With 
FindABV = .Range("B28").Value 
End Sub 

Я пробовал создать новый модуль для его ввода. Без изменений. И никаких указаний об ошибках от редактора кода.

+2

'Sub'? Или вы хотите, чтобы он был «Public Function FindABV (температура)»? –

+0

Возможно, вы захотите увидеть [This] (http://www.excel-easy.com/vba/function-sub.html) –

+0

@SiddharthRout верен. Вы должны определить его как функцию, если хотите использовать в «Формуле». Тем не менее, ссылки на ячейки жестко закодированы, поэтому, вероятно, они не будут работать так, как вы планируете. –

ответ

0

Процедура Sub выполняет задачу и затем возвращает управление вызывающему коду, но не возвращает значение вызывающему коду.

Подробнее here.

При этом, вы не можете установить порядок, равный к чему-то:

FindABV = .Range("B28").Value 

потому , что имя не является действительным (вы не можете сказать, что процедура равна определенному значению, это не делает смысл). Вы, вероятно, хотели использовать Function, чтобы вернуть значение этой ячейки рассчитывается по цели Seeker в зависимости от входа temperature, что вы проходите мимо функции:

Function FindABV(temperature) 
With Worksheets("Sheet1") 
    .Range("C28").GoalSeek _ 
    Goal:=temperature, _ 
    ChangingCell:=.Range("B28") 
End With 
FindABV = .Range("B28").Value '<-- return the value 
End Function 

Однако будьте осторожны: если =FindABV(temperature) лежит на Sheet1.Range("B28"), вы будет иметь круговую ссылку, потому что ваша функция будет пытаться получить значение самого себя.

0

Ваш код не даст желаемые результаты. Если вы хотите иметь Function работу для различных значений, чем те, хранящихся в B28 и C28 вам придется писать больше, как это:

Public Function FindABV(goalCell As Range, changeCell As Range, temperature As Double) 

    goalCell.GoalSeek Goal:=temperature, ChangingCell:=changeCell 

    FindABV = changeCell 
End Function 

Но это не имеет значения, в любом случае, потому что на самом деле изменения GoalSeek значение в ChangingCell, которое Excel не будет выполнено, если оно вызвано из Function.

+0

Спасибо за понимание! Я не знал, что функция не может изменить значение в ячейке. Это, казалось бы, означает, что то, что я пытаюсь, безнадежно. Есть ли другой способ заставить GoalSeek работать как вызываемая функция? – user3238181

+0

Интересно, что Excel с удовольствием меняет значения ячеек при вызове AppleScript. Но я надеялся создать калькулятор, который мог бы поделиться даже с пользователями Windows. – user3238181

+0

Вы всегда можете выполнить операцию, которую Excel выполняет в 'GoalSeek' самостоятельно, увеличивая значение с очень маленькими приращениями до тех пор, пока вы не перевернете и не вернете ближайшее значение. –

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