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

Страницы: 1
Запуск двух сценариев для одного и того же макроса в зависимости от зажатой клавиши, макрос с параметрами Onkey
 
Добрый день, подскажите, можно ли реализовать запуск двух сценариев для одного и того же макроса в зависимости от переданного параметра, а именно зажатой клавишей при запуске макроса?

К примеру, есть кнопка или на листе экселя или вынесенная на панель инструментов и к ней подвязан макрос, который пусть выполняет закрашивание ячейки в красный цвет.
Но если пользователь предварительно зажмет клавишу, скажем, Ctrl и затем кликнет эту кнопу с макросом, то ячейка уже должна будет закраситься в желтый цвет.
Редактирование макроса в книге другим макросом
 
Нашел рабочий код тут. Работает с личной книги макросов.
Только там код меняет код во всех открытых книгах, ниже закоментил эти куски и проставил чтобы код менялся в активной книге и только в указанном модуле

Код
Option Explicit

Sub ReplaceTextInCodeModules()

' Must add a reference to "Microsoft Visual Basic For Applications Extensibility 5.3"
' Also must set "Trust access to the VBA project object model"
' See the url below for more info on these.
' Based on code found at:
' Source: www.cpearson.com/excel/vbe.aspx Copyright 2013, Charles H. Pearson

Dim theWorkbook As Workbook
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Dim numLines As Long ' end line
Dim lineNum As Long
Dim thisLine As String
Dim message As String
Dim numFound As Long

Const FIND_WHAT As String = "RowsStart = 124"
Const REPLACE_WITH As String = "RowsStart = 150"

    numFound = 0

    'For Each theWorkbook In Application.Workbooks
        Set theWorkbook = ActiveWorkbook
        If theWorkbook.Name <> ThisWorkbook.Name Then
            If theWorkbook.HasVBProject Then
                Set VBProj = theWorkbook.VBProject
                'For Each VBComp In VBProj.VBComponents
                    Set VBComp = VBProj.VBComponents("Season")
                    Set CodeMod = VBComp.CodeModule

                    With CodeMod
                        numLines = .CountOfLines
                        For lineNum = 1 To numLines
                            thisLine = .Lines(lineNum, 1)
                            If InStr(1, thisLine, FIND_WHAT, vbTextCompare) > 0 Then
                                message = message & theWorkbook.Name & " | " & VBComp.Name & " | Line #" & lineNum & vbNewLine
                                .ReplaceLine lineNum, Replace(thisLine, FIND_WHAT, REPLACE_WITH, , , vbTextCompare)
                                numFound = numFound + 1
                            End If
                        Next lineNum
                    End With
                'Next VBComp
            End If
        End If
    'Next theWorkbook

    Debug.Print "Found: " & numFound
    If message <> "" Then
        Debug.Print message
    End If

End Sub
Редактирование макроса в книге другим макросом
 
Добавил -
Цитата
Tools-References-Microsoft Visual Basic For Applications Extensibility 5.X
Включено -
Цитата
Файл -Параметры -Центр управления безопасностью -Параметры макросов -поставить галочку «Доверять доступ к объектной модели проектов VBA»
Редактирование макроса в книге другим макросом
 
Не вышло изменить макрос =(

ни при попытке обратиться к самому макросу:
Код
Sub GetSubText()
    Dim objVBProj As Object
    Dim sProcName As String, res As String
    Dim lProcLineNum As Long, lProcLinesCnt As Long, lProcKind As Long, vMdl
     
    sProcName = "КвазиИнтерполAll" 'имя процедуры или функции, которые ищем
    Set objVBProj = ActiveWorkbook.VBProject
    On Error Resume Next
     
    'цикл по всем модулям проекта(стандартные, классы, формы, листы, книги)
    For Each vMdl In objVBProj.VBComponents
        For lProcKind = 0 To 3
            lProcLineNum = vMdl.CodeModule.ProcStartLine(sProcName, lProcKind)
            If lProcLineNum > 0 Then
                lProcLinesCnt = vMdl.CodeModule.ProcCountLines(sProcName, lProcKind)
                'MsgBox lProcLinesCnt
                ChangeMe = vMdl.CodeModule.Lines(lProcLineNum, lProcLinesCnt)
                'Часть макроса которую хотим поменять
                Text1 = "RowsStart = 120"
                'Часть макроса на который хотим поменять
                Text2 = "RowsStart = 124"
                'в текстовой переменной производим замену нужного участка кода
                ChangeMe = Replace(ChangeMe, Text1, Text2)
                'записываем изменения в макрос
                vMdl.CodeModule.Lines(lProcLineNum, lProcLinesCnt) = ChangeMe
                'vMdl.CodeModule.ProcCountLines(sProcName, lProcKind) = lProcLinesCnt
                MsgBox ChangeMe
                Exit Sub
            End If
        Next
    Next
    
End Sub


ни при попытке обращения к модулю
Код
Sub ChangeSubText()
'имя модуля для копирования
    sModuleName = "Season"
    On Error Resume Next
    'проект книги, из которой копируем модуль
    'Set objVBProj = ActiveWorkbook.VBProject
    Set objVBProj = ThisWorkbook.VBProject
    'необходимый компонент
    Set objVBComp = objVBProj.VBComponents(sModuleName)
    'Часть макроса которую хотим поменять
    Text1 = "RowsStart = 120"
    'Часть макроса на который хотим поменять
    Text2 = "RowsStart = 124"
    'objVBComp = Replace(objVBComp, Text1, Text2)
    objVBProj.VBComponents(sModuleName) = objVBComp.ReplaceLine(130, "RowsStart = 124")
End Sub

Раз объекты как таковые существуют и к ним можно обращаться, то способ их изменить должен быть, но не понимаю что именно я делаю не так.
Изменено: Александр - 27.01.2021 11:47:15
Редактирование макроса в книге другим макросом
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
почему нет? Если знаете имя, то проблем нет.
Отлично! Спасибо
Редактирование макроса в книге другим макросом
 
DANIKOLA, спасибо, буду пробовать

в примере можно обращаться к модулю, который содержит макрос, будем надеяться с ним сработает replace
Жаль нельзя обратиться непосредственно к макросу по его имени например  :(  
Редактирование макроса в книге другим макросом
 
Цель макросом из личной книги макросов при его запуске обновить рабочий файл до последней версии.
Помимо изменений в структуре данных, также требуется отредактировать часть кода существующих макросов зашитых в этот рабочий файл.

Можно ли получить как-то содержимое макроса из открытой книги в переменную, а потом replace- ом заменить необходимый кусок и перезаписать его?
Изменено: Александр - 13.01.2021 16:04:49
Изменить формулу условного форматирования макросом
 
Доброе время суток

Есть необходимость изменить часть формулы в уже созданном условном форматировании:
с
Код
=ЕСЛИ(C5<>C22;1;0)
на
Код
=ЕСЛИ(C5<>C23;1;0)

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

Эта операция много раз повторяется за день и нет большого смысла в том, чтобы делать ее руками, именно поэтому хотелось бы это автоматизировать.

Можно записать через макрорекодер само создание условного форматирования и заново его наложить на необходимый диапазон. Также можно банально скорпировать необходимый стиль из какой-то шаблонной ячейки и наложить его на необходимый диапазон.
Но есть проблема - условное форматирование не наложено всплошную на диапазон ячеек, например, range("A1:ND15"), в этом диапазоне есть отдельные куски ячеек в которых нет условного форматирования и нужно чтобы так и оставалось. Более того, во время каждого импорта данных, кол-во ячеек в заданом лиапазоне, в которых отсуствует условное форматирование,будут сильно отличаться.

Заранее большое спасибо за помощь
Изменено: AleX_X89 - 11.03.2019 19:43:36
Как в промежуточные итоги добавить новую функцию?, вычислить Медиану для каждого набора значений
 
Формула АГРЕГАТ в помощь
Минус формулы: отсутствие обратной совместимости с MS Office 2007 и ранее.  
Максимальные продажи за 5 подряд идущих дней
 
MCH, ох**неть))))
Формула Смещение в массиве имметирует итерации, Промежуточные итоги суммируют по каждой итерации, а Макс выделяет максимальное значение - КРУТО!)

Спасибо большое!) Обязательно нужно познакомиться поближе с этими функциями)
Максимальные продажи за 5 подряд идущих дней
 
Добрый день, формучане!

Есть такая задача: "Необходимо с помощью функций определить максимальную суммарную продажу за 5 подряд идущих дней"

Никак не могу понять какие функции позволят избежать создание промежуточной таблички и при этом еще й выделят максимальное значение.
Подозреваю, что и здесь не обойтись без чуда под названием СУММПРОИЗВ, но не представляю как это реализовать...
Был бы очень благодарен за помочь)
Изменено: AleX_X89 - 06.03.2015 12:27:15
Количество магазинов с более чем трехмесячным запасом товара
 
МатросНаЗебре, спасибо) тема оказалась даже очень познавательной)
Количество магазинов с более чем трехмесячным запасом товара
 
Цитата
МатросНаЗебре пишет: Какой это запас в месяцах?
Норматива нет, так как нет динамики, предлагается считать нормой запаса продажи в прошлом месяце.
Но если продажи равны нулю, то нельзя же считать, что любое количество товара присутствующее на складе точки будь то 5 единиц или 150 не является излишним.

ЕСЛИ(B3=0;ЕСЛИ(B13>=3;3;1);B13/B3)
здесь вышел из положения тем, что сравнил значение остатков для случаев если продажи равны нулю, если оно больше илиравно трем единицам, то считать как избыток иначе, как нормальный остаток
Количество магазинов с более чем трехмесячным запасом товара
 
Число продаж: 0
Остаток: 156
Количество магазинов с более чем трехмесячным запасом товара
 
МатросНаЗебре,решает проблему с учетом ячейки, которая выдает ошибку, но если на точке будет хоть и годовой запас, а не трехмесячный, то по такой формуле точка не будет учтена
Количество магазинов с более чем трехмесячным запасом товара
 
сразу уточняющий вопрос: если продаж по товару не было, то соответственно деление на ноль выдает ошибку, что вызывает цепную реакцию в массиве.
при расчете третьей таблицы выхожу из положения такой формулой:
Код
=ЕСЛИ(B3=0;ЕСЛИ(B13>=3;3;1);B13/B3)
а в случае с массивами опыта очень мало...
Количество магазинов с более чем трехмесячным запасом товара
 
блин, пробовал эксперементировать с СУММПРОИЗВ, нифига не вышло у самого))) еще учиться и учиться... а функция и правда золотая.
Спасибо!)
Изменено: AleX_X89 - 19.02.2015 12:05:37
Количество магазинов с более чем трехмесячным запасом товара
 
СПАСИБО!!! то что нужно!
Изменено: AleX_X89 - 19.02.2015 12:05:52
Количество магазинов с более чем трехмесячным запасом товара
 
прицепил
Количество магазинов с более чем трехмесячным запасом товара
 
Есть две таблицы продажи и остатки в разрезе точек, необходимо подсчитать количество точек где остатки превышают продажи в три раза, то есть количество магазинов, где более чем трехмесячный запас товара. Обыденным способом это делаю формированием еще одной таблицы, где ячейка остатков делится на ячейку продаж и только затем применял уже к этому новому диапазону функцию СЧЁТЕСЛИ в качестве критерия выставляя соответственно >3.

Вопрос в следующем - возможно ли произвести эти вычисления без формирования третьей таблицы? Сижу колупаюсь никак не могу сообразить...
Как определить номер строки по содержимому ячейки
 
Цитата
The_Prist пишет: В цикле быстрее будет InStr, хотя никто так же не отменял Like " * часть слова * "
боже, совсем забыл про Like!) за это отдельное спасибо, уже пригодилось)

ЗЫ всем большое спасибо за то что выручили и просветили)
Как определить номер строки по содержимому ячейки
 
Jack, с помощью цикла... вариант, спасибо большое)
для find и match, я так понимаю, нужно обязательно четкое условие - цифровое значение или текстовое, но в кавычках,
а интервал (>0 или <0) или только часть текста "*искомыйтекст*" в качестве условия не годится?
Изменено: AleX_X89 - 06.08.2014 09:53:55
Как определить номер строки по содержимому ячейки
 
Спасибо ребята, оба варианта работают.
теперь столкнулся с обратной ситуацией... в столбце С нужно найти координаты (интересует тот же номер строки) первого значения больше нуля, пробую ">" & 0
вылетает та же 91-я ошибка
Как определить номер строки по содержимому ячейки
 
черт)
Максим Зеленский, строка работает!))) спасибо!)
Изменено: AleX_X89 - 11.08.2014 01:15:51
Как определить номер строки по содержимому ячейки
 
не совсем понимаю почему find не подходит... но да фиг с ним
есть ли пример с этим самым доблестным match, по которому можно было бы по-человечески разобрать синтаксис?
Как определить номер строки по содержимому ячейки
 
1. мне необходимо, как фрагмент в логике всего кода, то есть это не конечный результат, но то что прошу требуется для полноценного макроса
2. макросом)
3. пример файла в понимании тут не так существенен, но если нужен, то пожалуйста

ЗЫ пробую через find но так как никогда раньше не работал с этим методом, то ничего не выходит( даже макрос записанный макрорекордером в последствии выдает ошибку 91:

Код
    Range("B10").Select
    Cells.Find(What:="0,00", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
        xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
Изменено: AleX_X89 - 05.08.2014 17:58:14
Как определить номер строки по содержимому ячейки
 
Есть некий столбец с суммами, к примеру
135 055,12
157 079,08
342 581,35
500 000,00
0,00
0,00
0,00
0,00
0,00
то есть сразу идут суммы по возрастанию, а потом когда заканчивается выписка, последующие ячейки содержат 0,00
необходимо определить номер строки с первой по порядку сверху ячейки, которая содержит 0,00
СуммЕсли неадекватно считает
 
хм... прошу прощение
формула сдвинулась и ссылка поднялась выше, где в качестве одного из значений был текст, посему и выдало ошибку

PS Спасибо за помощь)
Изменено: AleX_X89 - 22.10.2013 15:18:40
СуммЕсли неадекватно считает
 
не получается(
ошибка #ЗНАЧ!
СуммЕсли неадекватно считает
 
Есть цифровая кодировка финансовых позиций, но список этой кодировки стоит с форматом ТЕКСТ
В случае если код типа
2.07 - позиция второго уровня вложения
или
2.01.03.01 - позиция четвертого уровня вложения

то СУММЕСЛИ или СУММЕСЛИМН считает так как и положено - находит искомое значение и суммирует если таких значений несколько.

Но если искомый код такого типа
2.04.13 - позиция третьего уровня вложения

то, несмотря на то, что формат стоит текстовый, эксель насколько "умный", что видимо все равно считает это как дату и подсчет суммы вообще неадекватный.

Как можно обойти эту проблему, если учесть, что кодировку поменять - это не вариант.
Заранее спасибо за помощь.
Страницы: 1
Наверх