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

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Мне нужно, чтобы в экселевском файле производились некоторые изменения и сохранялись в файл с другим именем.  
    Я это делаю вот так:
     
    xl.ActiveWorkbook.SaveAs newFile
    xl.Quit
     
    Все это работает, но почему-то даже после выполнения xl.Quit в процессах Windows остается висеть EXCEL.EXE, который мне совершенно не нужен, и, более того, мешает, вызывая ошибки при последующих обращениях к Excel.
    Вызывается этот экселевский файл из Access'a.
    Пробовал сделать с помощью SaveCopyAs - та же история.
     
    Помогите плиз!  

    Всего записей: 2 | Зарегистр. 20-05-2006 | Отправлено: 16:57 20-05-2006
    satura77

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть 2 таблицы в разных файлах на разных компах, соед. по сети. Их содержимое различно, но есть несколько одинаковых полей. Нужно сделать, чтобы при добавлении/удалении/редактировании записей в одной из таблиц, если выполняется некоторое условие по содержимому записи, то в другой таблице отражались эти изменения.

    Всего записей: 1 | Зарегистр. 20-05-2006 | Отправлено: 18:58 20-05-2006
    Dixi257



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

    Цитата:
    xl.ActiveWorkbook.SaveAs newFile  
    xl.Quit

     
    Надо убить ВСЕ ссылки на объекты EXCEL строками вида
    Set xl=Nothing
    и подождать секунд 15, пока система выгрузит сервер из памяти.
     

    Всего записей: 128 | Зарегистр. 24-08-2005 | Отправлено: 23:26 20-05-2006 | Исправлено: Dixi257, 23:27 20-05-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как можно реализовать следующую задумку:
    Есть книга из N+1 листа. На 1 листе находится таблица с N столбцами.
    Вопрос: Как сделать так, чтобы при выборе ячейки из таблицы на листе 1 автоматически открывался лист, соответсвующий столбцу из таблицы и курсор устанавливался на столбце, соответсвующем строке из таблицы.  
    Т.е. выбираем на листе 1 ячейку из столбца 2 по строке 5. Соответсвенно должны оказаться на листе 3 (2+1) в столбце 5.

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1
    Типа такого (вставляется в VBA, в код листа "1"):

    Код:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim r As Integer, c As Integer
        Dim ws As Worksheet
        r = Target.Row
        c = Target.Column
        On Error Resume Next
        Set ws = Sheets(CStr(c + 1))
        If ws Is Nothing Then
            ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
            Set ws = ActiveSheet
            ws.Name = CStr(c + 1)
        Else
            ws.Activate
        End If
        ws.Cells(1, r).Select
    End Sub

     
    Названия листов "1", "2", "3" и т.д.
    Если лист не существует, создается новый. Ну, или убери код между If и Else.
     

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk  
    Спасибо. Но я забыл сказать. Дело в том, что в этом файле макросов не должно быть. Все макросы в отдельной книге. Пока писал возникла Идея: Повесить макрос на комбинацию клавиш.

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 19:31 21-05-2006
    OchkaritO

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ, подскажите, пожалуйста, код для календаря (Элемент управления Office 2003), чтоб при нажатии на число, соответсвующая дата появлалась в определенной ячейке. Или ссылочку, где это описывается. Спасибо.

    Всего записей: 19 | Зарегистр. 02-02-2006 | Отправлено: 07:41 23-05-2006 | Исправлено: OchkaritO, 07:42 23-05-2006
    aquaman1977



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

    Код:
     
    Private Sub Calendar1_Click()
      Cells(1, 1).Value = UserForm1.Calendar1.Value
    End Sub
     

    Всего записей: 94 | Зарегистр. 11-03-2005 | Отправлено: 11:54 23-05-2006
    OchkaritO

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

    Код:
     
    Private Sub Calendar1_Click()
      Cells(5, 3).Value = Calendar1.Object
    End Sub
     

     
     - работает. Тебе персональный респект, Мой файлик уже запущен в производство.

    Всего записей: 19 | Зарегистр. 02-02-2006 | Отправлено: 12:28 23-05-2006
    DimidROLL



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А у меня такая проблема возникла, пишу программу в Excel + VBA  
    Пытаюсь смоделировать транспортную задачу, модель начинает действовать 26.05.06  а заканчивает через год и далее, изменяются времена года, в зависимости от этого меняются условия функционирования, а так же растёт время в часах для дальнейшего расчёта.
     
    В кратце: Создал в Excel 120 с лишним блоков (то есть разбил путь на участки), далее изымаю данные из Excel в VBA произвожу расчёт, вставляю в конце этого блока, далее изымаю уже новые данные и сними произвожу манипуляции, итд...
     
    Но столкнулся с такой проблемой, что дойдя до определённой точки VBA выдаёт ошибку  
    Compile error: Procedure too large
    Насколько я понял, слишком большую и громоздкую программу я сделал, нет ли способа обойти эту проблему, или может кто-нибудь сталкивался с подобным, как ошибкой, так может и задачей.  
     
    Заранее спасибо за ответ.

    Всего записей: 129 | Зарегистр. 24-05-2006 | Отправлено: 01:20 24-05-2006
    DONRU1



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DimidROLL
    разбей процедуру на несколько:  
     
    Private sub ляля()
             .... 'твой код
             call ляля2 'вызов и выполнение следующей процедуры
    end sub
     
    Private sub ляля2()
             .... 'твой код
    end sub

    Всего записей: 32 | Зарегистр. 19-04-2006 | Отправлено: 13:44 24-05-2006
    DimidROLL



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1
    Хм, мысль хорошая, спасибо! Попробую!

    Всего записей: 129 | Зарегистр. 24-05-2006 | Отправлено: 20:15 24-05-2006
    Fluk

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ, подскажите как заполнить поля в UserForm значениями из текущей строки?
    Проблема в заполнении свойства ControlSource поля TextBox формы. Все перепробовал - Invalid property value...
     
    Видимо это так просто, что ни в мануале, ни в инете не находится..

    Всего записей: 242 | Зарегистр. 21-09-2004 | Отправлено: 06:24 25-05-2006
    Preston



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

    Код:
    Private Sub CommandButton1_Click()
     
    Dim WWW(5) As Double
     
    Dim i As Integer
     
    Sheets("Лист1").Select
     
    For i = 1 To 5
     
    WWW(i) = Cells(0 + i, 1)
     
    Next
     
    For i = 1 To 5
     
    Sheets("Лист2").Select
     
    Cells(0 + i, 1) = WWW(i)
     
    Next
         
    End Sub

     
    Задача состоит в том, чтобы считать значения в опреленных ячейках на Листе1, а потом теже значения вывести на лист 2. Но почему-то не хочет работать.

    ----------
    Один терапевт - это 1024 гигапевта, или 1048576 мегапевтов!

    Всего записей: 296 | Зарегистр. 15-08-2003 | Отправлено: 15:37 25-05-2006
    Troitsky



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Preston
    А так:
    Код:
    Private Sub CommandButton1_Click()
       
      Dim i As Integer
       
      For i = 1 To 5
        Sheets("Лист2").Cells(i, 1).Value = Sheets("Лист1").Cells(i, 1).Value
      Next
         
      Sheets("Лист2").Activate
       
    End Sub

    В чем вообще выражается нежелание твоего кода работать?
     
    Добавлено:
    Fluk
    Приведи примеры кода, при выполнении которого получаешь ошибку
    Цитата:
     Invalid property value...


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 18:28 25-05-2006
    avk06

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как сделать. Имеется файл, где, в частности есть парочка столбцов:  
     
    2460739           грн/м2. сдача 4кв2007
    5100548    
    4582773            с 1.05
    67.1108868    
    2421671    
    5743668            хрущовка торг
    4121525             торг 1кв2008
    97.5108924             сд-4кв.07г
    67.4096769              Н=3.3м.тр.рем.отличный вид.торг
    5381166    
     
    Задача следующая- если в первом столбце длина числа больше 7 символов, то это число надо удалить из первого столбца и добавить это число в начало следующего столбца.

    Всего записей: 127 | Зарегистр. 15-12-2003 | Отправлено: 18:55 25-05-2006
    Preston



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

    ----------
    Один терапевт - это 1024 гигапевта, или 1048576 мегапевтов!

    Всего записей: 296 | Зарегистр. 15-08-2003 | Отправлено: 22:56 25-05-2006
    Yuk



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

    Код:
    Sheets("Лист2").Cells(0 + i, 1) = WWW(i)

    По-моему, объект Cells по умолчанию ассоциируется с первым листом.

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



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

    Цитата:
    По-моему, объект Cells по умолчанию ассоциируется с первым листом.

    А, по-моему, все таки с активным
     
    Preston

    Цитата:
    Но только вот мой код не работает.

    Может быть в ячейках, значения которых переносятся во второй лист, содержится текст и при попытке присвоения текстового значения переменной типа Double (члены массива WWW), разумеется, возникает 13-я ошибка (Type mismatch). Но это все догадки - ты ведь не пишешь в чем выражено нежелание кода работать.
    А вообще лучше игнорировать все возможные "по умолчанию" и использовать запись вида Лист.Диапазон.Свойство. Например, Sheets(1).Cells(1, 1).Value
     


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 11:29 26-05-2006 | Исправлено: Troitsky, 11:30 26-05-2006
    Preston



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk и Troitsky спасибо за подсказку. Действительно при указании Sheets("Лист2").Cells(0 + i, 1) он передает значения на второй лист.

    ----------
    Один терапевт - это 1024 гигапевта, или 1048576 мегапевтов!

    Всего записей: 296 | Зарегистр. 15-08-2003 | Отправлено: 14:17 26-05-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