powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Использование функции GoalSeek из пользовательской UDF-функции
9 сообщений из 9, страница 1 из 1
Использование функции GoalSeek из пользовательской UDF-функции
    #38925902
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток форумчане.
Столкнулся со следующей проблемой. Не могу воспользоваться функцией GoalSeek посредством пользовательской функции вводимой пользователем прямо в ячейку Excel. Работает только через GS() вызываемой через Alt+F8. Посредством ввода в ячейку =iGoalSeek(B5;B2;B3) или =sGoalSeek(5; 2; 2; 2; 3; 2) ничего не получается.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Public Function iGoalSeek(iRange As Range, _
                          iGoal As Range, _
                          iChangingCell As Range)
   Dim ir As Long
   Dim jr As Long
   Dim ig As Long
   Dim jg As Long
   Dim ic As Long
   Dim jc As Long
   
   ir = iRange.Row
   jr = iRange.Column
   ig = iGoal.Row
   jg = iGoal.Column
   ic = iChangingCell.Row
   jc = iChangingCell.Column

   fGoalSeek ir, jr, ig, jg, ic, jc
End Function

Function sGoalSeek(ir As Long, _
                   jr As Long, _
                   ig As Long, _
                   jg As Long, _
                   ic As Long, _
                   jc As Long)

   fGoalSeek ir, jr, ig, jg, ic, jc
End Function

Sub GS()
   fGoalSeek 5, 2, 2, 2, 3, 2
End Sub

Public Sub fGoalSeek(ir As Long, _
                     jr As Long, _
                     ig As Long, _
                     jg As Long, _
                     ic As Long, _
                     jc As Long)
   Dim iRange As Range
   Dim iGoal As Range
   Dim iChangingCell As Range
   
   Set iRange = Cells(ir, jr) 'ActiveCell
   Set iGoal = Cells(ig, jg) '"B2"
   Set iChangingCell = Cells(ic, jc) '"B3"
   iRange.GoalSeek Goal:=iGoal.Value, ChangingCell:=iChangingCell
End Sub



Заранее спасибо!
...
Рейтинг: 0 / 0
Использование функции GoalSeek из пользовательской UDF-функции
    #38925921
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAGRAV, функции листа "не имеют права" менять что-либо на листе, хотя есть исключение. Почитайте
http://www.excel-vba.ru/chto-umeet-excel/kak-funkciej-polzovatelya-izmenit-znachenie-drugoj-yachejki/

Однако, работу функции можно эмулировать с помощью обработки события листа Worksheet_Change, в этом случае ограничений нет.
...
Рейтинг: 0 / 0
Использование функции GoalSeek из пользовательской UDF-функции
    #38926442
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский, Спасибо конечно, но на версиях Excel старше 2003 не фурычит. Зато нашол вот такой код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function ЧЕРВЬ(r As Range, t)
'взято тут:
'Нужна формула EXCEL которая даёт эффект копирования
'http://forum.msexcel.ru/empty-t194.0.html - Шпец Докапыч
    Application.Volatile
    With r
        .Replace IIf(Len(.Value), "*", ""), t
    End With
    ЧЕРВЬ = ""
End Function



ТОГДА ТАКОЙ ВОПРОС:
КАК ИМИТИРОВАТЬ iRange и iChangingCell В СЛЕДУЮЩЕЙ ЗАПИСИ
Код: vbnet
1.
iRange.GoalSeek Goal:=iGoal.Value, ChangingCell:=iChangingCell
...
Рейтинг: 0 / 0
Использование функции GoalSeek из пользовательской UDF-функции
    #38926709
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я расскажу сам принцип в первом приближении. Допустим, в ячейке Я введена функция =Ф(Д1;Д2), где Д1 и Д2 - аргументы-диапазоны.
Как работает функция. Если происходит изменение значений ячеек в диапазонах Д1 или Д2, Excel вызывает пересчет функции Ф и помещает результат в Я. Если мы хотим проделать то же самое макросом, пишем обработчик события листа (правый клик по ярлычку листа - Исходный текст)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Union(Range("Д1"), Range("Д2"))) Is Nothing Then 'есть измененные ячейки
    On Error Resume Next             'чтобы строка 6 выполнилась даже в случае ошибки
    Application.EnableEvents = False 'предотвратить повторный вызов процедуры при изменении ячейки
    Range("Я").Value = Ф(Range("Д1"), Range("Д2")) 'вычисление
    Application.EnableEvents = True  'разрешить обработку событий
  End If
End Sub
...
Рейтинг: 0 / 0
Использование функции GoalSeek из пользовательской UDF-функции
    #38928715
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский, спасибо буду пробовать такой вариант.
Однако на ум пришла одна комбинация, но для её реализации нужна пользовательская ФУНКЦИЯ способная УБИТЬ САМУ СЕБЯ.
Подскажите пути решения?
...
Рейтинг: 0 / 0
Использование функции GoalSeek из пользовательской UDF-функции
    #38929720
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не надо никого убивать! Приложите файл и поясните, для какой ячейки (ячеек) должен работать GoalSeek и какие ячейки менять.
...
Рейтинг: 0 / 0
Использование функции GoalSeek из пользовательской UDF-функции
    #38929986
MAGRAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский,
Вообще говоря, цель всех этих извращений в том чтобы измудриться использовать GoalSeek из пользовательской функции. А код функции находился только в одном модуле, который можно было бы подключать к любому документу. К примеру синтаксис на листе будет таким: "=iGoalSeek(A1;A2;A3)". Вся соль в том, что никак не удаётся сделать так чтобы можно было задавать из текста функции эти (A1;A2;A3). слабо верится,но хотел опробовать такой сценари:
-iGoalSeek запоминает свой собственный текст синтаксиса "=iGoalSeek(A1;A2;A3)" из текущей ячейки (B5);
-запоминает переменную из "А2";
-в "А2" помещаем ссылку на: "=B5";
-в "B5" число из "А2";
-после пробуем использовать встроенную функцию Excel "....GoalSeek Goal:=..., ChangingCell:=...",но ссылающуюся в параметре ChangingCell:=на "B5" вместо первоначаьного "А2".
если чудо произойдёт и и встроенный GoalSeek сработает, то возвращаем все на свои места (в том числе и новую переменую) и радумся 8) 8) 8)
...
Рейтинг: 0 / 0
Использование функции GoalSeek из пользовательской UDF-функции
    #38931241
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно это реализовать. Будет надстройка, которая подключается к обработке событий приложения _SheetChange и _SheetCalculate. В ней будет создаваться база данных (коллекции и/или массивы) диапазонов, к которым должен применяться подбор параметра, целевых значений и изменяемых ячеек. При возникновении события пересчитывается либо все, либо выборочно.
А функция iGoalSeek помещает свои аргументы в эту базу данных.
Надо придумать, что делать при удалении функции iGoalSeek или при ручном изменении ее параметров. Наверно, проще будет не хранить эту базу данных, а каждый раз при пересчете искать ячейки с формулой "=iGoalSeek(...)" по всем листам всех открытых книг и проводить подбор параметра. Но это может заметно тормозить работу с приложением.
...
Рейтинг: 0 / 0
Использование функции GoalSeek из пользовательской UDF-функции
    #38932063
omegastripes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вероятно, вот это сможет помочь VBA: Excel обход ограничений UDF
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Использование функции GoalSeek из пользовательской UDF-функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]