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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 201 202 203 204 205 206 207 208 209 210 211 212 213

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



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

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

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Предыдущие ветки топика: Часть 1, Часть 2
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях 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
     
    Перечень основных ColorIndex'ов из MSDN
     

    Смежные темы:
    Программы » Microsoft Office 2019 & 365 | 2016 | 2013 | 2010 | 2007 | 2003
    Программы » OneNote | Outlook 2013 & 2016 & 2019 | Outlook 2010 | Microsoft Mathematics & Math Solver
    Программы » Word FAQ | Excel FAQ | Access FAQ
    Прикладное программирование » Word VBA | Access VBA  
    Андеграунд » Microsoft Office 2019 | 2016 | 2013 | 2010 | 2007 | 2003
    Андеграунд » OneNote | Visio | SharePoint Server | Project Server | Exchange Server
    Андеграунд » Надстройки (add-ins) и коммерческие макросы Excel
    Андеграунд » Самостоятельная сборка дистрибутивов Оffice 2007/2010/2013/2016 | MUI для Office 2007

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:16 11-01-2010 | Исправлено: ALeXkRU, 16:42 03-08-2021
    andrewkard1980

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

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 15:41 12-03-2011
    w01f14

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

    Код:
     
    ...
    SUM=2  
     
    Do Until objExcel.Cells(SUM,1).Value = 0
     
    SUM = SUM +1
    MsgBox "Helo"
    Loop
     
    objExcel.Cells(SUM,1).Value = Date
    objExcel.Cells(SUM,2).Value = Time
    objExcel.Cells(SUM,3).Value = computer
    objExcel.Cells(SUM,4).Value = "logon"
     
    ...
     
     
     

    Всего записей: 7 | Зарегистр. 25-02-2008 | Отправлено: 12:21 13-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    "...на пустоту и если она пустая ..." - ключевые слова
    0 (Zero) и Empty - разные вещи
    SUM - зарезервированное слово, так переменную лучше не именовать

    Код:
     
    '...
        iSum = 2
        Do
            Select Case IsEmpty(objExcel.Cells(iSum, 1).Value)
                Case True
                    MsgBox "Hello"
                    objExcel.Cells(iSum, 1).Value = Date
                    objExcel.Cells(iSum, 2).Value = Time
                    objExcel.Cells(iSum, 3).Value = computer
                    objExcel.Cells(iSum, 4).Value = "logon"
                    Exit Do
                Case False
                    iSum = iSum + 1
            End Select
        Loop While iSum < 289097856
    '...
     

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 13:23 13-03-2011 | Исправлено: asbo, 13:25 13-03-2011
    w01f14

    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    asbo
    Спс огромное !!!  
    Кинь в личку номер мобилки денег в знак благодарности кину немножко =) !!

    Всего записей: 7 | Зарегистр. 25-02-2008 | Отправлено: 14:10 13-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    w01f14, :))
     
    Полно, голубь, не греши,
    Убери свои гроши.
    Я ведь енто не для денех,
    Я ведь енто для души...
     
    Будет новая беда -  
    Прямиком спеши сюда  
    Чай, и мы в лесу не звери
    Чай, поможем завсегда...

     
     
    Добавлено:
    Да, и "While iSum < 289097856" замени на что-нибудь разумное, соответствующее обстановке :)

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 14:31 13-03-2011
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день.
    Коллеги, подскажите, не могу добить, нужно из строки вытянуть первый номер телефона. Строки разные.
    Им'я: Вячеслав  Телефон: 0979122381  
    раб. 587-72-43 ; (063)-266-68-00  
    Роман т.3837006 м.0935688864м.0964165605м.0994356448  
    Иван 0672992940  
    0677088425 Олег;  093-404-55-50 Оксана
    Вера Николаевна т.221-14-39, 0958723695, 0673079412.  
    067 605 56 27      221 63 17  
    221 63 17  067 605 56 27        
     
     
    Как быть? Спасибо.

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 16:54 15-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Хе-х... Первый! Да хоть какой-нибудь, получилось бы :( Системы-то нет.  
     
    Я бы в Ворд закинул и первым делом автоматом удалил бы явные разделители между цифрами "цифра-тире-цифра". Также автоматом удалил чтото "цифра-правая скобка - чтото - цифра". Затем заменил "точка-непробел" на "точка-пробел". Затем вручную с просмотром удалил бы пробел "цифра-пробел-цифра". Потом блоки, начинающиеся с нуля - вычленить три первые цифры и заключить в скобки (бэз пробела после скобки правой!). Ну еще можно пофантазировать. Когда все будет причесано по единому стандарту - удалил бы избыточные двойные пробелы. А дальше уже - дело техники.
     
    Если исходник в Экселе - то использовать какой-нибудь суперуникальный разделитель полей, чтобы окончательно не запутать уже запутанное, и, наоборот, использовать этот разделитель с пользой.

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 17:22 15-03-2011
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да я тоже так думал, но тут надо сделать максимально возможно, и все в vba excel. Понимаете, таких данных программа тащит из интернета уйму, и задача найти первый входящий телефон.
    А система тут есть, просто очень жесткая. Replace ом я почищу, но у меня сложность найти в строке порядковый номер цифры. Дальше буду думать. Спасибо.

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 17:37 15-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Если задача сводится к "найти в строке порядковый номер цифры", то уточняем - первой встретившейся цифры?
    Если да, то:
    Добавлено:

    Код:
    Function gg(pStr$) As Integer
    Dim sSym$
    Dim i%
    Dim tAsc As Byte
        For i = 1 To Len(pStr)
            tAsc = Asc(Mid(pStr, i, 1))
            'If tAsc > 47 And tAsc < 58 Then Exit For
            If tAsc >= Asc(0) And tAsc <= Asc(9) Then Exit For
        Next
        gg = i
    End Function

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 17:45 15-03-2011 | Исправлено: asbo, 17:58 15-03-2011
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо.
    А нет встроенной функции - убить все текст, оставить цифры? Например Val убивает, если с самого начала идет цифра, а если текст - то убивает все.

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 19:51 15-03-2011
    asbo

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

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 20:54 15-03-2011
    dneprcomp



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

    Цитата:
    А нет встроенной функции - убить все текст, оставить цифры?  

    Около 30 раз сделать Replace в цикле

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 00:11 16-03-2011
    dmka



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    andrewkard1980
    Вроде как для такой задачи Regular Expressions так и просятся. Только не спрашивайте меня как это сделать в Excel

    Всего записей: 947 | Зарегистр. 23-04-2003 | Отправлено: 01:19 16-03-2011
    AndVGri

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

    Код:
     
        'подключить Microsoft VBScript Regular Expressions 5.5
        Dim pReg As New VBScript_RegExp_55.RegExp
        Dim pAnswers As VBScript_RegExp_55.MatchCollection
     
        pReg.Global = True: pReg.Pattern = "\d+-\d+-\d+|\d+|\(\d+\)-\d+-\d+-\d+"
     
        Set pAnswers = pReg.Execute("Вера Николаевна т.221-14-39, 0958723695, 0673079412.")
        If pAnswers.Count > 0 Then
            Debug.Print pAnswers.Item(0).Value
        End If
     
        Set pAnswers = pReg.Execute("Им'я: Вячеслав  Телефон: 0979122381, м. 33040-3")
        If pAnswers.Count > 0 Then
            Debug.Print pAnswers.Item(0).Value
        End If
     
        Set pAnswers = pReg.Execute("Ещё чей-то (063)-266-68-00, раб. 23-33-333 ")
        If pAnswers.Count > 0 Then
            Debug.Print pAnswers.Item(0).Value
        End If
     

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 03:32 16-03-2011
    SAS888

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

    Цитата:
    нужно из строки вытянуть первый номер телефона. Строки разные.

    Пусть, например, требуется из всех значений, находящихся в столбце "A" получить первый номер телефона и поместить рядом в столбец "B". Можно так:

    Код:
    Sub Main()
        Dim i As Long, s As String, a(), b(), x
        Set x = CreateObject("VBScript.RegExp"): x.Global = True
        a = Range([A1], Cells(Rows.Count, 1).End(xlUp)).Value
        ReDim b(1 To UBound(a, 1), 1 To 1): On Error Resume Next
        For i = 1 To UBound(a, 1)
            If a(i, 1) <> "" Then
                s = Trim(Replace(a(i, 1), Chr(160), "  ")): x.Pattern = "[^()0-9]"
                b(i, 1) = Replace(Split(Trim(x.Replace(s, " ")), "  ")(0), " ", "")
            End If
        Next
        [B:B].NumberFormat = "@": [B1].Resize(UBound(b, 1)).Value = b
    End Sub

    Макрос рассматривает два пробела подряд как разделение номеров.
    Текстовый формат столбца "B" устанавливается для того, чтобы не потерять лидирующие нули, если таковые присутствуют в номере.
    Пример файла здесь.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 07:53 16-03-2011
    dmka



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

    Цитата:
    "\d+-\d+-\d+|\d+|\(\d+\)-\d+-\d+-\d+"

    Я думаю тут лучше быть конкретнее с количеством цифр (\d+ ->  \d{n,m}). И "-" заменить на [\s-] или добавить отдельно pattern-ы с пробелами.

    Всего записей: 947 | Зарегистр. 23-04-2003 | Отправлено: 11:06 16-03-2011
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    dmka
    А как Ваш вариант справится с двумя последними примерами автора  

    Цитата:
    067 605 56 27      221 63 17  
    221 63 17  067 605 56 27

    Если считать, что один номер от другого отделен двойным (или более) пробелом, то предложенный мной вариант с этой задачей справится, так же, как и со всеми другими, представленными автором. А Ваш вариант, с методом Execute, требует существенной доработки.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 13:00 16-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    andrewkard1980 правильно смотрел (как я его понял) - от первой цифпы вычленить блок тлф.
    Не учитывается возможная первая открывающая скобка в коде - будет отброшена (в примере нет такого варианта с лидирующим кодом в скобках).  
    Никаких доп. библиотек.  
    Думаю, работать будет быстрее, чем вариант SAS888.
    Надо как-то более грамотно корявое Case сформулировать. Оставил для наглядности :)
     
    '0979122381'
    '587-72-43'
    '3837006'
    '0672992940'
    '0677088425'
    '221-14-39'
    '067 605 56 27'
    '221 63 17'

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 14:45 16-03-2011 | Исправлено: asbo, 15:04 16-03-2011
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребят, спасибо. Не ожидал стольких решений. Буду пробовать.

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 15:55 16-03-2011
    dmka



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

    Цитата:
    А как Ваш вариант справится с двумя последними примерами автора  

    Я не проверял, но если "-" заменить на [\s-] (пробел или минус) по идее должен справится. Или можно добавить такой-же pattern с пробелами.
     
    Тупой regexp знающему синтаксис человеку кажется проще и гибче, хотя порой такого можно наворотить... Может в данном случае Ваше решение будет лучше. Пускай дальше автор вопроса разбирается и проверяет на реальных данных

    Всего записей: 947 | Зарегистр. 23-04-2003 | Отправлено: 16:57 16-03-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 201 202 203 204 205 206 207 208 209 210 211 212 213

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 3)


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru