FusionBY Пользователь Сообщений: 18 |
Добрый день. В очередной раз ищу помощи сообщества. Такой вопрос,макрос сейчас выполняется по нажатию кнопки на конкретной странице. Идея состоит в том, чтобы макрос выполнялся не по нажатию, а при открытии книги. Поместить его в Private Sub Workbook_Open() не составило труда, однако макрос будет работать корректно только если книга откроется на нужном листе. Открываться книга конечно же будет на другом листе с расчетами, а курсы будут подставляться через функцию ВПР, помогите указать абсолютный путь исполнения макроса. P.S. Это нужно для того, чтобы Пользователь не запаривался о том, как обновляются циферки на странице и просто получал данные. |
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
#2 20.05.2015 15:31:22 Как обратиться к диапазону из VBA
Кратко:
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Слэн Пользователь Сообщений: 5192 |
#3 20.05.2015 15:45:32 у листа есть так называемое кодовое имя — вот по нему и можно обращаться пример:
Живи и дай жить.. |
||
Слэн Пользователь Сообщений: 5192 |
самый малозатратный метод — в начале макроса запомнить текущий лист, перейти на нужный, отработать(без изменения кода), восстановить активность прежнего листа |
FusionBY Пользователь Сообщений: 18 |
А можно по подробнее о последнем методе? |
Scripter Пользователь Сообщений: 255 |
#6 21.05.2015 04:58:55 В дополнении к перечисленным
|
||
FusionBY Пользователь Сообщений: 18 |
Что-то я не совсем понимаю, к чему можно прикрутить «Sheets(«ИмяЛиста»).[A1].Value». Если я правильно понял, самый малозатратный метод будет работать следующим образом: Как это осуществить? |
Hugo Пользователь Сообщений: 23249 |
Зачем вообще переходить на другой лист, если нужно возвращаться? Без перехода всё обычно можно сделать (за редким исключением, что есть глюк экселя, сталкивался). |
FusionBY Пользователь Сообщений: 18 |
Полностью с Вами согласен, The_Priest предложил самый оптимальный вариант решения, однако мой небольшой опыт общения с VBA существенно усложняет реализацию. Но даже, когда у меня получится, все равно останется интерес к альтернативному способу, с запоминанием, переходом и возвратом на исходную. |
Hugo Пользователь Сообщений: 23249 |
#10 21.05.2015 12:35:07 Да ничего сложного:
P.S. И чего это r? Обычно sh! Хотя разницы нет. Изменено: Hugo — 21.05.2015 12:38:22 |
||
FusionBY Пользователь Сообщений: 18 |
Спасибо. Действительно все очень не сложно оказалось. Может быть вы любезно согласитесь глянуть где я допустил ошибку и почему не работает первый метод? Код идентичный, как при нажатии на кнопку, так и при запуске книги. Однако курсы обновляются только через «button». При открытие появляется только табличка «Готово»! |
Hugo Пользователь Сообщений: 23249 |
#12 21.05.2015 13:09:52 Вообще-то модуль книги — «стрёмное» место… P.S. Беда сидит в строке
Тут дописал лист. Изменено: Hugo — 21.05.2015 13:15:47 |
||
Работа макроса только на определенных листах книги |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
|
Вы всё сделали правильно, разве что упустили один маленький момент. Ваш 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(«Все данные») Вы всё сделали правильно, разве что упустили один маленький момент. Ваш 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(«Все данные») Роман, Москва, voronov_rv@mail.ru Сообщение 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, а другая(например, доступность просмотра только конкретных листов) достигается только через макросы. В этой статье хочу привести несколько примеров реализации подобных разграничений прав между пользователями, их плюсы и минусы. Разграничение доступа к ячейкам стандартными средствами
Теперь остается сообщить сотрудникам отделов их пароли: производственный — 2222 , коммерческий – 1111 . Разграничение прав доступа при помощи VBA
Доступ пользователям только к определенным листам В форме необходимо выбрать пользователя и указать пароль, соответствующий этому пользователю. Важно: Пароли и список доступных листов можно редактировать на очень скрытом листе «Users». Для каждого пользователя можно указать несколько листов. Указывать имена листов необходимо в точности такие же, какие они на самом деле. Это значит, что и регистр букв и каждый пробел должен быть учтен. Для разделения записей с несколькими листами используется точка-с-запятой(Лист1;Лист2;Лист3).
Доступ пользователю к определенным листам и возможность изменять только отдельные ячейки
Доступ к определенным листам и скрытие указанных строк/столбцов
Практический пример с использованием администратора
Статья помогла? Поделись ссылкой с друзьями! Источник Adblock |
На чтение 1 мин. Просмотров 4.7k.
Что делает макрос: помогает открыть Excel-книгу на нужном листе. С этим макросом Ваши пользователи будут сразу оказываться в конкретном месте файла.
Содержание
- Как макрос работает
- Код макроса
- Как это использовать
Как макрос работает
Этот код запускается по событию рабочей книги (Open— при открытии файла) и делает активным нужный лист.
Код макроса
Private Sub Workbook_Open() 'Указываем нужный нам лист Sheets("Отчёт").Select End Sub
Как это использовать
Для реализации этого макроса, вам нужно скопировать и вставить его в код события Workbook_Open. Размещение макроса здесь позволяет запускать макрос сразу при открытии excel- файла.
- Активируйте редактор Visual Basic, нажав ALT + F11.
- В окне проекта найдите свой проект/имя рабочей книги и нажмите на знак плюс рядом с ним в чтобы увидеть все листы и модуль ЭтаКнига.
- Правой кнопкой мыши нажмите на модуле ЭтаКнига и выберите View Code
- В левой части окна выберите объект WorkBook (Excel автоматом предложит написать макрос для события Workbook_Open, если нет, то выполните п.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:
- 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» -
Create a workbook with one
worksheet. Rename it «MySheet1«.
Open the VBE (Alt+F11) and in
«Sheet1 (MySheet1)» create a sub
routine, call itTimesTen
and in
the code just putDebug.Print 10 *
. Like this:
10Sub TimesTen() Debug.Print 10 * 10 End Sub
-
Save the file as an macro-enabled
document and call it
«MacroXSLX.xlsm«. Leave it open. -
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
-
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.