Страницы: 1
RSS
работа функии во всех книгах
 
внутри одной книге функцию можно загнать в    
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
 
А вот как сделать функцию чтобы она запускалась во всех книгах автоматически?  
не хочется копировать каждый раз один макрос во все книги.  
например по двойному нажатию на определенный столбик выделялась вся строка и т.п. функции
 
В личную книгу макросов код надо закидывать. VBAProgect(Personal.XLS)
At odd moments: VBA, VB6, VB.NET, Java, Java for Android, Java Script, Action Script, Windows Scriping Host
 
создал книгу Personal.XLS  
создал модуль с функцией  
Public Function plus(a As Integer, b As Integer)  
plus = a + b  
End Function  
но функция работает только в этой книге
 
чтобы функцию можно было использовать без ссылки на книгу, в которой она прописана, нужно эту книгу сделать надстройкой.
 
{quote}{login=андрей}{date=09.01.2009 11:44}{thema=}{post}создал книгу Personal.XLS  
создал модуль с функцией  
Public Function plus(a As Integer, b As Integer)  
plus = a + b  
End Function  
но функция работает только в этой книге{/post}{/quote}  
 
 
 
Создавать ничего не нужно. Вы когда макрос начинаете записывать выбираете меню Сервис – Макрос – Начать запись (там окно появляется «Запись макроса» и в пункте «Сохранить в» выбираете из выпадающего списка «Личная книга макросов» - макрос будет доступен во всех книгах excel (т.е. можно смело создавать кнопки и вешать их на панели инструментов и т.п. они будут работать во всех приложениях); если выбираете «Эта книга» то макрос создается только для текущей книги. Можно еще выбрать «Новая книга» - тогда автоматически создается еще одна чистая книга, в которой можно потренироваться.    
В редакторе кода VBA (если вы выбрали пункт «Личная книга макросов» и появится тот самый VBAProgect(Personal.XLS) о котором я говорил в первом посте там как и в обычной книге можно будет выбрать из проджект-эксплорера либо Эта книга либо Лист. Весь код из модуля Лист будет доступен в списке макросов, а в модуль эта книга можно кидать код, который должен запускаться, например при открытии всех файлов ))))))))))))
 
З.Ы. Личная книга макросов Personal.exs в MS Excel генерируется автоматически при выборе «Сохранить в:» - «Личная книга макросов» в профайле "С:\Documents and Settings\Имя_Администатора_компьютера\Application Data\Microsoft\Excel\XLSTART\PERSONAL.XLS" (с ней можно работать напрямую)  
Если программируете в MS Word, то там наоборот, все макросы по умолчанию пишутся в Normal.dot и только при необходимости можно выбирать текущий документ…
At odd moments: VBA, VB6, VB.NET, Java, Java for Android, Java Script, Action Script, Windows Scriping Host
 
вроде получил исчерпывающий ответ, а все равно не все получается  
записал макрос в личную книгу(personal.xlsb в 2007)  
 
загнал в "Эта книга"    
первое событие срабатывает, а второе нет.  
мою функцию excel из других книг тоже не видит.  
 
 
Public Sub Workbook_Open()  
MsgBox (" fsdfdsfdsfewrt")  
End Sub  
 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)  
MsgBox (" fsdfdsfdsfewrt")  
End Sub  
а мне позарез нужно именно второе событие    
я так понял это событие равно Worksheet_SelectionChange
 
Мне кажется, тут надо писать свой Класс, который будет находится в личной книге макросов и обрабатывать это событие для всех книг.  
 
Итак в модуле ЭтаКнига файла Personal.xls написать  
 
Dim Cls As New Class1  
Private Sub Workbook_Open()  
   Set Cls.XLApp = Application  
End Sub  
 
 
В модуле класса Class1 файла Personal.xls написать  
 
Public WithEvents XLApp As Application  
Private Sub XLApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)  
   MsgBox ("fsdfdsfdsfewrt")  
End Sub  
 
Закрыть полностью весь Excel и на вопрос "Сохранить изменения в лич. книге макросов?" - Ответить "Да"  
 
У меня всё работает.
 
огромное спасибо :)  
у меня тоже все заработало
 
Не за что
 
Pavel55, прошу прощения, думал разберусь дальше сам, но чувствую с макросами мне придется общаться на вы.  
 
хочу дописать еще в событие    
pass = CDbl(Date) * 7  
If idata <> pass Then  
 
idata = InputBox(Prompt:="ой", Title:="", Default:="ай", XPos:=250, YPos:=250)  
MsgBox Application.UserName & Chr(13) & " произошла критическая" & Chr(13) & " ошибка", vbCritical  
и чтобы на весь сеанс работы он запомниал значение idata
 
эм, ничего не понял из вашего кода. А можно вопрос? Что это за строка?  
 
pass = CDbl(Date) * 7  
 
на сколько я знаю Date - это текущая дата  
 
Т.е. pass = CDbl(10.01.2009) * 7  
 
Вы хотите перевести текущую дату в формат Double, а потом полученный результат умножить на 7  
 
Сохранить информацию можно:  
1) На листе Excel в какой-нибудь ячейке (лист можно скрыть)  
2) добавить Имя и присвоить ему значение переменной idata  
3) в реестре Windows (я лично не работал с реестром, но говорят, что не сложно)  
4) наверное ещё где-нибудь
 
просто надоело что по моим фаилам лазеют посторонние. а на каждый файл пароль ставить не хочется. а так это будет что-то типа пароля на все файлы excel.  
(не редко приходится говорить пароль, а так он будет каждый день новый и я всегда буду знать кто там копался в мое отсутствие.)  
 
для этого я пытался сделать, чтобы макрос работал во всех книгах по событию  
SheetSelectionChange  
запускалась проверка пароля и если вводился пароль то можно спокойно работать в excel? иначе постоянно бы выскакивало сообщение.    
но у меня это не получается.    
 
по логике после введения  idata равного pass ничего происходить не должно. а у меня почему-то всеравно выскакивают сообщения  
можно записать значение idata  в персональную книгу макросов?
Страницы: 1
Наверх