Перезаггрузка userform без выхода из неё |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Асааа
Пользователь
Сообщений: 36
Регистрация: 17.09.2017
Добрый вечер. Маленькое отступление. Хочу поблагодарить всех Форумчан, которые отвечали на мои вопросы. Я понимаю, что вас немного подза****(надоел). Но прошу понять. Вообщем, суть вопроса… Есть форма, на которой набросан некий макет. Кнопка «Изменить», «Добавить», «Обновить», и список. Когда я ввожу в список любое слово, и жму «Добавить», то это слово отправляется в таблицу, но это новое слово не отображается в списке формы. Пока я не перезапущу программу. Для этого я создал кнопку «Обновить», чтобы не надо было перезапускать программу. Использовал команду: «Me.Repaint» — но не совсем уверен, что я правильно сделал. Потому что, он обновляет форму, но в списках новое слово не появляется. Вообщем всё… Спасибо. Всех люблю. Спокойной ночи. Форумчане.
0 / 0 / 0 Регистрация: 08.08.2007 Сообщений: 32 |
|
1 |
|
28.07.2009, 01:23. Показов 35631. Ответов 5
Заранее спасибо!
0 |
4 / 4 / 1 Регистрация: 25.07.2009 Сообщений: 43 |
|
28.07.2009, 08:32 |
2 |
Если код внутри самой формы, то: Me.Form.Repaint Если код извне: Form_НазваниеТвоейФормы.Repaint
1 |
papirus |
|
28.07.2009, 10:04 |
3 |
Если вопрос не о перерисовке формы, а об обновлении набора записей, то Me.Requery |
5 / 5 / 0 Регистрация: 02.10.2009 Сообщений: 17 |
|
02.10.2009, 02:03 |
4 |
Я люблю писать одновременно
5 |
ibrahimveg 2 / 1 / 2 Регистрация: 26.08.2015 Сообщений: 96 |
||||
16.05.2020, 23:22 |
5 |
|||
при обновлении перескакивает на первое значение формы. Есть ли вариант обновиться без смены позиции на начальную?
0 |
mobile 26777 / 14456 / 3192 Регистрация: 28.04.2012 Сообщений: 15,782 |
||||
16.05.2020, 23:34 |
6 |
|||
при обновлении перескакивает на первое значение формы. Есть ли вариант обновиться без смены позиции на начальную? Предположим в форме есть уникальное поле, назовем его для определенности ID. Тогда перед обновлением надо запомнить значение текущего ID, а после реквери его найти
Добавлено через 1 минуту
2 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
16.05.2020, 23:34 |
Помогаю со студенческими работами здесь Как обновить таблицу не закрывая форму? Как обновить dataGridView не закрывая форму? Как обновить подчиненную форму посредством макроса? Как обновить форму без перемещения скрола? Как обновить Подч.Форму, по значению из поля-со-списком Как обновить форму и где лучше хранить List<PartClass> ? у меня есть List<*мойкласс*> и его мне надо отображать на DataGrid, я его… Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 6 |
Содержание
- Метод Form.Refresh (Access)
- Синтаксис
- Возвращаемое значение
- Примечания
- Пример
- Поддержка и обратная связь
- Событие Form.AfterUpdate (Access)
- Синтаксис
- Замечания
- Поддержка и обратная связь
- Заставить обновление экрана в Excel VBA
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Vba excel обновление формы
- Принудительное обновление экрана в Excel VBA
- 6 ответов
Метод Form.Refresh (Access)
Метод Refresh сразу же обновляет записи в базовом источнике записей для указанной формы или таблицы, чтобы отразить изменения данных, внесенные вами и другими пользователями в многопользовательской среде.
Синтаксис
выражение.Refresh
выражение: переменная, представляющая объект Form.
Возвращаемое значение
Примечания
Использование метода Refresh эквивалентно выбору параметра Обновить на вкладке Главная.
Microsoft Access автоматически обновляет записи в соответствии с параметром Интервал обновления на вкладке Дополнительно диалогового окна Параметры Access. Для его открытия нажмите кнопку Microsoft Office и выберите Параметры Access. Источники данных ODBC обновляются в соответствии с параметром Период обновления ODBC на вкладке Дополнительно диалогового окна Параметры Access. Используйте метод Refresh для просмотра изменений, внесенных в текущий набор записей в форме или таблице, с момента последнего обновления источника записей формы или таблицы.
В базе данных Access метод Refresh показывает только изменения, внесенные в записи в текущем наборе. Так как метод Refresh фактически не отправляет запрос в базу данных, текущий набор не будет включать добавленные записи или исключать записи, которые были удалены с момента последнего повторного запроса базы данных, а также не будет исключать записи, которые больше не удовлетворяют условиям запроса или фильтра. Чтобы повторно запросить базу данных, используйте метод Requery. При повторном запросе источника записей текущий набор записей будет точно отражать все данные в источнике записей.
В проекте Access (ADP) метод Refresh повторно запрашивает базу данных и отображает все новые или измененные записи, а также удаляет удаленные записи из таблицы, на которой основана форма. Кроме того, форма обновляется для отображения записей на основе всех изменений свойства Filter формы.
- Часто обновление формы или таблицы выполняется быстрее, чем их повторный запрос. Это особенно верно, если первоначальный запрос выполнялся медленно.
- Не путайте метод Refresh с методом Repaint, который перерисовывает экран с помощью всех ожидающихся визуальных изменений.
Пример
В приведенном ниже примере используется метод Refresh для обновления записей в базовом источнике записей для формы Customers, когда форма получает фокус.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Событие Form.AfterUpdate (Access)
Событие AfterUpdate возникает после обновления измененных данных в элементе управления или записи.
Синтаксис
expression. После обновления
выражение: переменная, представляющая объект Form.
Замечания
Изменение данных в элементе управления с помощью Visual Basic или макроса, содержащего действие SetValue, не активирует эти события для элемента управления. Однако при переходе на другую запись или сохранении записи возникает событие AfterUpdate формы.
Чтобы выполнить макрос или процедуру события при возникновении этого события, задайте для свойства AfterUpdate имя макроса или [Процедура события].
Событие AfterUpdate активируется при обновлении элемента управления или записи. В записи измененные данные в каждом элементе управления обновляются, когда элемент управления теряет фокус или когда пользователь нажимает клавишу ВВОД или TAB.
При вводе новых или измененных данных в элементе управления в форме, а затем переходе к другой записи или сохранении записи путем нажатия кнопки Сохранить запись в меню Записи событие AfterUpdate для формы возникает сразу после события AfterUpdate для элемента управления .
При переходе к другой записи возникают события Exit и LostFocus для элемента управления, за которым следует событие Current для записи, в которую вы переместились, и события ВВОД и GotFocus для первого элемента управления в этой записи. Чтобы выполнить макрос или процедуру событий AfterUpdate без выполнения макросов exit и LostFocus или процедур событий, сохраните запись с помощью команды Сохранить запись в меню Записи .
Макросы и процедуры событий AfterUpdate выполняются только при изменении данных в элементе управления. Это событие не возникает при изменении значения в вычисляемом элементе управления. После обновления макросов и процедур событий для формы выполняются только при изменении данных в одном или нескольких элементах управления в записи.
Для привязанных элементов управления свойство OldValue не имеет обновленного значения до тех пор, пока не произойдет событие AfterUpdate для формы. Даже если пользователь вводит новое значение в элементе управления, параметр свойства OldValue не изменяется до тех пор, пока данные не будут сохранены (запись будет обновлена). При отмене обновления значение свойства OldValue заменяет существующее значение в элементе управления .
Для выполнения простых проверок или более сложных проверок, таких как требование значения в поле или проверка нескольких элементов управления в форме, можно использовать свойство ValidationRule для элементов управления и свойства ValidationRule и Required для полей и записей в таблицах.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Заставить обновление экрана в Excel VBA
Мой инструмент Excel выполняет длинную задачу, и я стараюсь быть добрым к пользователю, предоставляя отчет о ходе выполнения в строке состояния или в некоторой ячейке на листе, как показано ниже. Но экран не обновляется или не останавливается в какой-либо точке (например, на 33%). Задача в конечном итоге завершается, но индикатор выполнения бесполезен.
Что я могу сделать, чтобы принудительно обновить экран?
Я использую Excel 2003.
ОТВЕТЫ
Ответ 1
Добавьте функцию DoEvents внутри цикла, см. ниже.
Вы также можете убедиться, что строка состояния отображается пользователю и reset, когда ваш код завершен.
Ответ 2
Текстовые поля в листах иногда не обновляются когда их текст или форматирование изменены, и даже команда DoEvent не помогает.
Поскольку в Excel нет команды для обновления рабочего листа в том, как можно обновить форму пользователя, необходимо использовать трюк, чтобы заставить Excel обновить экран.
Следующие команды, похоже, делают трюк:
Ответ 3
Поместите вызов DoEvents в цикл.
Это повлияет на производительность, поэтому вы можете просто вызвать ее только на каждой, скажем, на 10-й итерации.
Однако, если у вас всего 30, это вряд ли проблема.
Ответ 4
Это напрямую не отвечает на ваш вопрос, а просто предоставляет альтернативу. Я нашел во многих длинных вычислениях Excel большую часть времени, ожидая наличия значений обновления Excel на экране. Если это так, вы можете вставить следующий код в начало вашего юнита:
и положим это как конец
Я обнаружил, что это часто ускоряет работу любого кода, с которым я работаю, так что необходимость предупредить пользователя о прогрессе не требуется. Это просто идея для вас попробовать, и ее эффективность в значительной степени зависит от вашего листа и расчетов.
Ответ 5
В частности, если вы имеете дело с UserForm, вы можете попробовать метод Перепаковать. Вы можете столкнуться с проблемой с DoEvents, если вы используете триггеры событий в своей форме. Например, любые клавиши, нажатые во время выполнения функции, будут отправлены DoEvents. Ввод клавиатуры будет обработан до обновления экрана, поэтому, если вы меняете ячейки в электронной таблице, удерживая одну из клавиши со стрелками на клавиатуре, то событие изменения ячейки продолжит стрельбу до завершения основной функции.
UserForm не будет обновляться в некоторых случаях, потому что DoEvents будет запускать события; однако Repaint обновит UserForm, и пользователь увидит изменения на экране, даже если другое событие сразу же следует за предыдущим событием.
В коде UserForm это просто:
Ответ 6
Напишите DoEvents непосредственно перед строкой, в которой вы обновляете пользовательский интерфейс, она должна работать.
Источник
Vba excel обновление формы
Stacey, Спасибо!
Наконец-то нашел ответ
Интересно почему так происходит
Stacey, Спасибо!
Наконец-то нашел ответ
Интересно почему так происходит Fidgy
Сообщение Stacey, Спасибо!
Наконец-то нашел ответ
Интересно почему так происходит Автор — Fidgy
Дата добавления — 03.06.2019 в 18:03
1607oxana | Дата: Суббота, 10.09.2022, 15:13 | Сообщение № 8 | |
|
My Excel tool performs a long task, and I’m trying to be kind to the user by providing a progress report in the status bar, or in some cell in the sheet, as shown below. But the screen doesn’t refresh, or stops refreshing at some point (e.g. 33%). The task eventually completes but the progress bar is useless.
What can I do to force a screen update?
For i=1 to imax ' imax is usually 30 or so
fractionDone=cdbl(i)/cdbl(imax)
Application.StatusBar = Format(fractionDone, "0%") & "done..."
' or, alternatively:
' statusRange.value = Format(fractionDone, "0%") & "done..."
' Some code.......
Next i
I’m using Excel 2003.
asked Sep 17, 2010 at 12:42
Add a DoEvents function inside the loop, see below.
You may also want to ensure that the Status bar is visible to the user and reset it when your code completes.
Sub ProgressMeter()
Dim booStatusBarState As Boolean
Dim iMax As Integer
Dim i As Integer
iMax = 10000
Application.ScreenUpdating = False
''//Turn off screen updating
booStatusBarState = Application.DisplayStatusBar
''//Get the statusbar display setting
Application.DisplayStatusBar = True
''//Make sure that the statusbar is visible
For i = 1 To iMax ''// imax is usually 30 or so
fractionDone = CDbl(i) / CDbl(iMax)
Application.StatusBar = Format(fractionDone, "0%") & " done..."
''// or, alternatively:
''// statusRange.value = Format(fractionDone, "0%") & " done..."
''// Some code.......
DoEvents
''//Yield Control
Next i
Application.DisplayStatusBar = booStatusBarState
''//Reset Status bar display setting
Application.StatusBar = False
''//Return control of the Status bar to Excel
Application.ScreenUpdating = True
''//Turn on screen updating
End Sub
Ben McCormack
31.8k46 gold badges145 silver badges221 bronze badges
answered Sep 17, 2010 at 16:04
Robert MearnsRobert Mearns
11.8k3 gold badges38 silver badges42 bronze badges
2
Text boxes in worksheets are sometimes not updated
when their text or formatting is changed, and even
the DoEvent command does not help.
As there is no command in Excel to refresh a worksheet
in the way a user form can be refreshed, it is necessary
to use a trick to force Excel to update the screen.
The following commands seem to do the trick:
- ActiveSheet.Calculate
- ActiveWindow.SmallScroll
- Application.WindowState = Application.WindowState
brettdj
54.6k16 gold badges113 silver badges176 bronze badges
answered Dec 19, 2011 at 12:37
2
Put a call to DoEvents
in the loop.
This will affect performance, so you might want to only call it on each, say, 10th iteration.
However, if you only have 30, that’s hardly an issue.
answered Sep 17, 2010 at 13:05
GSergGSerg
75.3k17 gold badges160 silver badges340 bronze badges
@Hubisans comment worked best for me.
ActiveWindow.SmallScroll down:=1
ActiveWindow.SmallScroll up:=1
answered Nov 27, 2019 at 17:57
1
Specifically, if you are dealing with a UserForm, then you might try the Repaint method. You might encounter an issue with DoEvents if you are using event triggers in your form. For instance, any keys pressed while a function is running will be sent by DoEvents The keyboard input will be processed before the screen is updated, so if you are changing cells on a spreadsheet by holding down one of the arrow keys on the keyboard, then the cell change event will keep firing before the main function finishes.
A UserForm will not be refreshed in some cases, because DoEvents will fire the events; however, Repaint will update the UserForm and the user will see the changes on the screen even when another event immediately follows the previous event.
In the UserForm code it is as simple as:
Me.Repaint
answered Mar 18, 2013 at 0:29
This worked for me:
ActiveWindow.SmallScroll down:=0
or more simply:
ActiveWindow.SmallScroll 0
answered Mar 23, 2020 at 17:50
I couldn’t gain yet the survey of an inherited extensive code. And exact this problem bugged me for months. Many approches with DoEnvents were not helpful.
Above answer helped. Placeing this Sub in meaningful positions in the code worked even in combination with progress bar
Sub ForceScreenUpdate()
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Wait Now + #12:00:01 AM#
Application.ScreenUpdating = False
Application.EnableEvents = False
End Sub
answered May 4, 2020 at 20:36
1
In my case: A complex Excel with a graphic simulation using shapes which move. In order to speed up, I wished to update the display only each 10th optimization step. Therefore, every 10th step, I had to switch it back on, followed by a doevents — but I ran into the problems described above. — Now, which is odd: Simply stating the screenupdating=True TWICE, it works. ??!! This is crazy.
If counteR Mod 10 = 0 Then
'must state this twice. WHY ??
Application.ScreenUpdating = True
Application.ScreenUpdating = True
DoEvents
Application.ScreenUpdating = False
End If
answered Mar 4 at 16:46
1
This is not directly answering your question at all, but simply providing an alternative. I’ve found in the many long Excel calculations most of the time waiting is having Excel update values on the screen. If this is the case, you could insert the following code at the front of your sub:
Application.ScreenUpdating = False
Application.EnableEvents = False
and put this as the end
Application.ScreenUpdating = True
Application.EnableEvents = True
I’ve found that this often speeds up whatever code I’m working with so much that having to alert the user to the progress is unnecessary. It’s just an idea for you to try, and its effectiveness is pretty dependent on your sheet and calculations.
answered Sep 17, 2010 at 16:05
MichaelMichael
1,6362 gold badges16 silver badges21 bronze badges
0
On a UserForm two things worked for me:
- I wanted a scrollbar in my form on the left. To do that, I first had to add an Arabic language to «Change administrative language» in the Language settings of Windows 10 (Settings->Time & Language->Change Administrative Language). The setting is actually for «Change the language of Non-Unicode Programs,» which I changed to Arabic (Algerian). Then in the properties of the form I set the «Right to Left» property to True. From there the form still drew a partial ghost right scrollbar at first, so I also had to add an unusual timed message box:
Dim AckTime As Integer, InfoBox As Object
Set InfoBox = CreateObject("WScript.Shell")
'Set the message box to close after 10 seconds
AckTime = 1
Select Case InfoBox.Popup("Please wait.", AckTime, "This is your Message Box", 0)
Case 1, -1
End Select
- I tried everything to get the screen to redraw again to show the first text box in it’s proper alignment in the form, instead of partially underneath or at least immediately adjacent to the scrollbar instead of 4 pixels to the right where I wanted it. Finally I got this off another Stackoverflow post (which I now can’t find or I would credit it) that worked like a charm:
Me.Frame1.Visible = False
Me.Frame1.Visible = True
answered Apr 7, 2021 at 11:09
socrtwosocrtwo
1221 silver badge12 bronze badges
In my case the problem was in trying to make one shape visible and another one invisible on a worksheet.
This is my approach to «inactivating» a button [shape] once the user has clicked it. The two shapes are the same size and in the same place, but the «inactive» version has dimmer colors, which was a good approach, but it didn’t work, because I could never get the screen to update after changing .visible = FALSE to = TRUE and vice versa.
None of the relevant tricks in this thread worked. But today I found a solution that worked for me, at this link on Reddit
Essentially you just call DoEvents
twice in immediate succession after the code that makes the changes. Now why? I can’t say, but it did work.
Gass
6,4822 gold badges33 silver badges37 bronze badges
answered Aug 4, 2021 at 12:51
SoproniSoproni
51 silver badge3 bronze badges
I’ve been trying to solve this Force a screen update on a Worksheet
(not a userform) for many years with limited success with
doevents
and scrolling etc.. This CH Oldie solutions works best with a slight mod.
I took out the Wait
and reset ScreenUpdating
and EnableEvents
back to true.
This works office excel 2002 through to office 365
Sub Sheet1Mess(Mess1 As String)
Sheet1.Range("A6").Value = Mess1
ForceScreenUpdate
End Sub
Sub ForceScreenUpdate()
Application.ScreenUpdating = True
Application.EnableEvents = True
' Application.Wait Now + #12:00:01 AM#
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Gass
6,4822 gold badges33 silver badges37 bronze badges
answered Aug 26, 2021 at 3:23