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

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ScorpionS
    If worksheets("формулы").cells(103,1) = 0 then

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



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо! Просто гениально придумано!
    Теперь я смотрю на ВБА другими глазами..

    Всего записей: 341 | Зарегистр. 15-02-2005 | Отправлено: 09:55 05-05-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DONRU1
    Спасибо! Подскажите, нужно чтобы тобразилась строка 107 и скрылись строки с 108 по 331. Вроде код такой

    Код:
     
       Range("107:107").Select
       Selection.EntireRow.Hidden = False
       Range("108:121").Select
       Selection.EntireRow.Hidden = True
     

    Но из-за того, что ячейки A107:E121 объеденены строка 107 тоже скрывается вместе с 108:121. Подскажите, plz, как обойти этот момент?
    И еще.... Как сделать, чтобы условие выполнялось только при изменении любой из ячеек F15:F29, а то при Private Sub Worksheet_Change(ByVal Target As Range) осуществляется при любом изменении на листе?

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 10:45 05-05-2006 | Исправлено: ScorpionS, 14:15 05-05-2006
    Yuk



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

    Цитата:
    Просто гениально придумано!


     
    ScorpionS
    А вот так?

    Код:
    Range("F108:F121").Select
    Selection.EntireRow.Hidden = True

     

    Цитата:
    Как сделать, чтобы условие выполнялось только при изменении любой из ячеек F15:F29

    Только через условие в самой функции. То есть функция запускается, через If проверяет, находится ли Target в указанной области, если да, выполняет необходимые действия. Условие можно составить, сравнивая ряды и колонки, либо используя функцию Intersect.

    Код:
    Private Sub Worksheet_Change(ByVal Target As Range)
        Set isect = Application.Intersect(Target, Range("F15:F29"))
        If Not isect Is Nothing Then
            MsgBox "Done"
        End If
    End Sub


    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:19 05-05-2006 | Исправлено: Yuk, 19:23 05-05-2006
    ScorpionS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Спасибо! Все заработало как надо.

    Всего записей: 139 | Зарегистр. 24-02-2003 | Отправлено: 14:28 06-05-2006
    MOCT

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    возник вопрос - почему при работе с некоторыми файлами, у которых в соответствующих свойствах ничего не содержится, появляется ошибка (Automation Error) при использовании конструкций вида:
     
    Dim sUserFileEx As Excel.WorkBook
    ...
    sUserFileEx.BuiltInDocumentProperties(wdPropertyTimeLastSaved)
     
    аналогичная ошибка появляется для свойств wdPropertyRevision и wdPropertyVBATotalEdit

    Всего записей: 4 | Зарегистр. 26-10-2005 | Отправлено: 01:05 07-05-2006
    maidenmarion

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Люди добрые подскажите, кто знает.. Задача: есть база в xls файле.. Через запросы SQL  нормально проходит и INSER INTO и SELECT FROM.. Однако требуется комбинированный запрос.. ТОесть результат запроса SELECT вставить как исходные данные оператора INSERT.. В книге по SQL есть вид запроса.. Однако в EXCEL с этим проблема.. Для SELECT FROM нужно результат копировать в Recordset.. Если кто сталкивался, помогите пожалуйста.. Просьба не предлагать перевести EXCEL в "нормальную базу данных".. Т.к этот способ не приемлем для текущей работы.. Заранее спасибо

    Всего записей: 84 | Зарегистр. 27-10-2005 | Отправлено: 11:55 07-05-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MOCT
    По-моему, wdProperty..., только для Ворда.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 19:52 07-05-2006
    MOCT

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

    Цитата:
    По-моему, wdProperty..., только для Ворда.

    нет, все правильно - wdProperty* одни на все семейство Офиса.
     
    кстати, если кому будет интересно, судя по всему ответ на мой вопрос - это листинг 4 на странице http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/VBA/Word/382.mspx
    но помогает, почему-то, только для wdPropertyRevision, а для wdPropertyTimeLastSaved, wdPropertyTimeLastPrinted, wdPropertyVBATotalEdit проблема остается

    Всего записей: 4 | Зарегистр. 26-10-2005 | Отправлено: 21:33 07-05-2006 | Исправлено: MOCT, 21:52 07-05-2006
    Yuk



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

    Цитата:
    wdProperty* одни на все семейство Офиса

    Ну, не знаю. У меня с wdProperty* ничего не заработало в экселе. Но зато работает вот такой скрипт:

    Код:
    Sub AllProperties()
    Dim myIndex As Integer
    Dim MyString As String
    With ActiveWorkbook
        For myIndex = 1 To .BuiltinDocumentProperties.Count
            MyString = ("'" & myIndex & ". " & _
            .BuiltinDocumentProperties(myIndex).Name)
            Worksheets(1).Cells(myIndex, 1).Value = MyString
            Worksheets(1).Cells(myIndex, 2).Value = _
            .BuiltinDocumentProperties(myIndex).Value
            On Error Resume Next
        Next myIndex
    End With
    End Sub

    Выводит усе.

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



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

    Цитата:
    wdProperty* одни на все семейство Офиса
    Одни на все семейство Офиса константы msoProperty*
     
    Константы wdProperty* относятся конкретно к объектной модели Word. Например,
    Цитата:
    Const wdPropertyVBATotalEdit = 13
        Member of Word.WdBuiltInProperty

     
    Даже в справке к ExcelVBA в разделе BuiltinDocumentProperties Property есть пример, который выводит все доступные свойства книги:
    Код:
    rw = 1
    Worksheets(1).Activate
    For Each p In ActiveWorkbook.BuiltinDocumentProperties
        Cells(rw, 1).Value = p.Name
        rw = rw + 1
    Next

    Вот они
     
    Добавлено:

    Цитата:
    кстати, если кому будет интересно, судя по всему ответ на мой вопрос - это листинг 4 на странице http://www.microsoft.com/Rus/Msdn/Activ/MSVB/Archive/VBA/Word/382.mspx
    Не стоит, все же, забывать, что разговор идет не о свойствах документа Word, а о рабочей книге Excel.

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

    Всего записей: 794 | Зарегистр. 13-12-2003 | Отправлено: 08:53 08-05-2006 | Исправлено: Troitsky, 08:53 08-05-2006
    MOCT

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

    Цитата:
    Ну, не знаю. У меня с wdProperty* ничего не заработало в экселе. Но зато работает вот такой скрипт:  

    константы - они и есть константы. можно вообще подставить конкретное число - будет то же самое (пробовал).
     
    По поводу предложенного скрипта:
    все идет нормально до индекса с номером 10 (Last print date). А на нем получаем то же самое:
    Run-time error '-2147467259 (80004005)
    Method 'Value' of object 'DocumentProperty' failed
     
     
    Добавлено:
    Troitsky:

    Цитата:
    Константы wdProperty* относятся конкретно к объектной модели Word. Например,
     
    Даже в справке к ExcelVBA в разделе BuiltinDocumentProperties Property есть пример, который выводит все доступные свойства книги:

    имена выводятся для всех из них, не спорю. а вот значения некоторых из них (мне нужны были 10, 12, 13, может быть еще на каких проблемы возникают) приводят к ошибке. не помогает даже on error resume next (
     
    Поэтому остается та же самая проблема - можно ли как-то еще, не обращаясь к .Value, определить, что данное значение в книге/документе не определено? Может быть какой-то специфический обработчик ошибок?

    Всего записей: 4 | Зарегистр. 26-10-2005 | Отправлено: 09:52 08-05-2006
    Yuk



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

    Цитата:
    константы - они и есть константы

    Э нет. Константы определяются в конкретной объектной модели.
     

    Цитата:
    По поводу предложенного скрипта:
    все идет нормально до индекса с номером 10 (Last print date). А на нем получаем то же самое:
    Run-time error '-2147467259 (80004005)
    Method 'Value' of object 'DocumentProperty' failed

    У меня скрипт работает без проблем. А ты пробовал открыть File - Properties и посмотреть, что там? А может ошибка где-то в другом месте? Пробовал мой скрипт один к одному?
     
    All
    Кто-нибудь еще пробовал скрипт? Есть проблемы?

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



    Водник Водкин
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    MOCT
    Yuk
    Получается, что вопрос, скорее, о том, почему не срабатывает обработчик
    Код:
    On Error Resume Next
    . С ним макрос работает без проблем, без него, разумеется, возникают ошибки на свойствах, значения которых неопределенны.


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

    Всего записей: 794 | Зарегистр. 13-12-2003 | Отправлено: 23:24 08-05-2006
    denis_a

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите плиз, как обойти такую траблу.
     
    Так - вылетает оффис:
    ActiveWorkbook.Worksheets("List1").SaveCopyAs Filename:="c:\List1.csv", FileFormat:=xlCSV, CreateBackup:=False
    ActiveWorkbook.Worksheets("List2").SaveCopyAs Filename:="c:\List2.csv", FileFormat:=xlCSV, CreateBackup:=False
    ActiveWorkbook.SaveAs Filename:="c:\Lists.xls", _
          FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
          ReadOnlyRecommended:=False, CreateBackup:=False
     
    А так CSV файлы не сохраняет:
    ActiveWorkbook.SaveAs Filename:="c:\Lists.xls", _
          FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
          ReadOnlyRecommended:=False, CreateBackup:=False
    ActiveWorkbook.Worksheets("List1").SaveCopyAs Filename:="c:\List1.csv", FileFormat:=xlCSV, CreateBackup:=False
    ActiveWorkbook.Worksheets("List2").SaveCopyAs Filename:="c:\List2.csv", FileFormat:=xlCSV, CreateBackup:=False

    Всего записей: 214 | Зарегистр. 16-08-2004 | Отправлено: 14:58 09-05-2006
    mcyr

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Please! Please! Please!  
    Никак не удается из VBA вставить в ячейку функцию ЕСЛИ(...)
    Т.е на строку типа:
    Range.Cells(1,1).Formula = "=ЕСЛИ(...)"
    дает ошибку "Application-defined or object-defined error"
    То же самое для функций СУММАЕСЛИ, If, SumIf.
    При этом другие функции вставляются нормально. Это что, принципиальное ограничение, или я что-то тупо делаю не то?

    Всего записей: 3 | Зарегистр. 09-05-2006 | Отправлено: 21:18 09-05-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mcyr
    Покажи полностью строчки кода где появляется ошибкa. С работающей функцией и с проблемной. Ошибка в коде скорее всего.
     
    Добавлено:
    Проверь ; и , в формуле. Зависит от языка.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 22:58 09-05-2006 | Исправлено: Yuk, 23:00 09-05-2006
    mcyr

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот пожалуйста!
    Первая не работает, вторая работает
     
    Sub TestBad()
    Cells(11, 11).Formula = "=If($H$13>$I$1;$I$13;0)"
    End Sub
     
    Sub TestWell()
    Cells(11, 11).Formula = "=SUM($H$13:$I$1)"
    End Sub

    Всего записей: 3 | Зарегистр. 09-05-2006 | Отправлено: 00:08 10-05-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mcyr
    Не знаю, есть ли IF в русском экселе, а в английском параметры разделяются запятой:

    Код:
     Cells(11, 11).Formula = "=If($H$13>$I$1,$I$13,0)"


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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ты гений, а я идиот!
    С запятой работает.
     И "ЕСЛИ" c запятой работает,
    хотя у меня русский Excel.
    Но это уже наплевать!
    Спасибо

    Всего записей: 3 | Зарегистр. 09-05-2006 | Отправлено: 00:23 10-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.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru