Страницы: 1
RSS
Вычисления внутри макроса по формуле и присвоение результата переменной
 
Добрый день знатоки!
Подскажите как переменной присвоить результат вычисления формулы вида
Код
=(ВПР(.....) + ([rc4]/100)*([rc6]/100))*2

сейчас делаю через вставку в ячейку формулы, потом переменной присваиваю значение ячейки и потом уже использую переменную.
Можно как то избежать вставки формулы в ячейку?
 
Santiago, здравствуйте!
Вычисляйте внутри макроса и вставляйте уже значение:
Код
Sub t ()
ActiveCell.Value2=WorksheetFunction.VlookUp(…) + 2*(Range("A1").Value2/100 * Range("C4").Value2/100)
End Sub
WorksheetFunction.VlookUp() в коде также можно заменить на "чистый" VBA, но это уже вопрос для другой темы, в которой вы покажете ЧТО именно нужно сделать (какой результат получить)
Изменено: Jack Famous - 05.10.2020 13:32:48
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: Вычисляйте внутри макроса и вставляйте уже значение:
мне не нужно значение вставлять в ячейку

есть вот так
Код
Cells(1,1).FormulaR1C1 = "=(VLookup(""text"", range, 3, 0) * (rc[-6] / 100) * (rc[-5] / 100))*2"
a = Cells(1,1).Value
Cells(1,1) = 125 + a

как сделать
Код
a =(VLookup(""text"", range, 3, 0) * (rc[-6] / 100) * (rc[-5] / 100))*2
Cells(1,1) =125 +a

p.s. вместо 125 результат другой формулы
 
Santiago, у вас всё перепуталось  :D
приложите файл-пример и формулой (на листе) покажите, что хотите получить. Я вам покажу, как сделать это макросом
Цитата
Santiago: мне не нужно значение вставлять в ячейку
Цитата
Santiago: Cells(1,1) = 125 + a
это и есть "вставка" значения, только не вставка, как вы через Ctrl+V делаете, а, скорее "присвоение" ячейке указанных данных

P.S.: код оформляется тэгом "<…>" на панели и делать такие пропуски между строками совсем не нужно
Название темы: Вычисления внутри макроса по формуле и вывод результат на лист
Изменено: Jack Famous - 05.10.2020 13:52:20
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Название темы: Вычисления внутри макроса по формуле и вывод результат на лист
немного не так...Вычисления внутри макроса по формуле и присвоение результата переменной
так думаю будет правильнее
 
Цитата
Santiago: Присвоить переменной результат вычисления формулы
в таком случае, ответ готов
Код
Sub t()
Dim a

a=12*6
MsgBox a
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
а если формула посложнее, например:
Код
Sub t()
Dim a
 
a= (vlookup(""text"",range,3,0)+(rc[-6]/100)*(rc[-5]/100))*2
MsgBox a
End Sub
Изменено: Santiago - 05.10.2020 14:18:58
 

сейчас вот так, все работает:

Код
If Me.cmbModel = "Long Sleep" Then
            .Cells(lastrow, 11).FormulaR1C1 = "=SUMPRODUCT((INDEX(price_material,,1)=material_spec)*INDEX(Спецификации!C[-8]:c[40],MATCH(rc[-7],Спецификации!c[-10],),)*Материалы!r2c[-8]:r50c[-8]*Материалы!r2c[-6]:r50c[-6]*((Материалы!r2c[-7]:r50c[-7]=""l"")*2*(if(rc[-6]/100<1.81,1.8,if(or(rc[-6]/100=1.81,and(rc[-6]/100>1.81,rc[-6]/100<2.01)),2,if(or(rc[-6]/100=2.01,and(rc[-6]/100>2.01,rc[-6]/100<2.11)),2.1,rc[-6]/100)))+(if(and(rc[-5]/100>0.71,rc[-5]/100<0.81),0.8,if(or(rc[-5]/100=0.81,and(rc[-5]/100>0.81,rc[-5]/100<0.91)),0.9,if(or(rc[-5]/100=0.91,and(rc[-5]/100>0.91,rc[-5]/100<1.21)),1.2,if(or(rc[-5]/100=1.21,and(rc[-5]/100>1.21,rc[-5]/100<1.41)),1.4,if(or(rc[-5]/100=1.41,and(rc[-5]/100>1.41,rc[-5]/100<1.61)),1.6,if(or(rc[-5]/100=1.61,and(rc[-5]/100>1.61,rc[-5]/100<1.81)),1.8,if(or(rc[-5]/100=1.81,and(rc[-5]/100>1.81,rc[-5]/100<2.01)),2,if(or(rc[-5]/100=2.01,and(rc[-5]/100>2.01,rc[-5]/100<2.16)),2.15,rc[-5]/100))))))))))+" & _
                "(Материалы!r2c[-7]:r50c[-7]=""s"")*(if(rc[-6]/100<1.81,1.8,if(or(rc[-6]/100=1.81,and(rc[-6]/100>1.81,rc[-6]/100<2.01)),2,if(or(rc[-6]/100=2.01,and(rc[-6]/100>2.01,rc[-6]/100<2.11)),2.1,rc[-6]/100)))*(if(and(rc[-5]/100>0.71,rc[-5]/100<0.81),0.8,if(or(rc[-5]/100=0.81,and(rc[-5]/100>0.81,rc[-5]/100<0.91)),0.9,if(or(rc[-5]/100=0.91,and(rc[-5]/100>0.91,rc[-5]/100<1.21)),1.2,if(or(rc[-5]/100=1.21,and(rc[-5]/100>1.21,rc[-5]/100<1.41)),1.4,if(or(rc[-5]/100=1.41,and(rc[-5]/100>1.41,rc[-5]/100<1.61)),1.6,if(or(rc[-5]/100=1.61,and(rc[-5]/100>1.61,rc[-5]/100<1.81)),1.8,if(or(rc[-5]/100=1.81,and(rc[-5]/100>1.81,rc[-5]/100<2.01)),2,if(or(rc[-5]/100=2.01,and(rc[-5]/100>2.01,rc[-5]/100<2.16)),2.15,rc[-5]/100))))))))))+(Материалы!r2c[-7]:r50c[-7]=""n"")*Материалы!r2c[-6]:r50c[-6]))"
            a = .Cells(lastrow, 11).Value
            .Cells(lastrow, 11).FormulaR1C1 = "=(VLookup(""Кокос 8"", price_material, 3, 0) * (rc[-6] / 100) * (rc[-5] / 100))*2"
            b = .Cells(lastrow, 11).Value
            .Cells(lastrow, 11) = a + b
        Else
            .Cells(lastrow, 11).FormulaR1C1 = "=SUMPRODUCT((INDEX(price_material,,1)=material_spec)*INDEX(Спецификации!C[-8]:c[40],MATCH(rc[-7],Спецификации!c[-10],),)*Материалы!r2c[-8]:r50c[-8]*Материалы!r2c[-6]:r50c[-6]*((Материалы!r2c[-7]:r50c[-7]=""l"")*2*(if(rc[-6]/100<1.81,1.8,if(or(rc[-6]/100=1.81,and(rc[-6]/100>1.81,rc[-6]/100<2.01)),2,if(or(rc[-6]/100=2.01,and(rc[-6]/100>2.01,rc[-6]/100<2.11)),2.1,rc[-6]/100)))+(if(and(rc[-5]/100>0.71,rc[-5]/100<0.81),0.8,if(or(rc[-5]/100=0.81,and(rc[-5]/100>0.81,rc[-5]/100<0.91)),0.9,if(or(rc[-5]/100=0.91,and(rc[-5]/100>0.91,rc[-5]/100<1.21)),1.2,if(or(rc[-5]/100=1.21,and(rc[-5]/100>1.21,rc[-5]/100<1.41)),1.4,if(or(rc[-5]/100=1.41,and(rc[-5]/100>1.41,rc[-5]/100<1.61)),1.6,if(or(rc[-5]/100=1.61,and(rc[-5]/100>1.61,rc[-5]/100<1.81)),1.8,if(or(rc[-5]/100=1.81,and(rc[-5]/100>1.81,rc[-5]/100<2.01)),2,if(or(rc[-5]/100=2.01,and(rc[-5]/100>2.01,rc[-5]/100<2.16)),2.15,rc[-5]/100))))))))))+" & _
                "(Материалы!r2c[-7]:r50c[-7]=""s"")*(if(rc[-6]/100<1.81,1.8,if(or(rc[-6]/100=1.81,and(rc[-6]/100>1.81,rc[-6]/100<2.01)),2,if(or(rc[-6]/100=2.01,and(rc[-6]/100>2.01,rc[-6]/100<2.11)),2.1,rc[-6]/100)))*(if(and(rc[-5]/100>0.71,rc[-5]/100<0.81),0.8,if(or(rc[-5]/100=0.81,and(rc[-5]/100>0.81,rc[-5]/100<0.91)),0.9,if(or(rc[-5]/100=0.91,and(rc[-5]/100>0.91,rc[-5]/100<1.21)),1.2,if(or(rc[-5]/100=1.21,and(rc[-5]/100>1.21,rc[-5]/100<1.41)),1.4,if(or(rc[-5]/100=1.41,and(rc[-5]/100>1.41,rc[-5]/100<1.61)),1.6,if(or(rc[-5]/100=1.61,and(rc[-5]/100>1.61,rc[-5]/100<1.81)),1.8,if(or(rc[-5]/100=1.81,and(rc[-5]/100>1.81,rc[-5]/100<2.01)),2,if(or(rc[-5]/100=2.01,and(rc[-5]/100>2.01,rc[-5]/100<2.16)),2.15,rc[-5]/100))))))))))+(Материалы!r2c[-7]:r50c[-7]=""n"")*Материалы!r2c[-6]:r50c[-6]))"
            .Cells(lastrow, 11).Value = .Cells(lastrow, 11).Value
        End If

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

чтобы как то так было

Код
If Me.cmbModel = "Long Sleep" Then
            a = "=SUMPRODUCT((INDEX(price_material,,1)=material_spec)*INDEX(Спецификации!C[-8]:c[40],MATCH(rc[-7],Спецификации!c[-10],),)*Материалы!r2c[-8]:r50c[-8]*Материалы!r2c[-6]:r50c[-6]*((Материалы!r2c[-7]:r50c[-7]=""l"")*2*(if(rc[-6]/100<1.81,1.8,if(or(rc[-6]/100=1.81,and(rc[-6]/100>1.81,rc[-6]/100<2.01)),2,if(or(rc[-6]/100=2.01,and(rc[-6]/100>2.01,rc[-6]/100<2.11)),2.1,rc[-6]/100)))+(if(and(rc[-5]/100>0.71,rc[-5]/100<0.81),0.8,if(or(rc[-5]/100=0.81,and(rc[-5]/100>0.81,rc[-5]/100<0.91)),0.9,if(or(rc[-5]/100=0.91,and(rc[-5]/100>0.91,rc[-5]/100<1.21)),1.2,if(or(rc[-5]/100=1.21,and(rc[-5]/100>1.21,rc[-5]/100<1.41)),1.4,if(or(rc[-5]/100=1.41,and(rc[-5]/100>1.41,rc[-5]/100<1.61)),1.6,if(or(rc[-5]/100=1.61,and(rc[-5]/100>1.61,rc[-5]/100<1.81)),1.8,if(or(rc[-5]/100=1.81,and(rc[-5]/100>1.81,rc[-5]/100<2.01)),2,if(or(rc[-5]/100=2.01,and(rc[-5]/100>2.01,rc[-5]/100<2.16)),2.15,rc[-5]/100))))))))))+" & _
                "(Материалы!r2c[-7]:r50c[-7]=""s"")*(if(rc[-6]/100<1.81,1.8,if(or(rc[-6]/100=1.81,and(rc[-6]/100>1.81,rc[-6]/100<2.01)),2,if(or(rc[-6]/100=2.01,and(rc[-6]/100>2.01,rc[-6]/100<2.11)),2.1,rc[-6]/100)))*(if(and(rc[-5]/100>0.71,rc[-5]/100<0.81),0.8,if(or(rc[-5]/100=0.81,and(rc[-5]/100>0.81,rc[-5]/100<0.91)),0.9,if(or(rc[-5]/100=0.91,and(rc[-5]/100>0.91,rc[-5]/100<1.21)),1.2,if(or(rc[-5]/100=1.21,and(rc[-5]/100>1.21,rc[-5]/100<1.41)),1.4,if(or(rc[-5]/100=1.41,and(rc[-5]/100>1.41,rc[-5]/100<1.61)),1.6,if(or(rc[-5]/100=1.61,and(rc[-5]/100>1.61,rc[-5]/100<1.81)),1.8,if(or(rc[-5]/100=1.81,and(rc[-5]/100>1.81,rc[-5]/100<2.01)),2,if(or(rc[-5]/100=2.01,and(rc[-5]/100>2.01,rc[-5]/100<2.16)),2.15,rc[-5]/100))))))))))+(Материалы!r2c[-7]:r50c[-7]=""n"")*Материалы!r2c[-6]:r50c[-6]))"
            b = "=(VLookup(""Кокос 8"", price_material, 3, 0) * (rc[-6] / 100) * (rc[-5] / 100))*2"
            .Cells(lastrow, 11) = a + b
        Else
            .Cells(lastrow, 11).FormulaR1C1 = "=SUMPRODUCT((INDEX(price_material,,1)=material_spec)*INDEX(Спецификации!C[-8]:c[40],MATCH(rc[-7],Спецификации!c[-10],),)*Материалы!r2c[-8]:r50c[-8]*Материалы!r2c[-6]:r50c[-6]*((Материалы!r2c[-7]:r50c[-7]=""l"")*2*(if(rc[-6]/100<1.81,1.8,if(or(rc[-6]/100=1.81,and(rc[-6]/100>1.81,rc[-6]/100<2.01)),2,if(or(rc[-6]/100=2.01,and(rc[-6]/100>2.01,rc[-6]/100<2.11)),2.1,rc[-6]/100)))+(if(and(rc[-5]/100>0.71,rc[-5]/100<0.81),0.8,if(or(rc[-5]/100=0.81,and(rc[-5]/100>0.81,rc[-5]/100<0.91)),0.9,if(or(rc[-5]/100=0.91,and(rc[-5]/100>0.91,rc[-5]/100<1.21)),1.2,if(or(rc[-5]/100=1.21,and(rc[-5]/100>1.21,rc[-5]/100<1.41)),1.4,if(or(rc[-5]/100=1.41,and(rc[-5]/100>1.41,rc[-5]/100<1.61)),1.6,if(or(rc[-5]/100=1.61,and(rc[-5]/100>1.61,rc[-5]/100<1.81)),1.8,if(or(rc[-5]/100=1.81,and(rc[-5]/100>1.81,rc[-5]/100<2.01)),2,if(or(rc[-5]/100=2.01,and(rc[-5]/100>2.01,rc[-5]/100<2.16)),2.15,rc[-5]/100))))))))))+" & _
                "(Материалы!r2c[-7]:r50c[-7]=""s"")*(if(rc[-6]/100<1.81,1.8,if(or(rc[-6]/100=1.81,and(rc[-6]/100>1.81,rc[-6]/100<2.01)),2,if(or(rc[-6]/100=2.01,and(rc[-6]/100>2.01,rc[-6]/100<2.11)),2.1,rc[-6]/100)))*(if(and(rc[-5]/100>0.71,rc[-5]/100<0.81),0.8,if(or(rc[-5]/100=0.81,and(rc[-5]/100>0.81,rc[-5]/100<0.91)),0.9,if(or(rc[-5]/100=0.91,and(rc[-5]/100>0.91,rc[-5]/100<1.21)),1.2,if(or(rc[-5]/100=1.21,and(rc[-5]/100>1.21,rc[-5]/100<1.41)),1.4,if(or(rc[-5]/100=1.41,and(rc[-5]/100>1.41,rc[-5]/100<1.61)),1.6,if(or(rc[-5]/100=1.61,and(rc[-5]/100>1.61,rc[-5]/100<1.81)),1.8,if(or(rc[-5]/100=1.81,and(rc[-5]/100>1.81,rc[-5]/100<2.01)),2,if(or(rc[-5]/100=2.01,and(rc[-5]/100>2.01,rc[-5]/100<2.16)),2.15,rc[-5]/100))))))))))+(Материалы!r2c[-7]:r50c[-7]=""n"")*Материалы!r2c[-6]:r50c[-6]))"
            .Cells(lastrow, 11).Value = .Cells(lastrow, 11).Value
        End If

как сделать не пойму.
 
Ответ в первом же ответе!
 
Цитата
Santiago: чтобы как то так было
вместо a = "=SUMPRODUCT((INDEX( должно быть что-то вроде
a = WorksheetFunction.SUMPRODUCT((WorksheetFunction.INDEX(
При работе с функциями листа в ВБА ссылки на ячейки будут другие (я показал в первом ответе). Я так работать не люблю, поэтому ждите пока кто-то другой вам "расжуёт"

Перечень функций листа, доступных в VBA
Изменено: Jack Famous - 05.10.2020 15:18:24
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
приложите файл-пример и формулой (на листе) покажите, что хотите получить
Просмотрел всю тему, но файла-примера так и не увидел.
Скорее всего я сюда больше не вернусь :(
 
Добрый день всем!
Хочу продолжить тему. У меня такая-же задача. Нужно присвоить переменной результат поиска функцией ВПР в закрытом файле. Пишу пользовательскую функцию, которая в зависимости от значения переменной Vyrobce ищет Prohlaseni для Reference на одном из листов базы данных BAZA. И, пока что уперся в проблему, что VBA выдает ошибку компиляции. Ругается на на  апостроф  'D:. Я не понимаю в чем проблема. Помогите , пожалуйста.
Код
Function Prohlaseni(Vyrobce As Variant, Reference As Variant) As Variant                
 Select Case Vyrobce
  Case GOI
   Prohlaseni = WorksheetFunction.VlookUp(Reference,'D:\[BAZA.xlsx]DPG'!$D$5:$G$1000,4,0)
  Case FINKLEY
   Prohlaseni = WorksheetFunction.VlookUp(Reference,'D:\[BAZA.xlsx]DPF'!$D$5:$G$1000,4,0)
  Case STEEL
   Prohlaseni = WorksheetFunction.VlookUp(Reference,'D:\[BAZA.xlsx]DPS'!$D$5:$G$1000,4,0)
  Case TESLA
   Prohlaseni = WorksheetFunction.VlookUp(Reference,'D:\[BAZA.xlsx]DPT'!$D$5:$G$1000,4,0)
  Case CRAVT
   Prohlaseni = WorksheetFunction.VlookUp(Reference,'D:\[BAZA.xlsx]DPC'!$D$5:$G$1000,4,0)
 End Select
End Function
Изменено: Perec - 13.12.2021 14:21:19
 
Путь - это текст, а тексты нужно заключать в кавычки
 
Кавычки я конечно же тоже пробовал, но тогда компилятору начинает не нравиться восклицательный знак.
 
Код
   Prohlaseni = WorksheetFunction.VLookup(Reference, Workbooks("D:\BAZA.xlsx"). _
   Worksheets("DPG").Range("$D$5:$G$1000"), 4, 0)
 
Код
Function Prohlaseni(Vyrobce As Variant, Reference As Variant) As Variant
 Select Case Vyrobce
  Case "GOI"
   Prohlaseni = WorksheetFunction.VLookup(Reference, Workbooks("D:\BAZA.xlsx").Worksheets("DPG").Range("$D$5:$G$1000"), 4, 0)
  Case "FINKLEY"
   Prohlaseni = WorksheetFunction.VLookup(Reference, Workbooks("D:\BAZA.xlsx").Worksheets("DPF").Range("$D$5:$G$1000"), 4, 0)
  Case "STEEL"
   Prohlaseni = WorksheetFunction.VLookup(Reference, Workbooks("D:\BAZA.xlsx").Worksheets("DPS").Range("$D$5:$G$1000"), 4, 0)
   Case "TESLA"
   Prohlaseni = WorksheetFunction.VLookup(Reference, Workbooks("D:\BAZA.xlsx").Worksheets("DPT").Range("$D$5:$G$1000"), 4, 0)
  Case "CRAVT"
   Prohlaseni = WorksheetFunction.VLookup(Reference, Workbooks("D:\BAZA.xlsx").Worksheets("DPC").Range("$D$5:$G$1000"), 4, 0)
  End Select
End Function
Спасибо компилятор успокоился, но VLookup ищет только в открытом файле BAZA.xlsx. При закрытом файле выдает ошибку.
Т.е ищет если Workbooks("BAZA.xlsx") и файл открыт, выдает ошибку, если Workbooks("D:\BAZA.xlsx") и файл закрыт.
А нужно, чтобы работало с закрытым файлом BAZA. Подскажите, пожалуйста, что нужно исправить, чтобы работало с закрытым файлом.
Изменено: Perec - 13.12.2021 15:48:29
 
Цитата
написал:
что нужно исправить, чтобы работало с закрытым файлом
в таком виде - ничего не сделать. Раз работаете из VBA - открывайте нужный файл кодом, получайте данные и закрывайте.
На всякий случай: Как получить данные из закрытой книги?
Можете, конечно, ADO применить, но...Лучше открыть и закрыть, если файл не большой.
Изменено: Дмитрий(The_Prist) Щербаков - 13.12.2021 18:11:44
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Santiago  Посмотрите темы может это вам нужно
Как без использования рабочего листа записать в переменную массив, возвращаемый формулой
Можно ли получить результат вычисления формулы в VBA без использования Имен и ячейки листа
Изменено: Евгений Смирнов - 14.12.2021 08:13:40
Страницы: 1
Наверх