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

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

    Цитата:
    А поконкретней?

    В каждом листе больше 1000 строк, а в форме листбокс дольго думает.
     
    Я не понял, почему в каждом листе отображается последний лист, а предыдущие не отображается?????  

    Код:
     
    Private Sub TextBox1_Change()
        Dim rng As Range
        Dim r As Range
        Dim strFilt As String
        Dim strFiltLen As Integer
        Dim arrFilt As Variant 'динамический массив
        Dim ColCnt As Integer
        Dim i As Integer, c As Integer
        Dim ls As Worksheet
         
        For Each ls In Worksheets 'в каждом листе
            ColCnt = ls.UsedRange.Columns.Count 'проходим по всем столбцам
            Set rng = ls.UsedRange.Rows 'и по всем строкам
             
            strFilt = TextBox1.Text
            strFiltLen = Len(strFilt)
            i = 0
            ReDim arrFilt(ColCnt - 1, i)
            For Each r In rng.Rows
                If strFilt = Left(r.Cells(1).Text, strFiltLen) Then
                    ReDim Preserve arrFilt(ColCnt - 1, i)
                    For c = 1 To ColCnt
                        arrFilt(c - 1, i) = r.Cells(1, c).Value
                    Next
                    i = i + 1
                End If
            Next
     
        Next
        With ListBox1
            .Column() = arrFilt
            .ColumnCount = ColCnt
        End With
    End Sub
     
    Private Sub UserForm_Initialize()
        TextBox1_Change
    End Sub
     

     
     
    Добавлено:
    P.S. The okk - ICQ есть?

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



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Anton T
    Если задача формулируется так
    Цитата:
    пробегаем по каждому листу в книге, если его имя состоит из одной буквы, пробегаем по всему первому заполненному столбцу и добавляем значения его ячеек в листбокс на форме. кроме того, при вводе в текстбокс начала фамилии в листбоксе должны отображаться только те фамилии, которые с этого начинаются
    то код такой

    Код:
    Dim strAr() As String
    Dim i As Integer, j As Integer
    Dim ws As Worksheet
     
    Private Sub TextBox1_Change()
      FillLB (TextBox1.Text)
    End Sub
     
    Sub FillArray()
      For Each ws In ActiveWorkbook.Worksheets
        If Len(ws.Name) = 1 Then
          For Each r In ws.UsedRange.Rows
            ReDim Preserve strAr(i)
            strAr(i) = ws.Cells(r.Row, ws.UsedRange.Column).Value
            i = i + 1
          Next r
        End If
      Next ws
    End Sub
     
    Private Sub UserForm_Initialize()
      i = 0
      ListBox1.Clear
      FillArray
      FillLB (TextBox1.Text)
    End Sub
     
    Sub FillLB(strMask As String)
      ListBox1.Clear
      For j = 0 To i - 1
        If StrComp(Left(strAr(j), Len(TextBox1.Text)), strMask, 1) = 0 Then
          ListBox1.AddItem strAr(j)
        End If
      Next j
    End Sub

    Пример тут:
    Цитата:
    http://slil.ru/23870492
    Файл будет удален через 1 месяц после последнего скачивания.



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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 13:01 04-02-2007
    Anton T

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

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 13:18 04-02-2007
    vzbzdnov



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

    Цитата:
      ReDim Preserve strAr(i)  

    Я в таких случаях, когда надо делать ReDim Preserve всегда вместо array использую Class и Collection. Намного быстрее и удобнее. ReDim Preserve  очень дорогостоящая операция. А с классом больше возможностей, да и основной код проще. Всю спесифику забираем в класс. Ещё одно достоинство в том, что можно не заботиться про duplicate key. В Сollection его не добавишь

    ----------
    |^^^пиво^^\\|""\\_,_
    |___________||___|__|)
    (@)(@)""*|(@)(@)**(@)

    Всего записей: 3957 | Зарегистр. 27-03-2002 | Отправлено: 21:15 04-02-2007
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    сделал ListView, а ошибку дает Type mismatch '13'
    Что испарвить?

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Возникла следующая надобность. Нужна реализация функции, которая производит выборку из N чисел, выбирает из них число с максимальным отклонением от заданного. Пример: Имеется 3 числа 4003, 3992, 3998. Нужно среди них выбрать число с максимальным отклонением от заданного - 4000. Этим числом будет число - 3992, как число с наибольшим отклонением - -8. Функции МАКС и МИН не подходят, так как число с максимальным отклонением может быть как больше заданного ( МИН не подходит), так и меньше заданного ( МАКС не подходит). Подскажите - какую функцию использовать для реализации данной задачи? Очень надо...

    Всего записей: 1106 | Зарегистр. 23-12-2003 | Отправлено: 18:52 05-02-2007
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    sanek1106
    Sub GoToMax()
    '   Активизирует ячейку с наибольшим значением
        Dim WorkRange As Range
        Dim MaxVal As Double
     
    '   Выход, если диапазон не выбран
        If TypeName(Selection) <> "Range" Then Exit Sub
     
    '   Если выбрана одна ячейка, поиск по всему листу;
    '   в противном случае – поиск в выделенном диапазоне
        If Selection.Count = 1 Then
            Set WorkRange = Cells
        Else
            Set WorkRange = Selection
        End If
         
    '   Определение максимального значения
        MaxVal = Application.Max(WorkRange)
         
    '   Поиск и выделение ячейки с максимальным значением
        On Error Resume Next
        WorkRange.Find(What:=MaxVal, _
            After:=WorkRange.Range("A1"), _
            LookIn:=xlValues, _
            LookAt:=xlPart, _
            SearchOrder:=xlByRows, _
            SearchDirection:=xlNext, MatchCase:=False _
            ).Select
        If Err <> 0 Then MsgBox "Максимальное значение не найдено: " _
         & MaxVal
    End Sub
     
    Добавлено:
    MaxVal = Application.Max(WorkRange) вместо заменить на MaxVal = Application.Min(WorkRange) - это минимальное значение

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sanek1106
    Лучше в тему по Excel.
     
    Yuk

    Цитата:
    Для определения последней непустой ячейки в столбце предлагаю такой код:
    Код:Cells(ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count, 1).End(xlUp)

    Может, можно обойтись без вычислений?:

    Код:
    Cells(Rows.Count,1).End(xlUp)

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 07:18 06-02-2007 | Исправлено: The okk, 08:24 06-02-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Погонял в цикле. Да, так быстрее получается и код проще. Интересно было бы потестировать в 2007-м.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:34 06-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    По идее, результат в 2007-м должен быть таким же. Ведь End - это не метод, а свойство объекта. Обращение к свойству по определению должно отрабатывать быстрее...
     
    А ты свой код как тестировал? Именно в таком виде?:

    Цитата:
    Cells(ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count, 1).End(xlUp)

    Может, имеет смысл попробовать:

    Код:
    With ActiveSheet.UsedRange
    Cells(.Row+Rows.Count,1).End(xlUp)
    End With

    Должно работать пошустрее.
     
     
    Добавлено:
    Натолкнулся на Cоветы по VB. Надо в шапку. Довольно интересные советы по VB. Будет интересно как начинающим, так и продвинутым VBA-программерам.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:42 06-02-2007 | Исправлено: The okk, 09:46 06-02-2007
    RMKusto



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет!  
     
    Уважаемые форумяне, может ли кто-нибудь помочь мне с решением этой задачки?
     
    Задача - выдернуть из файла Excel, Word статистику: создания,  изменения файла, Total editing time , количество символов , и сохранить эту инфу в другом файле Excel.  
     
    Вся инфа тут: File > Properties > Statistics.  
     
    Есть ли какие-нить функции в VBA, чтобы это оперативно и безболезнено сделать ?
     
     
     
     
     

    Всего записей: 64 | Зарегистр. 15-05-2002 | Отправлено: 17:11 06-02-2007
    The okk



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

    Цитата:
    Есть ли какие-нить функции в VBA, чтобы это оперативно и безболезнено сделать ?

    Получить данные книги можно с помощью кода:

    Код:
    WorkBook(твоя_книга).BuiltInDocumentProperties

    Например, число символов книги "Книга1" можно получить кодом:

    Код:
    Sub GetDocProp
    Dim objProperty As Object
    'можно обратиться по номеру атрибута документа:
    Set objProperty = WorkBook("Книга1").BuiltInDocumentProperties(30)
    ''а если знаешь название атрибута, можно и по названию:
    Set objProperty = WorkBook("Книга1").BuiltInDocumentProperties("Number of characters (with spaces)")
    End Sub

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 17:32 06-02-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RMKusto
    если бы вы почитали форум - то нашли бы ссылки (тут было обсуждение)... ;-)))
    ищите BuiltinDocumentProperties А вот пример из хелпа к VBA (к Word): Подробнее...
    для Excel приблизительно так: Подробнее...
     
    Добавлено:
    The okk
    да... тут не успеешь и ответить ;-))))) находу подмётки рвут ;-))

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 18:05 06-02-2007 | Исправлено: SERGE_BLIZNUK, 18:12 06-02-2007
    playnow

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В VBA ноль.. Помогите плз релиазовать следующую задачку
     
    Допустим на листе1 есть 10 столбцов 10 строк. (количество строк может менятся)
     
    По одному столбцу (пусть Е) просматриваем содержимое ячеек, если в просматриваемой ячейке цифра 2, то всю строку копируем в лист2, если 3 то всю строку в лист3 и т.д.  
    Если находим в столбце следующую циферку 2, то всю строку вставляем в лист2 ниже уже вставленной строки, и так до конца записей в столбце.
     
    Очень желательно чтобы ячейки копировались без изменения размеров.
    В исходном же листе1 всю строку надо выделить определенным цветом.
     
    Зарание БОЛЬШОЕ СПАСИБО

    Всего записей: 2 | Зарегистр. 06-02-2007 | Отправлено: 18:58 06-02-2007
    ZORRO2005



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

    Как привязать скрол мышки к этому списку.Т.е.
    Как сделать так чтобы при помощи скрола можно было двигать двигать
    данные в списке а не страницу целиком.

    Всего записей: 342 | Зарегистр. 08-10-2005 | Отправлено: 19:07 06-02-2007 | Исправлено: ZORRO2005, 19:09 06-02-2007
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Наконец-то сделал массивЯ не понял, почему отображается одна строка ???  
     
    ZORRO2005
    Скроллинг пока невозможно.  
     
     
     
    Добавлено:
    ZORRO2005
    ListBox Scrolling

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



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

    Цитата:
    Я не понял, почему отображается одна строка ???

    Все правильно. при каждом проходе массив переписывается и в конце остается последняя строка последнего листа.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 21:23 06-02-2007
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Yuk
    Почему так? А жаль.

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 22:48 06-02-2007
    Troitsky



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

    Цитата:
    Наконец-то сделал массив Я не понял, почему отображается одна строка ???


    Цитата:
    Почему так? А жаль.

    Да потому что у тебя массив одномерный. Почитай про двумерные массивы.

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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 23:15 06-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Сейчас будете смеяться:
    я в Оbject Browser'e не нашел некоторые свойства объектов, которые у них 100% должны быть. Долго ломал голову, что за ерунда. Оказывается, всего лишь не включил Show Hidden Members. Надо это в шапку добавить:
    По умолчанию в Object Browser не отображаются скрытые методы и свойства.
    Если кликнуть правой кнопкой мыши в правом окошке Object Browser’а (там, где нарисованы члены классов), то выскочит контекстное меню с командой Show Hidden Members. Если щелкнуть на этой команде, то отныне Object Browser будет показывать все hidden-свойства и методы (а также и классы) любой библиотеки, и Вы можете использовать это для более детального исследования библиотек объектов. Взял оттуда

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:30 07-02-2007 | Исправлено: The okk, 08:34 07-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