Excel макрос только для определенного листа

 

FusionBY

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

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

Добрый день. В очередной раз ищу помощи сообщества. Такой вопрос,макрос сейчас выполняется по нажатию кнопки на конкретной странице. Идея состоит в том, чтобы макрос выполнялся не по нажатию, а при открытии книги. Поместить его в Private Sub Workbook_Open() не составило труда, однако макрос будет работать корректно только если книга откроется на нужном листе. Открываться книга конечно же будет на другом листе с расчетами, а курсы будут подставляться через функцию ВПР, помогите указать абсолютный путь исполнения макроса.

P.S. Это нужно для того, чтобы Пользователь не запаривался о том, как обновляются циферки на странице и просто получал данные.

 

The_Prist

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

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

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

#2

20.05.2015 15:31:22

Как обратиться к диапазону из VBA

Кратко:

Код
Sheets("ИмяЛиста").Cells(1,1).Value = ""
Sheets("ИмяЛиста").Range("A1").Value = ""

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

 

Слэн

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

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

#3

20.05.2015 15:45:32

у листа есть так называемое кодовое имя — вот по нему и можно обращаться
преимущество — не может быть изменено неквалифицированным пользователем( да и ни к чему ему)
минус — могут быть проблемы локализации — кодовые имена «переводятся». можно избежать этой проблемы заранее назвав лист( дав кодовое имя) на латинице.

пример:

Код
Лист1.cells(1).value

Живи и дай жить..

 

Слэн

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

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

самый малозатратный метод — в начале макроса запомнить текущий лист, перейти на нужный, отработать(без изменения кода), восстановить активность прежнего листа

 

FusionBY

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

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

А можно по подробнее о последнем методе?

 

Scripter

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

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

#6

21.05.2015 04:58:55

В дополнении к перечисленным

Код
Sheets("ИмяЛиста").[A1].Value
 

FusionBY

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

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

Что-то я не совсем понимаю, к чему можно прикрутить «Sheets(«ИмяЛиста»).[A1].Value». Если я правильно понял, самый малозатратный метод будет работать следующим образом:
— Открывается книга
— Запоминается наименование текущего листа
— Осуществляется переход на лист где выполняется основной макрос. (экспорт курсов валют)
— Возврат к исходному листу, с которого открылась книга.

Как это осуществить?

 

Hugo

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

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

Зачем вообще переходить на другой лист, если нужно возвращаться? Без перехода всё обычно можно сделать (за редким исключением, что есть глюк экселя, сталкивался).

 

FusionBY

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

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

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

 

Hugo

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

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

#10

21.05.2015 12:35:07

Да ничего сложного:

Код
    Dim r As Object
    '...
    Set r = ActiveSheet
    '...
    r.Select

P.S. И чего это r? Обычно sh! Хотя разницы нет. :)

Изменено: Hugo21.05.2015 12:38:22

 

FusionBY

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

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

Спасибо. Действительно все очень не сложно оказалось. Может быть вы любезно согласитесь глянуть где я допустил ошибку и почему не работает первый метод? Код идентичный, как при нажатии на кнопку, так и при запуске книги. Однако курсы обновляются только через «button». При открытие появляется только табличка «Готово»!

 

Hugo

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

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

#12

21.05.2015 13:09:52

Вообще-то модуль книги — «стрёмное» место…
Попробуйте разместить код в модуле, ну а вызывать его можно по событию книги.

P.S. Беда сидит в строке

Код
x1 = Sheets("Беларусь").Cells(2, i).Value 'невядомая валюта

Тут дописал лист.

Изменено: Hugo21.05.2015 13:15:47

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

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

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

 

Ответить

Вы всё сделали правильно, разве что упустили один маленький момент. Ваш Delete удаляет строки Rows, вот эти строки тоже надо было привязать к листу. Предлагаю макрос подкорректировать так. Обратите внимание — в двух случаях перед Rows поставлена точка — это своего рода якорь для With.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Udalenie_Pustyh_Strok2()

Dim r As Long, FirstRow As Long, LastRow As Long

With Sheets(«Все данные»)
FirstRow = .UsedRange.Row
LastRow = .UsedRange.Rows.Count — 1 + .UsedRange.Row
For r = LastRow To FirstRow Step -1
If Application.CountA(.Rows(r)) = 0 Then
.Rows(r).Delete
End If
Next r
End With

Вы всё сделали правильно, разве что упустили один маленький момент. Ваш Delete удаляет строки Rows, вот эти строки тоже надо было привязать к листу. Предлагаю макрос подкорректировать так. Обратите внимание — в двух случаях перед Rows поставлена точка — это своего рода якорь для With.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Udalenie_Pustyh_Strok2()

Dim r As Long, FirstRow As Long, LastRow As Long

With Sheets(«Все данные»)
FirstRow = .UsedRange.Row
LastRow = .UsedRange.Rows.Count — 1 + .UsedRange.Row
For r = LastRow To FirstRow Step -1
If Application.CountA(.Rows(r)) = 0 Then
.Rows(r).Delete
End If
Next r
End With

Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279

Сообщение televnoy, здравствуйте.

Вы всё сделали правильно, разве что упустили один маленький момент. Ваш Delete удаляет строки Rows, вот эти строки тоже надо было привязать к листу. Предлагаю макрос подкорректировать так. Обратите внимание — в двух случаях перед Rows поставлена точка — это своего рода якорь для With.

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Sub Udalenie_Pustyh_Strok2()

Dim r As Long, FirstRow As Long, LastRow As Long

Источник

Выборочное отображение листов пользователям

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

Классический способ определения имени заключается в использовании очевидного свойства UserName объекта Application:

Выполнение такого макроса приведет к появлению простого окна сообщения с приветствием:

Неплохо, несложно, но есть одно «но». В качестве UserName макрос берет имя пользователя, которое введено в поле Пользователь в параметрах Excel Файл — Параметры — Пользователь (File — Options — User) :

Засада в том, что это имя любой пользователь у себя на компьютере может в любой момент свободно поменять на любое другое. А у корпоративных пользователей там, зачастую, при установке Office автоматически прописывается какой-нибудь безличный «user».

Чуть более сложным, но гораздо более надежным способом, будет брать не имя пользователя из параметров Excel, а логин входа в Windows. Его поменять уже не так легко и, для большинства пользователей, он уникален в пределах локальной сети компании.

Чтобы считать его нам потребуется использовать малоизвестную функцию VBA Environ, которая выдает информацию о различных параметрах операционной системы и Office на текущем компьютере. Аргумент USERNAME заставит эту функцию считать логин пользователя в Windows, под котороым сейчас произведен вход в компьютер:

Таким образом, несложно организовать с помощью простого макроса, своего рода защиту при открытии файла — если книгу открывает не тот человек, то ему не показываются определенные листы с приватной информацией или промежуточными вычислениями. Если открыть редактор Visual Basic (Alt+F11) и затем двойным щелчком открыть в левом верхнем углу модуль ЭтаКнига (ThisWorkbook), то туда можно вставить макрос обработки события открытия книги, который и будет выполнять эту функцию защиты:

Теперь все листы будут видны только пользователю с именем (логином) Nikolay, а для всех остальных из трех листов книги будет виден только второй. Простор для применения этой функции широкий — пользуйтесь 😉

Источник

Каждому пользователю свой лист/диапазон

Очень часто на своих тренингах и в форумах я слышу вопрос: как защитить доступ к книге так, чтобы для каждого пользователя был доступен только свой лист/листы? А другие ячейки или листы были недоступны для изменения или просмотра? Или скрыть отдельные столбцы с глаз пользователя? Часть подобного функционала предоставляется стандартными средствами Excel, а другая(например, доступность просмотра только конкретных листов) достигается только через макросы. В этой статье хочу привести несколько примеров реализации подобных разграничений прав между пользователями, их плюсы и минусы.

Разграничение доступа к ячейкам стандартными средствами
Для разграничения доступа к ячейкам на листе можно воспользоваться инструментом Разрешить изменение диапазонов (Allow Users to Edit Ranges) , расположенном на вкладке Рецензирование (Review) , группа Изменения (Changes) :

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

Например, сотрудники коммерческого отдела в общем файле бюджета(картинка выше) должны иметь возможность заполнять только ячейки строк со статьями выручки (строки 8-11, 13-14), а производственный отдел строки 18-22, в которых расположены статьи по расходам производственного отдела. При этом сотрудники коммерческого отдела не должны иметь возможность изменять данные статей другого отдела – каждый только данные своих статей.
Для начала необходимо для сотрудников каждого отдела создать отдельные диапазоны, к которым они будут иметь доступ. Для этого переходим на вкладку Рецензирование (Review) -группа Изменения (Changes)Разрешить изменение диапазонов (Allow Users to Edit Ranges) . Появится диалоговое окно создания/изменения диапазонов:

Нажимаем Создать (New) . Появится другое окно, в котором необходимо указать имя диапазона (Title) ( коммерческий ), доступные для изменения ячейки (Refers to cells) ( C8:N11;C13:N14 ) и вписать пароль (Range password) ( 1111 ):

После нажатия Ок появится окно подтверждения пароля. Необходимо указать тот же пароль, что был указан ранее для данного диапазона.
Примечание: если нажать на кнопку Разрешения (Permissions) , то можно установить доступ без пароля для конкретных групп пользователей, если группы настроены политикой доменной сети.
Точно так же создаем второй диапазон – «производственный», но для него указываем другой пароль(например – 2222 ). После этого у нас в главном окне управления диапазонами будет два диапазона:

Здесь можно еще раз проверить все ли правильно указано, при необходимости изменить (так же изменить диапазоны можно в любое время, вызвав данное окно с вкладки Рецензирование (Review)Разрешить изменение диапазонов). После этого нажимаем Применить (Apply) .
Теперь, чтобы такая защита сработала необходимо непосредственно защитить лист. Это можно сделать либо сразу из этого же окна, нажав кнопку Защитить лист, либо закрыв окно перейти на вкладку Рецензирование (Review) и в группе Изменения (Changes) выбрать Защитить лист (Protect sheet) :

В появившемся окне проставляем галочки для тех действий, которые мы хотим разрешить делать пользователю на защищенном листе без ввода пароля(например, на картинке выше помимо стандартного выделения ячеек разрешена вставка столбцов. Подробнее про защиту листов и ячеек можно прочитать в статье — Защита листов и ячеек в MS Excel). Указываем пароль (например 3333 ), подтверждаем пароль в появившемся окне и нажимаем Ок. Лист защищен.

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

Теперь остается сообщить сотрудникам отделов их пароли: производственный — 2222 , коммерческий – 1111 .
При первой попытке изменить данные в ячейках C8:N11;C13:N14 — будет запрошен пароль на изменение ячеек созданного диапазона «коммерческий» ( 1111 ):

Если пользователю известен пароль для диапазона – его необходимо будет ввести лишь один раз. В дальнейшем для ввода данных в ячейки этого диапазона вводить пароль не придется до тех пор, пока файл не будет закрыт. После повторного открытия файла пароль необходимо будет указать заново.
Однако, если сотрудник другого отдела попытается изменить ячейки производственного отдела и пароль ему неизвестен – изменить данные этих ячеек не получится.
Также ни сотрудники коммерческого отдела, ни сотрудники производственного отдела не смогут изменить данные столбцов А и В(№ и наименование статьи), заголовки таблицы(строки с 1-ой по 7-ю) и строки с итоговыми формулами (12, 15 и т.д. – закрашенные зеленым). Они смогут изменять только те ячейки, которые перечислены в назначенных каждому отделу диапазонах. Внести данные в другие ячейки(не перечисленные в разрешенных диапазонах) можно будет исключительно сняв общий доступ с книги, а после этого защиту с листа –Рецензирование (Review) -группа Изменения (Changes)Снять защиту листа (Unprotect sheet) . Но снять общую защиту сможет только тот, кто её создавал и кому известен «главный» пароль. Как правило это администратор или некий «смотрящий» файла и другие пользователи этот пароль не знают.
Плюс подобного метода в том, что такая защита может быть установлена для книги в общем доступе(подробнее про книги с общим доступом можно прочитать в статье — Ведение журнала сделанных в книге изменений).
Что необходимо учитывать для книг с общим доступом: создавать диапазоны для пользователей и устанавливать защиту на лист необходимо ДО назначения книге общего доступа, т.к. после того, как книге будет назначен общий доступ изменять параметры защиты листов и книги запрещено. При этом запрещены как установка защиты так и её снятие.
Минус данного метода в том, что нет дружественного интерфейса снятия защиты. Например, при попытке изменить какие-то ячейки одного из назначенных диапазонов нет никакой информации о том, что это за диапазон(коммерческий или производственный). Что в свою очередь может запутать пользователя. Так же данным методом невозможно скрыть листы, либо отдельные строки и столбцы. Можно лишь запретить изменение ячеек.

Разграничение прав доступа при помощи VBA
Самый большой минус всех методов ниже: они не будут работать при отключенных макросах (Что такое макрос и где его искать?). Во всех приложенных к статье файлах это предусмотрено и если макросы будут отключены, то пользователь увидит лист, предлагающий включить макросы. Подробнее см. в статье: Как запустить файл с включенными макросами?
Плюс подобного подхода — мы практически не ограничены в правилах: можем скрывать от отдельных пользователей любые листы, строки и столбцы, защищать отдельные ячейки и т.п. Я ниже приведу несколько вариантов реализации защиты кодами, а вам останется лишь выбрать тот, который больше подходит под задачу. Первые три больше демонстрационные, чтобы показать что можно сделать. А вот последний пример — Практический пример с использованием администратора — наиболее приближен к задачам, применяемым в работе и наиболее удобен для распространения среди пользователей.
Проект VBA во всех файлах открыт для просмотра и изменений . Однако перед распространением решений в реальности лучше его закрыть от просмотра и изменений — Как защитить проект VBA паролем.

Важно: приведенные ниже решения могут работать некорректно в книгах с общим доступом. А те решения, в которых устанавливается защита на листы вообще не будут работать, т.к. для книг с общим доступом невозможно изменять параметры защиты листов и книг.

Доступ пользователям только к определенным листам
Исходная задача: дать возможность пользователю видеть и работать только на определенных листах — тех, которые мы ему выделили. При этом он даже не подозревает, что есть другие листы. Как работает. Открываем файл — автоматом отображается лишь один лист «Main», доступный всем пользователям, жмем на кнопку, появляется форма:

В форме необходимо выбрать пользователя и указать пароль, соответствующий этому пользователю. Важно: Пароли и список доступных листов можно редактировать на очень скрытом листе «Users». Для каждого пользователя можно указать несколько листов. Указывать имена листов необходимо в точности такие же, какие они на самом деле. Это значит, что и регистр букв и каждый пробел должен быть учтен. Для разделения записей с несколькими листами используется точка-с-запятой(Лист1;Лист2;Лист3).
На листе «Main» перечислены имена пользователей, пароли для них и доступные для просмотра листы. Данная информация указаны только для ознакомления и тестов. Менять данные для реальных задач необходимо на листе «Users».

Важно: файл может работать нестабильно в книгах с общим доступом.

Tips_Macro_Sheets_for_Users.xls (84,5 KiB, 10 513 скачиваний)

Доступ пользователю к определенным листам и возможность изменять только отдельные ячейки
Помимо того, что можно ограничить пользователю свободу выбора листов, ему можно еще и ограничить диапазоны ячеек, которые ему разрешено изменять. Иначе говоря, человек сможет работать только на Лист1 и Лист2 и вносить изменения только в указанные для каждого из листов ячейки. Файл с примером работает так же, как и пример выше: открываем книгу — видим только один лист «Main», жмем кнопку. Появляется форма, выбираем пользователя. Появятся только разрешенные листы и на этих листах можно изменять только те ячейки, который мы разрешим в настройках. При этом диапазоны для изменения можно указать для каждого листа разные. Важно: Пароли, список доступных листов и диапазонов можно редактировать на очень скрытом листе «Users». Для этого его необходимо отобразить, как описано в статье: Как сделать лист очень скрытым.
Чтобы разрешить изменять диапазоны на Лист1 — А1:А10 и А15:А20 , а на Лист2 — В1:В10 и В15:В20 , необходимо на листе «Users» указать листы: Лист1;Лист2 и диапазоны: A1:A10,A15:A20;B1:B10,B15:B20
На листе «Main» пароли и фамилии указаны только для ознакомления и тестов. Менять данные для реальных задач необходимо на листе «Users».
Пароль на листы указывается напрямую в коде. Для изменения пароля необходимо перейти в редактор VBA(Alt+F11), раскрыть папку Modules, выбрать там модуль sPublicVars и изменить значение 1234 в строке: Public Const sPWD As String = «1234» :

Важно: защита диапазонов достигается за счет установки защиты листа. Поэтому файл не будет работать в книгах с общим доступом.

Tips_Macro_Sheets_Rng_for_Users.xls (86,0 KiB, 4 855 скачиваний)

Доступ к определенным листам и скрытие указанных строк/столбцов
И еще чуть-чуть испортим жизнь пользователю: каждому пользователю видны только свои листы и виден только свой диапазон на этом листе. Точнее — строка или столбец. Все так же, как и в файлах выше(Пароли, список доступных листов и диапазонов можно редактировать на очень скрытом листе «Users». Для этого его необходимо отобразить, как описано в статье: Как сделать лист очень скрытым).
На листе » Users » доступны следующие настройки: в самом правом столбце необходимо указать скрывать столбцы(C) или строки(R) указанного диапазона.
Например, указаны диапазоны на Лист1 — А1:А10 и А15:А20 , а на Лист2 — В1:В10 и В15:В20 , а в правом столбце — R;C . Значит на Лист1 будут скрыты строки 1:10 , 15:20 , а на Лист2 столбец В. Почему так заумно? Потому что нельзя скрыть только отдельные ячейки — можно скрыть лишь столбцы или строки полностью.
На листе «Main» пароли и фамилии указаны только для ознакомления и тестов. Менять данные для реальных задач необходимо на листе «Users».
Пароль на листы указывается напрямую в коде. Для изменения пароля необходимо перейти в редактор VBA(Alt+F11), раскрыть папку Modules, выбрать там модуль sPublicVars и изменить значение 1234 в строке: Public Const sPWD As String = «1234» :

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

Tips_Macro_Sheets_Hide_Rng_for_Users.xls (100,0 KiB, 4 524 скачиваний)

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

Если выбрать «Пользователь» — admin , указать «Пароль» — 1 , то все листы файла будут отображены. Другим пользователям будут доступны только назначенные листы. Таким образом, пользователь, назначенный администратором сможет легко и удобно менять настройки и права доступа пользователей: добавлять и изменять пользователей, их пароли, листы для работы(они доступны на листе Users , как и в файлах выше). После внесения изменений надо просто закрыть файл — он сохраняется автоматически, скрывая все лишние листы.
При этом если пользователя нет в списке или пароли ему неизвестны, то при нажатии кнопки Отмена или закрытии формы крестиком файл так же закроется. Таким образом к файлу будет доступ только тем пользователям, которые перечислены в листе Users, что исключает доступ к файлу посторонних лиц.
Если макросы будут отключены, то пользователь увидит лишь один лист — с инструкцией о том, как включить макросы. Остальные листы будут недоступны.
В реальных условиях не лишним будет закрыть доступ к проекту VBA паролем: Как защитить проект VBA паролем

Важно: файл может работать нестабильно в книгах с общим доступом.

Tips_Macro_UsersRulesOnStart.xls (72,0 KiB, 6 276 скачиваний)

Статья помогла? Поделись ссылкой с друзьями!

Источник

Adblock
detector

На чтение 1 мин. Просмотров 4.7k.

Что делает макрос: помогает открыть Excel-книгу на нужном листе. С этим макросом Ваши пользователи будут сразу оказываться в конкретном месте файла.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как это использовать

Как макрос работает

Этот код запускается по событию рабочей книги (Open— при открытии файла) и делает активным нужный лист.

Код макроса

Private Sub Workbook_Open()
'Указываем нужный нам лист
Sheets("Отчёт").Select
End Sub

Как это использовать

Для реализации этого макроса, вам нужно скопировать и вставить его в код события Workbook_Open. Размещение макроса здесь позволяет запускать макрос сразу при открытии excel- файла.

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. В окне проекта найдите свой проект/имя рабочей книги и нажмите на знак плюс рядом с ним в чтобы увидеть все листы и модуль ЭтаКнига.
  3. Правой кнопкой мыши нажмите на модуле ЭтаКнига и выберите View Code
  4. В левой части окна выберите объект WorkBook (Excel автоматом предложит написать макрос для события Workbook_Open, если нет, то выполните п.5
  5. В правом выпадающем списке событие Open

I know you’ve figured this out, probably after much hair-tearing and coffee, but I wanted to:

  • Give you more details on why this is
  • Provide you with a way you could use
    your sheet’s name to get what you
    want.

First of all, the worksheet name you are wanting is not the same thing as the code module name. So in your VBE, you see that the name of the code module is «Sheet1», but if may have a different property of Name which is different, for example, «MySheet1» (or it also may be the same).

In order to get it by name, you’ll have to do some loops, change security settings, etc. If that’s what you’re after (this works well in smaller environments because of the security setting issue), here you go as an example:

  1. Change your security settings to
    trust programmatic access to VBA
    Projects. In Excel 2007, go to Orb | Excel Options | Trust Center | Trust Center Settings | Macro
    Settings and then enable «Trust
    access to the VBA project model»
  2. Create a workbook with one
    worksheet. Rename it «MySheet1«.
    Open the VBE (Alt+F11) and in
    «Sheet1 (MySheet1)» create a sub
    routine, call it TimesTen and in
    the code just put Debug.Print 10 *
    10
    . Like this:

    Sub TimesTen()
        Debug.Print 10 * 10
    End Sub
    
  3. Save the file as an macro-enabled
    document and call it
    «MacroXSLX.xlsm«. Leave it open.

  4. Open a new Excel document, navigate
    to it’s VBE and in a new macro
    anywhere, create a sub called
    Test. In the body of that code,
    put this:
    .

    Sub test()
    Dim SheetName As String
    SheetName = "MySheet1"
    Dim wb As Workbook
    Set wb = Workbooks("MacroXSLX.xlsm")
    For Each VBComp In wb.VBProject.VBComponents
        If VBComp.Properties.Item("Name").Value = SheetName Then
            Application.Run (wb.Name & "!" & VBComp.Name & ".TimesTen")
        End If
    Next
    End Sub
    
  5. Press F5 to run test and you
    should see 100 in the Immediate
    window.

You can see in #4 that I’m looping through all the components (Modules, Classes, etc.) looking for the one that has a Name property that has a value of MySheet1. Once I have that, I can then get the name of that component, which in this case is Sheet1 and use that to construct my string that will run the sheet’s macro in MacroXSLX.xlsm. The code can be cleaned up further to exit the For statement when you’ve found what you want, etc.

As mentioned above, the only real draw-back to this is the security settings piece and ensuring you have programmatic access to the VBAProject — fine on one to ten computers, but could be a hassle if you have to ensure more than that are always set correctly.

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