Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с обновлением листа Excel

266
16 февраля 2004 года
mhaturov
901 / / 23.10.2003
Из кодна на VBA (Access) идет изменение внедрённого запроса на листе Excell. Если код выполняется в пошаговом режиме. то рефреш данных происходит. Если в режиме свободной интерпритации, то лист не рефрешится. Уже пробовал даже такой код:
DoEvents
On Error GoTo 0
ExcelSheet.ActiveWorkbook.RefreshAll
DoEvents
ExcelSheet.Sheets("Отчет").PivotTables("СводнаяТаблица1").RefreshTable
DoEvents
ExcelSheet.ActiveWorkbook.RefreshAll
ExcelSheet.Sheets("Отчет").PivotTables("СводнаяТаблица1").RefreshTable

ExcelSheet.CommandBars("PivotTable").Visible = True
DoEvents
Всё утыкал, как видите DoEvents, всё равно не помогает.
При пошаговой трансляции после 2 вызова RefreshAll выдаёт сообщение, что данные были изменены и рефрешит. При "беглой" интерпритации - ничего не выдаёт и не рефрешит. Приходится вызывать обновление данных непосредственно на листе книги.
Кто знает, как с этим бороться? Help Me!!!
266
16 февраля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by mhaturov
Из кодна на VBA (Access) идет изменение внедрённого запроса на листе Excell. Если код выполняется в пошаговом режиме. то рефреш данных происходит. Если в режиме свободной интерпритации, то лист не рефрешится. Уже пробовал даже такой код:
DoEvents
On Error GoTo 0
ExcelSheet.ActiveWorkbook.RefreshAll
DoEvents
ExcelSheet.Sheets("Отчет").PivotTables("СводнаяТаблица1").RefreshTable
DoEvents
ExcelSheet.ActiveWorkbook.RefreshAll
ExcelSheet.Sheets("Отчет").PivotTables("СводнаяТаблица1").RefreshTable

ExcelSheet.CommandBars("PivotTable").Visible = True
DoEvents
Всё утыкал, как видите DoEvents, всё равно не помогает.
При пошаговой трансляции после 2 вызова RefreshAll выдаёт сообщение, что данные были изменены и рефрешит. При "беглой" интерпритации - ничего не выдаёт и не рефрешит. Приходится вызывать обновление данных непосредственно на листе книги.
Кто знает, как с этим бороться? Help Me!!!


Пока я выхожу из положения по-дубовому:

Код:
ExcelSheet.ActiveWorkbook.RefreshAll
       DoEvents
       ExcelSheet.Sheets("Отчет").PivotTables("СводнаяТаблица1").RefreshTable
       For I = 0 To 1000
        DoEvents
       Next
       DoEvents
       ExcelSheet.ActiveWorkbook.RefreshAll
       DoEvents
       ExcelSheet.Sheets("Отчет").PivotTables("СводнаяТаблица1").RefreshTable
       
       ExcelSheet.CommandBars("PivotTable").Visible = True

Если у кого есть идеи - буду очень благодарен!:P
258
16 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
Наскоко я понял, проблема в том, что обновление данных занимает какое-то время, а мы из Access должна каким-то образом узнать оконочание и подождать до этого момента.

Как вариант
1. попробовать поискать в свойствах Excel.Application что-нибудь отвечающее за занятость приложения обновлением.... Cutty Sark подойдет может подскажет, есть что-нибудь похожее
2. поставить свою метку после окончания рефреша. Вот тут такой момент. Я не знаю: если после рефреша написать - Cells(1,1).Value="Ура", он отработает рефреш полностью и только потом напишет в A1 Ура или сам Excl еще оже не ждет конца обновления? - если сам Excel еще не ждет, тогда действительно жопа. Можно тока предложить запускать после обновления еще один запрос, который должен в скрытую ячейку вернуть кодовое слово и в цикле с DoEvents проверять не появилось ли оно.
266
16 февраля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by SergeySV
Наскоко я понял, проблема в том, что обновление данных занимает какое-то время, а мы из Access должна каким-то образом узнать оконочание и подождать до этого момента.

Как вариант
1. попробовать поискать в свойствах Excel.Application что-нибудь отвечающее за занятость приложения обновлением.... Cutty Sark подойдет может подскажет, есть что-нибудь похожее
2. поставить свою метку после окончания рефреша. Вот тут такой момент. Я не знаю: если после рефреша написать - Cells(1,1).Value="Ура", он отработает рефреш полностью и только потом напишет в A1 Ура или сам Excl еще оже не ждет конца обновления? - если сам Excel еще не ждет, тогда действительно жопа. Можно тока предложить запускать после обновления еще один запрос, который должен в скрытую ячейку вернуть кодовое слово и в цикле с DoEvents проверять не появилось ли оно.


Пока так не получилось:{ Вернусь к этому малёк попозже

267
18 февраля 2004 года
Cutty Sark
1.2K / / 17.10.2002
Никогда не встречался с такой проблемой. Даже и не знаю, что предложить... Макс, когда вернешься к этой проблеме, будем устраивать мозгоштурм...
266
18 февраля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Cutty Sark
Никогда не встречался с такой проблемой. Даже и не знаю, что предложить... Макс, когда вернешься к этой проблеме, будем устраивать мозгоштурм...


ОК, если адрес поста не забуду ;-)
(Блин, с 3 раза ответил :-()

266
19 февраля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by mhaturov

ОК, если адрес поста не забуду ;-)
(Блин, с 3 раза ответил :-()


Так, я вернулся к этой проблеме :P

258
20 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by mhaturov

Так, я вернулся к этой проблеме :P



Ну так как там, сам Excel после Refresh ждет и сразу сам недожидаясь бухает следующую команду, например: MsgBox "Привет!"

266
20 февраля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by SergeySV


Ну так как там, сам Excel после Refresh ждет и сразу сам недожидаясь бухает следующую команду, например: MsgBox "Привет!"


Да, примерно так. Тоесть, Excel на командах:

Код:
ExcelSheet.ActiveWorkbook.RefreshAll
       DoEvents
       ExcelSheet.Sheets("Отчет").PivotTables("СводнаяТаблица1").RefreshTable
       ExcelSheet.ActiveWorkbook.RefreshAll
       DoEvents
       ExcelSheet.Sheets("Отчет").PivotTables("СводнаяТаблица1").RefreshTable
       
       ExcelSheet.CommandBars("PivotTable").Visible = True
       DoEvents
       DoCmd.Close acForm, "Пожалуйста подождите": DoCmd.Maximize
       
       ExcelSheet.Visible = True

Отображает нерефрешеную таблицу (несмотря на то, что рефреш "по-дубовому" вызывается 2 раза подряд, как Вы можете видеть). Рефрешить таблицу приходится вручную уже в интерфейсе Excel'я, что, учитывая ленность пользователей, не сеть хорошо.
266
20 февраля 2004 года
mhaturov
901 / / 23.10.2003
Если ставить Debug.Print или MsgBox, то видно, что среда не дожидается рефреша, а продолжает выполнять код. DoEvents, естественно. не помогает, так как для программы Excel в данном случае - стороннее приложение и его отработку среда не может отследить.
Самое обидное, что шаблон (он сложный и содержит какие-то внутренние коды) мне коверкать совершенно не хочется, так как писал его не я, того человека, который его делал, нет, и, сами понимаете, разбираться при условии сжатых сроков (проект должен быть готов вчера:) ) мне совершенно в шаблоне не хочется.
266
20 февраля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by mhaturov
Если ставить Debug.Print или MsgBox, то видно, что среда не дожидается рефреша, а продолжает выполнять код. DoEvents, естественно. не помогает, так как для программы Excel в данном случае - стороннее приложение и его отработку среда не может отследить.
Самое обидное, что шаблон (он сложный и содержит какие-то внутренние коды) мне коверкать совершенно не хочется, так как писал его не я, того человека, который его делал, нет, и, сами понимаете, разбираться при условии сжатых сроков (проект должен быть готов вчера:) ) мне совершенно в шаблоне не хочется.


Всё, подсказали мне! Нужно было фоновое обновление запроса для листа таблицы отключить. В этом случае Excel себя не отобразит раньше времени и обновиттся, как надо.:D

266
20 февраля 2004 года
mhaturov
901 / / 23.10.2003
Теперь другая проблема: Excel выдаёт мессагу о том, что данные были изменены... Подобный пост, честно говоря. я тут видел, но на него, по-моему, никто не ответил.... Как с сиим бороться? И можно ли?
267
20 февраля 2004 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by mhaturov
Теперь другая проблема: Excel выдаёт мессагу о том, что данные были изменены... Подобный пост, честно говоря. я тут видел, но на него, по-моему, никто не ответил.... Как с сиим бороться? И можно ли?



Попробуй Application.DisplayAlerts = True/False

266
20 февраля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by Cutty Sark


Попробуй Application.DisplayAlerts = True/False


Помогло!
ExcelSheet.DisplayAlerts = False
Огромное спасибо!:D

18K
01 июня 2006 года
Максималь
6 / / 01.06.2006
Здравствуйте !

Подскажите плс как сделать автообновление листа.
Ситуация такова:
имеется поле с датой, которое форматируется макросом из VBA, но обновление цвета ячейки происходит после того как макрос запусакается вручную, как сделать, чтобы автоматически при изменении данных на листе, изменялось форматирование ячейки :-? :-? :-?
275
01 июня 2006 года
pashulka
985 / / 19.09.2004
Выделите мышкой ярлычок нужного рабочего листа, затем кликните правой кнопкой мышки и в появившемся стандартном контекстном меню выберите команду Исходный текст. После этого выберите наиболее подходящее событие рабочего листа, замените функцию MsgBox на инструкцию, которая будет изменять параметры форматирования и скопируйте в модуль листа.

Код:
Private Sub Worksheet_Activate()
    MsgBox "Выполняется при пересчёте", , ""
End Sub

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    MsgBox "Выполняется при изменении данных ячейки/диапазона", , ""
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    MsgBox "Выполняется при выделении ячейки/диапазона", , ""
End Sub


P.S. Не забывайте, что в некоторых случаях параметры форматирования можно менять без использования VBA, например, используя условное форматирование.
18K
02 июня 2006 года
Максималь
6 / / 01.06.2006
Спасибо большое, щас попробую !
18K
07 июня 2006 года
Максималь
6 / / 01.06.2006
Извините пожалуйста, а специально для чайников выне могли бы дат более точные разъяснения.
Привожу скрипт:

Sub AvailableCredit()
For i = 5 To 10000
jj = Cells(i, 10).Value
kk = Cells(i, 11).Value
With Cells(i, 8)
If .Value = " " Then Exit Sub
If .Value < Date And jj = "" Then .Interior.Color = RGB(255, 0, 0) ' And Cells(i, 11).FormulaR1C1 = "&#239;&#240;&#238;&#241;&#240;&#238;&#247;&#229;&#237;&#238;"
If .Value < Date And jj = "" Then Cells(i, 11).FormulaR1C1 = "&#239;&#240;&#238;&#241;&#240;&#238;&#247;&#229;&#237;&#238;"
If .Value > Date And .Value < Date + 10 Then .Interior.Color = RGB(255, 255, 0)
If .Value > Date And .Value < Date + 5 Then .Interior.Color = RGB(255, 0, 0)
If .Value >= jj And jj > "" Then .Interior.Color = RGB(0, 128, 0)
End With
Next i
End Sub

чтоб все это работало автообновлением.
Помогите пожалуйста !
275
07 июня 2006 года
pashulka
985 / / 19.09.2004
Код:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim iRangeInter As Range, iCell As Range
Set iRangeInter = Intersect(Target, [H5:H10000])
If Not iRangeInter Is Nothing Then
   For Each iCell In iRangeInter
       iValue = iCell.Item(1, 3)
       If IsDate(iCell) = True And _
          IsError(iValue) = False Then
          If iCell < Date And iValue = "" Then
             iColorIndex% = 3
             Application.EnableEvents = False
             iCell.Item(1, 4) = "/Хреновина/"
             Application.EnableEvents = True
          ElseIf iCell > Date And iCell < Date + 5 Then
             iColorIndex% = 43
          ElseIf iCell > Date And iCell < Date + 10 Then
             iColorIndex% = 6
          ElseIf iCell >= iValue And iValue <> "" Then
             iColorIndex% = 10
          End If
          iCell.Interior.ColorIndex = iColorIndex%
       End If
   Next
End If
End Sub
18K
07 июня 2006 года
Максималь
6 / / 01.06.2006
не работает :(((
275
07 июня 2006 года
pashulka
985 / / 19.09.2004
А вот у меня, при изменении данных в диапазоне "H5:H10000" выбранного рабочего листа, как ни странно всё работает …
18K
08 июня 2006 года
Максималь
6 / / 01.06.2006
Данные в столбце H должны меняться при изменении столбца J, видимо у меня не получилось правильно сформулировать задачу :(.

Вообщем сравниваются 2 столбца,
1. если данные в Н < текущей даты, то в К присваивается "ПРОСРОЧЕН" и красный цвет
2. за 5 дней в Н до наступления даты тоже в красный
3. за 10 дней в Н до наступления даты - в желтый
4. если J заполнен и значение < Н, то в зеленый
275
08 июня 2006 года
pashulka
985 / / 19.09.2004
Вот пример события, использование которого позволит (при изменении данных в диапазоне "J5:J10000") автоматически изменять параметры форматирования в столбце "H" и значения в столбце "K" Для этого, в столбце "H" должны наличествовать даты, а ячейки и рабочий лист не должны быть защищены.

Код:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim iRangeInter As Range, iCell As Range
Set iRangeInter = Intersect(Target, [J5:J10000])
If Not iRangeInter Is Nothing Then
   For Each iCell In iRangeInter
       iValue = iCell.Item(1, -1)
       If IsDate(iValue) = True And _
          IsError(iValue) = False Then
          iColorIndex% = xlNone
          If iValue < Date And iValue >= Date - 5 Then
             iColorIndex% = 3
             ' в течении пяти дней до наступ. текущ. даты
          ElseIf iValue < Date And iValue >= Date - 10 Then
             iColorIndex% = 36
             ' в течении десяти дней до наступ. текущ. даты
          ElseIf iValue < Date Then
             iColorIndex% = 3
             Application.EnableEvents = False
             iCell.Item(1, 2) = "/Просрочено/"
             Application.EnableEvents = True
          ElseIf IsDate(iCell) = True Then
             If iValue > iCell Then iColorIndex% = 43
             ' это условие будет выполнено только
             ' при условии, что дата в столбце "H"
             ' будет >= текущей даты и > даты в столбце "J"
          End If
          iCell.Interior.ColorIndex = iColorIndex%
       End If
   Next
End If
End Sub
18K
09 июня 2006 года
Максималь
6 / / 01.06.2006
Спасибо Вам огромное, особенно за терпением к таким тормозам
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог