02.04.2017 13:27:23
Sanja, все верно, ограничение только "в планах" (дело техники, да и пользователь это пока я сам...) пока решаем вопрос насущный..., Формул не так уж и много, другое дело что невозможно предсказать где в расчете она будет использована! т.е. Иногда формулой задается длина, иногда, ширина а иногда и количество деталей. В тоже время есть детали с неизменяемыми параметрами ... т.е. цифры. Вот такой ребус. Схема расчета должна быть гибкой и "съедать" формулы или цифры по необходимости..
|
|
|
02.04.2017 13:05:24
Sanja, а если "в порядке бреда" для всеядности, вот так
Проверил..всеядность не обеспечена(( тоже не все цифры перевариваются... что то не так...
Изменено: |
|||
|
02.04.2017 12:44:11
Sanja, хорошая идея!
Val(d(i,6)) - это для меня новая функция, буду изучать спасибо!!! Ломаю голову вот над чем: если в значении d(i,6) находится функция то мы ее: Evaluate(d(i, 6)) - и ок)) а если в d(i,6) находится число то надо Val(d(i,6)) т.е. надо проверять каждый элемент массива через if ??? типа: если формула то применяем Evaluate а если число то Val Как это правильно исполнить? |
|
|
02.04.2017 11:51:21
Ну да.., если
Только задача как раз и заключается в том что пользователь должен записывать формулу при расчете (создании) новой детали, или записывать значение если параметр для детали не меняется! В этом и заключается замысел, сделать инструмент для конструктора и потом использовать его при подборе комплекта в зависимости от параметров. И почему одни цифры в расчете не вызывают ошибку а другие вызывают..... вопрос остался открытым..
Изменено: |
|||
|
02.04.2017 11:12:41
Да вы правы, я неправильно указал номер не d(2,1) а имелось ввиду d(2,4) = ""=Hzd"
суть задачи вкраце изложена в начале темы:
и по форме и по содержанию....чувствую я там можно попроще сделать.. |
|||
|
02.04.2017 10:30:33
Формулы записаны в ячейки диапазона, определяем массив d = Range(Cells(17, 4), Cells(z + 1, 11)).Formula
Получается что в значение d(2,1) ="=Hzd" и при использовании Evaluate(d(2, 1)) получаем значение 10 , которое можно использовать в расче
Изменено: |
|||
|
02.04.2017 09:32:57
Добрый день!
Столкнулся с такой проблемой: Есть задача: Расчитываем спецификацию ОМ и результат расчета сохраняем в каталог. Поля «Длина», «Ширина», «Кол-во» могут быть числами (конкретными велечинами) или это формулы использующие в качестве переменных именованные диапазоны. Есть один момент! Расчеты производим в массиве, т.к. может быть большое кол-во строк, загружаем диапазон в массив, делаем расчет и выгружаем обратно. При этом в ячейках с формулами должны остаться формулы!!! Решил эту проблему с помощью совета Через определения массива как массив формул: d = Range("A6:C8").Formula А расчеты выполнял через Evaluate(d(i, 2)), по началу вроде все работало а потом стала появлятся ошибка… Сейчас при вводе в полля «Длина», «Ширина», «Кол-во» целых чисел от 7 до 12 появляется ошибка : Object doesn't support this property or method (Error 438) Причем при вводе 1, 2, 3, и т.д. все работает… СТРАННО что одни цифры проходят а другие нет)) Еще смущает следущее: Понятно что определив массив как формулы, мы и числа получили в формате string, может надо работать с ними не через Evaluate()? Пока не хватает здесь моих знаний… А заранее присвоить тип данных полям мы не можем, т.к. не знаем в какой ячейке будет формула а в какой число, может есть возможность внутри массива определять тип данных и правильно использовать его в вычислениях?
Изменено: |
|
|
02.04.2017 00:07:54
Jungl, да странное дело... для того чтобы прикрепить файл удалил несколько форм и листов (которые по идее не должны влиять на выполнение кода!)
В результате в исходном файле ошибка осталась но он весит 250 кбт и сюда не помещается( А StopEvents по аналогии с пользовательскими формами там Application.EnableEvents = False не работает (когда искал как предотвратить срабатывание в элементе управления попалось такое мнение)) и решение с переменной. Спасибо что напомнили стандартный (более правильный на мой взгляд )метод |
|
|
01.04.2017 21:46:22
Подскажите, кто соображает что не так? Столкнулся с такой проблемой:
В диапазоне расчетов есть формулы поэтому приходится определять массив как d = Range(Cells(17, 4), Cells(z + 1, 11)).Formula И потом работать со значениями через Evaluate, Тоесть когда записана формула то Evaluate(d(i, 6)) дает ее значение, а вот если в ячейке было число то иногда при вводе 7 или 8 выдает ошибку ...как правильно написать чтобы числа читались однозначно или может есть более изящное решение?
В колонке "Количество" ставим 1, 2, 3 и т.д - все работает ставим 8 - ошибка))
Изменено: |
|||
|
28.03.2017 19:43:56
Сомнение у меня вызвал сам факт замены переменных в теле процедуры на "имя диапазона". Допустим в ходе выполнения процедуры значение переменной меняется....( т.е. надо переназначить значение именованного диапазона? это тоже можно сделать внутри процедуры? думаю да....) Во всей этой схеме смущает только то, что именованный диапазон на листе особо и не нужен, значение некоторых переменных хочется вводить в TextBox или Список, а некоторые вычисляются внутри процедуры... Возможно я немного неправильно формулирую...пока только знакомлюсь VBA, но есть ощущение что делаем лишнюю операцию. Вместо того чтобы присвоить переменной значение и его использовать, мы делаем три хода: Значение ложим в диапазон, обзываем его как переменную и от туда берем значение диапазона... В этом и был вопрос, использовать переменные в расчете формулы (текст которой записан в ячейке или в элементе управления). А так все работает ка Вы и подсказали, еще раз спасибо за помощь. |
|
|
27.03.2017 22:15:53
Огромное спасибо за ответ!))
Интересное решение использовать для вычислений именованные диапазоны . Получается вместо переменных в теле процедуры мы используем именованный диапазон.... и можем обращатся к именам диапазонов в которых находятся значения переменных...насколько это правильно с точки зрения программирования? я только начинаю изучать VBA может чего не вижу... В задаче есть условия: имеем список параметров и формулы для вычисления этих параметров, расчет параметров происходит в массиве и на лист выгружаются значения и в отдельном столбце формулы. В вашем коде на лист выгружаются формулы...а значение дает ошибку? есть ли возможность перевести формулу в значение "внутри" процедуры? т.е. имеем в одной ячейке записанную формулу с переменными, а в другой ячейке должны получить значение вычислений... |
|
|
26.03.2017 20:38:17
Доброго всем времени суток! Подскажите куда копать)) Есть задача…) В таблице параметры для расчета значений используются разные формулы с использованием переменных. Переменные определяются в начале процедуры и не меняются в процессе. Пользователь назначает значения переменным и записывает формулы для расчета в таблица. В соседний столбец необходимо вывести результат расчета. Пример: расчет площади, периметра и объема здания. Размеры определяем в начале процедуру, а формулы берем из столбца (2) Задумка такая: Загружаем данные в массив, и производим вычисления используя текст формулы из d(I,2) для расчета значения d(I,3) и далее выгружаем все обратно!Проблема в том что формула записаная в массив воспринимается как текст…
Изменено: |
|||
|
02.03.2017 15:20:40
Ура!!! товарищи, ура...
Проблема решена, если кому поможет буду рад))) Sub Диапазон_Фото_вида_здания_по_Назв_Листа() 'В адресе диапазона меняется лист Dim x As String x = Worksheets("Лист1").Cells(3, 2).Text 'назначаем переменную лист (имя листа) 'MsgBox (лист) 'проверка ' имя диапазона ' верхняя левая ' нижняя правая ActiveWorkbook.Names("Фото_вида_здания").RefersToR1C1 = Worksheets(x).Range(Worksheets(x).Cells(1, 1), Worksheets(x).Cells(13, 6)) 'Range("Фото_вида_здания").Select 'Для отладки диапазона End Sub |
|
|
02.03.2017 11:43:32
это поиск зашел в тупик...вот и подбирал разные варианты
ActiveWorkbook.Names(""Фото_вида_здания").RefersToR1C1 = "=À2!R1C1:R13C6" это меняет диапазон РАБОТАЕТ!) а такая конструкция не хочет(( лист = Worksheets("Лист1").Cells(3, 2).Text 'назначаем переменную лист (имя листа) 'MsgBox (лист) 'проверка 'Worksheets(лист).Activate 'проверка ActiveWorkbook.Names("Фото_вида_здания").RefersToR1C1 = "=лист!R1C40:R13C45" хотя переменная определяется и лист открывает правильный... |
|
|
02.03.2017 11:09:51
Друзья! добрый день! Помогите советом начинашке
Тема такая: Для создания связанных выпадающих списков, в том числе и с картинками)) назначаем для элементов управления(выпадающий список) именованные диапазоны. Далее создаем макрос для изменения диапазона этих диапазонов))
Все работает, но есть минус - при создании новых листов нужно каждый раз править руками. Логично сделать переменную с именем листа и тут я зашел в тупик...
А конструкция:
работает исправно только если нужный лист активен! Делать через Select видится не очень правильно. Подскажите пожалуйста как правильно вписать переменную чтобы она определяла имя листа? |
|||||||
|