Можно ли запускать макрос VBA поэтапно, чтобы сократить время выполнения? - PullRequest
2 голосов
/ 08 апреля 2020

Я пытаюсь создать рабочий лист, который позволяет мне и моим коллегам заполнять переменные в рабочем листе, как можно было бы сделать во время беседы с клиентом. До сих пор мне это удавалось, но макрос стал очень-очень медленным ... Я уже отключил ScreenUpdating, DisplayPageBreaks, Calculation и Events.

На самом деле, я почти уверен, что это займет много времени из-за обширного Private Sub Worksheet_Change. Я использую некоторое первоначальное форматирование, когда ячейка еще пуста, чтобы мои коллеги знали, что поместить в ячейку. Но этот процесс повторяется индивидуально для около 170 строк. Это выглядит так:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Cells(19,3).Value="" Then Cells(19,3).Value="Fill in x.."
     Cells(19,3).Font.Fontstyle = "Italic"
     Cells(19,3).Font.ColorIndex = 16

  If Cells(20,3).Value="" Then Cells(20,3).Value="Fill in y.."
     Cells(20,3).Font.Fontstyle = "Italic"
     Cells(20,3).Font.ColorIndex = 16

  If Cells(25,2).Value="" Then Cells(25,2).Value="Fill in z.."
     Cells(25,2).Font.Fontstyle = "Italic"
     Cells(25,2).Font.ColorIndex = 16

  If Cells(70,3) = True Then Cells(70,3).Value = "Comment.."
  If Cells(70,3) = False Then Cells(70,3).Value = ""
     Cells(70,3).Font.Fontstyle = "Italic"
     Cells(70,3).Font.ColorIndex = 16

И это продолжается для многих других ячеек. Я хотел бы изучить, можно ли запускать только куски Private Sub Worksheet_Change в то время. Например, он только проверяет, изменяются ли ячейки в главе, в которой работает человек. Может ли кто-нибудь помочь мне с этим или направить меня в правильном направлении?

Заранее спасибо!

1 Ответ

0 голосов
/ 08 апреля 2020

Если оператор If - Then завершен в одну строку, как и во всех ваших случаях, то код рядом с ним будет выполняться независимо от результата if, который находится непосредственно над ними. Таким образом, в вашем случае будут выполняться все операторы (включая условия If и другие), что делает операторы if избыточными. Так что даже если Cells(19,3).Value<>"", он все равно проверит состояние и сделает Cells(19,3).Font italic and colorindex 16. Лучше использовать, если блоки с действиями на следующих строках и с end ifs

Worksheet.Change происходит, когда ячейки на рабочем листе изменяются пользователем или по внешней ссылке. Это событие не происходит, когда ячейки меняются во время пересчета. Используйте событие Рассчитать , чтобы перехватить пересчет листа. Таким образом, если пользователь обновляет лист вручную, за один раз будет изменена только одна ячейка.

Следовательно, каждый раз при изменении одной ячейки макрос будет проверять все 170 строк и выполнять все операторы независимо от результата операторов if, как указано выше, и будет задержка.

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