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

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

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

    Цитата:
    Открой свою форму. Tools - additional controls - и там выбирай Microsoft Listview Contro

    Нету.
     

    Цитата:
    Прописывается в любой модуль. Потом из любого модуля можно вызвать

    Вот! Спасибо! Работает! =)))

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 12:53 22-12-2006
    The okk



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

    Цитата:
    Нету.  

    не может быть. Хотя бы старая версия должна быть. Файл msocomctl.ocx у тебя должен быть в \system32\. В этом файле все доп. майкрософтовские контролы TreeView и ListView.
    Или в ранних версиях назывался типа Comctl.ocx или comctl32.ocx
     
     
    Добавлено:
    если искать неохота, скачай пример. Там на форме их две штуки. Можно оттуда скопировать

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:03 22-12-2006
    weg

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    УРА ЗАРАБОТАЛА!!!
    ВСЕМ СПАСИБО!

    Всего записей: 3 | Зарегистр. 22-12-2006 | Отправлено: 14:05 22-12-2006
    The okk



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

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:12 22-12-2006
    aks sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
     
    В форме имеется ListBox, который заполняется с Листа1. Надо чтобы при нажатии на ОК данные из ListBox скопировались на Лист2. Подскажи, пожалуйста, что не правильно делаю?  
     
    Private Sub cmdOK_Click()
        Application.ScreenUpdating = False
        Worksheets("Лист2").Activate
        Dim n As Integer
        n = ListBox1.ListIndex
        r = ListBox1.ListCount
        For n = 0 To r
            Cells(n, 1).Value = ListBox1.List(n)
        Next n
        Worksheets("Лист1").Activate
        Unload Me
    End Sub

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 14:36 22-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aks sv
    Ты уж скажи сразу, что не работает или выложи файл, а то тут мне остается только догадываться .
    Код:
     
        n = ListBox1.ListIndex' присвоить переменной n номер выделенного в данный момент элемента
        r = ListBox1.ListCount 'присвоить переменной количество элементов
        For n = 0 To r 'присвоить переменной n (где раньше лежал номер элемента) ноль!
            Cells(n, 1).Value = ListBox1.List(n)  
        Next n  

    Так и было задумано?

    Код:
     Application.ScreenUpdating = False  

    Я обычно после заполнения пишу  

    Код:
     Application.ScreenUpdating = True  

    А то всякое бывает .
     

    Цитата:
    Dim n As Integer  

    если уж на то пошло, то:
    Dim n As Long, r As Long
     
    ну и фатальная ошибка наверное:
    Цитата:
     
    column Required. An integer with a range from 0 to one less than the number of columns.  

    А у тебя только ряд.

    Цитата:
    ListBox1.List(n)  

    Я про вот это свойство.
     
    Ну и "до кучи" :

    Цитата:
    Next n  

    Надо:

    Код:
    Next

     

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 15:44 22-12-2006 | Исправлено: The okk, 15:56 22-12-2006
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    The okk
    Нашел дома, но на работе надо переустановить офис, какой-то глюк
     
    Выдает ошибку 380:
    Invalid property value
    Короче, что делать?
    Жду ответа.

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 19:13 22-12-2006
    The okk



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

    Цитата:
    Нашел дома

    Я же говорил - должен быть.

    Цитата:
    Выдает ошибку 380:  
    Invalid property value  
    Короче, что делать?  

    Скорее всего, ты не настроил ListView (а именно - не создал столбцы) . Я же говорил, что предварительно его надо настроить. Я мог бы это сделать и кодом, но руками это делается намного быстрее. Заходишь в Custom и на вкладке ColumnHeaders добавляешь столбцы (там же присваиваешь им ключи, текст и ширину).
    Кроме того, не забудь .view = 3 - lvwReport. Иначе Subitems не будут видны.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 20:54 22-12-2006 | Исправлено: The okk, 21:12 22-12-2006
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    The okk
    h--p://vbnet.mvps.org/index.html?code/comctl/lvcolumnhilite.htm много интересного
     
    Добавлено:
    А так же - h--p://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/Interface/Technique/Default.mspx

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 21:40 22-12-2006
    aks_sv

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

    Цитата:
    Ты уж скажи сразу, что не работает или выложи файл, а то тут мне остается только догадываться  

     
    Весь список с ListBox вставляется в Лист2, но при этом матерится:
     
    Run-time error '381':
    Could not get the List property. Invalid property array index.
     
     
    Добавлено:
     
    The okk
    и выделяет желтым строку
    Cells(n, 1).Value = ListBox1.List(n)

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 11:35 23-12-2006
    Troitsky



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

    Цитата:

    Цитата:
    Next n
    Надо:
    Код:
    Next
    Я, конечно, понимаю, что можно опускать переменную-счетчик в инструкции Next и это не скажется на выполнении кода, но лучше так не делать, т.к. в некоторых случаях просто можно запутаться (например, во вложенных циклах).
     
    aks_sv

    Цитата:
    и выделяет желтым строку  
    Cells(n, 1).Value = ListBox1.List(n)

    Скорее всего, проблема в том, что у ListBox
    Цитата:
    индекс первого пункта равен 0, а индекс последнего — величине (ListCount–1)

    Да и в этом случае:
    Код:
    Cells(n, 1)
    для нулевого индекса ListBox'а ты подразумеваешь наличие нулевой строки в Excel, в то время как их нумерация начинается с единицы


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 14:39 23-12-2006 | Исправлено: Troitsky, 14:48 23-12-2006
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Огромное человеческое СПАСИБО:
    Изменил:
     r = ListBox1.ListCount - 1
    И все ОК

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 18:38 23-12-2006
    Aladdinych



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как повысить производительность?
    У меня в модуле по открытию книги, копируются данные из Лист1 одной книги в Лист1 другой книги. Всего ~ 1300 строк. Занимает эта процедура 35 сек. На компьютере с проц Pentium IV 1.8 Ггц. Перед копированием вычисление формул отключаю. После копирования включаю.
    Что еще можно предпринять, чтобы увелитить производительность модуля?

    Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 13:49 25-12-2006
    Troitsky



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

    Цитата:
    У меня в модуле по открытию книги, копируются данные из Лист1 одной книги в Лист1 другой книги.

    А как копируешь? Диапазоном или каждую ячейку поотдельности?
    Один из способов оптимизации есть в шапке. Но не видя кода трудно что то советовать.


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 14:26 25-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aladdinych
    А нельзя лист1 одной книги скопировать в другую целиком (в крайнем случае, потом удалить ненужное)? Копирование листа занимает времени на порядок меньше, чем перенос данных/форматов.
    Ну, разумеется, не забываем про Application.Screenupdating = False перед началом копирования и Application.Screenupdating = True после. Небольшой прирост в скорости будет, если в качестве переменных для счетчиков будешь использовать Long.
     
    Добавлено:
    но лучше, конечно, покажи код

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 14:52 25-12-2006 | Исправлено: The okk, 14:55 25-12-2006
    Aladdinych



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Раньше копировал ячейка в ячейку.
    Сейчас копирую построчно диапазоном.  
    The okk
    Лист в лист скопировать нельзя. Первая книга на самом деле просто dbf таблица.
    Использование Screenupdating сократило время обработки до 15-16 сек.
    Для копирования использовал цикл While Wend.
     
     
     
    Добавлено:
    И еще почему-то не работает строка
    newdoc.ActiveSheet.Range(Cells(i + 4, 2), Cells(i + 4, 11)).Value = .Workbooks(wbdbf).ActiveSheet.Range(Cells(i + 2, 2), Cells(i + 2, 11)).Value
     
    а вот строка
    newdoc.ActiveSheet.Range("B" + Trim(Str(i + 4)) + ":K" + Trim(Str(i + 4))).Value = .Workbooks(wbdbf).ActiveSheet.Range("B" + Trim(Str(i + 2)) + ":K" + Trim(Str(i + 2))).Value
    работает. Что не правильно в первом варианте?
     
     
     
    Добавлено:
    Выдается ошибка application defined or object defined error
     
    Добавлено:
    И еще
    из 15 сек на копирование уходит только 4 сек все остальное уходит на загрузку/сохранение файлов.

    Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 15:42 25-12-2006
    The okk



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

    Цитата:
    Лист в лист скопировать нельзя.

    можно копировать лист в книгу
     

    Цитата:
    Для копирования использовал цикл While Wend.  

    циклы while использовать не стоит. Только For

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 18:19 25-12-2006
    WWWovan



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Итересует каким образом можно поменять имя файла с Bill1, Bill2, Bill3.... на осмысленное "Счет №....."?
    Можно ли это сделать при формировнии счета прикладной программы написаной на CBuilder?
    Или нужно использовать макросы?
     
    З.Ы. Документ формируется на основании шаблона.
     
    Пожалуйста сильно не пинайте. С VBA раньше дела не имел, а сейчас возникла необходимость.
     
    Заранее спасибо за помощь.

    ----------
    Не несу ответственность за случайно допущенные орфографические ошибки.

    Всего записей: 578 | Зарегистр. 15-11-2003 | Отправлено: 12:50 26-12-2006
    jONES1979



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    WWWovan
     
    в билдере функция RenameFile
    перебор файлов в каталоге через FindFirst, FindNext, FindClose
     
    почему в ЭТОЙ ветке спросил?
     
    или ты про что вообще?

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 15:46 26-12-2006
    WWWovan



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

    Цитата:
    WWWovan  
     
    в билдере функция RenameFile  
    перебор файлов в каталоге через FindFirst, FindNext, FindClose  
     
    почему в ЭТОЙ ветке спросил?  
     
    или ты про что вообще?

     
    Я не совсем корректно сформулировал вопрос.  
    Есть счет.
    При помощи кнопочки на форме вызывается экспорт счета в Эксель на основании шаблона Bill.xlt. Он сохраняется уже из Excel. И получает по умолчаниюю имена Bill1.xls, Bill2.xls и т.д.
    Я же хочу, чтобы при вызове диалога "Сохранить" в Excelе в имя файла по умолчанию подставлялся номер счёта.

    ----------
    Не несу ответственность за случайно допущенные орфографические ошибки.

    Всего записей: 578 | Зарегистр. 15-11-2003 | Отправлено: 15:53 26-12-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