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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Help
    Очень надо, чтоб при загрузке листа при А2>В2, А3>В3, А4>В4... програма меняла цвет ячейки С2, С3,С4.. на красный?    

    Всего записей: 37 | Зарегистр. 01-02-2007 | Отправлено: 11:13 10-02-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Voyager69
    В модуль нужного листа вставьте код:

    Код:
    Private Sub Worksheet_Activate()
     
        If [A2] > [B2] And [A3] > [B3] And [A4] > [B4] Then [C2:C4].Interior.ColorIndex = 3
     
    End Sub

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 11:21 10-02-2009
    Voyager69

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

    Цитата:
    Private Sub Worksheet_Activate()  
     
        If [A2] > [B2] And [A3] > [B3] And [A4] > [B4] Then [C2:C4].Interior.ColorIndex = 3  
     
    End Sub

     
    Спасибо, а как чтоб сразу считала при открытии документа, а не смене листа?
    То же в Private Sub Workbook_Open() ?

    Всего записей: 37 | Зарегистр. 01-02-2007 | Отправлено: 11:37 10-02-2009
    DAD

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите настроить макрос для пакетного удаления данных  из таблицы. В примере на Лист1 в колонке А имеется список (40 ячеек), который образуется из формул. На Лист2 есть таблица. Задача: удалить все данные из таблицы которые есть в списке. Пытаюсь использовать:
     

    Код:
    Sub Find_Replace()
    Dim myCount As Long, J%
     
    ActiveSheet.Range("A2").Select
    Range(Selection, Selection.End(xlDown)).Select
    myCount = Selection.Rows.Count
    Dim NTM As String
    For J = 1 To myCount
    NTM = Sheets("Sheet1").Range("A2").Offset(J - 1, 0)
    Application.Goto Reference:="MYRANGE1"
    Selection.Replace What:=NTM, Replacement:="", LookAt:=xlWhole, _
    SearchOrder:=xlByRows, MatchCase:=False
    Next J
    On Error Resume Next
    End Sub

     
     В принципе работает. А проблема вот какая:
    Список всегда без пропусков, но может быть не полным и даже иногда из одного элемента. То есть результат формулы или текст. или "". Получается что код всегда проигрывается 40 раз вне зависимости сколько ячеек на самом деле содержат данные для удаления. Можно ли изменить код так, чтобы число циклов было равно числу ячеек с реальными данными ?
    Файл примера не большой, но реальные список и таблица в сотни раз больше. Удаление стандартными средствами Excel занимает 20 минут ежедневно.
     
    http://tempfile.ru/file/853506

    Всего записей: 2 | Зарегистр. 10-01-2006 | Отправлено: 11:44 10-02-2009
    Solenaja



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    всё правильно и все работает как надо. единственно что возникает после открытия сформированных файлов (это было и в непоправленном макросе):  "Возникла ошибка и Excel удалил часть форматов, чтобы предотвратить повреждение книги. Тщательно проверьте форматирование книги."
    При открытии исходной общей книги со всеми листами Excel не ругается ни на что.  
     
    Поэтому приходится открывать каждый раз сформированный файл - жать на кнопку ОК в окне ошибки и сохранять файл.

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

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 11:55 10-02-2009
    NUB01



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

    Цитата:
    Можно, например, с помощью небольшой процедуры.  

     
    Спасибо,SAS888.
    Немного не так сформулировал вопрос, но Cell.MergeArea.(Columns.Count и Rows.Count) - именно то, что мне было нужно. Да и процедура полезная.

    Всего записей: 19 | Зарегистр. 30-09-2008 | Отправлено: 12:11 10-02-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DAD
    Не могу "залить" Ваш файл-пример. Но если я правильно понял, что из именованного диапазона "MYRANGE1" нужно очистить ячейки, значения которых совпадает с любым значением из столбца "A" листа "Sheet1", то можно так:

    Код:
    Sub Find_Replace()
     
        Application.ScreenUpdating = False
        [MYRANGE1].Activate
        With Sheets("Sheet1")
            arr = .Range(.[A1], .Cells(Rows.Count, "A").End(xlUp)).Value
        End With
        For Each x In arr
            [MYRANGE1].Replace What:=x, Replacement:="", LookAt:=xlWhole
        Next
         
     End Sub

     
    Добавлено:
    Solenaja
    К сожалению, у меня нет Excel 2007.
    Попробуйте в коде макроса, в строке
    Код:
    ActiveWorkbook.SaveAs (myPath & arg & ".xls")
    заменить ".xls" на ".xlsm".

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 12:13 10-02-2009
    SergK80

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

    Код:
       MyVar = Trim(Worksheets(1).Cells(counter, 1).Value)
       If Not (MyVar = "") Then
       ПОИСК И ЗАМЕНА
     

     
    Самое простое, что приходит, это проверить не пустая ли ячейка

    Всего записей: 20 | Зарегистр. 06-06-2008 | Отправлено: 12:54 10-02-2009
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Жаль что тут нет фишки, как на других форумах - где рейтинг можна для пользователей повышать! У нас бы SAS888 был бы наверное чемпионом по количеству решенных задач

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 13:03 10-02-2009
    DAD

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

    Код:
    [MYRANGE1].Activate

     
    Activate method of Range class failed
    Заменил на

    Код:
    Application.Goto Reference:="MYRANGE1"

    Спасибо, вроде всё работает. Вечером проверю на большом файле.
     
    Перезалил:
    http://ifolder.ru/10482609

    Всего записей: 2 | Зарегистр. 10-01-2006 | Отправлено: 13:08 10-02-2009
    SAS888

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

    Цитата:
    Activate method of Range class failed
    Заменил...

    Совершенно верно  [MYRANGE1].Activate будет работать тогда, когда лист, содержащий этот диапазон активен. Либо добавить ссылку на этот лист. Либо Ваше решение. В принципе, эту строку можно заменить активацией листа с этим диапазоном. Сам диапазон активировать совсем не нужно.
     
    Добавлено:
    Voyager69

    Цитата:
    а как чтоб сразу считала при открытии документа, а не смене листа?
    То же в Private Sub Workbook_Open() ?  

    Да. Только нужно добавить ссылку на требуемый лист. Например:

    Код:
    Private Sub Workbook_Open()
     
        With Sheets(2)
            If .[A2] > .[B2] And .[A3] > .[B3] And .[A4] > .[B4] Then .[C2:C4].Interior.ColorIndex = 3
        End With
     
    End Sub

     
    Добавлено:
    MaximuS G
    Спасибо за оценку. Просто пытаюсь данный топик форума сделать более оживленным.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 13:53 10-02-2009
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    У меня тоже вопрос:
    Как можна задавать путь через диалоговое окно ? Тоесть не через inputbox, а в диалоговом окне, наподобие Открыть файл и Сохранить файл ?
    И  еще можна как-то влепить перебор листов вот сюда?  For each Cell in Selection, типа так:
     
    В "каждой ячейки" на "Листе 1" в диапазоне [А1:А10]
    делать то-то...
     
    чтоб не делать так:
     
    For each Worksheet in ActiveWorkbook
          For each Cell in Selection
     
    Спасибо!

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 15:34 10-02-2009 | Исправлено: MaximuS G, 15:35 10-02-2009
    Voyager69

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, как организовать цикл до тех пор пока в ячейке Аn не пусто.
    Т.е. как перебрать А1,А2,А3..Аn ?

    Всего записей: 37 | Зарегистр. 01-02-2007 | Отправлено: 16:45 10-02-2009
    kalinakrasnay



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

    Цитата:
    Подскажите, как организовать цикл до тех пор пока в ячейке Аn не пусто.  
    Т.е. как перебрать А1,А2,А3..Аn ?

    Если я верно поняла задачу, то так:

    Код:
     
    Dim i As Integer
    i = 1
    Do While Cells(i, 1) <> ""
        'твои действия
         'например, мое - выдача значений ячеек
        MsgBox (Cells(i, 1).Value)
        i = i + 1
    Loop


    Всего записей: 351 | Зарегистр. 04-01-2007 | Отправлено: 16:56 10-02-2009
    Solenaja



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

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

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 17:29 10-02-2009 | Исправлено: Solenaja, 18:08 10-02-2009
    filemoto



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    а есть вообще возможность контролирования страницы на уровне редактирования, что когда введен в числовое поле текст отличный от numeric, возникала ошибка? или может иные какие способы есть?
     
    в общем, необходимо проверять, цифра ли введена в числовое поле, если нет, то ругаться, вплоть до изменения цвета ячейки.
     
    хелп. задолбали уже юзеры, кто 4 введёт - это правильно, а кто по приколу ч, а потом невозможно подсчёты вести.

    Всего записей: 132 | Зарегистр. 08-04-2006 | Отправлено: 17:39 10-02-2009
    Voyager69

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

    Цитата:
    kalinakrasnay

     
    Вроде то, что думалось. Попробую. Спасибо.

    Всего записей: 37 | Зарегистр. 01-02-2007 | Отправлено: 17:41 10-02-2009
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    filemoto
    Ну в екселе это просто Данные - Проверка - Целое число  
    Если надо через код, запишите макрорекодером и посмотрите что предложит

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 18:07 10-02-2009
    Voyager69

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите в чем ошибка приведения типов?
     
    If [G49] - Date <= 30 Then ..... OK
    If (Cells(Counter, 7).Value) - Date <= 30 ........ Type mismatch  
     
     
     
     

    Всего записей: 37 | Зарегистр. 01-02-2007 | Отправлено: 18:54 10-02-2009 | Исправлено: Voyager69, 22:11 10-02-2009
    aks_sv

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем очень здрасьте!
    Вычитал у Уокенбаха "Перемещение опции в списке элемента управления ListBox". Все вроде сделал, как у него, а не получается. В чем дело?
    В данном разделе вы узнаете, как можно перемещать опции вверх и вниз в списке элемента
    управления ListBox. В VBA подобный метод применяется для предоставления пользователю
    возможности указать порядок просмотра элементов управления в диалоговом окне UserForm.
    На рис. 14.13 показано диалоговое окно, которое содержит элемент управления L i s t B o x
    и два элемента управления CommandButton. Щелчок на кнопке Вверх приведет к переме-
    щению выделенной опции вверх по списку элемента управления ListBox. Щелчок на кноп-
    ке Вниз приведет к перемещению выделенной опции вниз по списку.

    И еще. Как сделать, чтобы вместе с перемещением элементов в ListBox перемещались данные и в таблице?
    Заранее благодарен.
    Пример

    Всего записей: 109 | Зарегистр. 18-12-2006 | Отправлено: 23:37 10-02-2009 | Исправлено: aks_sv, 23:47 10-02-2009
       

    Страницы: 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