Пересчитать макрос в excel

 

Здравствуйте уважаемые ГУРУ! Экселем владею на пользовательском уровне, но для работы нужны скоростные фишки, т.к. информации приходится обрабатывать очень много. Есть файл из 5-ти связанных формулами листов. При введении новых данных программа очень долго пересчитывает каждое нововведение. Вводит данные сотрудница лет 55 и ей нужно, чтобы все было просто и понятно. Поэтому прошу Вас помочь мне с написанием макроса и привязке его к кнопке «ПЕРЕСЧИТАТЬ». Я отключу автоматический пересчет и сделаю ей кнопку, по окончании ввода данных она нажмет КНОПКУ (F9 — она не запомнит)и проверит результат. Только как все это сделать? Очень жду Вашего совета.

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

Дим, кнопка будет в 1/4 листа :-)

 

слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

 

Да, кнопка будет не маленькая. Как привязать макрос к кнопке? Что создать сначала?

 

{quote}{login=слэн}{date=09.09.2010 02:27}{thema=}{post}вот файл{/post}{/quote}  

  Как здорова работает! Спасибо огромное! А если листов несколько — будет работать?

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

А самому проверить не судьба?

 

{quote}{login=Юрий М}{date=09.09.2010 02:40}{thema=}{post}А самому проверить не судьба?{/post}{/quote}  

  Прошу прощение за тугоумие, я впервые столкнулась с макросами. Подскажите последовательность действий. Я создала кнопку, а как привязаться к макросу?

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

Правый клик — Назначить макрос

 

Кликаю правой кнопкой — в списке нет такой записи «Назначить макрос». Есть: вырезать, копировать, вставить, свойства, исходный текст, объект …, группировка, порядок, формат и ВСЁ. Может у меня уровень безопасности не тот?

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

{quote}{login=Хома}{date=09.09.2010 02:56}{thema=}{post}Кликаю правой кнопкой — в списке нет такой записи «Назначить макрос». {/post}{/quote}  
А сам макрос есть?

 

Сомневаюсь. Его нет — нажимаю на ПИ Сервис-Макрос — кнопка «создать» неактивна. Как тогда создать?

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

В файле Слэна попробуйте правый клик на «кнопке».

 

Получается вот так:  
Private Sub CommandButton1_Click()  
Application.Calculate  
End Sub  
но кнопка не нажимается, вокруг нее белые кружки форматирования ???

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

Отключите режим конструктора.

 

{quote}{login=Юрий М}{date=09.09.2010 03:08}{thema=}{post}В файле Слэна попробуйте правый клик на «кнопке».{/post}{/quote}  

  такая же история — нет надписи «назначить макрос».

 

{quote}{login=Юрий М}{date=09.09.2010 03:16}{thema=}{post}Отключите режим конструктора.{/post}{/quote}  

  Вышла из режима, и все заработало!!! Пересчитывает!

 

Дурацкий вопрос —  как переименовать кнопку?

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

В свойствах кнопки — Caption.

 

И еще один вопросик — можно ли, чтобы эта кнопка перемещалась вместе с последней строкой данных и всегда была на виду?

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

Первую, или несколько первых строк закрепляем и в эту область помещаем кнопку. Кнопка всегда будет на виду. Вам бы литературу почитать…

 

{quote}{login=Юрий М}{date=09.09.2010 03:40}{thema=}{post}Первую, или несколько первых строк закрепляем и в эту область помещаем кнопку. Кнопка всегда будет на виду. Вам бы литературу почитать…{/post}{/quote}  

  Простите! Делаю надпись, а спрашиваю о кнопке: если кнопка является объектом WordArt (просто надписью), как прикрепить этот объект к последней строке и сделать всегда в поле зрения?

 

Юрий М

Модератор

Сообщений: 60586
Регистрация: 14.09.2012

Контакты см. в профиле

Хома, в закреплённую область.

 

Хома

Гость

#23

09.09.2010 16:33:41

Спасибо Вам за советы и рекомендации! Буду осваивать неосвоенное.

Пересчет отдельных формул в рабочей книге

Подробности
Создано 04 Февраль 2018
Содержание
Решение задачи
Константы:
Процедура пересчета диапазонов:

Типичная проблема при работе с большими или очень большими файлами Excel — это слишком сильное замедление при выполнении любых расчетов. Стандартной рекомендацией при этом является переключение Excel на ручной режим пересчета (ленат Формулы Параметры вычислений). Но зачастую рабочая книга построена таким образом, что хотелось бы видеть автоматическое обновление каких-то оперативных данных и сумм непосредственно при вводе. Нажимать все время F9, во-первых, неудобно, во-вторых, расчет каких-то итоговых таблиц вообще можно отложить на неопределенный срок — занимать время на их пересчет совсем не требуется. Иногда помогает пересчет не всей рабочей книги, а только активного листа — Shift+F9. Но и это не всегда удобно, и зависит от степени сложности связей между листами.

Кардинальным способом решения проблемы является пересчет итоговых таблиц по определенному событию, все остальное время там будут храниться только значения. Шаблон расчетных формул можно хранить в скрытом диапазоне. Т.е. рабочий файл можно оставить в автоматическом режиме расчетов для ввода каких-то данных. А для расчета итоговых таблиц необходимо будет вызывать макрос VBA. Очевидно, что для эффективности данного пересчитываемые таблицы должны иметь большое количество однотипных формул.

Решение задачи

Макрос делает следуеющее:

  1. Проходит по всем ячейкам столбца «Признак»
  2. Если «Признак»=1, то во все «Столбцы» таблицы вставлются формулы из строки «Формула»
  3. После заполнения всех формул пересчитывается рабочий лист
  4. После завершения расчета все вставленные формулы заменяются на значения
  5. Во вложении пример решения подобной задачи.

Пример реализации макроса на VBA во вложении к статье.

Константы:

Для простоты в примере все ссылки на столбцы и строки заданы через константы — см.проект VBA. В реальном проекте лучше заменить константы на переменные, ссылающиеся на именованные диапазоны рабочей книги.

Const colBegFormula As Long = 2
Const colEndFormula As Long = 9
Const colFlag As Long = 11
Const rowBegData As Long = 5
Const rowEndData As Long = 18
Const rowFormulas As Long = 19

Процедура пересчета диапазонов:

Private Sub RecalcFormulas(rngData As Excel.Range, rngFlags As Excel.Range, rngFormulas As Excel.Range)
    Dim calcMode As Excel.XlCalculation
    Dim wsh As Excel.Worksheet
    Dim rngRowData As Excel.Range
    Dim idx As Long, curRow As Long
    
On Error GoTo Err_
    calcMode = SaveCalcMode()
    Set wsh = rngData.Worksheet
    
    ' fill formulas
    For idx = 1 To rngData.Rows.Count
        curRow = rngData.Rows(idx).Row
        If (rngFlags.Cells(idx) = 1) Then
            Set rngRowData = wsh.Range(wsh.Cells(curRow, rngFormulas.Columns(1).Column), _
                        wsh.Cells(curRow, rngFormulas.Columns(rngFormulas.Columns.Count).Column))
            rngFormulas.Copy
            rngRowData.PasteSpecial xlPasteFormulas
        End If
    Next
    
    wsh.Calculate 'Application.Calculate
    
    ' fill values
    For idx = 1 To rngData.Rows.Count
        curRow = rngData.Rows(idx).Row
        If (rngFlags.Cells(idx) = 1) Then
            Set rngRowData = wsh.Range(wsh.Cells(curRow, rngFormulas.Columns(1).Column), _
                        wsh.Cells(curRow, rngFormulas.Columns(rngFormulas.Columns.Count).Column))
            rngRowData.Copy
            rngRowData.PasteSpecial xlPasteValues
        End If
    Next
    
    RestoreCalcMode calcMode
    Exit Sub
Err_:
    MsgBox Err.Description
    RestoreCalcMode calcMode
End Sub

Для сложных файлов лучше пересчитывать не только активный лист (см.строку wsh.Calculate), а все открытые рабочие книги — замените строку на Application.Calculate

Процедуры SaveCalcMode и RestoreCalcMode необходимы для корректного возврата текущего режима расчета Excel (автоматический или ручной). Туда же можно добавить скрытие визуализации выполнения макроса через задание параметра Application.ScreenUpdating = False (скрывает обновление экрана) и Application.ScreenUpdating = True (восстанавливает обновление экрана).

Смотри также

» Класс сохранения настроек Excel

В данной статье описывается небольшой, но очень удобный класс для сохранения и автоматического восстановления таких параметров…

» Основные принципы оптимизации работы в электронных таблицах

Знание специальных приемов работы в электронных таблицах Excel позволяет в разы сократить время разработки моделей, повысить…

» Надстройки Excel

Те, кто программирует на VBA для Excel, в определенный момент задумываются над распространением своих приложений в качестве независимых…

» Автоматизация в Excel

Создание программного кода для автоматизации определенных процедур открывает практически безграничные возможности по развитию и…

» Доступ к данным Excel через ADO

Данный пример демонстрирует работу с файлами Excel через интерфейс доступа к данным ADO (ActiveX Data Objects). Объекты ADO входят в состав Windows,…

Содержание

  • Отключить автоматические вычисления
  • Снова включите автоматические вычисления
  • Пример макроса «Отключить автоматические вычисления»
  • Расчет вручную

Каждый раз, когда вы обновляете значение ячейки, Excel выполняет процесс пересчета книги. При работе непосредственно в Excel вы хотите, чтобы это происходило в 99,9% случаев (за исключением случаев, когда вы работаете с очень большой книгой). Однако это может действительно замедлить ваш код VBA. Рекомендуется устанавливать вычисления вручную в начале макроса и восстанавливать вычисления в конце макроса. Если вам нужно пересчитать книгу, вы можете вручную указать Excel для расчета.

Отключить автоматические вычисления

Вы можете отключить автоматический расчет с помощью макроса, установив для него значение xlmanual. Используйте следующий фрагмент кода VBA:

1 Application.Calculation = xlManual

Снова включите автоматические вычисления

Чтобы снова включить автоматический расчет с настройкой xlAutomatic:

1 Application.Calculation = xlAutomatic

Я рекомендую отключить автоматические вычисления в самом начале процедуры и снова включить автоматические вычисления в конце. Это будет выглядеть так:

Пример макроса «Отключить автоматические вычисления»

12345678 Sub Auto_Calcs_Example ()Application.Calculation = xlManual’Сделай что-нибудьApplication.Calculation = xlAutomaticКонец подписки

Расчет вручную

Когда автоматические вычисления отключены, вы можете использовать Рассчитать команда для принудительного пересчета Excel:

Вы также можете указать Excel, чтобы он пересчитывал только отдельный рабочий лист:

1 Рабочие листы («лист1»). Рассчитать

Вы также можете указать VBA пересчитать только диапазон (щелкните, чтобы прочитать нашу статью о методах вычисления VBA)

Вот как это может выглядеть внутри макроса:

12345678910111213 Sub Auto_Calcs_Example_Manual_Calc ()Application.Calculation = xlManual’Сделай что-нибудь’RecalcРассчитать’Делай больше вещейApplication.Calculation = xlAutomaticКонец подписки

Настройки VBA — код ускорения

Если ваша цель — ускорить код, вам также следует подумать о настройке следующих параметров:

Отключение обновления экрана может существенно повлиять на скорость:

1 Application.ScreenUpdating = False

Отключение строки состояния также имеет небольшое значение:

1 Application.DisplayStatusBar = False

Если ваша книга содержит события, вам также следует отключить события в начале ваших процедур (чтобы ускорить код и предотвратить бесконечные циклы!):

1 Application.EnableEvents = False

Наконец, ваш код VBA может замедлиться, когда Excel пытается повторно вычислить разрывы страниц (Примечание: не все процедуры будут затронуты). Чтобы отключить DisplayPageBreaks, используйте эту строку кода:

1 ActiveSheet.DisplayPageBreaks = False

Вы поможете развитию сайта, поделившись страницей с друзьями

5 / 5 / 0

Регистрация: 25.02.2010

Сообщений: 34

1

11.08.2011, 11:32. Показов 31787. Ответов 9


Студворк — интернет-сервис помощи студентам

Подскажите, пож.

Ситуация:
программный пересчет объемных данных на листе 1; генерируются пошаговые значения, расставляются по таблицам, часть значений (используемых на следующем шаге расчета) пересчитываются формулами, и пользовательскими функциями — т.о. здесь пересчет должен работать.

на листе 2 суммируются результаты листа 1 (помесячные значения) в квартальные, формулами вида =СУММЕСЛИ(No_квартала;Строка_номеров_кварталов_лис та1;Таблица_помесячных_значений_листа1)
здесь пересчет желательно отключить, т.к. добавление этого листа увеличило время расчета с 30-40 сек. до ~ 10 минут.

Вопрос: Есть ли способ сохранить пересчет формул для листа_1 и выключить для листа_2 ?



0



4 / 4 / 0

Регистрация: 11.08.2011

Сообщений: 62

11.08.2011, 12:00

2

там, где генерируешь пересчет надо изменить на
Worksheets(1).Calculate, если надо пересчитать только диапазон, то Worksheets(1).Range(«диапазон»).Calculate



0



5 / 5 / 0

Регистрация: 25.02.2010

Сообщений: 34

11.08.2011, 12:44

 [ТС]

3

Правильно ли Вас понял:

Вначале запрещаем пересчет
Application.Calculation = xlCalculationManual

Затем разрешаем для конкретного листа (~ .Calculate — больше похоже на разовый принудительный пересчет)
Worksheets(1).Calculate

==> СЧИТАЕМ

Возвращаем автопересчет
Application.Calculation = xlCalculationAutomatic

= ? = — если уверены — ответьте (простите, проверять конкретно сегодня нет времени)



0



4 / 4 / 0

Регистрация: 11.08.2011

Сообщений: 62

11.08.2011, 13:34

4

в зависимости от того, как часто тебе надо проводить пересчет. Если постоянно при вводе, то так, как ты написал, а если ты что-то вносишь, а потом разом произвести пересчет, то можно средствами экселя — пересчет листа, я бы вывалил на лист кнопку и в обработке клика прописал пересчет листа, как писал раньше.



0



5 / 5 / 0

Регистрация: 25.02.2010

Сообщений: 34

11.08.2011, 13:47

 [ТС]

5

По частоте я обращал внимание: после изменения данных каждой ячейки листа1, поскольку после подстановки данных шага i формулами генерятся данные для шага i+1, т.е. по сути листу 1 нужен автопересчет; а пересчет листа 2 нужен после отработки на листе 1

получается, Ваш пересчет для какой-то точки программы, что некузяво, т.к. wsh.Count придется вызывать после каждого заполнения j,i-й ячейки, ну или типа того. Изначально вопрос стоял иначе: автопересчет на листе 1 и его отсутствие на листе 2.

Есть у кого идеи?



0



Busine2009

Заблокирован

11.08.2011, 13:57

6

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



0



4 / 4 / 0

Регистрация: 11.08.2011

Сообщений: 62

11.08.2011, 21:46

7

If Worksheets(2).EnableCalculation = False Then Worksheets(2).EnableCalculation = True: Worksheets(2).CommandButton1.Caption = «Включено»
If Worksheets(2).EnableCalculation = True Then Worksheets(2).EnableCalculation = False: Worksheets(2).CommandButton1.Caption = «выключено»

у листа, если зайдете в исходный текст есть свойство: EnableCalculation
если выставить «Ложь», то пересчета не будет для листа 2, а первый будет считаться.
Когда заполните 1-й лист, поставьте свойство EnableCalculation в «Истина» и все будет рассчитано.
Я добавил кнопку на второй лист — сижу и радуюсь)



1



Iasmer

5 / 5 / 0

Регистрация: 25.02.2010

Сообщений: 34

12.08.2011, 11:17

 [ТС]

8

primuspd — респект!

Добавлено через 28 минут
Только странно,

Private Sub CommandButton1_Click()
If Worksheets(2).EnableCalculation Then
Worksheets(2).EnableCalculation = False
Worksheets(2).CommandButton1.Caption = «Выкл.»
Else
Worksheets(2).EnableCalculation = True
Worksheets(2).CommandButton1.Caption = «Вкл.»
End If
End Sub

пишет, падла
Run-time error ‘438’:
Object doesn’t support this property or method

на Worksheets(2).CommandButton1.Caption = «ххх»

к чему бы это?

Добавлено через 46 минут
Тема закрыта. Всем спасибо, primuspd — персональное.

наше ИТОГО выглядит следующим образом:

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub CommandButton1_Click()
    Worksheets(2).EnableCalculation = Not Worksheets(2).EnableCalculation
    If Worksheets(2).EnableCalculation Then    
        '  "Пересчет включен" 
        Me.CommandButton1.Caption = "Выкл."    
    Else
        '  "Пересчет выключен" 
        Me.CommandButton1.Caption = "Вкл."    
    End If
End Sub



0



4 / 4 / 0

Регистрация: 11.08.2011

Сообщений: 62

12.08.2011, 15:54

9

я понимаю, что тема закрыта, но я вчера потестил внимательно этот код и заметил такую бяку: выставляешь по дефолту руками для листа это EnableCalculation в ложь и потом по нажатию кнопки оно включается и сразу после расчета встает снова в ложь.



0



5 / 5 / 0

Регистрация: 25.02.2010

Сообщений: 34

12.08.2011, 17:04

 [ТС]

10

Состояние EnableCalculation листа 2 в процессе работы программы не проверял, но время расчета вернулось к «нормальному», т.е. до вставки самого листа 2 со сложным и нудным суммированием.



0



Циклический пересчет формул после добавления макроса

Anis625

Дата: Среда, 26.05.2021, 08:26 |
Сообщение № 1

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Добрый день, всем участникам форума!
Решил одну свою задачку (выполнение ряда макросов при пересчете значения формулы) готовым кодом в конкретный лист:
[vba]

Код

Private Sub Worksheet_Calculate()
‘Updateby Extendoffice
    Dim Xrg As Range
    Set Xrg = Range(«A8»)
    If Not Intersect(Xrg, Range(«A8»)) Is Nothing Then
    Call Show
    Call Hide
    End If
End Sub

[/vba]
При добавлении этого кода после каждого действия файл на несколько секунд-минут зависает в пересчете формул. В начале было много ячеек с формулой СЛУЧМЕЖДУ. Думал проблема в этом. Снес. Все равно пересчитывает. Других летучих формул нет.
Пробовал отключать в начале автоматически пересчет формул Application.Calculation = … и включать в конце кода — увы пересчитывает. Причем даже на любом листе если просто добавлю любое число в любое место — пересчитывает моргая экраном.
Убираю код. Все нормально работает. Но остается не решенная задача с запуском других макросов при изменении результата расчеты формулы. Файл нужен будет? (большой, много зачищать нужно будет, если нужно будет подготовлю).
P.S. пытался в модуль код добавить и прописал ссылку на конкретный лист перед RANGE — не работает вообще.
Буду признателен за совет как подправить код.

Сообщение отредактировал Anis625Среда, 26.05.2021, 08:27

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 08:38 |
Сообщение № 2

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Похоже не в той ветке создал тему. Перенесите, пожалуйста в ветку VBA

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 10:51 |
Сообщение № 3

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

На одном сайте нашел подсказку в виде использования TextBox на изменение в ячейке но не совсем понял как вкручивать в свой код

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 11:36 |
Сообщение № 4

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Решение нашел на дружественном (надеюсь) сайте:
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
  If oldValue <> Cells(8, 1) Then
      Application.EnableEvents = False
      Application.ScreenUpdating = False
      Call Show
      Call Hide
      Application.EnableEvents = True
      Application.ScreenUpdating = True
   End If
End Sub

[/vba]
Странно что его сразу не высмотрел, хотя в поиске он находил этот сайт

Сообщение отредактировал Anis625Среда, 26.05.2021, 11:36

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 14:08 |
Сообщение № 5

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Только маленький нюанс у этого кода — когда включаю его в лист при любом действии он похоже включается (хотя значение ячейки не меняется) и задержка после каждого изменения в любом месте книги на 1-1,5с (заметно визуально). Вроде отключают обновление экрана.
Подскажите, пожалуйста, нужно для этого отдельную тему создать с вопросом?

 

Ответить

Serge_007

Дата: Среда, 26.05.2021, 14:20 |
Сообщение № 6

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Здравствуйте

…отключают обновление экрана…

[vba]

Код

Application.ScreenUpdating = False

[/vba]

— эта строка отключает обновление экрана

нужно для этого отдельную тему создать с вопросом?

Если вопрос относится к «Циклическому пересчету формул после добавления макроса«, то отдельная тема не требуется


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 14:26 |
Сообщение № 7

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Serge_007,
К этому же вопросу относится, т.к. код до конца не отрабатывает как необходимо

Попробовал сделать так:
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
If oldValue = Cells(8, 1) Then End Sub Else
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Call Show
    Call Hide
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End If
End Sub

[/vba]
Выдает ошибку =(

Сообщение отредактировал Anis625Среда, 26.05.2021, 14:26

 

Ответить

Serge_007

Дата: Среда, 26.05.2021, 14:27 |
Сообщение № 8

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 14:35 |
Сообщение № 9

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Serge_007, :'(
Exit sub тоже не помог

 

Ответить

Serge_007

Дата: Среда, 26.05.2021, 14:37 |
Сообщение № 10

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Надо-то что?
Можете своими словами сформулировать что не получается сделать?


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 14:47 |
Сообщение № 11

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Serge_007,
При добавлении кода макрос (из сообщения 4) включается (т.е. запускаются макросы Hide и Show) при действии в любом месте книги (даже просто если число какое нибудь написать). Решил подправить код, предположил что при условии
[vba]

Код

oldValue = Cells(8, 1)

[/vba]вообще ничего происходить не будет. Не получается подправить.

 

Ответить

Serge_007

Дата: Среда, 26.05.2021, 14:51 |
Сообщение № 12

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

макрос включается при действии в любом месте книги

Естественно, макрос же в модуле листа и запускается по событию изменений на листе
Сделать что надо? Что бы макрос по кнопке запускался? Или по другому событию? Или по расписанию? Или ещё как?


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 14:55 |
Сообщение № 13

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

запускается по событию изменений на листе

Я думал, что если указал ячейку A8 то макрос только ее смотрит.
Нужно чтобы при изменении (результата расчета формулы, любое изменение) ячейки А8 срабатывали два макроса Hide и Show. А если не меняется значение, то ничего не происходило.

 

Ответить

Serge_007

Дата: Среда, 26.05.2021, 15:23 |
Сообщение № 14

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 15:36 |
Сообщение № 15

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Serge_007,
Добавил в начале
[vba]

Код

If Not Intersect(Target, Range(«A:A»)) Is Nothing Then

[/vba] + в конце End If и проблема решилась :D
Спасибо Вам огромное за то, что направили на обучение =)

 

Ответить

Anis625

Дата: Среда, 26.05.2021, 15:37 |
Сообщение № 16

Группа: Проверенные

Ранг: Ветеран

Сообщений: 670


Репутация:

31

±

Замечаний:
0% ±


Excel 2013

Финальный код (вдруг кому пригодится):
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range(«A:A»)) Is Nothing Then
If oldValue <> Cells(8, 1) Then
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Call Show
    Call Hide
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End If
End If
End Sub

[/vba]

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Переставить слова в ячейке excel
  • Пересчитать значения в ячейках excel
  • Пересохранить excel в старую версию онлайн
  • Пересчитать все формулы в excel сочетание клавиш
  • Пересохранил файл word как восстановить