Страницы: 1
RSS
Как Privat Sub'ы перевести в обычные макросы с названиями?, чтобы потом вызывать их через RUN или CALL
 
Здравствуйте! У меня на самом деле много вопросов и большинство ответов я нашел в поиске. Но есть одно жирное НО. Почти всё, что нужно мне сделать в Excel делается через Privat sub макросы. Мне такой вариант не подходит, так как работаю через DDE и отсутствует ручной ввод данных, да и пересчет нужных ячеек нужно делать раз в 1-2 секунды. И что бы не создавать по несколько тем, я решил сократить кол-во вопросов до одного. (надеюсь, что решение данного вопроса, поможет мне решить все остальные)
Как Privat sub'ы перевести в обычные макросы с названиями ?  
 
CabancheG, здравия. Не понятно о чём Вы. Про событийные макросы что-ли?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Ну вот к примеру приват саб
Код
Private Sub Worksheet_Change(ByVal Target As Range)
      
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("J1:J2")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
           End With
             
       End If
    Next cell
 
End Sub

А мне нужно чтобы из модуля можно было его вызвать, как наприер этот с названием
Код
Sub NextTime()
    Application.OnTime Now + TimeSerial(0, 0, 5), "NextTime" 'вызов каждую 5 секунд
    iP = [N1]
    iG = [N2]
     iK = [K14]
    iE = [K15]
        If iP > iG And iK > iE Then
          Call PlayMusic(SoundFile)
    End If
'        If [p5] > [g2] Then
'          Call Звук
'    End If
 End Sub
Изменено: CabancheG - 01.10.2015 16:32:46
 
Так и так можно его вызвать:
Код
sub tt
Call Sheets(1).Worksheet_Change(Sheets(1).Range("J1"))
end sub 
Хотя нет, так что-то не работает... Хотя другие событийные срабатывали. Может у меня Эксель глючит?
Изменено: Hugo - 01.10.2015 16:50:40
 
Hugo, чтобы так вызвать макрос, надо:
1) вместо Sheets(1) написать кодовое имя листа
2) удалить слово Private из строки Private Sub Worksheet_Change(ByVal Target As Range)
 
Цитата
Hugo написал: Так и так можно его вызвать:
А как заставить их работать при машинном вводе?   У меня такие работают только при ручном вводе. А вот макрос
Sub NextTime()  (пример вверху)  пересчитывается каждую секунду.
Изменено: CabancheG - 01.10.2015 17:18:02
 
CabancheG, самый простой способ вызвать ваш Private Sub Worksheet_Change из вашего примера, - изменить значения ячеек,
которые отслеживает это событие.

вместо  Call Worksheet_Change ...
напишите Range("J1:J2").Value = Range("J1:J2").Value

PS: а вообще, это плохая идея, - программно вызывать события листа
 
Цитата
CabancheG написал:  как заставить их работать при машинном вводе?
поищите по форуму слово DDE
вообще если ячеек немного думаю самое простое завязать на них невидимый текстбокс, и смотреть на его события. Но повтор значения так не детектит.

P.S. Тёзка, спасибо :)
Изменено: Hugo - 01.10.2015 17:18:32
 
Worksheet_Change не работает, если данные поступают по DDE. Самый оптимальный вариант - создать текстбокс из элементов ActiveX, в LinckedCell указать адрес ячейки, изменение которой надо отслеживать и в событие Change текстбокса записать нужный код. Тогда поступление данные по DDE тоже будет обрабатываться.

Или, если на листе исключительно данные от DDE поступают и никакие формулы не пересчитываются - сделать формулу(лучше что-то вроде ТДАТА()), к которой просто плюсовать данные из ячейки, изменение которой надо отследить(вроде =ТДАТА()+A1). И обрабатывать уже не событие листа Change, а Calculate.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему
Наверх