Мне нужно вызвать макрос из другого макроса, и я использую способ «вызова». Я не понимаю, почему это не работает должным образом, если вы не поставили точку останова в строке вызова.

Видеть. У меня есть это:

Sub actualizarDatos()   
     Sheets("DATOS CITAS").Select
     Range("A1").Select
     Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False

     ActiveWorkbook.RefreshAll

     Call replaceColumns

     Sheets("Resumen").Activate
End Sub

Первая часть написана так, потому что у меня были проблемы с большим листом. Это остановило мое превосходство.

Макрос, который я вызываю, выглядит так:

 Sub replaceColumns()    
   With ThisWorkbook.Sheets("RFS")
       .Columns("A").Replace _
          What:="2", Replacement:="2", _
          SearchOrder:=xlByColumns, MatchCase:=True
   End With
End Sub

Зачем мне второй макрос? Поскольку столбец с формулой не обновлялся автоматически, этот макрос «изменяет» ячейку, которая используется в формуле.

Но давайте перейдем к важной части и главному вопросу:

Почему не работает часть звонка? -если я выполняю первый макрос в листе RFS (лист во втором макросе), он работает! Но мне нужно обновить его с помощью кнопки на другом листе, так что это не ответ. - если я поставлю точку останова и выполню первый макрос из случайного листа, он сработает.

Я также пробовал использовать имя макроса напрямую, не используя «Call». Не работает. И даже записать содержимое макроса прямо внутри первого макроса, где написана строка вызова, не работает !! По какой-то причине он пропускает эту строчку. Кто-нибудь знает почему?

Спасибо!

[РЕДАКТИРОВАТЬ]

РЕШИТЬ

Пришлось что-то сделать в конфигурации моих таблиц. Если у кого-то такая же проблема с обновлением, просто к следующему:

Для каждой таблицы вы обновите в RefreshAll, выберите ее и перейдите в «Дизайн» в верхнем меню. Теперь перейдите в свойства и снимите флажок, который говорит: Включить обновление фона. Вот как это выглядит:

properties window to change the refresh settings of a table

1
arnau infante pinós 14 Фев 2018 в 15:20
3
«Я использую способ звонка» - почему? Call replaceColumns эквивалентно replaceColumns. Ключевое слово Call устаревшее. Кроме того, замена "2" на "2", мягко говоря, немотивирована. Если вы хотите запустить вычисление, просто используйте Application.Calculate.
 – 
John Coleman
14 Фев 2018 в 15:25
1
Замените ActiveWorkbook на ThisWorkbook и избегайте использования .Select и Selection. (в Google есть много руководств, как их избежать).
 – 
Pᴇʜ
14 Фев 2018 в 15:27
1
Как узнать, не заменяется ли «2» на «2»?
 – 
John Coleman
14 Фев 2018 в 15:43
1
Почему бы просто не использовать Application.Calculate? Это эквивалентно нажатию F9 в пользовательском интерфейсе.
 – 
John Coleman
14 Фев 2018 в 15:45
1
Что не рассчитывает? Если зависимая ячейка изменяется (или любая зависимая ячейка является изменчивой), то Application.Calculate должен работать. Используется ли функция VBA в качестве UDF, которая не вычисляет? В этом случае добавьте Application.Volatile к определению функции. Не видя минимального воспроизводимого примера, трудно сделать что-либо, кроме предположений.
 – 
John Coleman
14 Фев 2018 в 16:05

1 ответ

Лучший ответ

Вы пытались сделать Sub Public. Нравиться:

Public Sub replaceColumns()    
   With ThisWorkbook.Sheets("RFS")
       .Columns("A").Replace _
          What:="2", Replacement:="2", _
          SearchOrder:=xlByColumns, MatchCase:=True
   End With
End Sub

Кроме того, для первой процедуры попробуйте ввести команду сна, чтобы дождаться завершения обновления Excel.

Sub actualizarDatos()   
     Sheets("DATOS CITAS").Select
     Range("A1").Select
     Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False

     ActiveWorkbook.RefreshAll
     Sleep 2000
     Call replaceColumns

     Sheets("Resumen").Activate
End Sub

И поместите этот код в верхнюю часть модуля:

#If VBA7 Then
  Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
   Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
1
Alex Martinez 14 Фев 2018 в 18:48
1
Это больше похоже на комментарий, чем на ответ. Если это была проблема, попытка вызвать его из-за пределов области действия вызовет ошибку, которая не проблема, которую описывает OP.
 – 
John Coleman
14 Фев 2018 в 16:50
Это не позволяет мне комментировать в блоке выше, потому что у меня еще нет 50 баллов, извините.
 – 
Alex Martinez
14 Фев 2018 в 16:51
Я не пытаюсь набрать 50 баллов, я думал, что мое предложение может помочь, и у меня нет другого выхода. Извините.
 – 
Alex Martinez
14 Фев 2018 в 17:00
1
Вы добавили достаточно к своему исходному ответу, так что теперь это гораздо больше, чем просто комментарий. +1
 – 
John Coleman
14 Фев 2018 в 19:04
1
Спасибо, JohnColeman :) Сейчас у меня 50+ баллов. Больше не буду отвечать вместо того, чтобы комментировать. @ arnauinfantepinós Дайте нам знать. Вероятно, поэтому с точкой останова работает, остановив ее, вы даете Excel возможность обновиться.
 – 
Alex Martinez
14 Фев 2018 в 19:15