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
Проблема с обновлением листа Excel
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!!!
Цитата:
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!!!
Из кодна на 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!!!
Пока я выхожу из положения по-дубовому:
Код:
Если у кого есть идеи - буду очень благодарен!:P
Как вариант
1. попробовать поискать в свойствах Excel.Application что-нибудь отвечающее за занятость приложения обновлением.... Cutty Sark подойдет может подскажет, есть что-нибудь похожее
2. поставить свою метку после окончания рефреша. Вот тут такой момент. Я не знаю: если после рефреша написать - Cells(1,1).Value="Ура", он отработает рефреш полностью и только потом напишет в A1 Ура или сам Excl еще оже не ждет конца обновления? - если сам Excel еще не ждет, тогда действительно жопа. Можно тока предложить запускать после обновления еще один запрос, который должен в скрытую ячейку вернуть кодовое слово и в цикле с DoEvents проверять не появилось ли оно.
Цитата:
Originally posted by SergeySV
Наскоко я понял, проблема в том, что обновление данных занимает какое-то время, а мы из Access должна каким-то образом узнать оконочание и подождать до этого момента.
Как вариант
1. попробовать поискать в свойствах Excel.Application что-нибудь отвечающее за занятость приложения обновлением.... Cutty Sark подойдет может подскажет, есть что-нибудь похожее
2. поставить свою метку после окончания рефреша. Вот тут такой момент. Я не знаю: если после рефреша написать - Cells(1,1).Value="Ура", он отработает рефреш полностью и только потом напишет в A1 Ура или сам Excl еще оже не ждет конца обновления? - если сам Excel еще не ждет, тогда действительно жопа. Можно тока предложить запускать после обновления еще один запрос, который должен в скрытую ячейку вернуть кодовое слово и в цикле с DoEvents проверять не появилось ли оно.
Наскоко я понял, проблема в том, что обновление данных занимает какое-то время, а мы из Access должна каким-то образом узнать оконочание и подождать до этого момента.
Как вариант
1. попробовать поискать в свойствах Excel.Application что-нибудь отвечающее за занятость приложения обновлением.... Cutty Sark подойдет может подскажет, есть что-нибудь похожее
2. поставить свою метку после окончания рефреша. Вот тут такой момент. Я не знаю: если после рефреша написать - Cells(1,1).Value="Ура", он отработает рефреш полностью и только потом напишет в A1 Ура или сам Excl еще оже не ждет конца обновления? - если сам Excel еще не ждет, тогда действительно жопа. Можно тока предложить запускать после обновления еще один запрос, который должен в скрытую ячейку вернуть кодовое слово и в цикле с DoEvents проверять не появилось ли оно.
Пока так не получилось:{ Вернусь к этому малёк попозже
Никогда не встречался с такой проблемой. Даже и не знаю, что предложить... Макс, когда вернешься к этой проблеме, будем устраивать мозгоштурм...
Цитата:
Originally posted by Cutty Sark
Никогда не встречался с такой проблемой. Даже и не знаю, что предложить... Макс, когда вернешься к этой проблеме, будем устраивать мозгоштурм...
Никогда не встречался с такой проблемой. Даже и не знаю, что предложить... Макс, когда вернешься к этой проблеме, будем устраивать мозгоштурм...
ОК, если адрес поста не забуду ;-)
(Блин, с 3 раза ответил :-()
Цитата:
Originally posted by mhaturov
ОК, если адрес поста не забуду ;-)
(Блин, с 3 раза ответил :-()
ОК, если адрес поста не забуду ;-)
(Блин, с 3 раза ответил :-()
Так, я вернулся к этой проблеме :P
Цитата:
Originally posted by mhaturov
Так, я вернулся к этой проблеме :P
Так, я вернулся к этой проблеме :P
Ну так как там, сам Excel после Refresh ждет и сразу сам недожидаясь бухает следующую команду, например: MsgBox "Привет!"
Цитата:
Originally posted by SergeySV
Ну так как там, сам Excel после Refresh ждет и сразу сам недожидаясь бухает следующую команду, например: MsgBox "Привет!"
Ну так как там, сам 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
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'я, что, учитывая ленность пользователей, не сеть хорошо.
Самое обидное, что шаблон (он сложный и содержит какие-то внутренние коды) мне коверкать совершенно не хочется, так как писал его не я, того человека, который его делал, нет, и, сами понимаете, разбираться при условии сжатых сроков (проект должен быть готов вчера:) ) мне совершенно в шаблоне не хочется.
Цитата:
Originally posted by mhaturov
Если ставить Debug.Print или MsgBox, то видно, что среда не дожидается рефреша, а продолжает выполнять код. DoEvents, естественно. не помогает, так как для программы Excel в данном случае - стороннее приложение и его отработку среда не может отследить.
Самое обидное, что шаблон (он сложный и содержит какие-то внутренние коды) мне коверкать совершенно не хочется, так как писал его не я, того человека, который его делал, нет, и, сами понимаете, разбираться при условии сжатых сроков (проект должен быть готов вчера:) ) мне совершенно в шаблоне не хочется.
Если ставить Debug.Print или MsgBox, то видно, что среда не дожидается рефреша, а продолжает выполнять код. DoEvents, естественно. не помогает, так как для программы Excel в данном случае - стороннее приложение и его отработку среда не может отследить.
Самое обидное, что шаблон (он сложный и содержит какие-то внутренние коды) мне коверкать совершенно не хочется, так как писал его не я, того человека, который его делал, нет, и, сами понимаете, разбираться при условии сжатых сроков (проект должен быть готов вчера:) ) мне совершенно в шаблоне не хочется.
Всё, подсказали мне! Нужно было фоновое обновление запроса для листа таблицы отключить. В этом случае Excel себя не отобразит раньше времени и обновиттся, как надо.:D
Теперь другая проблема: Excel выдаёт мессагу о том, что данные были изменены... Подобный пост, честно говоря. я тут видел, но на него, по-моему, никто не ответил.... Как с сиим бороться? И можно ли?
Цитата:
Originally posted by mhaturov
Теперь другая проблема: Excel выдаёт мессагу о том, что данные были изменены... Подобный пост, честно говоря. я тут видел, но на него, по-моему, никто не ответил.... Как с сиим бороться? И можно ли?
Теперь другая проблема: Excel выдаёт мессагу о том, что данные были изменены... Подобный пост, честно говоря. я тут видел, но на него, по-моему, никто не ответил.... Как с сиим бороться? И можно ли?
Попробуй Application.DisplayAlerts = True/False
Цитата:
Originally posted by Cutty Sark
Попробуй Application.DisplayAlerts = True/False
Попробуй Application.DisplayAlerts = True/False
Помогло!
ExcelSheet.DisplayAlerts = False
Огромное спасибо!:D
Подскажите плс как сделать автообновление листа.
Ситуация такова:
имеется поле с датой, которое форматируется макросом из VBA, но обновление цвета ячейки происходит после того как макрос запусакается вручную, как сделать, чтобы автоматически при изменении данных на листе, изменялось форматирование ячейки :-? :-? :-?
Код:
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
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, например, используя условное форматирование.
Спасибо большое, щас попробую !
Привожу скрипт:
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 = "ïðîñðî÷åíî"
If .Value < Date And jj = "" Then Cells(i, 11).FormulaR1C1 = "ïðîñðî÷åíî"
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
чтоб все это работало автообновлением.
Помогите пожалуйста !
Код:
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
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
не работает :(((
А вот у меня, при изменении данных в диапазоне "H5:H10000" выбранного рабочего листа, как ни странно всё работает …
Вообщем сравниваются 2 столбца,
1. если данные в Н < текущей даты, то в К присваивается "ПРОСРОЧЕН" и красный цвет
2. за 5 дней в Н до наступления даты тоже в красный
3. за 10 дней в Н до наступления даты - в желтый
4. если J заполнен и значение < Н, то в зеленый
Код:
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
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
Спасибо Вам огромное, особенно за терпением к таким тормозам