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

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В принципе проблема решилась. При помощи Public Type ….End Type(очень похожее на то, что предлагалTropin) создал свою переменную (состоящую из массива и имени), а затем объявил массив из нее. Получился динамический массив внутри  которого есть нужное кол-во динамических массивов.  
    Размеры и количество етих массивов автоматически меняются в зависимости от исходных данных. Ура, товарищи!!!!!!!!!!!!!!!!!!! Хватит ли на это памяти - посмотрим...
      Всем  пасибо. Со старым Новым Годом, Господа!!!!!!!!!!!!!!
     
    Добавлено:
    dneprcomp

    Цитата:
    Попробуй, потом расскажешь. Т.к. все это теоретические изыски

    Массив внутри которого другие массивы-всё работает!И размерность у них разная может быть...

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wtt
    Не забудь, что при использовании просто redim все данные в массиве очищаются. Если надо переоб'явить массив и сохранить данные, используй redim preserve.

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



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

    Цитата:
    используй redim preserve
    -так и делаю
     На счёт памяти могу сказать следующее:c сотнями элементов типа Long система работает прекрасно,даже винчестер не шевелиться.Естественно к большему обьёму данных скорее всего нужен какой-то другой подход...

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Перед запуском очередной процедуры необходимо выполнить операцию анологичную той,которую выполняет Microsoft Visuai Basic при нажатии на кнопку Reset.
     Подскажите,пожалуйста,есть ли вообще такая возможность,и как выглядит код.
        Спасибо.

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hi all!
    У меня есть проблема работы с функцией из dll (чужая библиотечка) - одним из параметров должен быть строковый массив, который должен изменяться. Но, как написано в MSDN, - это в VBA невозможно. Как обойти это? Может где почитать?
     
    Попробовал подставить массив Integer - что-то получилось, надо теперь только как-то вытащить строки и посмотреть то ли это, что надо ... Есть ли другой более удобоваримый способ?

    Всего записей: 15 | Зарегистр. 22-01-2004 | Отправлено: 09:58 02-03-2005 | Исправлено: vdarasun, 10:21 02-03-2005
    ppch

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет!
     
    Есть проблемка с автофильтром в excel'е.
    Короче имеем worksheet, в котором находится таблица с данными.  
    Для поиска по данным используется автофильтр с условием.  
     
    Проблема в том, что в некоторых ячейках таблицы  содержится тест длиной более 256 символов. И автофильтр не ищет по таким ячейкам, точнее не находит слова которые начинаются после 256-го символа. (Надеюсь понятно объяснил...)
     
    Это лечится?  
    Можно конечно макрос написать, но как-то лень.  
    Может эту траблу можно как-то обойти?

    Всего записей: 102 | Зарегистр. 18-04-2003 | Отправлено: 20:10 04-03-2005
    MoKC0DeR



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

    Цитата:
     Но, как написано в MSDN, - это в VBA невозможно. Как обойти это?

    Можно. По конкретнее пример приведи.

    Всего записей: 510 | Зарегистр. 31-03-2004 | Отправлено: 09:41 05-03-2005
    zorrack



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vdarasun
    Если сторонняя библиотека сама выделяет память под строки - скорее всего не выйдет.
    Если сторонняя библиотека принимает строки фиксированной или заранее заданной длинны - можно попробовать сначала проинициализировать массив, а потом его уже передавать

    Всего записей: 244 | Зарегистр. 16-05-2003 | Отправлено: 17:34 05-03-2005
    darkevi

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Скрытие/отображение ячеек при помощи VBA:
     
    С combo-box использую простой скрипт:
    ActiveSheet.Columns("E:HM").Hidden = True
    ActiveSheet.Columns(ComboBox1.Value).Hidden = False
     
    То есть сначала скрывается все, а потом отображается нужный диапозон.
     
    На определенном моменте начал получать ошибку 1004 при выполнении операции скрытия всего диапозона. Выяснил, что эта ошибка проявляется не только при исполнении скрипта, но и в самом Excel'е невозможно скрыть больше определенного числа столбцов. Выдается ошибка "Невозможно переместить объект за пределы листа". Использую Excel 2003 (11.5612.5606) - русифицированная версия.
     
    Вопросы:  
    Сталкивался ли кто-нибудь с похожей фигней?
    Что посоветуете для исправления ошибки либо поиска причин ее возникновения?
     

    Всего записей: 3 | Зарегистр. 28-05-2004 | Отправлено: 06:36 09-03-2005
    Nimnul



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    darkevi
    А если попробовать не скрывать, а делать ширину столбца равной нулю?

    Всего записей: 1072 | Зарегистр. 05-02-2003 | Отправлено: 09:30 09-03-2005
    darkevi

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

    Цитата:
    darkevi  
    А если попробовать не скрывать, а делать ширину столбца равной нулю?

     
    Идея хорошая, пробовал, но все-равно выдается аналогичная ошибка. Тем более, что команды скрытия и установки ширины 0 кажется тождественны.

    Всего записей: 3 | Зарегистр. 28-05-2004 | Отправлено: 10:06 09-03-2005
    Troitsky



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

    Цитата:
    ошибка "Невозможно переместить объект за пределы листа"

    Если действительно в скрываемом диапазоне присутствуют какие либо объекты, то попробуй поиграться с Параметрами привязки объекта к фону во вкладке Формат объекта.../Свойства
     
    Или программно установлением соответствующих свойств. Например
    Код:
        Sheets(1).Shapes(2).Placement = xlMoveAndSize

     
    Но лучше сначала ручками попробовать, а уж программно в случае успеха не сложно сделать.

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 11:17 09-03-2005
    darkevi

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    to Troitsky
     
    Похоже этот глюк не имеет разумного объяснения:
    после удаление всех внедренных объектов на листе ничего не меняется
    более того, ничего не меняется, если полностью очистить содержимое листа.
     
    Все получается если только осуществить полную очистку.  
     
     
     
     
     
    Добавлено:

    Цитата:
    Скрытие/отображение ячеек при помощи VBA:  
     
    С combo-box использую простой скрипт:  
    ActiveSheet.Columns("E:HM").Hidden = True  
    ActiveSheet.Columns(ComboBox1.Value).Hidden = False  
     
    То есть сначала скрывается все, а потом отображается нужный диапозон.  
     
    На определенном моменте начал получать ошибку 1004 при выполнении операции скрытия всего диапозона. Выяснил, что эта ошибка проявляется не только при исполнении скрипта, но и в самом Excel'е невозможно скрыть больше определенного числа столбцов. Выдается ошибка "Невозможно переместить объект за пределы листа". Использую Excel 2003 (11.5612.5606) - русифицированная версия.

     
    найдено решение - см  
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;q211769

    Всего записей: 3 | Зарегистр. 28-05-2004 | Отправлено: 12:37 09-03-2005
    HdHg



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ.
    Подскажите PLS как программно получить список выделенных (сгруппированных) листов в книге EXCEL
    т.е. я к примеру держа CTRL выделяю (группирую) в книге несколько листов (не обязательно последовательных) после чего надо макросом получить список имен или индексов этих выделенных (сгрупированых) листов.

    Всего записей: 63 | Зарегистр. 27-10-2002 | Отправлено: 00:51 26-03-2005
    Troitsky



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

    Код:
    For Each S In ActiveWindow.SelectedSheets
      MsgBox S.Name
    Next

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 01:49 26-03-2005
    HdHg



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

    Всего записей: 63 | Зарегистр. 27-10-2002 | Отправлено: 15:27 26-03-2005
    HdHg



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Люди
    Вопрос конечно извращенный и не совсем по VBA, но ...
    В EXCELe есть стандартная функция СМЕЩ() или OFFSET() дающая ссылку на ячейку (диапазон) смещенную относительно другой ячейки (диапазона).
     
    Вопрос в чем: есть ли подобная стандартная EXCEL функция дающая ссылку на лист относительно другого листа. Т.е. я хочу сослаться на лист со смещением относительно текущего, или другого листа, или хочется сослаться на 3й лист книги, именно функция должна возвращать конкретное имя листа.
     
    Как это сделать на VBA я знаю, можно ли такое сделать без VBA.
    Я понимаю, что проще написать собственную функцию и добавить ее к общим, но интересует реализация стандартными функциями.

    Всего записей: 63 | Зарегистр. 27-10-2002 | Отправлено: 01:06 30-03-2005
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    HdHg
    Вопросы "не совсем по VBA" обсуждаются в этой теме:
    http://forum.ru-board.com/topic.cgi?forum=5&topic=4495

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 11:07 30-03-2005
    mooby

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем.
    Вопрос 1. Как можно закрепить "кнопку" на листе по аналогии с "закрепить области", чтобы она не ездила по листу при скроллинге?
     
    Вопрос 2. Выделяем произвольную ячейку на листе, вызываем макрос и он выделяет 2 соседние ячейки по строке (справа и слева) также, как если удерживать Control?

    Всего записей: 9 | Зарегистр. 07-01-2005 | Отправлено: 01:43 05-04-2005
    Zhenya68



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста, может кто встречал.
    Excel 2002 (10.2701.2625)
    Вызываю Excel как OLE Server из 1с.
    Много чего делаю и мне надо в ячейке поменять формат представления числа. Мне нужно, чтобы Excel показывал в ячеке "Число с двумя рязрядами после запятой и разделителем тысяч". Я пишу следующий код:
     
    Пременная Екс= (это сслылка на Excel.Application)
     
    Екс.Cells(20,20).NumberFormat="#,##0.00";
    или
    Екс.Range(Cells(20,20),Cells(20,20)).NumberFormat="#,##0.00";
     
    Получаем сообщение об ошибке: "Microsoft Excel: Нельзя установить свойство NumberFormat класса Range"
     
    Но в редакторе VBA пишу строки:
     
    Cells(20, 20).NumberFormat = "#,##0.00"
    или
    Range(Cells(10, 10), Cells(10, 10)).NumberFormat = "#,##0.00"
     
    все работает и никто не ругается.
     
    Помогите кто может!!
     
     
     

    Всего записей: 38 | Зарегистр. 26-11-2003 | Отправлено: 08:43 20-04-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