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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)

Модерирует : ShIvADeSt

ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

ShIvADeSt



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

 
 
Обсуждаем вопросы только по Excel VBA
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.
 
Вопросы по работе с MS Excel, не относящиеся к программированию, задаем в теме Excel FAQ

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Предыдущие ветки топика: Часть 1
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format (eng.)
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами 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.
  • Приемы, хитрости, трюки и нюансы работы в Microsoft Excel - сайт "Планета Excel", целиком посвященный Excel и всему, что с ним связано.
  • Microsoft Excel: Таблицы и VBA. Справочник. Вопросы и Ответы. Советы. Примеры.  
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2, часть 3
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов
    Найти "чужое" окно и нажать в нем кнопку (вписать текст в текстовое поле)
    Работа с UNICODE-символами в VBA: запись, чтение из ячейки, перевод в ASС и обратно
    Как программно подключить дополнительные библиотеки (например, "Microsoft Scripting Runtime" или "Microsoft ActiveX Data Objects 2.8 Library) через References

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:58 23-04-2007 | Исправлено: JekG, 22:32 10-01-2010
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
     
    ReDim a(UBound(arg)) 'Определяем размерность массива результатов  
     
    Можете объяснить, почему без этой команды никак, не могу въехать
     
    P.S. Вообщем значения вытягивать из массива получаеться )

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 15:25 02-09-2008
    jocer

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Workbooks("тратата.xls").Close savechanges = False перед закрытием показывает сообщение: в буфере обмена содержится большой формат данных... как избавиться от появления этого сообщения?
    Application.DisplayAlerts = False:  Workbooks("тратата.xls").Close - эксель сразу виснет

    Всего записей: 21 | Зарегистр. 13-08-2008 | Отправлено: 16:01 02-09-2008
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как можна учить работу с объектами Excel ?
    Макрорекодер как-то записывает ?

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 16:04 02-09-2008
    mistx

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Друзья подскажите пожалуйста как решить данную задачу?
     
    может как то это можно реализовать в екселе?
     
    Есть таблица в ворде - 8 колонок.
     
    1- 12\07\1999
    2- 28\07\1999
    3 - 15
    4- 16
    5- 120000
    6 - хххх.хх
    7- хххх.хх
     
    строк с подобными параметрами около 20
     
    нужно чтобы получилось без таблицы в одну строку
     
    с 12.07.1999 по 28.07.1999 - 120000 Х 16% Х 15 дн Х хххх.хх
     
    КАк реализовать?
     
    Заранее благодарю

    Всего записей: 765 | Зарегистр. 13-01-2005 | Отправлено: 17:19 02-09-2008 | Исправлено: mistx, 17:21 02-09-2008
    Oyger

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

    Цитата:
    Друзья подскажите пожалуйста как решить данную задачу?  
    может как то это можно реализовать в екселе?  
    Есть таблица в ворде - 8 колонок.  
    1- 12\07\1999  
    2- 28\07\1999  
    3 - 15  
    4- 16  
    5- 120000  
    6 - хххх.хх  
    7- хххх.хх  

    Можно ручками. И даже в Ворде.
    Эти столбцы меняешь местами: как у тебя должны быть данные по тексту - просто перетаскиваешь мышкой.
    Далее - создаешь вспомогательные столбцы. О чем говорю? Смотри

    Цитата:
    с 12.07.1999 по 28.07.1999 - 120000 Х 16% Х 15 дн Х хххх.хх  

    Первый столбец будет вспомогательный - вставляешь его. В первом столбце во всех ячейках пишешь "с" (делается в два счета).
    Далее идет твой столбец с датой (пробел пропускаем).
    3-ий столбец делаем тоже вспомогательным - везде "по" (тоже элементарно)
    4-ый - дата.
    5-ый - "-"
    и т.д.
    Когда все подготовил - выделяешь таблицу целиком и счелкаешь: Таблица (пункт меню) - Преобразовать - Таблицу в текст ...
    Выбираем разделитель "другой" и ставим пробел.
    Готово - получаем вместо таблицы текст...
     
    Можно, конечно, и код забабахать...

    Всего записей: 122 | Зарегистр. 22-03-2007 | Отправлено: 18:04 02-09-2008 | Исправлено: Oyger, 18:05 02-09-2008
    twindim77

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может кто нибуть сталкивался и знает решение...
    в Forms расположены ListBox в которые вбиваются даты
    1. Формат дат к сожалению как ни крути ММ.ДД.ГГ (хотя в региональных настройках привычные нам ДД.ММ.ГГ)
    2. Худшее то, что стал excel виснуть при изменении дат.
    Обе проблеммы лечатся и работает все идеально...2 мя способами и ОБА способа неприемлемы.
    1. Зайти в Региональные настройки и НИЧЕГО не меняя подтвердить формат даты.
    2. Установить excel-97 (любой его кусок)...и тут же снести его.
    В этом случае и формат даты правильный и всё летает без зависонов, но не скажешь же всем включая иногородных, мол лечение есть)))))...
    Помогите если кто знает, уже много времени убил...

    Всего записей: 3 | Зарегистр. 03-09-2008 | Отправлено: 04:50 03-09-2008
    Oyger

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    twindim77
    Текст инициализации формы и заполнения ListBox датами можешь вставить.
    И конкретнее: как заполняется ListBox? При помощи чего? и т.п.
    А то искать ошибку типа "ребята, при работе макроса виснет комп - в чем проблема?" как-то трудно...

    Всего записей: 122 | Зарегистр. 22-03-2007 | Отправлено: 17:25 03-09-2008
    Solenaja



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    есть вот такой макрос
    Sub Un-protect()
    '
    ' Снимает защиту со всех листов книги.
    ' Макрос записан 23.05.2008 (Горшков М.В.)
    '
     
    Dim PWORD As String
    ' присвоить PWORD пароль от листа
    PWORD = "11111"
     
    For Each WkSht In Worksheets
    WkSht.Unprotect Password:=PWORD
    Next WkSht
    End Sub
     
    Sub P-rotect()
    '
    ' Защищает паролем все листы книги.
    ' Макрос записан 23.05.2008 (Горшков М.В.)
    '
     
    Dim PWORD As String
    ' присвоить PWORD пароль от листа
    PWORD = "11111"
     
    For Each WkSht In Worksheets
    WkSht.Protect Password:=PWORD
    Next WkSht
     
    End Sub
     
    но по-умолчанию для страниц разрешено выделение заблокированных и незаблокированных ячеек, как назначить / снять пароль для всех листов чтобы запретить эти два разрешения?

    ----------
    Могу помочь, но только своими знаниями и ...

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 19:00 03-09-2008
    Klaid1

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

    Цитата:
    Klaid1  
    Переход на следующий лист можно осуществить так:  
     
    Код:Sheets(ActiveSheet.Index + 1).Select  
     
    Только следите за тем, чтобы не получилось перехода на несуществующий лист, т.е. следующий за последним.  
    Чтобы получить код VBA для создания автофильтра, запустите макрорекордер, проделайте то, что Вам нужно и подправьте полученный код.

     
    Отлично, работает. Правда она теперь просто переходит на другой лист и стоит.  
     
    Надо вот как сделать:
    выборка, переход на другой лист, выборка... последний лист выборка, стоп.
     
    Выборку сделаю просьба подсказать остальное.

    Всего записей: 376 | Зарегистр. 02-09-2008 | Отправлено: 01:37 04-09-2008 | Исправлено: Klaid1, 01:39 04-09-2008
    SAS888

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

    Цитата:
    ReDim a(UBound(arg)) 'Определяем размерность массива результатов  
    Можете объяснить, почему без этой команды никак, не могу въехать

    При определении переменных, размерность массива результатов неизвестна. Поэтому мы определяем динамический массив Dim a(). После того, как сформирован массив исходных данных (массив "arg"), то командой ReDim a(UBound(arg)) мы определяем размерность массива "a" равную размерности массива "arg".
     
    jocer

    Цитата:
    как избавиться от появления этого сообщения?

    Можно перед закрытием книги средствами VBA очистить буфер обмена (если, конечно, это допустимо).
     
    twindim77

    Цитата:
    в Forms расположены ListBox в которые вбиваются даты

    Для таких целей рациональнее использовать не ListBox, а DTPicker.
     
    Solenaja

    Цитата:
    но по-умолчанию для страниц разрешено выделение заблокированных и незаблокированных ячеек, как назначить / снять пароль для всех листов чтобы запретить эти два разрешения?

    Установить защиту с паролем и запретить выделение любых ячеек можно, выполнив:

    Код:
    WkSht.Protect Password:=PWORD
    WkSht.EnableSelection = xlNoSelection

    Соответственно, если при защите необходимо разрешить выделение, то так:

    Код:
    WkSht.Protect Password:=PWORD
    WkSht.EnableSelection = xlYesSelection

     
    Klaid1

    Цитата:
    Надо вот как сделать:
    выборка, переход на другой лист, выборка... последний лист выборка, стоп.

    Следующий пример в ячейку "A1" листов, определенных оператором Select Case (с 3 по 5), вставит "Yes". Можно задать диапазон требуемых листов или избранные листы. Если это действие необходимо применить ко всем листам, то Select Case не нужен. Естественно, вместо Sheets(i).[A1] = "Yes" Вы поместите код требуемых Вам действий.

    Код:
    Sub Main()
        Dim i As Integer
        Application.ScreenUpdating = False
        For i = 1 To Sheets.Count
            Select Case i
                Case 3 To 5
                    Sheets(i).[A1] = "Yes"
            End Select
        Next
    End Sub

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 06:05 04-09-2008 | Исправлено: SAS888, 06:38 04-09-2008
    MaximuS G

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

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 10:50 04-09-2008 | Исправлено: MaximuS G, 10:54 04-09-2008
    Solenaja



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    спасибо.
    есть ещё вопрос.
    на листе есть не защищенные ячейки, нужно установить пароль на лист чтобы эти ячейки не блокировались, т.е. разрешить выделение не защищеннных ячеек

    ----------
    Могу помочь, но только своими знаниями и ...

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 10:57 04-09-2008
    Oyger

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

    Цитата:
    на листе есть не защищенные ячейки, нужно установить пароль на лист чтобы эти ячейки не блокировались, т.е. разрешить выделение не защищеннных ячеек

    Если в свойстве ячейки уже снята функция защиты - просто защити лист. Ячейка будет доступной для изменения.
    Если же функция защиты не снята - перед защитой листа сними ее командой Range(...).Locked = False
    Если же ты хочешь, чтобы после защиты выделялись только не защищенные ячейки, а защищенные не выделялись вставь строку:
    Sheets(...).EnableSelection = xlUnlockedCells

    Всего записей: 122 | Зарегистр. 22-03-2007 | Отправлено: 11:39 04-09-2008
    Solenaja



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

    Цитата:
    Если же ты хочешь, чтобы после защиты выделялись только не защищенные ячейки, а защищенные не выделялись вставь строку:  
    Sheets(...).EnableSelection = xlUnlockedCells
    спасибо, но выдает ошибку
    Expected: identifier or bracketed expression

    ----------
    Могу помочь, но только своими знаниями и ...

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 12:49 04-09-2008
    Oyger

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Solenaja
    Функция работает.
    Ищи ошибку. Может где что наврал: книга не та активна или еще что...
    А скорее - ошибка в написании...
     
    Добавлено:
    У меня в свою очередь тоже вопрос...
    Вот я пишу код и описываю в нем переменную:
    Dim XXX as ...
    Что это значит - в памяти "отрезался" кусок под эту переменную длинной ... байт (в зависимости от типа переменной).
    Переменная свое отработала - до конца кода еще далеко. Переменная больше не нужна. Хочу от нее избавится.
    Даже если я обнулю переменную, ее место все равно остается в памяти и ничем не занимается (опять же зависит все от жизни переменной, но это опустим).
    Существует ли команда, которая позволит убить этот кусок - убить это место из памяти - освободить память?

    Всего записей: 122 | Зарегистр. 22-03-2007 | Отправлено: 13:13 04-09-2008
    Solenaja



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Oyger
    на троеточее ругается ваше
     
    Добавлено:
    работает так
    WkSht.EnableSelection = xlUnlockedCells

    ----------
    Могу помочь, но только своими знаниями и ...

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 17:26 04-09-2008
    ecolesnicov

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Oyger
     
    В Excel для очистки используются следующие приемы:
    1) для очистки массива - Erase
    2) Для очистки объекта - Unload
    3) Для очистки других переменных - x=empty (могу и ошибаться, но что-то с empty)
     
    Если переменных слишком уж много - может выдаться ошибка "Too many local, nonstatic variables" (маловероятно - я никогда с таким не сталкивался, хотя использовал сложные объектные переменные и массивы с 10-ками тысяч строк). Сам Excel рекомендует в таком случае описывать переменные как Static, так как они выделяются "из другой памяти" ...

    Всего записей: 251 | Зарегистр. 05-08-2005 | Отправлено: 18:00 04-09-2008
    twindim77

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Oyger
    Насчет DTPicker...его просто нет по умолчанию...доустанавливать неприемлемо.
    Инициализации формы как таковой нет ( я просто неумею этого). А заполнение ListBox
    примитивно...Открыл форму Show встал на лист бокс...вписал дату она и прописалась в A1 (в его свойствах прописано ControlSource=xxx!A1)..хочешь прочитать архив закинул в А1 дату тоже простым способом типа A1=B1...и в лист бокс прочитал...ячейка A1 имеет формат ДД.ММ.ГГ, такой же как и в региональных настройках. Так вот если танец с бубнами не производить ( что допустимо на 1 компе...недопустимо на 60 ти других)...то Дата в лист бокс имеет формат ММ.ДД.ГГ но это полбеды...просто excel зависает при поступлении дат...они то автоматом при пересчете страницы идут в него. Но если зависло то лечение есть как писал неприемлемое, но кординально все решающее...зайти тут же в региональные настройки и ПОДТВЕРДИТЬ ничего не меняя дату и все и дата пишется как заказывали и ничего не виснет все работает...но это надо делать при каждом новом запуске...причем не ДО не после а именно во время зависона excel)))...

    Всего записей: 3 | Зарегистр. 03-09-2008 | Отправлено: 20:25 04-09-2008
    andrejka k

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте. Я уже как-то обращался в данную ветку
    по поводу надстройки KaotiXLdemo.xla. Тогда речь шла о том, чтобы сделать надстройку работоспособной. Благодаря уважаемому  
    SERGE_BLIZNUK макрос заработал, правда с ограничениями
    (поскольку на сайте разработчика была выложена демонстрационная версия). Ограничения эти касаются объема обрабатываемого
    массива данных - Demo version only allow you to enter 100 rows of closing prices (т.е. максимум 100 строк). Подскажите,
    пожалуйста, насколько реально снять это ограничение??? Может ли кто-нибудь из здесь присутствующих помочь с данной
    проблемой? Исправленная  SERGE_BLIZNUK версия выложена здесь. Оригинал макроса находится
    здесь.
    Заранее огромное спасибо!!!

    Всего записей: 1225 | Зарегистр. 13-05-2003 | Отправлено: 21:10 04-09-2008
    Oyger

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Solenaja
    А вместо троеточия имя листа вставить не пробовали?
     
    Добавлено:
    twindim77
    А ты не путаешь, случаем, ListBox и TextBox?
     
    Добавлено:
    ecolesnicov

    Цитата:
    Сам Excel рекомендует в таком случае описывать переменные как Static, так как они выделяются "из другой памяти"

    А ссылку скажешь?

    Всего записей: 122 | Зарегистр. 22-03-2007 | Отправлено: 09:54 05-09-2008
       

    Страницы: 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)
    ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru