Excel макрос работает только на одном листе

 

Anatoliy_Pro

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

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

#1

18.01.2019 16:26:37

Здравствуйте.
Подскажите такое. Есть простейший макрос вида:

Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveCell.Calculate
  
  End Sub

 

Что нужно дописать, чтобы ограничить его работу только одним листом? В этом виде он срабатывает при изменениях на других листах в книге, что нежелательно.

Изменено: Anatoliy_Pro18.01.2019 16:27:01

 

Перенести макрос из модуля книги в модуль листа, в котором нужна его работа.

 

Ігор Гончаренко

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

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

#3

18.01.2019 16:31:27

а покажите такой файл, где этот макрос

Цитата
Anatoliy_Pro написал:
срабатывает при изменениях на других листах в книге

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Макрос находится в модуле нужного листа. Это первое что пришло мне в голову. Но почему то он срабатывает и при изменениях на других листах.

 

Дмитрий(The_Prist) Щербаков

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

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

Профессиональная разработка приложений для MS Office

#5

18.01.2019 16:37:19

Цитата
Anatoliy_Pro написал:
Но почему то он срабатывает и при изменениях на других листах

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

RAN

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

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

Срабатывает не макрос, а пересчет на всех листах книги.
Это совсем не одно и то-же.

 

Anatoliy_Pro

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

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

#7

18.01.2019 16:41:37

Возможно в этом дело.

Цитата
Ігор Гончаренко написал: а покажите такой файл, где этот макрос

Файл большой, но сейчас попытаюсь сделать мини-пример с таким же сценарием.

 

Дмитрий(The_Prist) Щербаков

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

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

Профессиональная разработка приложений для MS Office

#8

18.01.2019 16:47:30

Цитата
Anatoliy_Pro написал:
Возможно в этом дело

т.е. Вы сами проверить не можете в этом или нет? Макрос выполняется или нет? Вы точку останова в нем ставили, чтобы проверить?

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

В том то и дело что макрос выполняется везде в книге, хотя находится в модуле конкретного листа. И что такое «точка останова»? Я же не спец в макросах. Я их копирую пока из интернета, а не пишу самостоятельно.

В общем, в примере я использовал один из методов, выложенных на этом сайте.  На листе 1 должен выполнятся макрос только при изменениях на этом листе. Сейчас он выполняется при изменениях на всех листах. Если кто поможет — спасибо заранее.

Прикрепленные файлы

  • пример.xlsm (13.74 КБ)

 

Ігор Гончаренко

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

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

#10

18.01.2019 17:10:58

макрос работает так, как написано и работает ТОЛЬКО там где написан
формулы на листе1 тоже работаю так как написаны
сейчас макрос выглядит так:

Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  ActiveCell.Calculate
  MsgBox "сработал"
End Sub

и каждый раз когда он срабатывает, видно что он сработал

пощелкайте по ячейкам листа1, срабатывает?

перейдите на любой другой лист.
пощелкайте по ячейкам сработывает?
в пределах строк 2..14 на любом листе в любой ячейке измените значение этой ячейки на что-то другое сработал???

а перйдите на лист1, отметка в соотв. строке появилась???

Прикрепленные файлы

  • пример (23).xlsm (18.01 КБ)

Изменено: Ігор Гончаренко18.01.2019 17:17:07

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Anatoliy_Pro

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

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

#11

18.01.2019 17:19:37

Цитата
Ігор Гончаренко написал:
а перйдите на лист1, отметка в соотв. строке появилась???

Да, появилась. Во именно этот эффект мне и надо побороть. Я хочу чтобы отметка оставалась на своем месте (где я ее поставил на листе 1) независимо от изменений на других листах. Это возможно сделать? То, что дело не в макросе я уже понял.

 

ответ такой:
этот макрос не нужно ограничивать, он работает только на том листе, на котором написан

и судя по всему, перед Вами стоит какая-то задача
создавайте новую тему, описывайте свою задачу, решим… если она решается

Изменено: Ігор Гончаренко18.01.2019 17:25:54

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Anatoliy_Pro

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

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

#13

18.01.2019 17:34:53

Понял. Спасибо.

First, you need to create a public variable to hold your timer, otherwise you’ll never be able to cancel it so it will continue trying to fire even when your workbook is closed. You should also create a public variable to store when the timer is running, so you can check before creating a new timer.

At the top of a code module put:

Public nextTime As Date

Then in your Workbook_BeforeClose() event method (within ThisWorkbook), disable the existing timer so it doesn’t keep trying to fire after the workbook is closed.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    On Error Resume Next   ' Continue with next line of code if we encounter an error
    Application.OnTime Earliesttime:=nextTime, Procedure:="Macro1", Schedule:=False
    On Error GoTo 0   ' Resume error-trapping

End Sub

In Macro1() you should explicitly and directly reference your workbook components — ThisWorkbook always refers to the workbook the code is running from, so you don’t need your If statement. Then you set the nextTime and activate the timer using that variable if it is not already running.

Sub Macro1()

    Dim sht As Worksheet   ' Creates a variable to hold your Weight worksheet
    Set sht = ThisWorkbook.Sheets("Weight")   ' Sets the reference

    Application.DisplayAlerts = False

    sht.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:Nett weight" & sht.Range("B1").Text & sht.Range("E1").Text   ' Remember to preceed Range with sht. to explicitly reference the range of your Weight worksheet

    On Error Resume Next   ' Continue with next line of code if we encounter an error
    Application.OnTime Earliesttime:=nextTime, Procedure:="Macro1", Schedule:=False
    On Error GoTo 0   ' Resume error-trapping

    nextTime = Now + TimeSerial(0, 0, 10)   ' Adds 10 seconds to Now
    Application.OnTime Earliesttime:=nextTime, Procedure:="Macro1", Schedule:=True
    timerIsRunning = True

    Application.DisplayAlerts = True   ' Remember to enable alerts at the end of code

End Sub

Your Worksheet_Change() event method can stay as is. Now if there is a change in B1 it will call Macro1(). Macro1() will save the Weight worksheet as a PDF regardless of whether the workbook or worksheet is active, and create a new timer to re-run Macro1() every 10 seconds after deactivating an existing timer. When you’re finished with the workbook, you close it and the existing timer is also deactivated.

EDIT:

Fortunately (as it fixes a spreadsheet of my own) I have figured out why the solution I originally provided wasn’t working. Placing the Public variables under ThisWorkbook meant they no longer held their values after code execution. The remedy was to place them in a module instead. Once that was sorted out, I also realised that when the timer fires to call Macro1() it will throw an error when trying to unschedule the existing timer (as none exists unless Macro1() was called ad hoc by the Worksheet_Change() event).

Long story short: Public variables have been moved to a code module, and the timerIsRunning flag has been removed entirely and errors when attempting to unschedule the timer are simply ignored in the event that no timer exists.

Работа макроса только на определенных листах книги

Vladimir7200

Дата: Воскресенье, 21.09.2014, 07:51 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

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


Excel 2013

Здравствуйте. Пользуюсь макросом (спасибо Алексею Матевосову) который записан в «эта книга». Работа макроса нужна на большинстве листах, но не на всех. Макрос изменяет содержимое ячеек на листах, где его работа не нужна. Пробовал убирать макрос из книги и помещать в соответствующие листы, но он тогда вообще переставал работать. Как сделать, чтобы макрос работал только на нужных листах? Спасибо.

Макрос такой:
[vba]

Код

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

‘водим дату открытия и закрытия сессии
If Not Intersect(Range(«J5:U» & Range(«C4»).End(xlDown).Row), Target) Is Nothing Then
Range(«F» & Target.Row) = IIf(Range(«E» & Target.Row) = «Д», Date, «»)
End If

If Not Intersect(Range(«G5:I» & Range(«C4»).End(xlDown).Row), Target) Is Nothing Then
Range(«W» & Target.Row) = IIf(Range(«V» & Target.Row) = «Сд», Date, «»)
End If

‘создаем примечание с датой сдачи экзамена
If Intersect(Target, Range(«AG:AG»)) Is Nothing Then Exit Sub

Dim oComment As Comment
On Error Resume Next
Set oComment = Target.Comment
If oComment Is Nothing Then
Target.AddComment Target.Text & » » & Range(«AI» & Target.Row)

Else
oComment.Text oComment.Text & Chr(10) & Target.Text & » » & Range(«AI» & Target.Row)
End If
End Sub

[/vba]

 

Ответить

AndreTM

Дата: Воскресенье, 21.09.2014, 08:50 |
Сообщение № 2

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

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


2003 & 2010

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


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

Vladimir7200

Дата: Воскресенье, 21.09.2014, 16:16 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

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


Excel 2013

Прилагаю файл. Макрос должен работать только на листах 1201 и 1202 (на самом деле групп больше, это для примера)

К сообщению приложен файл:

2012_5.7z
(36.7 Kb)

 

Ответить

Формуляр

Дата: Воскресенье, 21.09.2014, 17:48 |
Сообщение № 4

Группа: Друзья

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

Сообщений: 832


Репутация:

255

±

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


Excel 2003, 2013

В начало ф-ции вставить:
[vba]

Код

Select Case sh.name
Case «1201», «1202» ‘список листов, на которых должен работать макрос
Case Else:    Exit Sub
End Select

[/vba]


Excel 2003 EN, 2013 EN

 

Ответить

Vladimir7200

Дата: Вторник, 23.09.2014, 02:19 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

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


Excel 2013

Спасибо.

 

Ответить

Vladimir7200

Дата: Вторник, 23.09.2014, 03:12 |
Сообщение № 6

Группа: Пользователи

Ранг: Новичок

Сообщений: 42


Репутация:

0

±

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


Excel 2013

Огромное спасибо, а то данные из других листов исчезал и совсем некстати

 

Ответить

Хелп!
Записал макрос на 1-ом листе, пытаюсь применить на других — не получается.
Что нужно добавить в код?


Код находится в стандартном модуле?


Sub Макрос1()

‘ Макрос1 Макрос


    ActiveWindow.SmallScroll Down:=-3
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        «Астрахань!R1C1:R65536C4», Version:=xlPivotTableVersion10).CreatePivotTable _
        TableDestination:=»Астрахань!R2C12″, TableName:=»СводнаяТаблица1″, _
        DefaultVersion:=xlPivotTableVersion10
    Sheets(«Астрахань»).Select
    Cells(2, 12).Select
    With ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields(«Наименование»)
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields(«С/С»)
        .Orientation = xlRowField
        .Position = 2
    End With
    With ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields(«Реализ.шт.»)
        .Orientation = xlRowField
        .Position = 3
    End With
    With ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields(«Реал.руб.»)
        .Orientation = xlRowField
        .Position = 4
    End With
    ActiveSheet.PivotTables(«СводнаяТаблица1»).AddDataField ActiveSheet.PivotTables _
        («СводнаяТаблица1»).PivotFields(«Наименование»), _
        «Количество по полю Наименование», xlCount
    ActiveSheet.PivotTables(«СводнаяТаблица1»).AddDataField ActiveSheet.PivotTables _
        («СводнаяТаблица1»).PivotFields(«С/С»), «Количество по полю С/С», xlCount
    With ActiveSheet.PivotTables(«СводнаяТаблица1»).DataPivotField
        .Orientation = xlColumnField
        .Position = 1
    End With
    ActiveSheet.PivotTables(«СводнаяТаблица1»).AddDataField ActiveSheet.PivotTables _
        («СводнаяТаблица1»).PivotFields(«Реализ.шт.»), «Количество по полю Реализ.шт.» _
        , xlCount
    ActiveSheet.PivotTables(«СводнаяТаблица1»).AddDataField ActiveSheet.PivotTables _
        («СводнаяТаблица1»).PivotFields(«Реал.руб.»), «Количество по полю Реал.руб.», _
        xlCount
    With ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields( _
        «Количество по полю Наименование»)
        .Orientation = xlRowField
        .Position = 1
    End With
    With ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields( _
        «Количество по полю С/С»)
        .Caption = «Среднее по полю С/С»
        .Function = xlAverage
    End With
    With ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields( _
        «Количество по полю Реализ.шт.»)
        .Caption = «Сумма по полю Реализ.шт.»
        .Function = xlSum
    End With
    With ActiveSheet.PivotTables(«СводнаяТаблица1»).PivotFields( _
        «Количество по полю Реал.руб.»)
        .Caption = «Сумма по полю Реал.руб.»
        .Function = xlSum
    End With
    ActiveWorkbook.ShowPivotTableFieldList = False
    ActiveWindow.SmallScroll Down:=-123
    Columns(«A:D»).Select
    Selection.ClearContents

    Range(«L4:O4»).Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy

    Range(«A2»).Select
    ActiveSheet.Paste
    Range(«E9»).Select
End Sub

Вотмакрос какой получился


Названия листов- названия городов.
Как сделать так, что бы они автоматически менялись в коде?


Встраивать код в таблицу, еще та засада. Может оглушите примерчиком!?

А имена листов в код — через переменную.

Путей к вершине — множество. Этот один из многих!


Вот пример:
у меня 3 листа, на каждом по 2 таблицы.
Допустим на перовм листе делаю следущие действия: создаю две _сводные_ таблицы (по одной на каждую имеющуюся): наименование, среднее знач по колонке цена 1 и сумма знач по остальным, вставляю данные из сводной вместо тех, что есть и удалаю _сводные_. Далее применяю функцию ВПР для присоединения данных из таблицы 2 к таблице 1. То есть хочу, что бы в первой таблице стало 7 колонок.
Пока пытался сделать первую часть, создание сводных и замена значений в таблице, но ко всем листам почему то не применяется..


Вместо сводной можно попробовать такой макрос на зеленой стрелке — см. лист Астрахань. Дальше, про 7 колонок непонятно. И конечная цель в чем?


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

Доброго времени суток, форумчане!

Столкнулся со следующей проблемой:
На нескольких листах в формулах используются одни и те же пользовательские функции. Необходимо, чтобы при изменении значении в любой ячейке на листе, пересчитывались все формулы, но ТОЛЬКО НА ЭТОМ листе.
Т.е. Application.Volatile не подходит, ибо пересчитывает все формулы на всех листах. Причем при таком пересчете пользовательские функции используют значения ячеек с листа, с которого был инициирован пересчет.

Видится два варианта решения вопроса:
1) Сделать так, чтобы пересчитывались значения только на том листе, на котором произошло изменения ячейки. (пытался использовать Calculate. Возможно как-то криво его прописывал).
2) Сделать так, чтобы пересчитывались все листы, но на каждом листе использовались значения ячеек с этого же листа.

Пожалуйста, помогите с реализацией.

P.S. понимаю, что вопрос, скорее всего, глупый, ибо самостоятельно начал осваивать vba совсем недавно. Гугление не дало результатов.
Выложить Excel’вский файл проблематично, ибо корпоративная тайна.

Понравилась статья? Поделить с друзьями:
  • Excel макрос работа с датой
  • Excel макрос работа с датами
  • Excel макрос путь к файлу
  • Excel макрос проверка ячеек
  • Excel макрос присвоить значение ячейке