powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Пытаюсь сделать Эксель умнее, чем он есть?
25 сообщений из 39, страница 1 из 2
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255330
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем мое почтение и всем, кто ответит, моя благодарность. Хочу сделать в Экселе две вещи, но боюсь, что он на такое не очень способен. А именно:

1. Указать порядок вычисления ячеек.
2. Обращаясь к юзерской функции из ячейки, передать в нее параметр типа Range.

Я действительно слишком много хочу?
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255365
Фотография k-nike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч1. Указать порядок вычисления ячеек.
А можно узнать для чего? Вообще думаю что можно, задействуя событие xlCalculate.
Владимир Саныч2. Обращаясь к юзерской функции из ячейки, передать в нее параметр типа Range.
А в чем собственно проблема?
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255439
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k-nike Владимир Саныч1. Указать порядок вычисления ячеек.
А можно узнать для чего? Вообще думаю что можно, задействуя событие xlCalculate.
Владимир Саныч2. Обращаясь к юзерской функции из ячейки, передать в нее параметр типа Range.
А в чем собственно проблема?
согласен и тоже интересно, для чего нужен пункт 1? Неужели результат может зависеть от порядка вычисления?
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255475
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Есть функция, которая помимо возвращения результата заносит нечто в глобальную переменную. Вторая функция только берет значение из этой переменной и возвращает его (чтобы второй раз не запускать вычисление). И я хочу, чтобы сначала вызывалась первая функция, а потом вторая. А происходит почему-то наоборот (хотя вторая вызывается даже в ячейке, расположенной ниже).

2. Видимо, я просто не знаю синтаксиса. Функция описана так:
Function xxx(r As Range) As Integer
Обращаюсь так:
=xxx(A1:B2)
Выдает ошибку.
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255511
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч1. Есть функция, которая помимо возвращения результата заносит нечто в глобальную переменную. Вторая функция только берет значение из этой переменной и возвращает его (чтобы второй раз не запускать вычисление). И я хочу, чтобы сначала вызывалась первая функция, а потом вторая. А происходит почему-то наоборот (хотя вторая вызывается даже в ячейке, расположенной ниже).

2. Видимо, я просто не знаю синтаксиса. Функция описана так:
Function xxx(r As Range) As Integer
Обращаюсь так:
=xxx(A1:B2)
Выдает ошибку.

1. а если сделать проверку, проведено ли требуемое вычисление или нет. если нет - насильственно провести и поставить флаг, который снимется только когда изменятся влияющие данные (можно отслешивать и по ячейкам).

2. у меня вот так получилось (поместил в обычном модуле):
Код: plaintext
1.
2.
3.
Public Function xxx(r As Range) As Integer
    Application.Volatile
    xxx = r.Cells.Count
End Function
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255520
MX -- ALEX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир СанычВсем мое почтение и всем, кто ответит, моя благодарность. Хочу сделать в Экселе две вещи, но боюсь, что он на такое не очень способен. А именно:

1. Указать порядок вычисления ячеек.
2. Обращаясь к юзерской функции из ячейки, передать в нее параметр типа Range.

Я действительно слишком много хочу?

не - не много - нормально

мы например реализовали виртуальный многопользовательский EXCEL
на сервере

он может все и как угодно
а результаты проецируются на реальные EXCELи подключенных клиентов

зверь
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255547
Бабай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СанычВсем мое почтение и всем, кто ответит, моя благодарность. Хочу сделать в Экселе две вещи, но боюсь, что он на такое не очень способен. А именно:

1. Указать порядок вычисления ячеек.
2. Обращаясь к юзерской функции из ячейки, передать в нее параметр типа Range.

Я действительно слишком много хочу?
1. косвенно можно реализовать завязавшись на последовательность ссылок.

пусть в а1 сидит число,
в а2 ваша функция1 и формула в а2 комбинирует типа =ф1(параметр) +а1-а1
в а3 формула =ф2()+а2-а2

должна выстрится последовательность вычисления а1->a2->a3
но я бы думал что-то другое - надо задачу видеть.

2. можно. объявляйте параметр функции как вариант или как рэндж и будет щастье.
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255587
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbapro1. а если сделать проверку, проведено ли требуемое вычисление или нет. если нет - насильственно провести и поставить флаг, который снимется только когда изменятся влияющие данные (можно отслешивать и по ячейкам).
Не получается, потому что таких пар ячеек много. Одним флагом не обойтись. Нужно еще, чтобы сначала вычислялась одна пара (в нужном порядке), потом следующая и т.д. Грубо говоря: A2, A3, B2, B3, C2, C3 и т.д.

бабай1. косвенно можно реализовать завязавшись на последовательность ссылок.
Да! Похоже, что это оно. Спасибо!

Насчет второго вопроса - вроде всё делаю правильно, а не выходит... Сейчас попробую еще.
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255652
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, у Range есть метод .Calculate. иожно отключить пересчет на листе, выполнить расчеты в ячейках в требуемойочередности и включить пересчет листа на автомат
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255658
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СанычВсем мое почтение и всем, кто ответит, моя благодарность. Хочу сделать в Экселе две вещи, но боюсь, что он на такое не очень способен. А именно:

1. Указать порядок вычисления ячеек.

А такой вариант не подойдет?
Код: plaintext
1.
2.
3.
4.
5.
    Application.Calculation = xlCalculationManual
    Range("D8").Calculate
    MsgBox Range("D8")
    Range("D7").Calculate
    MsgBox Range("D7")
    Application.Calculation = xlCalculationAutomatic
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34255817
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbapro, vkodor Application.Calculation = xlCalculationManual
Range("D8").Calculate
MsgBox Range("D8")
Range("D7").Calculate
MsgBox Range("D7")
Application.Calculation = xlCalculationAutomatic
Большое спасибо, не знал про такие возможности. Очень подходит.
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256249
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СанычНасчет второго вопроса - вроде всё делаю правильно, а не выходит... Сейчас попробую еще.
Понял. Ошибка возникает тогда, когда я пытаюсь что-то заносить в этот рейндж, переданный как параметр. Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
Public Function xxx(r As Range) As Integer
    xxx = r.Cells.Count
    Dim v As Range
    For Each v In r.Cells
        v =  1 
    Next
End Function

Так нельзя?
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256310
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч Владимир СанычНасчет второго вопроса - вроде всё делаю правильно, а не выходит... Сейчас попробую еще.
Понял. Ошибка возникает тогда, когда я пытаюсь что-то заносить в этот рейндж, переданный как параметр. Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
Public Function xxx(r As Range) As Integer
    xxx = r.Cells.Count
    Dim v As Range
    For Each v In r.Cells
        v =  1 
    Next
End Function

Так нельзя?

хотел найти топик, не нашел. обсуждалось как-то, что пользовательская функция не может менять данных на листе. толmrj возвращать значения себя..
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256354
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbaproхотел найти топик, не нашел. обсуждалось как-то, что пользовательская функция не может менять данных на листе. толmrj возвращать значения себя..
Понятно. И как это обойти? Ведь в принципе-то Эксель позволяет менять значения данных программно. Если это нельзя сделать в пользовательской функции, то где? Только в обработчиках событий?
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256374
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч
Понятно. И как это обойти?
вместо функций использовать процедуры
Код: plaintext
1.
2.
3.
4.
5.
6.
Public Sub xxx(r As Range) As Integer
    xxx = r.Cells.Count
    Dim v As Range
    For Each v In r.Cells
        v =  1 
    Next
End Sub
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256407
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч vbaproхотел найти топик, не нашел. обсуждалось как-то, что пользовательская функция не может менять данных на листе. толmrj возвращать значения себя..
Понятно. И как это обойти? Ведь в принципе-то Эксель позволяет менять значения данных программно. Если это нельзя сделать в пользовательской функции, то где? Только в обработчиках событий?
или кнопка.. или пересмотреть концепцию..:)
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256411
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodor Владимир Саныч
Понятно. И как это обойти?
вместо функций использовать процедуры
Код: plaintext
1.
2.
3.
4.
5.
6.
Public Sub xxx(r As Range) As Integer
    xxx = r.Cells.Count
    Dim v As Range
    For Each v In r.Cells
        v =  1 
    Next
End Sub

как это? шутка?
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256590
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbaproкак это? шутка?
Пардон, конечно же "As Interger" - лишнее
я имел ввиду это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Dim i%
Public Sub xxx(r As Range) 
    i = r.Cells.Count
    Dim v As Range
    For Each v In r.Cells
        v =  1 
    Next
End Sub
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256698
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodorвместо функций использовать процедуры
Да, но вызывать-то их откуда?

vbaproили кнопка.. или пересмотреть концепцию..:)
Ну, пересмотреть всегда можно. Это если действительно Эксель не тянет того, что я вздумал на него взвалить.
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256711
Бабай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч Владимир СанычНасчет второго вопроса - вроде всё делаю правильно, а не выходит... Сейчас попробую еще.
Понял. Ошибка возникает тогда, когда я пытаюсь что-то заносить в этот рейндж, переданный как параметр. Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
Public Function xxx(r As Range) As Integer
    xxx = r.Cells.Count
    Dim v As Range
    For Each v In r.Cells
        v =  1 
    Next
End Function

Так нельзя?

по форме такого сорта функция могла бы быть функцией массива. и возвращать массив значений.

(или она не должна явно вызываться из ячейки листа.
тогда саб или вычисления на како-нибудь событие.
событие придется подобрать или придумать (поместив кнопку на лист, например), иначе там тоже легко можно в цикл попасть без специальных усилий по остановке последовательных событий.
)


но по факту, то, что написано, примененное к самому себе выглядит как бесконечный рекурсивный цикл. т.е. прямо так не только нельзя, но и не должно быть льзя.


может возникнет желание хоть как-то похожую задачу обрисовать?
я хоть не спец не тока по акцессу, а и по екселю тоже не спец, но что-то может быть
и сообразилось разумное...

а про функции массива посмотри, например, здесь:
http://www.sql.ru/forum/actualthread.aspx?tid=369706
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256751
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч vkodorвместо функций использовать процедуры
Да, но вызывать-то их откуда?

А откудо надо?
можно из реакций
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub Worksheet_Calculate()
    Application.EnableEvents = False
    Application.Run "xxx", Range("A1:A3")
    MsgBox i
    Call xxx(Range("A1:A4"))
    MsgBox i
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    Application.Run "xxx", Target
    MsgBox i
    Call xxx(Target)
    MsgBox i
    Application.EnableEvents = True
End Sub

можно из модулей
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public i%

Sub pr()
    Application.Run "xxx", Range("A1:A3")
    MsgBox i
    xxx Range("A1:A4")
    MsgBox i
End Sub

Sub xxx(r As Range)
    Dim v As Range
    i = r.Cells.Count
    For Each v In r.Cells
        v =  1 
    Next
End Sub
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256870
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабайпо форме такого сорта функция могла бы быть функцией массива. и возвращать массив значений.
На самом деле у меня и есть массив. И я думал либо функцией с параметром, сидящей в ячейке, выдергивать из массива в ячейку соответствующий элемент (вопрос 1), либо закидывать значения в ячейки по мере вычисления массива (вопрос 2). Согласен, что результат запуска функции с побочным эффектом может быть непредсказуемым, когда функция вызывается неявным образом и неизвестное количество раз.

бабайно по факту, то, что написано, примененное к самому себе выглядит как бесконечный рекурсивный цикл. т.е. прямо так не только нельзя, но и не должно быть льзя.
К самому себе я вроде не собирался. :)))

бабайможет возникнет желание хоть как-то похожую задачу обрисовать?
Учебная программа по морфологии иврита. Есть одна функция, которая строит слово из морфем по известным правилам. Я думал завести массив и в нем по ходу работы функции накапливать комментарии о том, какие правила были задействованы. И тогда бы юзеру выдавалось не только само построенное слово, но и массив комментариев.

vkodorможно из модулей
И тогда кто будет обращаться к процедурам? В конечном счете все равно либо функции (что запрещено), либо обработчики событий. Или есть еще что-то?
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256891
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СанычУчебная программа по морфологии иврита. Есть одна функция, которая строит слово из морфем по известным правилам. Я думал завести массив и в нем по ходу работы функции накапливать комментарии о том, какие правила были задействованы. И тогда бы юзеру выдавалось не только само построенное слово, но и массив комментариев.Эта функция от чего работает? От генератора случайных чисел или от чего-то, что ей юзер дает? Если генератора случайных чисел и от юзера ей ничего не нужно, то у вас месье проблема :) А если юзер этой функции что-то дает на вход, ну например корень слова, то можно уже сделать событие Worksheet_Change в котором делаем:
Код: plaintext
1.
2.
3.
if not (intersect(Target, Range("A:A")) is nothing) then
   запускаем процедуру формирования слова используя значение из Target.Range("A1") как параметр
   и пишем результат с коментариями в Target.Range("B1"), Target.Range("C1") и так далее.
end if
Ну и пусть теперь юзер задет корни слов в колонке A, в B он получит итоговое слово, а в C,D,E будут коментарии. Никаких функций листа вообще нет.

Владимир Саныч vkodorможно из модулей
И тогда кто будет обращаться к процедурам? В конечном счете все равно либо функции (что запрещено), либо обработчики событий. Или есть еще что-то?Еще можно из объектов лежащих на листе (кнопки, картинки, различные шейпы), можно добавить кнопку в тулбар или в меню, можно нарисовать пользовательскую модальную форму, а можно просто ткнуть Alt+F8 и запустить sub напрямую.
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256907
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЭта функция от чего работает? От генератора случайных чисел или от чего-то, что ей юзер дает?
Юзер дает корень и еще некоторые вещи в определенных ячейках. При изменении значения одной из ячеек функция запускается сама и выдает слово (и комментарии, которые пока еще у меня не работают).

Но у меня два режима работы. В одном на листе всего одно слово, исходный материал для него и вычисленные комментарии. Второй режим - отладочный, в нем вычисляется много слов с разными исходными данными, и там комментарии выводить не нужно. Хотелось бы, чтобы одна функция могла работать в обоих режимах.
...
Рейтинг: 0 / 0
Пытаюсь сделать Эксель умнее, чем он есть?
    #34256963
Бабай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Саныч
вероятно вердихт таков будет: если максимальный размер области результата фиксирован,
то фикнция массива к етому делу может прикрутиться удачнее саба, инкапсулировав в себе всякого рода очистки. Если фиксированной области для результата не получается, то что-то бегом саб только видно пока.

кнопка-педаль типа "вычислить вариантов" должна в твоей задаче смотреться.
или можно заложиться на изменения в фиксированной клетке с проверкой запонения прочих.

С екселем работаю мало и событий на листах не очень люблю.
по памяти - есть там тонкие заморочки с обрывом вычислений при использовании пользовательских волатильных функций. дело прошлое сразу не вспомню и не сформулирую.


слушай - у тебя русский на компуктере есть - табличку с рускими буквами твой ексель съест?

или латиницей все рисовать?

щаз прям малек в заморочке, а вечерком могу попробовать каку пригодну к делу демонстрашку выложил бы

может дашь русскую аналогию - каким боком рама к маме прислоняется на примере единственного и множественного прислоняния.
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Пытаюсь сделать Эксель умнее, чем он есть?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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