|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - Перевести логическую формулу в макрос, Excel |
|
|
VBA - Перевести логическую формулу в макрос, Excel
|
Пользователь Сообщения: 50 |
Ребят помогите пожалуйста вот эту формулу представить в виде скрипта:
=ЕСЛИ(E3="";B3-B3;ЕСЛИ(B3>E3;B3-E3;0)) Пробовал так: Но, судя по всему, данная процедура справедлива только для математических формул, а для логических - нет. ![]() Буду премного благодарен. ![]() |
|
Отправлено: 19:27, 19-05-2012 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата NoBrain:
Мне, правда, непонятен смысл вычислений вида «B3-B3». |
|
Отправлено: 19:55, 19-05-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 369
|
Профиль | Отправить PM | Цитировать Цитата:
![]() |
|
Отправлено: 20:08, 19-05-2012 | #3 |
Пользователь Сообщения: 50
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Спасибо большое. Цитата Iska:
Цитата azbest:
![]() |
|||
Последний раз редактировалось NoBrain, 20-05-2012 в 09:23. Отправлено: 20:46, 19-05-2012 | #4 |
Пользователь Сообщения: 50
|
Профиль | Отправить PM | Цитировать Ребят, возможно наглею, но хотя бы кратко подскажите плз как организовать цикл, т.е.
Вот выполнилась операция (не просто 1+1, а начиная от вычисления формул, копирования и вставки в ячейки и до очистки всех не нужных ячеек), а теперь нужно сделать тоже самое еще раз и так столько раз пока значение в некоторой ячейке не будет меньше или равно, ну скажем 1000. Тогда этот цикл прекращается. Попробовал первое что пришло в голову, но так не фурычит: Dim sum As Integer sum = ActiveCell.FormulaLocal = "=B3" Do While sum >= 1000 '---------------------------- Range("G3").Select ActiveCell.FormulaLocal = "=($I$2*C3)+B3" Selection.AutoFill Destination:=Range("G3:G26"), Type:=xlFillDefault Range("G3:G26").Select Selection.Copy Range("B3:B26").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("G3:G26").Select Selection.ClearContents Range("I3").Select ActiveCell.FormulaLocal = "=B2-(I2*1000)" Selection.Copy Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("I3").Select Selection.ClearContents Range("G3").Select Range("G3").FormulaLocal = "=Если(E3="""";0;Если(B3>E3;B3-E3;0))" Selection.AutoFill Destination:=Range("G3:G26"), Type:=xlFillDefault Range("G3:G26").Select Range("I3").Select ActiveCell.FormulaLocal = "=СУММ(G3:G26)" Range("I4").Select ActiveCell.FormulaLocal = "=I3+B2" Selection.Copy Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("L3").Select ActiveCell.FormulaLocal = "=B3-G3" Selection.AutoFill Destination:=Range("L3:L26"), Type:=xlFillDefault Range("L3:L26").Select Selection.Copy Range("B3:B26").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("I3:I4").Select Selection.ClearContents Range("G3:G26").Select Selection.ClearContents Range("L3:L26").Select Selection.ClearContents Range("A1").Select '---------------------------- Loop Do While sum >= 1000 и до loop Выполнялись пока сумма в одной ячейке не достигнет значения менее 1000 |
|
Последний раз редактировалось NoBrain, 19-05-2012 в 21:30. Отправлено: 21:10, 19-05-2012 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата NoBrain:
![]() Цитата NoBrain:
|
||
Отправлено: 22:32, 19-05-2012 | #6 |
Пользователь Сообщения: 50
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Только там тип файла *.xlsm Структуру файла оставил, названия некоторые изменил. Смысл задачи такой. Есть статьи расходов, для которых определена ставка с 1000 р. т.е. это минимальная единица распределения - сколько с этой суммы будет уходить в каждую статью. Для некоторых статей есть лимит, т.е. если сумма превысила его, то излишек уходит т.с. в "общий котел". И если сумма в этом "общем котле" опять превысит 1000, например 1230, то 1000 опять раскидывается по статьям, а 230 остаются не тронутыми, соответственно, если 8325 то раскидывается 1000*8 (т.е. операция 8 раз выполняется), 325 нетронутыми. Один раз вся вот эта транзакция выполняется успешно, но если нужно 8 раз выполнить, то придется вручную тыкать кнопку 8 раз. А хотелось бы, что бы программа делала это сама до момента пока сумма в ячейке "общий котел" - "B2" не будет меньше 1000. При этом самый первый модуль в цикл не входит. Вот. |
|
Последний раз редактировалось NoBrain, 20-05-2012 в 10:34. Отправлено: 09:56, 20-05-2012 | #7 |
Пользователь Сообщения: 50
|
Профиль | Отправить PM | Цитировать Цитата Iska:
![]() |
|
Отправлено: 09:56, 20-05-2012 | #8 |
Пользователь Сообщения: 50
|
Профиль | Отправить PM | Цитировать |
Отправлено: 12:04, 20-05-2012 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата NoBrain:
Но у меня для Вас всё же кое-что есть. Я сделал некоторые упрощения в приведённом Вами коде из выложенного файла: Sub CopyValues() ' ' CopyValues Макрос ' ' Копируем значение ключевого столбца в резерв Range("B3:B26").Select Selection.Copy Range("K3:K26").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False ' Выбираем ячейку в которой будем производить вычисления Range("G3").Select ' Производим вычисления ActiveCell.FormulaLocal = "=($I$2*C3)+B3" ' Растягиваем ячейку по вертикали Selection.AutoFill Destination:=Range("G3:G26"), Type:=xlFillDefault Range("G3:G26").Select ' Копируем диапазон Selection.Copy ' Выбираем диапазон, куда будем вставлять Range("B3:B26").Select ' Вставляем значения Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False ' Очищаем промежуточный стобец Range("G3:G26").Select Selection.ClearContents ' Для того что бы убрать значение ячейки "B2" ' производим вычисления в буферной ячеке и копируем значение из неё в нужную ячеку Range("I3").Select ActiveCell.FormulaLocal = "=B2-(I2*1000)" Selection.Copy Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("I3").Select Selection.ClearContents ' Операция учёта излишек Range("G3").Select Range("G3").FormulaLocal = "=Если(E3="""";0;Если(B3>E3;B3-E3;0))" Selection.AutoFill Destination:=Range("G3:G26"), Type:=xlFillDefault Range("G3:G26").Select Range("I3").Select ActiveCell.FormulaLocal = "=СУММ(G3:G26)" Range("I4").Select ActiveCell.FormulaLocal = "=I3+B2" Selection.Copy Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("L3").Select ActiveCell.FormulaLocal = "=B3-G3" Selection.AutoFill Destination:=Range("L3:L26"), Type:=xlFillDefault Range("L3:L26").Select Selection.Copy Range("B3:B26").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("I3:I4").Select Selection.ClearContents Range("G3:G26").Select Selection.ClearContents Range("L3:L26").Select Selection.ClearContents Range("A1").Select End Sub ' ' CopyValues Макрос ' Sub CopyValues() Range("K3:K26").Value = Range("B3:B26").Value Range("G3:G26").FormulaLocal = "=($I$2*C3)+B3" Range("B3:B26").Value = Range("G3:G26").Value Range("G3:G26").ClearContents Range("B2").Value = Range("B2").Value - Range("I2").Value * 1000 Range("G3:G26").FormulaLocal = "=Если(E3="""";0;Если(B3>E3;B3-E3;0))" Range("I3").FormulaLocal = "=СУММ(G3:G26)" Range("I4").FormulaLocal = "=I3+B2" Range("B2").Value = Range("I4").Value Range("L3:L26").FormulaLocal = "=B3-G3" Range("B3:B26").Value = Range("L3:L26").Value Range("I3:I4,G3:G26,L3:L26").ClearContents End Sub * операции с выделением: заменены на прямую работу с диапазонами: * операции по ручному копированию-вставке: заменены прямым присваиванием: * операции по вставке формулы в ячейку и последующее распространение этой формулы на диапазон ячеек: Range("…").Select ActiveCell.FormulaLocal = "=…" Selection.AutoFill Destination:=Range("…"), Type:=xlFillDefault * очистку можно производить над объединением диапазонов: Пробуйте. |
|
Последний раз редактировалось Iska, 21-05-2012 в 01:34. Отправлено: 01:24, 21-05-2012 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBA - Помогите написать макрос в Excel, экспорт данных из Excel в Word. | E.v.g | Программирование и базы данных | 7 | 03-05-2018 22:18 | |
Разное - [решено] Как в Excel скопировать формулу на большой диапазон | Инсульт | Microsoft Office (Word, Excel, Outlook и т.д.) | 3 | 07-02-2012 08:19 | |
Помогите автоматизировать формулу в Excel | dexer | Хочу все знать | 1 | 03-09-2009 16:48 | |
Нужно срочно написать формулу в EXCEL'е! help! | LexerON | Программирование и базы данных | 2 | 10-05-2007 09:28 | |
Excel | нужно подобрать формулу | Eldar | Хочу все знать | 7 | 13-07-2004 11:56 |
|