Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Sanja, спасибо, костыль как раз  в тему...применим по назначению..))
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Sanja, спасибо за участие и советы !!! Просвещаешь меня....добрый человек!)))) Особенно спасибо за предложенные решения, узнал несколько новых для себя функций!))
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Придумал для "непонятных" данных сделать временный массив куда записать их значения......вроде работает
Если кто на "косяки " покажет буду премного благодарен))
Код
 'Заполняем временный массив r() значениями либо функции либо числа из d()
        For y = 3 To 8
            If Left(d(i, y), 1) = "=" Then
               r(y) = Evaluate(d(i, y))
            Else
               r(y) = Val(d(i, y))
            End If
         'Debug.Print y & " - " & r(y)
        Next y
        
    'расчитываем массу одной детали
        'только длина
         If d(i, 4) <> "" And d(i, 5) = "" Then d(i, 7) = r(3) * r(4) / 1000
        'для листа, длина и ширина в расчет
         If d(i, 4) <> "" And d(i, 5) <> "" Then d(i, 7) = r(3) * r(4) / 1000 * r(5) / 1000
        
    'масса всех деталей
        If d(i, 6) <> "" And d(i, 7) <> "" Then d(i, 8) = r(6) * d(i, 7)
        If d(i, 6) = "" Or d(i, 4) = "" Then d(i, 8) = Empty
        If d(i, 1) = "" Or d(i, 1) = "Итого:  " Then d(i, 1) = i
    Next i
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Sanja, все верно, ограничение только "в планах" (дело техники, да и пользователь это пока я сам...) пока решаем вопрос насущный..., Формул не так уж и много, другое дело что невозможно предсказать где в расчете она будет использована! т.е. Иногда формулой задается длина, иногда, ширина а иногда и количество деталей. В тоже время есть детали с неизменяемыми параметрами ... т.е. цифры. Вот такой ребус. Схема расчета должна быть гибкой и "съедать" формулы или цифры по необходимости..
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
я и есть конструктор))) набор формул заранее неизвестен..т.к. каждый раз есть нюансы, а душа просит универсального решения))
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Sanja, а если "в порядке бреда" для всеядности, вот так    
Код
d(i, 8) = Val(Evaluate(d(i, 6))) * Val(Evaluate(d(i, 7)))
а переменные вводятся указанием ячейки, типа это равно вот это... ,а ячейки имеют имена переменных (И только их можно использовать!)

Проверил..всеядность не обеспечена((  тоже не все цифры перевариваются... что то не так...
Изменено: Алекс371 - 02.04.2017 13:21:46
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Sanja, хорошая идея!
Val(d(i,6)) - это для меня новая функция, буду изучать спасибо!!!
Ломаю голову вот над чем: если в значении d(i,6) находится функция то мы ее: Evaluate(d(i, 6)) - и ок))
а если в d(i,6) находится число то надо Val(d(i,6))  т.е. надо проверять каждый элемент массива через if ???
типа: если формула то применяем Evaluate а если число то Val
Как это правильно исполнить?
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Ну да.., если
Цитата
Пользователю вообще не нужно знать по каким формулам что считается
то Ваш вариант кода подходит,
Только задача как раз и заключается в том что пользователь должен записывать формулу при расчете (создании) новой детали, или записывать значение если параметр для детали не меняется!
В этом и заключается замысел, сделать инструмент для конструктора и потом использовать его при подборе комплекта в зависимости от параметров.

И почему одни цифры в расчете не вызывают ошибку а другие вызывают..... вопрос остался открытым..
Изменено: Алекс371 - 02.04.2017 12:02:43
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Да вы правы, я неправильно указал номер не d(2,1) а имелось ввиду d(2,4) = ""=Hzd"
суть задачи вкраце изложена в начале темы:
Цитата
Есть задача: Расчитываем спецификацию ОМ и результат расчета сохраняем в каталог. Поля «Длина», «Ширина», «Кол-во» могут быть числами (конкретными велечинами) или это формулы использующие в качестве переменных именованные диапазоны.

Есть один момент! Расчеты производим в массиве, т.к. может быть большое кол-во строк, загружаем диапазон в массив, делаем расчет и выгружаем обратно. При этом в ячейках с формулами должны остаться формулы!!!

Прикрепляю файл с более подробным описанием, ТЗ до конца не доработан..так сказать "Полет мысли" буду признателен за конструктивную критику
и по форме и по содержанию....чувствую я там можно попроще сделать..

Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Формулы записаны в ячейки диапазона, определяем массив d = Range(Cells(17, 4), Cells(z + 1, 11)).Formula
Получается что в значение d(2,1) ="=Hzd" и при использовании Evaluate(d(2, 1)) получаем значение 10 , которое можно использовать в расче
Цитата
Понятно что определив массив как формулы, мы и числа получили в формате string, может надо работать с ними не через Evaluate()? Пока не хватает здесь моих знаний…
по сути выглядит так: "число" * число , умножаем текст на число получаем ошибку...., что бы этого не было используем Evaluate(d(i, 6)) * d(i, 7)
Изменено: Алекс371 - 02.04.2017 10:36:21
Головоломка с (Error 438), макросу не нравятся цифры с 7 до 12
 
Добрый день!
Столкнулся с такой проблемой:

Есть задача: Расчитываем спецификацию ОМ и результат расчета сохраняем в каталог. Поля «Длина», «Ширина», «Кол-во» могут быть числами (конкретными велечинами) или это формулы использующие в качестве переменных именованные диапазоны.

(Разбирали здесь: http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=89684&TITLE_SEO=89684-vychisleniya-v-massive-po-formule-iz-yacheyki&MID=742994&result=edit#message742994)

Есть один момент! Расчеты производим в массиве, т.к. может быть большое кол-во строк, загружаем диапазон в массив, делаем расчет и выгружаем обратно. При этом в ячейках с формулами должны остаться формулы!!!

 Решил эту проблему с помощью совета Sanja и kuklp

Через определения массива как массив формул: 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()? Пока не хватает здесь моих знаний…

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

Изменено: Алекс371 - 02.04.2017 09:34:12
Вычисления в массиве, используем значение формул
 
Никак не разберусь, вот файл с ошибкой.. в поле количество ставим 8.... и получаем Object doesn't support this property or
method (Error 438) ошибка возникает с 7-13
Изменено: Алекс371 - 02.04.2017 01:36:29
Вычисления в массиве, используем значение формул
 
Jungl, да странное дело... для того чтобы прикрепить файл удалил несколько форм и листов (которые по идее не должны влиять на выполнение кода!)
В результате в исходном файле ошибка осталась но он весит 250 кбт и сюда не помещается(
А  StopEvents по аналогии с пользовательскими формами там Application.EnableEvents = False не работает (когда искал как предотвратить срабатывание в элементе управления попалось такое мнение)) и решение с переменной. Спасибо что напомнили стандартный (более правильный на мой взгляд )метод
Вычисления в массиве, используем значение формул
 
Jungl, да строка тут не играет роли.... В колонке "Количество" ставим 1, 2, 3 и т.д - все работает
ставим 8 - ошибка)) может 1 апреля...
Вычисления в массиве, используем значение формул
 
Подскажите, кто соображает что не так? Столкнулся с такой проблемой:
В диапазоне расчетов есть формулы поэтому  приходится определять массив как
d = Range(Cells(17, 4), Cells(z + 1, 11)).Formula
И потом работать со значениями через Evaluate,
Тоесть когда записана формула то Evaluate(d(i, 6)) дает ее значение, а вот если в ячейке было число то иногда при вводе 7 или 8 выдает ошибку ...как  правильно написать чтобы числа читались однозначно или
может есть более изящное решение?
Код
'создаем массив для вычислений d()(значения записываются как формулы т.е. "формула"!!! _
 поэтому все (не вычисляемые в массиве) значения использовать через: Evaluate(d(i, 4))
    d = Range(Cells(17, 4), Cells(z + 1, 11)).Formula
    
    j = UBound(d)
    For i = 1 To j - 1
        'масса одной детали
        If d(i, 4) <> "" And d(i, 5) = "" Then d(i, 7) = Evaluate(d(i, 3)) * Evaluate(d(i, 4)) / 1000 'только длина
        If d(i, 4) <> "" And d(i, 5) <> "" Then d(i, 7) = Evaluate(d(i, 3)) * Evaluate(d(i, 4)) / 1000 _
        * Evaluate(d(i, 5)) / 1000 'для листа, длина и ширина в расчет
        'масса всех деталей
        If d(i, 6) <> "" And d(i, 7) <> "" Then d(i, 8) = Evaluate(d(i, 6)) * d(i, 7)
        If d(i, 6) = "" Or d(i, 4) = "" Then d(i, 8) = Empty
        If d(i, 1) = "" Or d(i, 1) = "Итого:  " Then d(i, 1) = i
    Next i
    
'Строка Итого
    d(j, 1) = "Итого:  ": d(j, 8) = 0
    For i = 1 To UBound(d) - 1
      d(j, 8) = d(j, 8) + d(i, 8) ' Сумма в строку итого
    Next i
    d(j, 8) = Round(d(j, 8), 0)
    
'Выгружаем на лист
    Range(Cells(17, 4), Cells(z + 1, 11)) = d
т.е  Evaluate(d(i, 6))  ' выдает число не каждый раз... может пройти несколько строк а потом выдать ошибку

В колонке "Количество" ставим 1, 2, 3 и т.д - все работает
ставим 8 - ошибка))
Изменено: Алекс371 - 02.04.2017 00:00:10
Записанную в ячейке формулу использовать для расчета в массиве
 
Sanja спасибо за помощь! я успел прочитать Ваше сообщение в той удаленной теме и ваше решение для меня открыло новые возможности в использовании именованных диапазонов. Я пока еще не протестировал его в своем проекте полностью..., ввиду дефицита времени, но в целом должно все получится! еще раз огромное спасибо!))
    Сомнение у меня вызвал сам факт замены переменных в теле процедуры на "имя диапазона". Допустим в ходе выполнения процедуры значение переменной меняется....( т.е. надо переназначить значение именованного диапазона? это тоже можно сделать внутри процедуры? думаю да....) Во всей этой схеме смущает только то, что именованный диапазон на листе особо и не нужен, значение некоторых переменных хочется вводить в TextBox или Список, а некоторые вычисляются внутри процедуры...
    Возможно я немного неправильно формулирую...пока только знакомлюсь VBA, но есть ощущение что делаем лишнюю операцию. Вместо того чтобы присвоить переменной значение и его использовать, мы делаем три хода: Значение ложим в диапазон, обзываем его как переменную и от туда берем значение диапазона...
В этом и был вопрос, использовать переменные в расчете формулы (текст которой записан в ячейке или в элементе управления).
А так все работает ка Вы и подсказали, еще раз спасибо за помощь.
Записанную в ячейке формулу использовать для расчета в массиве
 
так тоже работает
Код
Private Sub Расчет_Парам()
    Dim i, d()
    d = Range("A6:C8")
    For i = 1 To UBound(d)
        d(i, 3) = Evaluate(d(i, 2))  'при условии наличия именнованых диапазонов
    Next i
    Range("A6:C8") = d
End Sub

Записанную в ячейке формулу использовать для расчета в массиве
 
 Хотя все работает при назначении именованных диапазонов и присвоении им значений, это вроде и не переменные но работает...
Получается что для изменения значений переменных нужно менять значение в диапазонах
   
Записанную в ячейке формулу использовать для расчета в массиве
 
Огромное спасибо за ответ!))
Интересное решение использовать для вычислений именованные диапазоны . Получается вместо переменных в теле процедуры мы используем именованный диапазон.... и можем обращатся к именам диапазонов в которых находятся значения переменных...насколько это правильно с точки зрения программирования? я только начинаю изучать VBA может чего не вижу...
  В задаче есть условия: имеем список параметров и формулы для вычисления этих параметров, расчет параметров происходит в массиве и на лист выгружаются значения и в отдельном столбце формулы. В вашем коде на лист выгружаются формулы...а значение дает ошибку?  есть ли возможность перевести  формулу в значение "внутри" процедуры? т.е. имеем в одной ячейке записанную формулу с переменными, а в другой ячейке должны получить значение вычислений...
Записанную в ячейке формулу использовать для расчета в массиве
 

Доброго всем времени суток! Подскажите куда копать))

Есть задача…)

В таблице параметры для расчета значений используются разные формулы с использованием переменных. Переменные определяются в начале процедуры и не меняются в процессе. Пользователь назначает значения переменным и записывает формулы для расчета в таблица.  В соседний столбец необходимо вывести результат расчета.    Пример: расчет площади, периметра и объема здания. Размеры определяем в начале процедуру, а формулы берем из столбца (2)      Задумка такая:  Загружаем данные в массив, и производим вычисления используя текст формулы из d(I,2) для расчета значения d(I,3) и далее выгружаем все обратно!Проблема в том что формула записаная в массив воспринимается как текст…

Код
Private Sub Расчет_Параметров()
Dim Dzd, Lzd, Hzd, i, d()
Dzd = Cells(3, 1)
Lzd = Cells(3, 2)
Hzd = Cells(3, 3)
d = Range("A6:C8")
'Задача: использовать тект в d(i,2) как формулу для d(i,3)
For i = 1 To UBound(d)
     d(i, 3) = d(i, 2)          ' а так просто переписывается значение(((
     d(i, 3) = Dzd * Lzd * Hzd 'нужно извлечь вот такую формулу из ячейки _
     причем в разных строках массива разные формулы.
Next i
Range("A6:C8") = d
End Sub
Изменено: Алекс371 - 26.03.2017 20:53:01
Как переопределить диапазон именованного диапазона для разных листов, именованные диапазоны для создания связанных выпадающих списков
 
Ура!!! товарищи, ура...
Проблема решена, если кому поможет буду рад)))


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
Как переопределить диапазон именованного диапазона для разных листов, именованные диапазоны для создания связанных выпадающих списков
 
это поиск зашел в тупик...вот и подбирал разные варианты
ActiveWorkbook.Names(""Фото_вида_здания").RefersToR1C1 = "=À2!R1C1:R13C6" это меняет диапазон РАБОТАЕТ!)
а такая конструкция не хочет((

лист = Worksheets("Лист1").Cells(3, 2).Text 'назначаем переменную лист (имя листа)
                                            'MsgBox (лист) 'проверка
                                          'Worksheets(лист).Activate 'проверка

    ActiveWorkbook.Names("Фото_вида_здания").RefersToR1C1 = "=лист!R1C40:R13C45"

хотя переменная определяется и лист открывает правильный...
Как переопределить диапазон именованного диапазона для разных листов, именованные диапазоны для создания связанных выпадающих списков
 
Друзья! добрый день! Помогите советом начинашке
Тема такая:
Для создания связанных выпадающих списков, в том числе и с картинками)) назначаем для элементов управления(выпадающий список) именованные диапазоны.
Далее создаем макрос для изменения диапазона этих диапазонов))
Код
Sub Диапазон_Фото_вида_здания_Если()

  ' назначаем диапазон
  If Worksheets("Лист1").Cells(3, 1).Value = 1 Then ' тогда диапазон на листе А1
     ActiveWorkbook.Names("Фото_вида_здания").RefersToR1C1 = "=А1!R1C40:R13C45"
 Else
      If Worksheets("Лист1").Cells(3, 1).Value = 2 Then ' тогда диапазон на листе А2
      ActiveWorkbook.Names("Фото_вида_здания").RefersToR1C1 = "=А2!R1C1:R13C6"
      Else
           If Worksheets("Лист1").Cells(3, 1).Value = 3 Then ' тогда диапазон на листе П1
           ActiveWorkbook.Names("Фото_вида_здания").RefersToR1C1 = "=П1!R1C1:R13C6"
           Else
           ActiveWorkbook.Names("Фото_вида_здания").RefersToR1C1 = "=П2!R1C1:R13C6"
           End If
      End If
  End If
 
End Sub

Все работает, но есть минус - при создании новых листов нужно каждый раз править руками.
Логично сделать переменную с именем листа и тут я зашел в тупик...
Код
Sub Диапазон_Фото_вида_здания()
Dim лист
лист = Worksheets("Лист1").Cells(3, 2).Text 'назначаем переменную лист (имя листа)

ActiveWorkbook.Names("Фото_вида_здания").RefersToRange = "=лист!R1C1:R13C6"  'ЭТА СТРОКА ДАЕТ ОШИБКУ 
End Sub

А конструкция:
Код
ActiveWorkbook.Names("Фото_вида_здания").RefersToR1C1 = Worksheets(лист).Range(Cells(1, 1), Cells(13, 6))

работает исправно только если нужный лист активен! Делать через Select видится не очень правильно.
Подскажите пожалуйста как правильно вписать переменную чтобы она определяла имя листа?
Страницы: 1
Наверх