VBA контролирует внимание пользователя во время итерации - PullRequest
0 голосов
/ 01 августа 2011

быстрый вопрос, который на самом деле не должен требовать моего кода.Во время моего приложения я использую цикл «для каждого», который проходит по диапазону ячеек, и прямо сейчас, когда пользователь запускает его, фокус экрана следует за выделением, когда он переходит от ячейки к ячейке в этом диапазоне.Есть ли какой-нибудь способ помешать фокусу следовать по пути цикла во время итерации, может быть, пользователь просто увидит что-то с надписью «обработка», пока она не завершится?вся помощь.

код:

Dim iLoop As Integer

For iLoop = 5 To lastRow

 Sheets("Planners").Activate
 Range("J" & iLoop).Select
 Range(Cells(iLoop, 9)).Select

 With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="Yellow, Orange, Green, Red"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = "Invalid Entry"
    .ErrorMessage = "Please choose from dropdown"
    .ShowInput = True
    .ShowError = True
 End With

Next iLoop

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Очевидно, вы используете .Select в своем коде.Есть шанс, что это правильно, но в большинстве случаев это не так.

Так что перестаньте использовать Select и ActiveCell и обращайтесь к ячейкам, используя индексы / ссылки.

Выше было бы правильное решение.
Неправильное решение было бы использовать Application.ScreenUpdating = False перед циклом и Application.ScreenUpdating = True после цикла.


Редактировать:

Dim iLoop As long
dim w as worksheet

set w = Worksheets("Planners")

For iLoop = 5 To lastRow

  With w.cells(iLoop, 9).Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:="Yellow, Orange, Green, Red"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = "Invalid Entry"
    .ErrorMessage = "Please choose from dropdown"
    .ShowInput = True
    .ShowError = True
  End With

Next

Но, учитывая этот код, вам вообще не нужен цикл:

dim w as worksheet
set w = Worksheets("Planners")

With w.Range(w.cells(5, 9), w.cells(lastRow, 9)).Validation
  .Delete
  .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
  xlBetween, Formula1:="Yellow, Orange, Green, Red"
  .IgnoreBlank = True
  .InCellDropdown = True
  .InputTitle = ""
  .ErrorTitle = ""
  .InputMessage = "Invalid Entry"
  .ErrorMessage = "Please choose from dropdown"
  .ShowInput = True
  .ShowError = True
End With
0 голосов
/ 01 августа 2011

Все, что вам нужно сделать, это добавить application.screenupdating = false в начале вашего кода (после подопределения курса) и application.screenupdating = true в конце перед 'end sub'.

Хорошей практикой является добавление этого ко всем вашим подпрограммам и функциям, поскольку это также заставит их работать быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...