Anatoliy_Pro Пользователь Сообщений: 17 |
#1 18.01.2019 16:26:37 Здравствуйте.
Что нужно дописать, чтобы ограничить его работу только одним листом? В этом виде он срабатывает при изменениях на других листах в книге, что нежелательно. Изменено: Anatoliy_Pro — 18.01.2019 16:27:01 |
||
Перенести макрос из модуля книги в модуль листа, в котором нужна его работа. |
|
Ігор Гончаренко Пользователь Сообщений: 13746 |
#3 18.01.2019 16:31:27 а покажите такой файл, где этот макрос
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
Макрос находится в модуле нужного листа. Это первое что пришло мне в голову. Но почему то он срабатывает и при изменениях на других листах. |
|
Дмитрий(The_Prist) Щербаков Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#5 18.01.2019 16:37:19
видимо, надо убедиться, что при изменениях на других листах никакие макросы не делают что-то на этом самом листе. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
RAN Пользователь Сообщений: 7091 |
Срабатывает не макрос, а пересчет на всех листах книги. |
Anatoliy_Pro Пользователь Сообщений: 17 |
#7 18.01.2019 16:41:37 Возможно в этом дело.
Файл большой, но сейчас попытаюсь сделать мини-пример с таким же сценарием. |
||
Дмитрий(The_Prist) Щербаков Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#8 18.01.2019 16:47:30
т.е. Вы сами проверить не можете в этом или нет? Макрос выполняется или нет? Вы точку останова в нем ставили, чтобы проверить? Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
В том то и дело что макрос выполняется везде в книге, хотя находится в модуле конкретного листа. И что такое «точка останова»? Я же не спец в макросах. Я их копирую пока из интернета, а не пишу самостоятельно. В общем, в примере я использовал один из методов, выложенных на этом сайте. На листе 1 должен выполнятся макрос только при изменениях на этом листе. Сейчас он выполняется при изменениях на всех листах. Если кто поможет — спасибо заранее. Прикрепленные файлы
|
|
Ігор Гончаренко Пользователь Сообщений: 13746 |
#10 18.01.2019 17:10:58 макрос работает так, как написано и работает ТОЛЬКО там где написан
и каждый раз когда он срабатывает, видно что он сработал пощелкайте по ячейкам листа1, срабатывает? перейдите на любой другой лист. а перйдите на лист1, отметка в соотв. строке появилась??? Прикрепленные файлы
Изменено: Ігор Гончаренко — 18.01.2019 17:17:07 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
Anatoliy_Pro Пользователь Сообщений: 17 |
#11 18.01.2019 17:19:37
Да, появилась. Во именно этот эффект мне и надо побороть. Я хочу чтобы отметка оставалась на своем месте (где я ее поставил на листе 1) независимо от изменений на других листах. Это возможно сделать? То, что дело не в макросе я уже понял. |
||
ответ такой: и судя по всему, перед Вами стоит какая-то задача Изменено: Ігор Гончаренко — 18.01.2019 17:25:54 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
Anatoliy_Pro Пользователь Сообщений: 17 |
#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.
Работа макроса только на определенных листах книги |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Хелп!
Записал макрос на 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’вский файл проблематично, ибо корпоративная тайна.