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

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



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    slashuz
    1. DBF - лучше, а еще лучше любая более менее нормальная СУБД (отличная от Microsoft
    2. код можно запихнуть в модули, и ссылаться на него из Worksheet'ов, а также можно разместиить код в Workbook'е, чтобы придобавлении/удалении нового листа автоматически добавлялись функции...
    3. А "сохранить как..." не получилось?

    Всего записей: 538 | Зарегистр. 25-11-2002 | Отправлено: 10:42 17-12-2004
    Smog



    Жираф-Сибиряк
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ошибся...

    ----------
    Клиент форума Ru-board (Rb_client)-с предварительной поддержкой ру-борда!
    Требуются бета-тестеры!
    Обновление v0.0.3.6 (21.04.08)!

    Всего записей: 5394 | Зарегистр. 20-06-2003 | Отправлено: 11:03 17-12-2004 | Исправлено: Smog, 14:45 17-12-2004
    Tropin



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    SebSeb
    тогда, наоборот ))
     
    For x = 1 To 20  
    Range ("a_"+x) = ......

    Всего записей: 538 | Зарегистр. 25-11-2002 | Отправлено: 11:33 17-12-2004
    SebSeb

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
           
    Tropin
     
            For x = 1 To massiv.Count
            aa = massiv.Item(x)
            Range("cell_" + x) = aa
            Next x
     
    Дает ошибку
    Правильно вместо + ставить &.
    После этого работает, но теперь ошибка другая:
    Method 'Range' of object '_Global' failed

    Всего записей: 59 | Зарегистр. 04-02-2002 | Отправлено: 13:32 17-12-2004 | Исправлено: SebSeb, 13:43 17-12-2004
    Smog



    Жираф-Сибиряк
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SebSeb
    Tropin
    извиняюсь, думал поначалу, что a_1, a_2  - это адреса ячеек

    ----------
    Клиент форума Ru-board (Rb_client)-с предварительной поддержкой ру-борда!
    Требуются бета-тестеры!
    Обновление v0.0.3.6 (21.04.08)!

    Всего записей: 5394 | Зарегистр. 20-06-2003 | Отправлено: 14:11 17-12-2004 | Исправлено: Smog, 14:25 17-12-2004
    SebSeb

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Smog
    Это я так объяснил Спасибо огромное, с этим вопросом разобрался. Ошибка возникала из-за   отсутвтвующих адресов ячеек.

    Всего записей: 59 | Зарегистр. 04-02-2002 | Отправлено: 14:39 17-12-2004 | Исправлено: SebSeb, 18:28 17-12-2004
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Месяца полтора назад возникло у меня желание написать код для добавления своего пункта меню, ассоциированного с макросом, в меню стандартное, да только вот времени тогда не было. Всвязи с праздниками свободная минутка выдалась.
    Представляю тут получившийся код - может пригодится кому. Добавляемый таким образом пункт (последний пункт в меню Data/Данные) при завершении работы с Excel удалится автоматически.
     

    Код:
     
    Set MyMenu = Excel.Application.CommandBars("Data").Controls.Add _
        (Type:=msoControlButton, ID:=850, Temporary:=True)
     
    Dim strPicture As String ' Файл пиктограммы (16x16 *.bmp)
    Dim strMask As String ' Файл маски (16x16 *.bmp)
    strPicture = Application.ActiveWorkbook.Path & "\picture.bmp"
    strMask = Application.ActiveWorkbook.Path & "\mask.bmp"
     
    With MyMenu
     .Style = msoButtonIconAndCaption
     .Caption = "MyMacros" ' Наименование пункта меню
     .OnAction = "Макрос1" ' Имя ассоциированного с ним макроса
     .Picture = LoadPicture(strPicture) ' Пиктограмма пункта меню ...
     .Mask = LoadPicture(strMask)  ' ... и ее маска
     .State = msoButtonUp
    End With
     

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 02:14 06-01-2005
    pavel123

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите!
    Имеются таблицы с данными. Нужен макрос, результат которого -
    суммы и средние по столбцам и строкам . Размер таблиц разный.
    То есть нужно одним нажатием кнопки ....

    Всего записей: 1 | Зарегистр. 17-08-2004 | Отправлено: 22:26 07-01-2005
    Tropin



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

    Цитата:
    Имеются таблицы с данными.

    Весь эксель и есть таблицы с данными... а поконкретнее, ну примерчик хотя б.
     
    А то действительно, получается просьба вида: "напишите мне макрос, который сам макросы писать будет...."

    Всего записей: 538 | Зарегистр. 25-11-2002 | Отправлено: 14:02 08-01-2005
    wtt



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите.
    В процессе выполнения программы требуется, что - бы она сама объявляла необходимое кол-во  динамических массивов. Т.е. присваивала самостоятельно очередному массиву какое-нибудь имя (желательно в виде номера, если это возможно), задавала необходимую размерность.
        Если кто-нибудь сталкивался с этим ,подтолкните в нужном направлении.
    Сбросьте исходник с комментариями в мыло \ ПМ \ форум
     Спасибо.

    Всего записей: 106 | Зарегистр. 05-02-2004 | Отправлено: 21:47 11-01-2005
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wtt
    В VB я бы попробовал об'явить data type, содержащий динамический массив
    Type ааа
        myArray() as integer
    End Type
    затем об'явил бы динамический массив  
    Dim sss() as aaa

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 02:19 12-01-2005 | Исправлено: dneprcomp, 01:41 13-01-2005
    wtt



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dneprcomp
     Про это я читал.Вопрос в том,как создать автоматически некоторое количество массивов(неизвестно какое кол-во,программа сама решает в результате сортировки данных),сохранить их в памяти на время работы програмы,а затем обработать их совместно...  

    Всего записей: 106 | Зарегистр. 05-02-2004 | Отправлено: 12:16 12-01-2005
    Tropin



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wtt
    а влоб, что - памяти не хватает?
    или на худой случай, что если воспользоваться дополнительным листом Экселя, который и будет представлять собой "некоторое количество массивов"...

    ----------
    Вот потому, что вы говорите то, что не думаете и думаете то, что не думаете, вот в клетках и сидите... (C) Кин-дза-дза

    Всего записей: 538 | Зарегистр. 25-11-2002 | Отправлено: 18:31 12-01-2005
    wtt



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tropin
    На счёт памяти размышлял,действительно объём данных может быть большой,но это всё-таки Long или Integer(в крайнем случае Single),и вообще как система работает,она что на жёстком диске место при необходимости не выделяет?
      На листе экселя я работаю сейчас,выглядит всё это кривовато и медленнее чем могло бы без распечатывания,стоит задача от этого избавиться...
     
    Добавлено
    Уважаемые господа, попробую ещё раз конкретизировать:
    В Visual Basic массивы определяются следующим образом:
    Dim myArray (10) As Long
    А можно ли вместо myArray вставить код\ссылку на код который бы возвращал всякий раз новое имя для очередного массива?
    Вместо 10 вставить код\ссылку на код, который бы возвращал всякий раз новую размерность для очередного массива?
    И таким образом создаются автоматически нужные массивы в необходимом количестве.

    Всего записей: 106 | Зарегистр. 05-02-2004 | Отправлено: 21:39 12-01-2005 | Исправлено: wtt, 21:41 12-01-2005
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wtt
    Есть такая команда 'redim'  
    Я же специально об'явил безразмерные динамические массивы.  
    ReDim sss(3).myArray(10)
    Можно задавать любую размерность массива, подставляя из переменных.
    Т.о. массив myArray состоит из 10 переменных и таких массивов об'явлено 3.
    Поиграйся с redim. Может можно сразу оба уровня назначать, а может надо последовательно. А может быть вообще так redim  не сработает.
    Можно еще использовать 'redim preserve'
     

    Цитата:
    новое имя для очередного массива

    VB,как и все остальные языки програмирования, не работает с именами. Имена используются только в исходниках. После компиляции имен нет, одни ссылки.

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 01:23 13-01-2005 | Исправлено: dneprcomp, 01:38 13-01-2005
    Tropin



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

    Цитата:
    как и все остальные языки програмирования

    Это компилируемые, а VB - интерпретируемый. Я не знаю, но может в нем как в JS или Perl есть что-нибудь наподобе eval ну или что-то в этом роде, когда прямо в программе можно изменять саму программу...

    ----------
    Вот потому, что вы говорите то, что не думаете и думаете то, что не думаете, вот в клетках и сидите... (C) Кин-дза-дза

    Всего записей: 538 | Зарегистр. 25-11-2002 | Отправлено: 10:35 13-01-2005
    wtt



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

    Цитата:
    Т.о. массив myArray состоит из 10 переменных и таких массивов об'явлено 3.  

    То есть ты хочешь сказать,что можно одновременно объявить несколько массивов,и указать каждому свою собственную размерность...Это бы решило проблему.Будем посмотреть.

    Всего записей: 106 | Зарегистр. 05-02-2004 | Отправлено: 12:24 13-01-2005
    dneprcomp



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tropin
    Я не знаю Perl и не знаю что делает eval.  
    Компьютер не работает с именами.
    Цитата:
    После компиляции имен нет, одни ссылки

    Поэтому невозможно обратиться по имени к переменной, не описав ее и ее имя предварительно в исходнике. А вот выделить память и создать новую ссылку на эту область памяти можно. Правда не в VB, а, скажем, в С++.
    Цитата:
    когда прямо в программе можно изменять саму программу...
    Честно говоря, не представляю себе такого.
     
    Добавлено
    wtt
    Попробуй, потом расскажешь. Т.к. все это теоретические изыски  
    Цитата:
    можно одновременно объявить несколько массивов
    Я немного не точно описал. На самом деле это один массив. Просто каждый его член сам является массивом.  
    А вот размерность внутреннего массива myArray() наверное должна быть одинакова.
     
     
     
     
    Добавлено
    Можно еще посмотреть использование команды 'new'. Возможно, что лучше создать clas, а не type. И уже на его основе с помощью 'new' создавать новые массивы

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 12:30 13-01-2005
    Tropin



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wtt
    я конечно не ручаюсь за оптимальность, но посмотри это
    Код:
    Private Type MyRecord
      A() As Integer
    End Type
     
    Sub MySub()
      Dim Mass() As MyRecord
      n = 3 ' 4 массива
       
    ' Задаём размерность массива массивов
      ReDim Mass(n)
       
    ' Задаём размерность 1-ого массива
      k = 5
      ReDim Mass(0).A(k)
       
    ' Задаём размерность i-ого массива
      i = 1
      k = 2
      ReDim Mass(i).A(k)
       
    ' получаем массив из 4-х массивов
    ' обращаемся к ним как
      i = 1 ' номер массива
      j = 0 ' элемент i-ого массива
      Mass(i).A(j) = 123
       
    End Sub

     
    dneprcomp

    Цитата:
    Я не знаю Perl и не знаю что делает eval.

    Хоть это и не по теме, но рекомендую ознакомиться, дабы иметь общее представление, Можно посмотреть, что скажет например  
    Гугл...
     

    Цитата:
    Честно говоря, не представляю себе такого.

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

    ----------
    Вот потому, что вы говорите то, что не думаете и думаете то, что не думаете, вот в клетках и сидите... (C) Кин-дза-дза

    Всего записей: 538 | Зарегистр. 25-11-2002 | Отправлено: 15:06 13-01-2005
    dneprcomp



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

    Цитата:
    Я не знаю, но может в нем как в JS или Perl есть что-нибудь наподобе eval ну или что-то в этом роде, когда прямо в программе можно изменять саму программу...

     
    А сами вы по этим ссылкам смотрели? Вот по первой же _http://www.parser.ru/docs/lang/?opeval.htm дано определение:

    Цитата:
    Оператор eval вычисляет математическое выражение и позволяет вывести результат в нужном виде, задаваемом форматной строкой...

    Какое отношение имеет данный оператор к изменению программы прямо в программе и к задаче wtt?

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 01:00 14-01-2005
       

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