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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Anton T
    я не могу помочь вам решить вашу проблему (пока)  
    - но точно могу сказать в чём проблема:
    в функции  TB1_change устанавливается фильтр по  TB1.Text, в TB2_change — по  TB2.Text... Таким образом, когда вы уставливаете фильтр по фамилии, то фильтр по адресу уже не задействован...  
     
    исправить ситацию можно приблизительно так (в TB1_change):

    Код:
     
    strFiltAdr = TB2.Text  
    strFiltAdrLen = Len(strFiltAdr)  
    ...
          If (strFilt = Left(r.Cells(1).Text, strFiltLen) ) _      
            and (strFiltAdr = Left(r.Cells(5).Text, strFiltAdrLen)) Then  
     

    и исправьте описку в вашей форме: Фильтр по фамилии

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 08:55 11-02-2007
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Yuk, SERGE_BLIZNUK
    Спасибо!

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 19:51 11-02-2007
    kandi



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не знаю, в каком топике постить вопрос, поэтому задаю в обоих: "Excel VBA" и "Excel FAQ".
    Пожалуйста, помогите решить такую задачу.
    На листе Excel расположено N-ое количество однотипных табличек с данными. Возле каждой из них находится управляющий элемент - ActiveX command button, по нажатию на который происходит обработка данных соответствующей таблички, строится отчет и выводится на принтер. Задача в том, чтобы каким-то образом определить до обработки данных и построения отчета КАКОЙ именно ActiveX command button был нажат, т.е. либо в переменной, либо в произвольной ячейке получить уникальный идентификатор нажатой кнопки.

    Всего записей: 38 | Зарегистр. 27-12-2003 | Отправлено: 11:08 12-02-2007
    dunamis

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    посоветуйте хорошие курсы VBA в киеве. спасибо

    Всего записей: 5 | Зарегистр. 31-01-2007 | Отправлено: 12:00 12-02-2007
    Pantera3587

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

    Ребята, помогите, пожайлуста, написать код, в выделенном диапазоне  которого числа имеющие точку между разрядами заменялись на числа, имеющие запятую между разрядами (т.е. точку надо заменить на запятую). Функция Заменить не подходит, т.к. надо производить замену по одной ячейке, а надо сразу во всех ячейках, где есть числа. Например, вот в такой таблице:
    Артикул    Наименование    Цена 1    Цена 2  
    47212    Процессор AMD     903.88  
    47213    Процессор AMD     1054.92    1025.42  
    47184    Процессор AMD     1348.74    1309.8  
    55336    Процессор AMD     1253.16  

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 17:02 12-02-2007
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Pantera3587
    так попробуй

    Код:
      For Each c In Selection.Cells
        c.Value = c.Text
      Next

     
     
    Добавлено:
    Это если
    Цитата:
    в выделенном диапазоне

    В противном случае вместо Selection используй ActiveSheet.UsedRange


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 17:27 12-02-2007
    djdtyfhu



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А я вот слышал, что Microsoft хочет убрать VBA из всех своих продуктов Office. Кто что знает по этому поводу?

    Всего записей: 422 | Зарегистр. 28-12-2004 | Отправлено: 18:58 12-02-2007
    The Invisible



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    помогите плиз надо осуществить следующее :
     
    есть несколько больших файлов *.xls
    файлы в виде отчетов допустим с такими колонками:
    имя / фамилия / место / дата
     
    мне надо как то сделать фильтрацию по некоторым колонкам
    допустим выбираю: такая то дата, и такое то имя..
     
    и надо чтоб взяло соответствующие данные из всех файлов *.xls
    и представило в виде одного файла или предложило бы сохранить в виде  *.xls
     
    как такое осуществить ?  
     
    запостил так же в теме про ексель и аксес
    не сочтите за флуд


    Всего записей: 609 | Зарегистр. 20-02-2004 | Отправлено: 19:57 12-02-2007
    serb78

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как создать письмо с вложенным файлом, которое бы отправлялось по времени, к пимеру мне нужно отправлять отчет ежесуточно в 9:00  на один и тот же адресс?

    Всего записей: 5 | Зарегистр. 10-02-2007 | Отправлено: 20:58 12-02-2007
    LevT



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

    Абсолютный новичок в экселе, но неплохо владел когда-то OO-техникой под вордом и акцесом.
     
    Хочу поместить в "ЭтаКнига" и в "Лист1" некоторые свои свойства и методы. Как получить ссылку на них в общем случае (то есть заранее неизвестно, откуда - известно только, что запущен эксель в контексте некоторого макроса, и в этом экселе открыта моя книга)? Имена и типы заранее известны - то есть вопрос не имеет отношения к перечислению typelib. Просто вот добавить бы в код объекта "Лист1" (Workbooks("MyBook").Sheets("MySheet").CodeName) переменную Public MyCustomSheetProperty As String и дергать ее снаружи по мере нужды. Как?
     
    Update.  
    В листы добавлять проперти научился, теперь бы ЭтаКнига победить. Ну никак нигде не вижу там своих методов.

    Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 21:34 12-02-2007 | Исправлено: LevT, 23:47 12-02-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Спасибо за отклик.  Все работает.

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 21:42 12-02-2007 | Исправлено: Pantera3587, 21:45 12-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT
    Переменные и процедуры, объявленные, как Public, видны из любого модуля. Зачем их нужно добавлять именно в Листы и Книгу (объекты, в общем случае, для этого не предназначенные)?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 07:01 13-02-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
     
    Ну вот надо. По опыту ворда придумывал изящные OO-решения таким образом. А то, что не предназначенные, неверно. Только нужна революция в мозгах, чтобы этим воспользоваться.
     
    А Public метод в ЭтаКнига не виден через Workbooks("Name"), по крайней мере.

    Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 10:28 13-02-2007 | Исправлено: LevT, 10:32 13-02-2007
    The okk



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

    Цитата:
    А то, что не предназначенные, неверно. Только нужна революция в мозгах, чтобы этим воспользоваться

    Чтобы записать объявления переменных Public в объект Лист или Книга революция не нужна - я тоже так поначалу делал (да и любой новичок пишет Public переменные туда, куда рука дотянется ). Разницы-то никакой. Они везде видны будут.

    Цитата:
    А Public метод в ЭтаКнига не виден через Workbooks("Name")

    Public - это глобальная вещь. Зачем его видеть через Workbooks("Name"), если можно  просто обратиться к нему по названию откуда угодно? Пишешь Call <название_процедуры>. Зачем обращаться именно как к методу?

    Цитата:
    По опыту ворда придумывал изящные OO-решения таким образом

    По опыту Excel... ничем подобным не занимался . Ибо вообще не представляю, какие преимущества может дать объявление переменных в Листе или Книге. Ну правда, зачем, например, это делать в Excel? Что можно таким образом получить?
     
    P.S.: Если уж тебе действительно это нужно, то вместо
    Код:
    Workbooks("Name").метод
    пиши
    Код:
    ЭтаКнига.метод
    Аналогично с листами: Лист1.метод вместо Worksheets("Лист1").метод.
    Думаю, сам догадываешься, почему

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 10:53 13-02-2007 | Исправлено: The okk, 11:15 13-02-2007
    LevT



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

    Public - это для примера, чтобы проще было показать. Дальше сам разберусь.  А вот еще связанный вопрос. Сделал в буке класс, Instancing = PublicNotCreatable
     
    Как его дергать? Через Workbooks("Name") нифига не видать.
     
     
    Добавлено:
     

    Цитата:
    Лист1.метод вместо Worksheets("Лист1").метод.  

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

    Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 12:34 13-02-2007
    The okk



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

    Цитата:
    Как его дергать? Через Workbooks("Name") нифига не видать.

    Зачем что-то дергать из коллекции Workbooks? Классов в книге нет. - По библиотеке посмотри: они не в Excel, а в VBAProject.
    Создал класс и работай с ним, как с обычным классом.
    Код:
    Dim objTest As Class1
    В чем проблема?

    Цитата:
    Это все хорошо, но мне нужно дергать этот метод в произвольном контексте

    В таком случае, зачем вообще прописывать эту процедуру/метод в объект Лист? Не проще ли создать модуль, записать в него Public процедуру и вызывать её откуда угодно когда угодно, тем более, что это как раз соответствует поставленной задаче. - Глобальную процедуру ты сможешь вызвать из любого контекста.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:28 13-02-2007 | Исправлено: The okk, 13:29 13-02-2007
    LevT



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


    Цитата:
    В таком случае, зачем вообще прописывать эту процедуру/метод в объект Лист?

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

    Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 13:40 13-02-2007 | Исправлено: LevT, 13:43 13-02-2007
    The okk



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

    Цитата:
    Ради эстетизма. ПолиморфизЬм, панимаешь... инкапьсуляцыя тудаже.

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

    Цитата:
    Для кого-то вообще проще классами не пользоваться или пользоваться ими как модулями.  

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

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:57 13-02-2007
    LevT



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
     
    ЭстетизЬма у всех разная. Моя с твоей просто не совпала. Ж)
     
    А вопросы остаются. Или эксель еще меньше ОО, чем ворд?  C вордом я когда-то так натренировался (можно считать, заново открыл ОО и рефакторинг - это когда слова такого еще не было, одновременно с придумавшим его Фаулером), что переходы к VB6 (дайте мне Interface!) и далее на .NET прошли совсем безболезненно.  
     
     
    Добавлено:
     
     
    Вот здесь http://support.microsoft.com/kb/555159
     
    прочел, что надо добавить ссылку на библиотечную книгу через Tools-> References. Почему-то не получается (у меня открыт воркспейс с этой книгой). В качестве альтернативы там предлагается позднее связывание (и запуск еще одного экселя?) через application.Run    
     
    Что, и впрямь все так грустно?
     
     
     
    Добавлено:
     
    И еще вопрос по отладчику. Я среду VBA уже изрядно подзабыл, но привык к тому, что в VB6 можно установить уровень перехвата ошибок в классах. Не помню даже, есть ли это в ворде, а в экселе?
     

    Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 14:06 13-02-2007 | Исправлено: LevT, 15:05 13-02-2007
    The okk



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

    Цитата:
    А вопросы остаются.

    Как обратиться к ЭтаКнига? - Так и обращайся ЭтаКнига.
    Как обратиться к глобальной процедуре, записанной где-либо (в книге, модуле, листе, форме)? - Просто: Call <имя процедуры>.
    Какие вопросы?

    Цитата:
    How one VBA project can use an object declared in the class module of another project
     
    А откуда ты его вызывать собираешься? Разве не из того же проекта?
     
    Если ты из одного проекта собрался работать с процедурами, классами и т.д. другого, может, имеет смысл все внешнее запихать в dll и вызывать уже оттуда?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 15:11 13-02-2007 | Исправлено: The okk, 15:38 13-02-2007
       

    Страницы: 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