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

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

Можно ли как-то (макросом или еще чем-нибудь) запускать макрос для формирования Chart'а после заполнения ячейки (например, если Value ячейки будет больше 0)?
...
Рейтинг: 0 / 0
06.09.2012, 15:40
    #37946819
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автозапуск макроса после заполнения листа
WorkSheet_Change. Проверяй нужную ячейку, если есть значение - вызывай процедуру.
...
Рейтинг: 0 / 0
07.09.2012, 10:35
    #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
07.09.2012, 10:42
    #37947829
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автозапуск макроса после заполнения листа
Неизвестно, вы же ни файла не приложили ни описания ошибки.
...
Рейтинг: 0 / 0
07.09.2012, 10:56
    #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
07.09.2012, 10:58
    #37947855
danzki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автозапуск макроса после заполнения листа
проблема в том, что как мне кажется с этот блок мы не попадаем.

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

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

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

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

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

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

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

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

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

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

но столкнулся с другой проблемой, когда формируется файл, вываливается ошибка 400.
как я понял ошибка возникает во множестве ситуаций...я прав?
...
Рейтинг: 0 / 0
07.09.2012, 13:40
    #37948191
danzki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
автозапуск макроса после заполнения листа
Разобрался! Всем спасибо!
...
Рейтинг: 0 / 0
07.09.2012, 15:04
    #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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / автозапуск макроса после заполнения листа / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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