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

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



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

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aladdinych
    Объяви ее, как Public:
    Код:
     
    Public Function MyFunc()
    'тут код твоей функции
    End Function

    Только сперва посмотри - нельзя ли ее заменить формулой Excel "Родные" формулы работают быстрее.
     
    Тут интересный вопрос Anton T задал:
    Каким образом сделать стандартное контекстное меню для текстбокса при клике по нему правой кнопкой мыши? Я в свойствах не нашел. Это API функция, повешенная на событие?

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



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

    The Okk, спасибо.  
     
    Толкько как запустить эту штуку?  
     
    Извините но VBA на прошлой неделе начал изучать , ещё не совсем понимаю походу...
    Ввожу код в VBA editor. Вместо "Книга1" подставляю название книги "Testbook".
     
    Получается:
     
     
    Код:
    Sub GetDocProp
     
    Dim objProperty As Object
     
    Set objProperty = WorkBook("Testbook").BuiltInDocumentProperties(30)
     
    End Sub
     
     
    Выдаёт ошибку: Compile Error: Sub or function not defined  
    Насколько я понимаю это он ругается функцию Workbook
     
    Пробовал Dim workbook as string, object, variant и т.д. - не катит, каждый раз другая ошибка...
     
    Подскажите что я делаю не так?
     
     
    SERGE_BLIZNUK,  
     
     Sub ListProp()
    rw = 1
    Worksheets(1).Activate
    For Each p In ActiveWorkbook.BuiltinDocumentProperties
       Cells(rw, 1).Value = p.Name
       On Error Resume Next
       Cells(rw, 2).Value = p.Value
       rw = rw + 1
    Next
    End Sub  
     
    Тоже выдаёт ошибку: Compile Error, Variable not defined, ругается на rw
     
     
     
     

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



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

    Код:
    Sub ListProp()
    Dim rw As Long, p As Object
    rw = 1
    Worksheets.Add
    For Each p In ActiveWorkbook.BuiltinDocumentProperties
       Cells(rw, 1).Value = p.Name
       On Error Resume Next
       Cells(rw, 2).Value = p.Value
       rw = rw + 1
    Next
    End Sub

    Выводит на первый лист полный перечень свойств активной книги (ActiveWorkbook). rw тут на самом деле не нужен и только тормозит процесс.
    Код:
    Sub ListProp()
        Dim p As Object
        Worksheets.Add
        Cells(1, 1) = "Название свойства (Name)"
        Cells(1, 2) = "Значение свойства (Value)"
        For Each p In ActiveWorkbook.BuiltinDocumentProperties
            With Cells(Rows.Count, 1).End(xlUp).Offset(1)
                .Value = p.Name
                On Error Resume Next
                .Offset(, 1) = p.Value
            End With
        Next
        Columns("A:B").AutoFit
    End Sub

     
     

    Код:
    Sub GetDocProp()
     
    Dim objProperty As Object  
     
    Set objProperty = WorkBooks("Testbook").BuiltInDocumentProperties(30)  
     
    End Sub

    А это просто пример, как можно обратиться к конкретному свойству книги.

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
     
    От души благодарю
     
    Всё рабоает
     
    SERGE_BLIZNUK
     
    И вас от души благодарю, для Worda код тоже пашет

    Всего записей: 64 | Зарегистр. 15-05-2002 | Отправлено: 13:16 07-02-2007 | Исправлено: RMKusto, 13:39 07-02-2007
    griin



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пишу макрос для Excel 2003, в нем есть такая строчка:

    Код:
    Range("A" & k).Formula = "=ДАТА(ГОД(Y" & k & "), МЕСЯЦ(Y" & k & "), ДЕНЬ(A8))"

    После выполнения макроса в нужной ячейке пишется текст "#ИМЯ?", но если даблкликнуть мышью по ячейке, потом нажать Enter, то в ней отобразится правильное значение. В чем ошибка? Как сделать так, чтобы в ячейке сразу отображалась расчитанная дата?

    Всего записей: 567 | Зарегистр. 03-01-2003 | Отправлено: 17:33 07-02-2007
    Troitsky



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

    Цитата:
    Range("A" & k).Formula = "=ДАТА(ГОД(Y" & k & "), МЕСЯЦ(Y" & k & "), ДЕНЬ(A8))"

    или пиши наименования функций по-английски (список соответствия в шапке) или .FormulaLocal


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

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

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    М-да! Прочти MacroUnit Excel QuickSearch –специальная реализация функции поиска (MS Excel 2000/XP/2003)
     
    Добавлено:
    Пробная версия 14 дней

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



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

    1. Код:
      Range("A" & k)

      Конкатенация (&) - довольно тормознутая операция. Лучше вместо этого пиши:

      Код:
      Cells(k,1)
      . Эффект будет тот же (обращение к k-й строке 1-го столбца), но работать будет быстрее.

    2. Код:
      "=ДАТА(ГОД(Y" & k & "), МЕСЯЦ(Y" & k & "), ДЕНЬ(A8))"  

      Эта запись мне тоже не нравится. Я так понял, тут есть цикл со счетчиком k, поэтому четыре конкатенации в данном случае - явный перебор. Есть же замечательный стиль ссылок R1C1 (альтернатива А1). Его и надо использовать. Тогда получится:

      Код:
      "=ДАТА(ГОД(RC25); МЕСЯЦ(RC25); ДЕНЬ(R8C1))"

      RC25 расшифровывается, как: ячейка в том же ряду, в 25-м по счету столбце (Y).
      Стиль ссылок R1C1 на самом деле довольно прост:
      R (Row, Ряд/Строка). Число после этой буквы соответствует номеру строки (абсолютная ссылка).  
      Например, R1 - ссылка на первую строку.
      Если число после R стоит в квадратных скобках ([ ]), это смещение по строкам относительно текущей ячейки (относительная ссылка).
      Например, R[-1] - ссылка на строку, стоящую над текущей ячейкой.
      C (Column, Столбец/Колонка) Действуют те же правила, что и для R.
    3. Ну и, соответственно, исправляем левую часть:
      Вместо
      Код:
      .Formula
      ставим
      Код:
      .FormulaR1C1Local

    4. В итоге имеем:

      Код:
      Cells(k,1).FormulaR1C1Local="=ДАТА(ГОД(RC25); МЕСЯЦ(RC25); ДЕНЬ(R8C1))"

    5. Теперь доводим до ума сам код - избавимся от цикла.

      Код:
      Cells(k,1)
      меняем на:

      Код:
      Range(Cells(k1,1),Cells(k2,1))
      , где k1 - это начальное значение счетчика k, указанное в твоем цикле;
      k2 - соответственно, конечное значение счетчика. Сама запись Range(Cells(k1,1),Cells(k2,1)) возвращает диапазон ячеек от ячейки Cells(k1,1) до Cells(k2,1).
      В итоге весь цикл записывается в одно действие:

      Код:
      Range(Cells(k1,1),Cells(k2,1)).FormulaR1C1Local="=ДАТА(ГОД(RC25); МЕСЯЦ(RC25); ДЕНЬ(R8C1))"
      Что в переводе на нормальный язык значит:
      Всем ячейкам в первом столбце в диапазоне от k1-й строки до k2-й присвоить формулу.
    6. Если будут тормоза, можно ускорить выполнение кода, отключив обновление экрана и калькуляцию формул на время заполнения диапазона формулами.:

      Код:
      '...в приложении
      With Application
            '...отключаем обновление экрана
            .ScreenUpdating = False
            '...и устанавливаем пересчет формул вручную
            .Calculation = xlCalculationManual
      End With
      'заполняем диапазон формулами
      Range(Cells(k1,1),Cells(k2,1)).FormulaR1C1Local="=ДАТА(ГОД(RC25); МЕСЯЦ(RC25); ДЕНЬ(R8C1))"
       
      'в приложении...
      With Application
            '...включаем обновление экрана...
            .ScreenUpdating = True
            '...и устанавливаем автоматический пересчет формул
            .Calculation = xlCalculationAutomatic
      End With
       


    И не забывай, что если пишешь формулу на русском, то ставится не , а ;.
     
    Добавлено:
    Anton T
    Цитирую оттуда:

    Цитата:
    данная программа «просматривает» построчно все записи на рабочем листе Excel. Для тех строк, для которых заданное условие поиска не соблюдено, изменяется высота строки, которая задается равной нулю. В результате на экране остаются только те строки, которые удовлетворяют заданному критерию. Таким «оригинальным» путем, фактически без установки фильтра, пользователь получает возможность видеть на экране только те строки, которые он ищет.

    Честно говоря, меня выделенный фрагмент описания немного шокировал. Либо я неправильно понял, либо... Из написанного я делаю вывод, что это проход в цикле по строкам (а во внутреннем цикле еще и по столбцам?!), да не просто проход, а с самописным(!) текстовым поиском и присваиванием значений числовым свойствам (вместо элементарного изменения логического свойства видимости на False). Я, конечно, проверю, что занимает меньше времени - скрыть строку или приравнять значение её высоты к нулю, но, честно говоря, сомневаюсь, что результат будет в пользу второго варианта. Кроме того, при таком подходе скрытые ячейки все еще остаются видимыми со всеми вытекающими последствиями.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:50 08-02-2007 | Исправлено: The okk, 13:17 08-02-2007
    Pantera3587

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кто подскажет, есть таблица, в которой числа с разрядами записаны через точку.
     
    Артикул    Наименование    Цена 1    Цена 2
    47212    Процессор AMD     903.88
    47213    Процессор AMD     1054.92    1025.42
    47184    Процессор AMD     1348.74    1309.8
    55336    Процессор AMD     1253.16
     
    Как записать такой код, чтобы заменить точку на запятую сразу во всех столбцах, где стоят числовые значения?

    Всего записей: 40 | Зарегистр. 20-10-2006 | Отправлено: 19:24 08-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pantera3587
    Это и без кода можно сделать - выделяешь столбцы, жмешь Правка - Заменить.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 19:47 08-02-2007
    Yuk



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

    Цитата:
    немного шокировал

    Мягко сказано. И за эту хрень они просят 20 баксов. Наши люди!
    Можно было бы, конечно, попробовать из интереса, действительно ли это так как описано. Можно и взломать при желании. Времени только жалко.
     
     
    Добавлено:
    The okk
    Может, ключевое слово здесь
    Цитата:
    где стоят числовые значения?


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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Да. Ломануть, конечно, надо. Просто из интереса.
     

    Цитата:
    Может, ключевое слово здесь
    Цитата:где стоят числовые значения?  

    Нет. Это НЕ числовые значения. Это обычный текст (если, конечно, в качестве разделителей не выбраны точки). Следовательно, обычный SpecialCells с параметром xlNumbers эти ячейки не увидит. Следовательно, надо найти все ячейки с форматом "Текст" и в каждой из них, где есть точка, сделать Split по точке и в полученном массиве проверить элементы на IsNumeric. Быстрее это вручную сделать, чем код писать.

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите как выделить деапозон ячеек относительно активной ячейки, которая определена поиском?

    Всего записей: 5 | Зарегистр. 10-02-2007 | Отправлено: 00:16 10-02-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    serb78
    ActiveCell.Offset(строк,столбцов)
    Или для диапазона пример
    Range(ActiveCell.Offset(1,0),ActiveCell.Offset(5,2))
    Выделит область 5 строк вниз и 3 столбца.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 00:26 10-02-2007
    serb78

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо огромное!
     
    Подскажите  еще как создать книгу с названием напимер "книга100220071320", т.е. часть названия "книга" всегда постоянная, а цифры это текущая дата и время?

    Всего записей: 5 | Зарегистр. 10-02-2007 | Отправлено: 13:26 10-02-2007
    Troitsky



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

    Цитата:
    Подскажите  еще как создать книгу с названием напимер "книга100220071320", т.е. часть названия "книга" всегда постоянная, а цифры это текущая дата и время?


    Код:
        Set wbNew = Workbooks.Add
        wbNew.SaveAs "книга" & Format(Now(), "ddmmyyyyhhmm")
        Set wbNew = Nothing


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 14:48 10-02-2007
    Domivan

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте всем.
    Я научился передавать команды через com порт во внешнее устройство (электронные весы) с целью управления ими и получения необходимых данных (результат взвешивания).
    Вопросы следующие.
    1. Для обращения к com порту я использую элемент управления mscomm32.ocx разработанный в Microsoft но не вошедший в дистрибутив по определенным причинам. Подробнее можно прочитать здесь http://www.anthillsolutions.com/msexcel.html
    Оттуда я и скачал элемент. Задачу передачи данных через порт я решил, но: есть ли какой-нибудь другой способ обращения к порту, желательно без помощи посторонних элементов управления? Естественно, средствами VBA.
    2. Опрос порта происходит в течение определенного времени, скажем, 2-х секунд.
    В течение этого времени весы успевают передать в порт всю строку в ответ на запрос. Программа циклически считывает данные с порта в текстовую переменную и ждет символа конца строки Chr (10), после чего цикл прекращается. Цикл прекращается также по таймингу (примерно 2-5 секунды). Но мне не нравится как этот тайминг мне пришлось организовать: я тупо устроил цикл do-loop until i=0 с начальным счетчиком i=10000.
    Подскажите, как сделать нормальный цикл по времени? Чтоб задать необходимое время жизни цикла?
    Спасибо.

    Всего записей: 4 | Зарегистр. 10-02-2007 | Отправлено: 17:13 10-02-2007
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Смотри рисунки:
    рис1
    рис2
    По адресу "Ленин" отображается все по улице Ленина, когда я ввожу фамилию "Ав" отображаются разные адреса. Как можно сделать, чтобы не отображались разные адреса?
    Здесь коды

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Domivan
    Это не ты случайно раньше здесь уже спрашивал про управление весами из VBA?
    Про 1 не знаю.
    2. Используй метод Application.Wait. Посмотри в хелпе, там есть нужные тебе примеры. Есть еще метод OnTime для расписания, может тоже пригодится.
     
    Добавлено:
    Подумал, что возможно я не так понял. Можно просто записать значение Time0 = Now() в начале работы цикла, а потом сравнивать с ним текущее время. Можно и не на каждом шаге.
     
     
    Добавлено:
    Anton T
    Все правильно. У тебя при изменении каждого текстбокса происходит чтение данных из таблицы с проверкой только по этому текстбоксу.

    Код:
    strFilt = TB1.Text
    strFiltLen = Len(strFilt)
    ...
    If strFilt = Left(r.Cells(1).Text, strFiltLen) Then
    ...
    ...
    strFilt = TB2.Text
    strFiltLen = Len(strFilt)
    ...
    If strFilt = Left(r.Cells(5).Text, strFiltLen) Then

    Объедини эти условия и выполняй при изменении каждого текстбокса. Например
    Код:
    If strFilt1 = Left(r.Cells(1).Text, strFiltLen1) And strFilt2 = Left(r.Cells(5).Text, strFiltLen2) Then


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 08:24 11-02-2007 | Исправлено: Yuk, 08:58 11-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