Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA

Модерирует : ShIvADeSt

ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

RUSmafia



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами Excel (об этом можно уточнить здесь) или требующая автоматизации, попробуйте для начала записать макрос самим Excel через меню Сервис (Tools) - Макрос (Macro) - Начать запись (Record New Macro). Подробнее здесь. В большинстве случаев получившийся код (Сервис-Макрос-Макросы-Изменить) Вас не удовлетворит, но подскажет, какие объекты-методы-свойства использовать.  
    Другой Ваш помощник - Просмотр объектов (Object Browser). Ну и встроення помощь (F1), естественно.
     
    Если Вы в тупике, покажите Ваш код (или часть кода) здесь.  Если вылазит ошибка, цитируйте ее полностью. Если код слишком большой, используйте тeг [more].
    Используйте отладчик - Breakpoints (F9), Watches (Shift-F9), Steps (F8 и др.) Сильно облегчает поиск ошибок.

     
    Рекомендуется к прочтению:
  • Первые шаги с Excel VBA
  • Excel VBA: Приёмы программирования
  • WinApi. Лекция из курса "Основы офисного программирования и язык VBA" (для продвинутых)
  • Daily Dose of Excel (eng.) - тематический блог: советы по работе с Excel и прочие материалы
  • Excel Macros & Excel VBA Code Tips, Tricks (eng.) - советы, трюки и уловки
  • Mr. Excel (forum) (eng.) - весьма оживленный форум по Excel&VBA.
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов

  • Всего записей: 556 | Зарегистр. 31-07-2002 | Отправлено: 21:40 14-10-2004 | Исправлено: lucky_Luk, 20:44 13-04-2007
    sonix555



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    всем привет,
    1) у меня на элементах управления отображаются вопросительные знаки "?". Пробовал на других компах - все нормально. Есть лекарство?
     
    2) существует ли такая возможность: при нажатии на "волшебную" кнопку рабочая книга сохраняется в папку "Переданные" клиента TheBat! (ну или любого другого), с нужными реквизитами ("кому", "тема" и "текст письма")?
    Может кто-то писал подобные макросы? Буду оч благодарен за фрагменты
     
    3) Ситуация: есть локальная сеть, в ней сервак на котором лежит куча файлов (ексель) одинаковой структуры. Юзеры периодически запускают эти файлы с сервака. Можно ли сделать так, чтобы файлы использовали один програмный код? Т.е. при изменении кода не нужно было бы открывать каждую книгу и менять в ней макросы, а сделать это в одном месте и для всех?

    Всего записей: 8 | Зарегистр. 03-07-2006 | Отправлено: 13:40 07-07-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, возможно ли реализовать следующую идею.
    Есть файл с сылками на ячейки других фыйлов.  
    Вопрос: Возможно ли сделать так, чтобы по щелку мышью по ячейке с сылкой открывался файл, на который сделана ссылка, и курсор устанавливался на ссылаемую ячейку? (Гиперссылки не предлагать)

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 13:48 07-07-2006
    vAkUuM



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1
    А вот такой примерчик подойдёт?
    /Есть 2 книги Exel. В одной в ячейке А1 ссылка на ячейку в Книге Book2 на ячейку А1 листа Sheet1/
     

    Код:
     Sub Example()  
        Range("A1").Select
        Windows("Book2.xls").Activate
        Sheets("Sheet1").Select
        Range("A1").Select  
             End Sub  


    Всего записей: 21 | Зарегистр. 21-02-2002 | Отправлено: 14:05 07-07-2006
    zporuchik



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ОФТОП:
    Никто не знает, чем можно сгенерить функцию по заданной последовательности чисел?

    Всего записей: 2131 | Зарегистр. 17-03-2005 | Отправлено: 14:17 07-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Virtualexx

    Цитата:
    Вы зря кипятитесь.
    С чего это ты взял? Это я от скуки и не имея конкретно никого ввиду.

    Цитата:
    Код:
    Application.EnableEvents = True
    ...
    Application.EnableEvents = False
    ...
     
    Не понял. Этим кодом ты запрещаешь обработку событий (Change, SelectionChange, Calculate и т.п.), но отнюдь не защищаешь ячейку от случайного изменения. Похоже ты не до конца разобрался.  

    Цитата:
    кнопку (макрос), которая будет отменять действие последнего выполненного макроса?
    С этим проблемы. Undo обычно не сохраняет изменения сделанные макросом. Единственный выход имхо - делать обратный макрос.
     
     
     
    Добавлено:
    eowyn
    Проверь Сервис - Совместное использование. Если включено, макросы блокируются.
     
    Добавлено:
    sonix555
    1) Вместо русских символов или любых других? Скорее всего проблема или с руссификацией или определенным шрифтом.
    3) Один из вариантов сделать шаблон с макросами, а в каждый файл прописать функцию Workbook_Open с
    Код:
    Workbooks.Open FileName:="имя шаблона" Editable:=False ReadOnly:=True

    Попробуй.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 18:07 07-07-2006
    lucky_Luk

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk

    Цитата:
    В 97-м офисе по другому работа с динамическими массивами. У меня его нет, так что извини.
    Попробуй убрать () в строках:
    Dim aArray() As Variant
    и
    Dim t() As Variant  

    Убрал, ВСЕ ЗАРАБОТАЛО под Office 97, спасибо. Прошу завсегдатаев топика еще погонять макрос на Office 97 и если не будет багов добавить это в шапку.

    Всего записей: 7100 | Зарегистр. 29-11-2004 | Отправлено: 21:29 07-07-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vAkUuM
    Если ве так было просто, то я бы и сам такое написал, смысл в том, что таких ячеек с сылками много - около 200. Что-же мне для каждой писать обработчик событий? Тут нужен универсальный подход. Т.е. вытыщить из ссылки адрес файла и ячеки. Но сслыки не однородны.

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 22:50 07-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1
    Можно несколько примеров ячеек с ссылками?
    Что значит ссылки не однородны?
    Почему нельзя гиперссылки использовать?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 23:07 07-07-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Файлы на работе, но попробую по памяти.
    Опечатался. Ссылки не одинаковые. Но определенный принцип построения есть.
     
    c:\navi\svodF\otchet\2006_200\[00_0503121.xls]2'!$E$7
    c:\navi\ - эта часть постоянна
    SvodF - может быть SvodF, SvodO, SvodR  
    2006_200 - тут думаю понятно год_кварталмесяц т.е. м.б. 2006_100, 2006_101 и т.п.
    00_0503121 - вместо 00 - код подразделения от 01 до 60   Изначально в ссылке стоят 00 но в процессе работы макроса они меняются на код подразделения.
    0503121 - код отчетной формы
     
    В ячейке может быть ссылка на несколько ячеек (их сумма, разница и т.п.)
    Может с гиперссылками я погорячился, но все мои попытки решить задачу с их помощью получились неудачными. Т.к. ссылка у меня динамичная а гиперссылка получается статичной.

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 23:30 07-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1
    Как насчет макроса, переделывающего текст в гиперссылку:

    Код:
    Sub MakeLink()
        s = Replace(Selection.Value, Chr(39), "")
        addr = Mid(s, InStr(1, s, "]") + 1)
        s = Left(s, InStr(1, s, "]") - 1)
        fname = Replace(s, "[", "")
        ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=fname, _
            SubAddress:=addr, TextToDisplay:=Selection.Value
    End Sub

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

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 01:10 08-07-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Идея неплохая, реализвалась в следующий код
    Подробнее...
    Но это не рашает всей задачи, т.к.
    1. применимо только к простым сылкам, а ссылки  вида:
    =ОКРУГЛ('D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$61;2)
    =ОКРУГЛ('D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$55+'D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$61+'D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$64;2)-'D:\NaviA\SvodF\Othet\2006_200\[44_рас_1.XLS]2'!$I$127
    данный трюк не проходит
    Я не могу знать кто, какую ссылку сделает в файле увязок.
    2. файлы на которые делаются гиперссылки запаролены, соответственно при нажатии на гиперссылку вылазиет окно с запросом пароля.
    Думаю повесить макрос на кнопку и открывать файл из ссылки через workbooks.open
    Но опять же это не решает проблемы с длинными ссылками

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 21:25 08-07-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1
    Уважаемый, чего-то я в данную тему не могу въехать. Аж хочу зайти и сделать парочку книжек в Excel и проверить о чём Вы тут... ;-))
    но:

    Цитата:
    Но опять же это не решает проблемы с длинными ссылками

    Конечно. Потому что логига такая.
    Как я вижу, тут формулы, в ней адреса несколько ячеек... так на какую вы собираетесь переходить? И, кстати, даже из разных книг... на первую переходить?
     

    Цитата:
    файлы на которые делаются гиперссылки запаролены

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

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 08:06 09-07-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK

    Цитата:
    И, кстати, даже из разных книг... на первую переходить?  

    Да, на первую в ссылке. Разные книги в ссылках практически не встречаются.
    Как открыть через гиперссылку с паролем я не знаю.
    Через Workboos.open открываю. Задача состоит не втом, чтобы запретить открывать книги, а чтобы их открывали черерз макрос. За год работы никто из моих пользователей, а их более 50 не нашел пароль. Не тот контингент. Да и не нужно им это. Все и так замечательно работает. Да и не храниться он в явном виде в макросе.

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 10:15 09-07-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Разные книги в ссылках практически не встречаются

     

    Цитата:
    =ОКРУГЛ('D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$55+'D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$61+'D:\NaviA\SvodF\Othet\2006_200\[44_0503121.xls]2'!$S$64;2)-'D:\NaviA\SvodF\Othet\2006_200\[44_рас_1.XLS]2'!$I$127  

     
    в вашем примере, две книги - 44_0503121.xls и 44_рас_1.XLS
    Тот код, который вы используете и вернёт вам имя первой книги! Или я ошибаюсь?..
     
    по поводу пароля, посмотрим, что скажет уважаемый эксперт Yuk...
     

    Цитата:
    Да и не храниться он в явном виде в макросе.

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

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 10:50 09-07-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK

    Цитата:
    Тот код, который вы используете и вернёт вам имя первой книги! Или я ошибаюсь?..

    Ну не возвращает он имя первой книги, а почему, я еще не разобрался.
    Я хочу, чтобы пароль был в макросе. Но при этом же не обязательно его там явно указывать. Если интересно могу показать как.

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 11:18 09-07-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    пароль был в макросе. Но при этом же не обязательно его там явно указывать. Если интересно могу показать как.
    интересно! Покажите, плиз...
     

    Цитата:
    не возвращает он имя первой книги

    я тоже гляну, может успею разобраться...

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 15:09 09-07-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Теперь все ссылки обрабатывает.
    Cells(j, 7).Select
    If Cells(j, 7).Text <> "" And Cells(j, 8) <> "" Then
        s = Replace(Selection.Formula, Chr(39), "")
        addr = Mid(s, InStr(1, s, "]") + 1)
        If Right(addr, 1) = ")" Then addr = Left(addr, Len(addr) - 3)
        If InStr(1, addr, "+") > 0 Then addr = Mid(addr, 1, InStr(1, addr, "+") - 1)
        If InStr(1, addr, "-") > 0 Then addr = Mid(addr, 1, InStr(1, addr, "-") - 1)
        s = Left(s, InStr(1, s, "]") - 1)
        fname = Replace(s, "[", "")
        fname = Right(fname, Len(fname) - 1)
        If Left(fname, 5) = "ROUND" Then fname = Right(fname, Len(fname) - 6)
        If Right(fname, 1) = ")" Then fname = Left(fname, Len(fname) - 3)
        Workbooks("_Ошибки.xls").Activate
        Cells(numins, 7).Select
        ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=fname, SubAddress:=addr, TextToDisplay:=Selection.value ', SubAddress:=addr
        Workbooks(NameUvyaz).Activate
    End If
     
    Но проблема с паролем остается
    SERGE_BLIZNUK
    Любой выполнить макрос с паролем не может. Для этого надо знать имя макроса.
    А просматривать всесь программный код )) - время тратить непонятно для чего. Разве только ради спортивного интереса.
     
    Workbooks.Open Filename:=AWP_O_FN & "\" & IndexFile & "_" & OpenNameFile, WriteResPassword:=Workbooks(AWN).Worksheets("6").Cells(4, 3).Text
    Т.е. пароль храниться в книге в ячейке. Лист защищен. ячейка скрыта. Т.е. просто так посмотреть пароль нельзя.
    Можно усложнить еще следующим образом:
    Workbooks(AWN).Sheets(Chr(51)).Range(Chr(98) & Chr(49) & Chr(51))
    Но все это детские игры т.к. если захотят всеравно найдут. ))

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 16:31 09-07-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1

    Цитата:
    Но проблема с паролем остается
    А в чем проблема? У тебя же уже практически все есть. Если можешь выделить путь и имя файл, лист и ячейку, замени создание гиперлинка на открытие файла, активизацию листа и выделение ячейки.
     
    А что касается проблем безопасности, это каждый решает сам для себя. Принимая во внимание и уровень пользователей, и критичность скрываемых данных.
    Удачи.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 07:07 10-07-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо
    Я уже так и сделал. Но просто подумал, что и для гиперссылок можно в макросе задавать пароль, ан нет

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 08:51 10-07-2006
    Virtualexx



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    по поводу отмены выполненного макроса: нельзяли сделать следующее с помощью макроса:
     

    Цитата:
    Вариант II. В меню Сервис выберите команду Доступ к книге, выделите закладку Правка. Далее установите "флажок" напротив Разрешить совместный доступ и нажмите кнопку ОК. Затем на все вопросы отвечайте ОК.  
    Для просмотра и отмены изменений в этой рабочей книге выберите в меню Сервис пункт Исправления, а затем команду Принять/отклонить исправления.  
     
    Примечание : Общая книга имеет ряд ограничений, которые обязательно необходимо учитывать при работе с подобной книгой.

     
    Пробовал записать, получается пустым...

    Всего записей: 10 | Зарегистр. 06-07-2006 | Отправлено: 12:48 10-07-2006
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA
    ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru