powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / автозапуск макроса после заполнения листа
13 сообщений из 13, страница 1 из 1
автозапуск макроса после заполнения листа
    #37946612
danzki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формирую excel-файл из oracle.
Процесс выглядит примерно так:
1. Создается новый excel-файл на основе xlt шаблона
2. Выводятся данные в файл

При этом в шаблоне есть макрос, рисующий Chart на одном из листов, на основе данных с другого листа.
Проблема в том, что макрос использует данные из одной ячейки (хранится количество колонок для Chart'а).
Поэтому если прописать макрос в ThisBook, то переменная, которая заполняется из ячейки, будет еще пустая.

Можно ли как-то (макросом или еще чем-нибудь) запускать макрос для формирования Chart'а после заполнения ячейки (например, если Value ячейки будет больше 0)?
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37946819
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorkSheet_Change. Проверяй нужную ячейку, если есть значение - вызывай процедуру.
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37947819
danzki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то такое получилось...не работает..подскажите в чем ошибка?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub WorkSheet_Change(ByVal Target As Range)
    Application.EnableEvents = False

    Dim x As Integer

    Sheets("Sheet1").Select
    x = Range("A1").Value
'проверяю есть ли значение в ячейке с количеством столбцов
    If x > 0 Then
'проверяю на заполненность последнюю ячейку
        If Worksheet("Sheet1").Cells(48, 3 + x).Value <> "" Then
            DrawChart1
        End If
    End If

    Application.EnableEvents = True
End Sub


Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37947829
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неизвестно, вы же ни файла не приложили ни описания ошибки.
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37947851
danzki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
файл приложить не могу, к сожалению, могу описать.

Есть два листа: на первый выводятся данные, на втором макросом строятся чарты.

На первом листе в ячейку (1, 1) выводится количество столбцов, по которым потом строятся эти чарты.

Так вот идея какая: при изменении на первом листе, я проверяю сначала есть ли значение в ячейке (1, 1), затем смотрю есть ли значение в последней ячейке (48, 3+x) и если есть, то вызываю функцию построения чартов.

Вот так сделал.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub WorkSheet_Change(ByVal Target As Range)
    Application.EnableEvents = False

    Dim x As Integer
    Dim r As Range
    
    Sheets("Number of Transaction").Select
    x = Range("A1").Value
    If x > 0 Then
        Set r = Range(Cells(48, 3 + x), Cells(48, 3 + x))
        If Not (Intersect(r, Target) Is Nothing) Then
            If Worksheet("Number of Transaction").Cells(48, 3 + x).Value <> "" Then
                DrawChart1
            End If
        End If
    End If

    Application.EnableEvents = True
End Sub


Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37947855
danzki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проблема в том, что как мне кажется с этот блок мы не попадаем.

ставил туда MsgBox, и он не появлялся
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37947891
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставьте брейкпойнт и оттрассируйте код.

PS. Устанавливать Application.EnableEvents до проверок - некошерно. Select листа без запоминания, где были, и невосстановление - и вовсе моветон.
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37947928
danzki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПоставьте брейкпойнт и оттрассируйте код.

PS. Устанавливать Application.EnableEvents до проверок - некошерно. Select листа без запоминания, где были, и невосстановление - и вовсе моветон.

А можно то же самое только для тех кто в танке?
с vba первый раз плотно столкнулся, поэтому черпаю информацию на просторах интернета, где-то нагуглил, что нужно так ставить, чтобы не было зацикливания - типа проверяем лист на изменение, вносим изменение и снова попадаем в проверку на изменение

Еще вопрос WorkSheet_Change применяется к текущему листу?
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37947948
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тыкаешь мышиным курсором слева от строки Sheets("Number of Transaction").Select
появляется точечка коричневая и строка выделается

дальше при выполнении кода, на этой строке произойдет остановка. Далее по F8 пошагово можно выполнять код и смотреть, как он идет, параллельно внизу в окне Immediate (или в окне watch, которое нужно открыть принудительно) можно проверять значения переменных.
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37947982
danzki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proтыкаешь мышиным курсором слева от строки Sheets("Number of Transaction").Select
появляется точечка коричневая и строка выделается

дальше при выполнении кода, на этой строке произойдет остановка. Далее по F8 пошагово можно выполнять код и смотреть, как он идет, параллельно внизу в окне Immediate (или в окне watch, которое нужно открыть принудительно) можно проверять значения переменных.

Спс. Это я уже понял. Тут как и в любой другой среде.

Я не совсем понял про Application.EnableEvents....
Если мы попадаем в обработку события Изменения на листе, и далее вносим в этот лист Изменение и как я понимаю снова попадаем в обработчик события
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37947992
danzki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сделал еще один вариант как можно вызывать формирование чартов после заполнения данных

[src vb]
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:00:05"), "ThisWorkbook.DrawChart1"
End Sub
[/src vb]

но столкнулся с другой проблемой, когда формируется файл, вываливается ошибка 400.
как я понял ошибка возникает во множестве ситуаций...я прав?
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37948191
danzki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался! Всем спасибо!
...
Рейтинг: 0 / 0
автозапуск макроса после заполнения листа
    #37948424
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danzkiЕсли мы попадаем в обработку события Изменения на листе, и далее вносим в этот лист Изменение и как я понимаю снова попадаем в обработчик событияДля предотвращения подобных вещей используют статические переменные-флаги.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
sub
static Busy as boolean
if Busy then exit sub
Busy = True
' main code
Busy = False
end sub


А Application.EnableEvents = False отрубает ВСЕ события.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / автозапуск макроса после заполнения листа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]