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

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

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

    Цитата:
    Пусть есть одномерный массив a, имеющий ту же размерность, что и ListBox1.  
    Тогда присвоить значение "True" элементам массива, которые соответствуют выбранным индексам в ListBox1, можно так:  

     
    Спасибо, то что нужно! Отлично работает

    Всего записей: 3 | Зарегистр. 27-04-2009 | Отправлено: 10:20 29-04-2009
    strat

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    забиваю в ячейку а1 цифру 1, сохраняю в текстовый формат с разделителем табуляции, файл получается размером 3 байта т.к. дописываются символы перевода строки  
     
    вопрос - как сохранить в 1 байт либо обрезать после сохранения?

    Всего записей: 459 | Зарегистр. 27-12-2005 | Отправлено: 12:08 29-04-2009
    isabpchereda



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    strat
     
    Я бы посмотрел двоичный ввод/вывод.
     

    Всего записей: 8 | Зарегистр. 25-04-2008 | Отправлено: 12:48 29-04-2009 | Исправлено: isabpchereda, 12:50 29-04-2009
    zaqwerty

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    в каждой стороке стоит CheckBox хочу что бы при выборе какого либо CheckBox копировался определенный диапозон подскажите как правильно написать этот макрос
    Sub Макрос1()
    If CheckBox1 = False Then
        Range("B2").Select
        Selection.Copy
        Range("K2").Select
        ActiveSheet.Paste
    End If
    End Sub
    он у меня копирует при любом состоянии CheckBox и как правильно записать что бы было CheckBox(i) где i - переменная. Заранее спасибо.

    Всего записей: 9 | Зарегистр. 05-12-2006 | Отправлено: 13:27 29-04-2009
    strat

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

    Цитата:
     двоичный ввод/вывод

    что это, подробней? яндекс по запросу "двоичный ввод excel" ничего не дал

    Всего записей: 459 | Зарегистр. 27-12-2005 | Отправлено: 14:12 29-04-2009
    jocer

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    zaqwerty
    если галочка будет стоять только в одном из checkbox то возможно лучше использовать OptionButton?
    и нужно определиться когда будет вызываться ваша функция, при нажатии на кнопку или по-другому, например, так:

    Код:
     
    Private Sub CheckBox1_GotFocus()
    If CheckBox1 = False Then
        Range("B2").Select
        Selection.Copy
        Range("K2").Select
        ActiveSheet.Paste
    End If
    End Sub

    а обращаться примерно так можно, смотря как пользоваться будете

    Код:
     
    For Each contr In Sheets("df").Controls
        If contr.Name = "checkbox" & i Then
        Debug.Print contr.Name
        End If
    Next
     


    Всего записей: 21 | Зарегистр. 13-08-2008 | Отправлено: 12:58 30-04-2009
    Naohh

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    [excel функция нечёткое неполное совпадение поиск пересечение]
     
    Вопрос о старом:
    "поиск неполного совпадения выбранного текстового значения в диапазоне.
    например сравнивая СибТлк-6об и интлкот7 есть пересечение ТЛК"
    найденные методы не подходят, прошу помощи правильно дописать идею на VBA.
     
    На сколько понял для экселя есть только одна подобная функция fuzzy_search\fuzzy_ВПР
    Не самая удачная, конечно, но хоть что-то.
    В связи с чем хочется реализовать один из более подходящих механизмов поиска нечётких совпадений.
    Реализовать самостоятельно не хватит знаний либо времени (((
    Прошу о помощи, если кому не составит труда написать пользовательскую функцию по представленной ниже идее
     
    #### Синтаксис:

    Код:
     
    Function fuzzy_search(
     
    stToFind As String,   ЧТО искать
    rgLookup As Range,   ГДЕ искать
    Optional jIndex As Integer = 0,   ИНДЕКС в списке вараинтов с вероятными совпадениями (0 или 1 не принципиально)
    Optional iTolerance As Integer = 2,   ОБЪЁМ пересечения
     
    fuzzy_search = string искомого сопадения из ГДЕ
     

     
    #### Логика:
     
    Считается кол-во одинаковых пар(iTolerance = 2) букв
    СибТлк-6об  >>  Си иб бТ Тл лк к- -6 6о об
    интлкот7   >>   ин нт тл лк ко от т7
    Тут будет две одинаковые пары [тл] [лк]
     
    #### Механизм:

    Код:
     
    fuzzy_search(  "СибТлк-6об" ; Range включающий "интлкот7" ; 0 ; 2 )
        
        Dim i, rez As Integer, cc As Range, stPattern As String
        
        fuzzy_search="Н/Д"
        
        Dim Array1(  length(rgLookup), 2 )  As Integer    'массив для дальнейшей сортировки наиболее вероятных совпадений
        Array1(  length(rgLookup), 1 ) = rgLookup.Range
        
        For Each cc In rgLookup
        
            rez = 0
            
            For i = 1 To Len(stToFind) - iTolerance + 1 'сдвиг
                If cc Like ("*" & Mid(stToFind, i, iTolerance) & "*") Then rez = rez + 1
                '(по возможности без учёта регистра, раскладки(рус или английские А В Н К и прочие; не уверен что like для этого подойдёт)
            Next
            
            Array1(  номер текущего СС из rgLookup, 2 ) = rez       'Сосчитать кол-во одинаковых пар
        
        Next
        
        отсортировать Array1  по "кол-ву совпадений", где на 0м\1ом месте наиболее вероятные(больше кол-во своп.)
        
        fuzzy_search = Array1 (jIndex)
        
    End Function
     

     
    ####:  
     
    помогите кому легко кодить на VBA!! пожалуйста. Не могу без слёз смотреть на проходящее время за сверкой полей.
     
    (Можно предложить чуть продвинутый вариант с автоматическим итеративным сравнением в группах от 3х и более букв, использование сдвига и расчёта индекса схожести, но тут можно самому сдвинуться, и от-того излишне)
     

    Всего записей: 1 | Зарегистр. 01-05-2009 | Отправлено: 23:14 01-05-2009 | Исправлено: Naohh, 23:21 01-05-2009
    Mikh5000

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите написать макрос.
    Имеется динамически меняющийся столбец с данными. Как при каждом появлении в столбце определенного значения (скажем, больше 50) подавать звуковой сигнал, а в другом столбце выводить это значение и время его появления. Например, появляется значение 51, время 12:00:01. Потом, если появляется, скажем 53, а 51 еще в столбце, ничего не происходит. Потом, если все значения становятся меньше 50, и появляется новое, скажем 55 - заполняется вторая строчка 55 и соответствующее время, скажем 12:00:45.
    Спасибо.

    Всего записей: 2 | Зарегистр. 04-12-2007 | Отправлено: 21:58 02-05-2009 | Исправлено: Mikh5000, 22:03 02-05-2009
    isabpchereda



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

    strat
     
    На Гогле нашел, например, ссылку
     
    _http://www.ssti.ru/kpi/informatika/Content/biblio/b1/inform_man/gl_19_2.html#rabota_s_file
     
    Ниже лежит цитата со страницы.  
     
    */
    Файл произвольного доступа имеет записи фиксированной длины: можно одновременно выполнять чтение и запись в файл записей.
     
    Открытие файла
     
    Открывать можно как существующие на диске, так и новые файлы. Каждый файл идентифицируется в программе определенным номером, который присваивается ему в момент открытия. Свободный номер файла можно определить с помощью встроенной функции FileFree, которая возвращает очередной свободный номер для открытия файла (номер изменяется в диапазоне 1 - 511).
     
    Файл открывают в определенном режиме работы:
     
    Open <путь_имя__файла> [For <режимы>] [Access <направление_потока>] [<блокировка>] As [#]номер [Len=<длина_записи>]
     
    где <путь имя_файла> - строка символов, задающая местоположение и имя дискового файла;
     
    <режимы> - режимы работы с файлом:
     
    Append - добавление записей
     
    Binary - двоичный файл
    */

    Всего записей: 8 | Зарегистр. 25-04-2008 | Отправлено: 12:04 03-05-2009
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    помогите плиз с пользовательской функцией, нужно чтобы формула =Repl(K122) возвращала переименованное наименование. Но у меня возвращает ошибку #ЗНАЧ!
     
    Function Repl(x As Range)
        Range(x).Replace What:="Подразделение 2 Цех 1", Replacement:="Подразделение 2 служба 1", LookAt:=xlPart
        Range(x).Replace What:="Подразделение 2 Цех 3", Replacement:="Подразделение 2 служба 3", LookAt:=xlPart
        Range(x).Replace What:="Подразделение 2 Цех 2", Replacement:="Подразделение 2 служба 2", LookAt:=xlPart    
    End Function
     
    SAS888, ты вроде похожий пример выкладывал на слил-ру, его уже потёрли

    Всего записей: 961 | Зарегистр. 17-04-2007 | Отправлено: 11:12 05-05-2009
    SAS888

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

    Код:
    Function Repl(x As Range) As String
        Dim Temp As String
        Temp = Replace(x.Value, "Подразделение 2 Цех 1", "Подразделение 2 служба 1")
        Temp = Replace(Temp, "Подразделение 2 Цех 3", "Подразделение 2 служба 3")
        Repl = Replace(Temp, "Подразделение 2 Цех 2", "Подразделение 2 служба 2")
    End Function

    А может быть заменять только "Цех 1" на "служба 1" и т.д. ? Т.е. "Подраэделение 2 " не трогать.

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

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    спасибо, работает! ( то адаптированный пример был, реалии посложнее будут)

    Всего записей: 961 | Зарегистр. 17-04-2007 | Отправлено: 13:47 05-05-2009
    SAS888

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

    Цитата:
    то адаптированный пример был, реалии посложнее будут

    Я понял. Поэтому такой "огород" и предложил. Чтобы принцип был понятен.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 06:32 06-05-2009
    sobaka70



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пожалуйста, помогите со скриптом удаления СТРОК в exel по наличию в ячейках 2 столбца слов "Реализация" и "Перемещение". данные слова стоят в начале строки.файл большой, несколько тыс. строк
    С VBA не сталкивался вообще.
     
    Пример
         1                                                                        2                                                                               3
    ----------------------------------------------------------------------------------------------------------------------------------
    24.11.08    Перемещение ТМЦ № 0000002227 от 24.11.08 (с "Основной склад" на "Розничный склад")      5
    13.12.08    Перемещение ТМЦ № 0000002456 от 13.12.08 (с "Основной склад" на "Временный")                    3
    15.12.08    Реализация (купля-продажа) № 11975 от 15.12.08 (зызызызызызы зызызызызыы)                    1
    31.12.08    Поступление ТМЦ (купля-продажа) вх. № 12172 от 31.12.08 (ООО "ТД "ЗыЗыЗы")           12
     
    Поступление должно остаться. Остальные строки удалить
     
     

    Всего записей: 194 | Зарегистр. 09-10-2004 | Отправлено: 15:03 06-05-2009 | Исправлено: sobaka70, 15:41 06-05-2009
    strat

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    sobaka70
    а отсортировать просто столбец, выделить все начинающиеся с ненужных слов и удалить, дел на 30 секунд

    Всего записей: 459 | Зарегистр. 27-12-2005 | Отправлено: 17:47 06-05-2009
    sobaka70



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

    Всего записей: 194 | Зарегистр. 09-10-2004 | Отправлено: 18:17 06-05-2009
    crotoff

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sobaka70
    можно автофильтр задать по 2м условиям: Не содержит "Реализация" и Не содержит "Перемещение"  - если строка начинается с даты (или  Не начинается с..., если под дату отдельный столбец выделен). После автофильтра удаляешь строки и задаёшь ему "отобразить всё"
    можно и через макрос то же самое сделать, вот к примеру
     
    Sub Макрос1()
        Selection.AutoFilter Field:=2, Criteria1:="<>*Перемещение*", Operator:= _
            xlAnd, Criteria2:="<>*Реализация*"
        Rows("2:65000").Delete
        ActiveSheet.ShowAllData
    End Sub

    Всего записей: 961 | Зарегистр. 17-04-2007 | Отправлено: 19:54 06-05-2009 | Исправлено: crotoff, 20:11 06-05-2009
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sobaka70
    Можно выполнить такой макрос:

    Код:
    Sub Main()
        Dim i As Long, Temp As String, x As Range, a(): Application.ScreenUpdating = False
        a = Range([B1], Cells(Rows.Count, "B").End(xlUp)).Value
        For i = 1 To UBound(a, 1)
            On Error Resume Next: Temp = Split(a(i, 1), " ")(0)
            If Err = 0 Then
                If Temp = "Реализация" Or Temp = "Перемещение" Then If x Is Nothing Then Set x = Rows(i) Else Set x = Union(x, Rows(i))
            Else: On Error GoTo 0
            End If
        Next
        If Not x Is Nothing Then x.Delete
    End Sub

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 07:32 07-05-2009
    sobaka70



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

    Всего записей: 194 | Зарегистр. 09-10-2004 | Отправлено: 13:29 07-05-2009
    Panajabi



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите написать макрос, который должен удалять строки содержащие дублетные записи в ячейках определённого столбца. Удалятся так же должна и сама сравниваемая строка, если есть её копии.
    Пример:
    до              после
    BNMG002U  BNMG002U
    BPJR000U      BPJR000U
    BUWW001U BUWW001U
    BVVS0000      BXKT0000
    BVVS0000    CAVJ201U
    BVVS199U      CBXL001U
    BVVS199U      CDCW0000
    BVXG0000      CDEX101U
    BVXG0000      CLBL0000
    BWTJ0000      CLQQ001U
    BWTJ0000      CLWE000U
    BXKT0000      COKM103U
    CAVJ201U      CQZZ105U
    CBXL001U      CREB000U
    CDCW0000  DIRD001U
    CDEX101U    
    CLBL0000    
    CLBL0000    
    CLBL0000    
    CLBL0000    
    CLBL0000    
    CLQQ001U    
    CLWE000U    
    COKM103U    
    CQZZ105U    
    CREB000U    
    DIRD001U    

    Всего записей: 2 | Зарегистр. 10-03-2008 | Отправлено: 14:48 07-05-2009 | Исправлено: Panajabi, 14:51 07-05-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