Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 След.
RSS
Работа формулы внутри макроса в выделенном диапазоне
 
Добрый день ув. формучане

Как сделать что бы формулы эти работали в любом выделенном диапазоне. У меня они работаю только в том диапазоне в котором я записывал рекордером.
На сколько я понимаю диапазон тут проставляется: "RC[-1]" но как правильно прописать, для формулы работу с выделенным диапазоном?
Код
Sub ПРОПНАЧ()
    Selection.FormulaR1C1 = "=PROPER(RC[-1])"
End Sub
Sub ПРОПИСН()
 Selection.FormulaR1C1 = "=UPPER(RC[-1])"
End Sub
 
Код
Sub ПРОПНАЧ()
    Selection.Formula = "=PROPER(A1)"
End Sub
Согласие есть продукт при полном непротивлении сторон.
 
Sanja,Добрый вечер, прошу прощения, только сейчас удалось зайти на форум. Ваш вариант не работает немножко. Да и у Вас указан конкретный диапазон, а мне нужно именно что бы макрос работал с выделенным диапазоном
 
опишите задачу, которую решаете, там может и решение найдется
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Fsociety_ написал: Ваш вариант не работает немножко
Сколько процентов работает? )
 
Доброе время суток
Цитата
Ігор Гончаренко написал:
там может и решение найдется
Краткий перевод с языка ТС на человеческий

Задача: в каждую ячейку выделения вписать формулу PROPER, аргументом которой является ячейка слева.
Цитата
Fsociety_ написал:
в любом выделенном диапазоне
Условие выполнения макроса:
1. Выделенный диапазон не должен содержать столбец A, так как в этом случае не существует левого столбца, ячейки которого являются аргументом применяемой к выделению формулы. Если выделение содержит столбец А, то прерывать выполнение макроса с сообщением.
2. Каждая область выделения должна состоять из одного столбца, так как бессмысленно применять формулу во втором столбце и последующих столбцах выделения.
Подварианты обработки исключения:
2.1 Прерывать выполнение макроса без выполнения
2.2 Ввести формулу только в самый левый столбец области
2.3 Ввести формулу только в самый правый столбец области
2.4 Запросить пользователя, что делать в этом случае.
3. В каждую ячейку выделения доступна для ввода данных. Проверка защищён ли лист. Если защищён, то проверка все ли ячейки выделения являются не защищёнными. Если нет, то варианты
3.1 Вводить формулу только в не защищённые.
3.2 Запросить пользователя, что делать в этом случае.
4. Возможно, проверять, не содержат ли ячейки выделения уже введённые данные или формулы. Защита от случайного ошибочного выделения.

Ну, как-то так я бы составил ТЗ.
Изменено: Андрей VG - 14 Июл 2019 08:45:31
 
понимая всю глубину наших глубин, жду от автора возражений (или подтверждения, сказанного Андрей VG)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Код
Sub ПРОПНАЧ()
Dim iCl As Range
For Each iCl In Selection
    iCl = LCase(iCl)
Next
End Sub

Sub ПРОПИСН()
Dim iCl As Range
For Each iCl In Selection
    iCl = UCase(iCl)
Next
End Sub

Согласие есть продукт при полном непротивлении сторон.
 
Андрей VG, Ігор Гончаренко, неверно поняли. прошу прощения что недостаточно подробно описал задачу.
Задача: данные формулы должны выполнятся в выделенном диапазоне. Они должны брать значения из выделенного диапазона обрабатывать их в соответствии с назначением формулы и возвращать результат работы формулы значением. как то так)  
 
Зачем это делать формулой? См. сообщение #8
Согласие есть продукт при полном непротивлении сторон.
 
Цитата
Fsociety_ написал:
неверно поняли.
Как вопрос был поставлен, так был и понят. Вы серьёзно думаете, что можно догадаться по коду, который делает не то что нужно, что он на самом деле должен делать? Но и в этом случае подумать о пунктах 3, 4 не мешало бы :)
Изменено: Андрей VG - 14 Июл 2019 16:55:30
 
часто создается впечатление, что сюда пишут
или
несколько программистов и тонко троллят местную публику:
пишут такое, что не налезает на голову., а потом смотрят догадается-ли кто нибудь-что реально нужно было сделать или нет
или
какой-то аспирант пишет диссертацию на тему "Насколько далеко от реальной задачи может быть ее описание, чтобы человеческий мозг все еще мог правильно ее понять?" и собирает тут на форуме статистический материал для своей работы
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Sanja, к тому что бы я мог любую формулу подставить в код и она выполняла свою фунцию, нежели писать каждый раз новый код
 
не пишите НИКАКИХ кодов, делайте все вручную и нет проблем
хотите получить решение задачи - опишите ее для начала. опишите чтобы было понятно еще хоть кому-то одному, а не только Вам
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
опишите ее для начала.
Цитата
Fsociety_ написал:
Задача: данные формулы должны выполнятся в выделенном диапазоне. Они должны брать значения из выделенного диапазона обрабатывать их в соответствии с назначением формулы и возвращать результат работы формулы значением. как то так)
 
Цитата
Fsociety_ написал:
Они должны брать значения из выделенного диапазона обрабатывать их в соответствии с назначением формулы и возвращать результат работы формулы значением. как то так)
Не задумывались на таким вопросом, что ваше решение предполагает, что формулы вводятся в ячейку, в которой уже есть некоторое значение. Следовательно простая запись формулы затирает это значение. Следовательно вам нужно доработать макрос так, чтобы в формулу подставлялось константное значение, взятое из ячейки, с учётом правил размещения в формулах константных значений, а не ссылок, как написано в вашем первом посте, который привёл к ошибочным рассуждениям отвечающих.
Соответственно, написать универсальный макрос, которому вы задаёте только имя формулы, в силу разных требований на использование констант в формулах не получиться. Проще двигаться в сторону, Applicaiton.WorksheetFunctions - VBA сборника функций - аналогов формул рабочего листа.
Ну, а записать результат вычисления формул для выделения, как значение вы уже знаете. Selection.Value = Selection.Value
Дерзайте.
Изменено: Андрей VG - 15 Июл 2019 10:28:36
 
Скажу одно - в ячейке, одновременно, не может быть И формула И значение, даже вычисленное этой формулой. Даже с помощью VBA этого не сделать
Согласие есть продукт при полном непротивлении сторон.
 
Цитата
Sanja написал:
И формула И значение
Коллега, результат формулы в ячейку, применённый к значению этой же ячейки, можно через
Код
ActiveCell.Value = Application.Evaluate("UPPER(""" & ActiveCell.Value & """)")
получить. Но это не отменяет правила использования констант в формулах.
Updated
Хотя, можно как-то где-то так, пусть и не быстро :)
Код
Public Sub ApplyFormulaToValueForSelection(ByVal formulaName As String)
    Dim pCell As Range
    For Each pCell In Selection
        pCell.Value = Application.Evaluate(formulaName & "(" & pCell.Address & ")")
    Next
End Sub

Public Sub test()
    ApplyFormulaToValueForSelection "UPPER"
End Sub
Изменено: Андрей VG - 15 Июл 2019 10:58:20
 
Цитата
Андрей VG написал: ActiveCell.Value = Application.Evaluate("UPPER(""" & ActiveCell.Value & """)")
данный вариант работает только с одной активной ячейкой, нужен именно диапазон как во втором примере:

Андрей VGВаш макрос, к сожалению работает довольно медленно как вы и описывали, особенно на большом объеме данных. Второй вариант вроде то что нужно, но возможно ли его как то ускорить?
 
Цитата
Fsociety_ написал:
возможно ли его как то ускорить?
Этот вариант - нет. Можете попробовать другой подход
Цитата
Fsociety_ написал:
Selection.FormulaR1C1 = "=UPPER(RC[-1])"
Вместо Selection использовать параллельный по столбцам диапазон (естественно пустой), в котором формула рассчитает по данным выделения требуемое. Затем через Selection.Value = ParallelRange.Value записываем значения и очищаем параллельный диапазон. Аналогично можно сделать и с использованием временного листа.
 
Цитата
Fsociety_ написал: Второй вариант вроде то что нужно, но возможно ли его как то ускорить?
Цитата
Fsociety_ написал: что бы я мог любую формулу подставить в код
А если в формуле больше одного аргумента - ссылки?
Согласие есть продукт при полном непротивлении сторон.
 
Цитата
Sanja написал:
А если в формуле больше одного аргумента - ссылки?
ну речь идет в основном про формулы с одним аргументом типа: пропнач, срзнач, прописн и т.д. если больше аргументов то ошибка, я впринципе не собирался использовать формулы с большим кол-вом аргументов
 
Цитата
Андрей VG написал: Хотя, можно как-то где-то так, пусть и не быстро
Цитата
Fsociety_ написал: Второй вариант вроде то что нужно
Неужели, то что предложил Андрей VG, во втором варианте, для Вас проще, чем предложенный мной вариант в сообщении #8?
Снимаю шляпу....
Согласие есть продукт при полном непротивлении сторон.
 
Sanja, прошу прощения, я вам отвечал по поводу вашего варианта, но сообщения не нашел, не сохранилось видимо. Я писал о том что как бы я не совсем понимаю как именно работает ваш вариант. Т.к у вас два варианта для двух разных формул, но единственное что в них отличается так это названия. И я так и не смог их проверить.
 
Цитата
Fsociety_ написал: Sanja , прошу прощения
Да без проблем. Просто то, что Вы хотите, гораздо проще и эффективнее решается встроенными командами VBA, а Ваш подход мало чем отличается от обычного ввода формулы в ячейку и растягивания ее на нужный диапазон.
Согласие есть продукт при полном непротивлении сторон.
 
Sanja, я понимаю что это все делается формулами, но гораздо проше получить результат кнопочкой чем игратся с вводом той самой формулы протяжкой и т.д

я бы и рад написать нормальный код, но мне с такими формулами нужно делать несколько шт, а под каждую отдельную фунцию просить тут писать код я не буду же. лучше уже сделать код макроса который будет вставлять значения той или иной формулы которую я впихну в код. по моему так проще. поправьте если я не прав
 
Fsociety_,
Цитата
Sanja: то, что Вы хотите, гораздо проще и эффективнее решается встроенными командами VBA
Вариант на массивах
не совсем то, что вы хотели, но намного быстрее из-за того, что работаем с массивами вместо отдельных ячеек. Выделяете диапазон (можно выделить "рваный" диапазон через Ctrl), нажимаете кнопку, вводите название функции (можно строчными, можно ПРОПИСНЫМИ, можно РаЗнЫмИ).

Я сделал для 4ёх функций: "ПЕРЕВЕРНУТЬ" (вроде нет аналога из штатных функций листа), "ПРОПНАЧ", "ПРОПИСН" и "СТРОЧН" — эти дублируют одноимённые функции листа, Разумеется, можно расширить список - там абсолютно ничего сложного (см. комментарии в коде)

Сборники функций по VBA: [1] и [2]
Изменено: Jack Famous - 16 Июл 2019 08:33:55
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Jack Famous, Спасибо большое за отзывчивость. Я посмотрю сегодня вечером, судя по описанию, да видимо немного не то, но я обязательно приду и изучу, наверное сам уже переделаю как мне нужно будет. Мне как раз именно важно, максимально быстрое срабатывание кода по вызову и все, без окон и лишних телодвижений. Еще раз спасибо, если возникнут вопросы сразу отпишусь!
 
Fsociety_, пожалуйста, спрашивайте  ;)
Если объёмы большие, то можно ещё ускорить - сообщите по результатам тестов…
Изменено: Jack Famous - 15 Июл 2019 15:49:05
«Тот, кто несет фонарь, спотыкается чаще, чем тот, кто идет следом.»
Иоганн Пауль Фридрих Рихтер
 
Цитата
Jack Famous написал:
Если объёмы большие, то можно ещё ускорить - сообщите по результатам тестов…
Доброе утро, прошу прощения, не мог раньше ответить. Пока еще потестить не успел, но сегодня точно посмотрю. По поводу ускорения, если можно сделать такой вариант то буду очень сильно благодарен. Скорость работы это первое что меня волнует в коде.
Страницы: 1 2 След.
Читают тему (гостей: 2)
Наверх