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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    asbo
    Взялся разобраться с твоей версией. Выглядит замечательно. Оч. лаконично.
    Но, не понял, что ты здесь имеешь в виду:

    Цитата:
    Надо только перед этим удалить подводные камни с листа (очистить ячейки).
     
    Какие ячейки и зачем их очищать?
    Проверка If pCmp = .SpecialCells(xlCellTypeBlanks).Count Then
    чего-то отрабатывает только на 20-й строчке (в выложенном мной примере) и все. Даже окно с адресом не выскакивает по Debug.Print. Как-то странно...
    Что за "хитрая" констранта xlCellTypeBlanks? В объяснении написано, что это пустые ячейки. Только что в данном случае подразумевается под "пустыми ячейками"?

    Всего записей: 2975 | Зарегистр. 04-01-2005 | Отправлено: 11:32 21-03-2011 | Исправлено: mrdime, 11:38 21-03-2011
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime
    Хочу предупредить: (может быть, уважаемый asbo об этом не знает), что метод SpecialCells возвращает не более 8192 несмежных ячеек/диапазонов. Поэтому, при больших объемах таблиц, возможны ошибки. Будьте внимательны.

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

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DmitryPrint, mrdime
    * В порядке все...
    - Увы нет, не все в порядке... См. файл с уточнениями.
     
    mrdime
    * Какие ячейки и зачем их очищать?  
    Если применительно к твоему файлу, то такие, как A15 (C,I,K etc.), в которых находится нечто и, поэтому, они не являются xlCellTypeBlanks. То же самое справедливо и для апострофов. "Очищать" (здесь) - удалять из них эти подводные камни, чтобы они корректно обрабатывались xlCellTypeBlanks.
     
    * что в данном случае подразумевается под "пустыми ячейками"?
    Это не ко мне. Это к БГ :) Возвращает якобы пустые (исключения мы уже видели)
     
    * отрабатывает только на 20-й строчке (в выложенном мной примере)  
    Задача как стояла? Удалить пустые строки и колонки. Так ведь?
    В упомянутом примере только одна (всего одна) пустая строка - 13. 20-я не пустая. Пустых колонок нет вообще.
     
    SAS888
    Цитата:
    Хочу предупредить: (может быть, уважаемый asbo об этом не знает), что ...

    Знал когда-то. Забыл. Извините, белая масса! Простите, белая масса!  
    Бзв, ограничение это применимо к Экселям до 2010  
     
    Вы разве не поняли, что основная проблема в том, чтобы определить "истинно пустое"? SpecialCells, в данном случае, применено, как палиативное решение - для демонстрации логики, из искуственного положения, что пустое есть пустое, без подводных камней.  
     
    И, обращаю Ваше внимание - читайте тему. Внимательно(!) читайте. Вот мои оговорки, которые я делал выше: "Навскидку - логика правильная", "в качестве рыбы - пойдет". Да и других много.  
     
    Неужели без упоминания моего имени Ваш совет стал бы менее ценным?  
    Вы еще за прошлое не расчитались, а уже в новые дрязги пытаетеь встревать? Погодите малость - я Вам отповедь приготовил... Вы мне все настроение портите :(
     

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

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

    Цитата:
     Вы еще за прошлое не расчитались...

    Ну, вот... опять... Давайте отбросим всякие "нападки" и раз и навсегда решим этот спор.
    Вот Вы меня обвинили в том, что для сравнения скорости выполнения поставленной задачи я взял не самый последний Ваш вариант. Да. Согласен. Но ведь Вы в своем сравнении сделали то же самое. В предложенном мной файле-примере я так же, как и Вы, немного скорректировал код (просто вынес одну строку кода за цикл). Но Вы никак не хотите этот файл посмотреть, сравнить со своим, и, наконец, сделать вывод. Только после этого будем говорить о взаиморасчетах...

    Цитата:
    Погодите малость - я Вам отповедь приготовил...  
    Очень надеюсь на то, что она ("отповедь") написана после того, как Вы сумели написать код, работающий быстрее моего (речь идет о предложенном файле-примере). С удовольствием посмотрю на это чудо. Но... все больше и больше сомневаюсь, что когда-нибудь это произойдет.
     
    mrdime
    Для решения Вашей задачи, предлагаю такой вариант.
    В нем все ячейки UsedRange очищаются от возможных одиночных апострофов, а так же возможных одинарных (двойных, тройных и т.д.) пробелов, количество которых задается счетчиком в первом цикле. Затем удаляются пустые строки и столбцы.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 06:19 23-03-2011 | Исправлено: SAS888, 07:15 23-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    Цитата:
    Давайте отбросим всякие "нападки" и раз и навсегда решим этот спор.

    Аристарх, голубь, давай бросим весь этот официоз и мирно-полюбовно встретимся где-нибудь в укромном уголке.
     
    Хе-хе... Что творится - последнее время я уже с десяток, наверное, цитат из "Энергичных людей" по разным поводам нацитировал :)  
     
    * Да. Согласен. Но...
    - Не надо "но". Вы и так все запутали. Надо - "извините".
     
    * Вы в своем сравнении сделали то же самое
    - Я не выбирал из имеющихся на тот момент вариантов. Что было, то и сравнил. После первого сравнения корретировок было уже множество, давайте не будем о том, что "после".  
     
    * Вы никак не хотите этот файл посмотреть
    - Я посмотрел все материалы, предложенные Вами после возникновения этого скользкого (для Вас) статус-кво. Более того, провел необходимые замеры. Результаты интересные, неоднозначные, но я не хочу это обсуждать до того, как решится вопрос с самыми первыми замерами.
     
    * надеюсь на то, она ("отповедь") написана после того, как Вы сумели написать код, работающий быстрее моего (речь идет о предложенном файле-примере).  
    - Точно так. Но Вы не даете мне возможность ее запостить, постоянно переключая меня на новые коды, их анализ, сравнение и погоню за этим гребанным быстродействием.
     
    Поймите - времени катстрофически мало. И меня уже не столько волнует быстродействие, как некоторые нюансы в методе измерений.  
     
    А касательно быстродействия - мой последний оптимизированный код все равно быстрее Вашего, предпоследнего (перед сегодняшним). Конечно, уже не с таким впечатляющим преимуществом. А иногда даже просто наравне... Но...
     
    Но остается ведь еще пара немаловажных моментов для конечного пользователя:
    - Отсутствие сторонних библиотек
    - Отсутствие того дискомфорта, которое многие испытывают при работе с рег. выражениями.
     
     
    Добавлено:
    SAS888
    * Application.ScreenUpdating = False
    Я уже второй раз обращаю внимание ВСЕХ на необходимость отбойного  
    Application.ScreenUpdating = True
     
    Добавлено:

    Код:
            For i = 1 To 3
                .Replace Space(i), "", xlWhole
            Next

    Сугубо частный случай. Нужно общее решение. И для 10-ти и 20-ти...
     
    Добавлено:
    А что делает вот это: .Value = .Value ?
    Перечел хэлп, но так ничего и не понял...  
     
    Returns or sets the value of the specified range. Read/write Variant.
     
    expression.Value(RangeValueDataType)
    expression    Required. An expression that returns a Range object.
     
    RangeValueDataType   Optional Variant. The range value data type. Can be a xlRangeValueDataType constant.
     
    xlRangeValueDataType can be one of these xlRangeValueDataType constants.  
    xlRangeValueDefault    default If the specified Range object is empty, returns the value Empty (use the IsEmpty function to test for this case). If the Range object contains more than one cell, returns an array of values (use the IsArray function to test for this case).  
     
    Добавлено:
    ? Rows(1).Text
    Null
    ? Cells(1,1)
    Порівняльний аналіз обсягів споживання енергоресурсів за відповідні періоди двох порівнюваних років
     
    Мне не нравится это If Rows(i).Text = "" Then
    Неявное приведение интерепретирует Null как False в то же время, как при наличии данных в яейках проверка всей строки все равно выдет Null...

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

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

    Цитата:
    Поймите - времени катстрофически мало. И меня уже не столько волнует быстродействие, как некоторые нюансы в методе измерений.  
    Согласен абсолютно. Данные моих замеров показывают либо одинаковые результаты, либо небольшое преимущество в мою пользу. Но, если хотите, в погоне "...за этим гребанным быстродействием." Можно оптимизировать и Ваш код. Так, например, функцию Mid(), которая Вами используется в цикле, лучше заменить на Mid$(), которая вернет результат немедленно, без его неявного преобразования в Variant. Также, в конструкции Select Case... Case... End Select, вместо Case 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 40, 41, 45 лучше использовать Case 48 To 57, 40, 41, 45, т.к. в первом случае, сравнение осуществляется с каждым элементом непрерывного диапазона, а во втором - только два сравнения с крайними значениями. Но, оба эти замечания, хоть и верные, но малосущественные. Однако, с Вашего позволения, я внес эти изменения в Ваш вариант и получил результаты измерения времени выполнения процедуры (как ни странно) совершенно одинаковыми с моим временем (+/- погрешность о которой Вы говорили).
    Так что, получите и мои извинения.

    Цитата:
    Но остается ведь еще пара немаловажных моментов для конечного пользователя:
    - Отсутствие сторонних библиотек
    - Отсутствие того дискомфорта, которое многие испытывают при работе с рег. выражениями.  

    1. Эти "сторонние" библиотеки есть в Excel. Почему бы их не использовать? Можно, но зачем "вручную" выполнять встроенные в Excel методы?
    2. Про какой дискомфорт Вы говорите? Наоборот, используя рег. выражения, все становится более компактным.

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

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888, ОК. Вернемся к этому. Позже.
    А пока - я добавил свой вопросник по коду для mrdime постом выше. Взгляните, плз...

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 10:59 23-03-2011
    SAS888

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

    Цитата:
    А что делает вот это: .Value = .Value ?

    Получаем массив из диапазона ячеек и вставляем его на то же место.
    При формировании массива из непрерывного диапазона ячеек (например, a=ActiveSheet.UsedRange.Value), если какая-либо ячейка этого диапазона содержит одиночный апостроф, то он не будет помещен в массив. После этого, мы помещаем значения полученного массива на то же место. В результате, ячейки, которые содержали одиночный апостроф (невидимый в ячейке) будут пустыми.

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

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888 .Value = .Value  
    Ага... Это может оказаться хорошим инструментом для предварительной очистки. Как-то подозрительно гладко и просто :)
     
    Применительно к данной задаче - пойдет. А вот как быть в общем случае, когда этот невидимый апостроф является значащим? Впрочем, когда доходит уже до таких узких задач обработки текстовых данных, надо ужЕ брать Access. Могут ведь и последовательности пробелов тоже оказаться значащими :)

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 11:08 23-03-2011
    SAS888

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

    Цитата:
    Мне не нравится это If Rows(i).Text = "" Then
    Неявное приведение интерепретирует Null как False в то же время, как при наличии данных в яейках проверка всей строки все равно выдет Null...  

    Великий Уокенбах для проверки строки на пустоту советует использовать Application.CountA(). Но она (эта функция), опять же, работает медленнее. Что касается If Rows(i).Text="", то мне такая конструкция нравится. Не совсем верно то, что она Null интерпретирует как False. Точнее, она Null интерпретирует как "". Более того, сравнивать можно только на равенство с пустотой (""). Если же нужно проверить, что строка не пуста, то только так: If Rows(i).Text="" Then Else... Т.е. запись If Rows(i).Text<>"" Then..., также, как  и If Not Rows(i).Text="" Then... не приведет к ошибке, но выдаст ошибочный результат.
     

    Цитата:
    Как-то подозрительно гладко и просто
    Есть существенное ограничение на применение данного способа, т.к. кроме апострофов исчезнут все формулы и связи (если таковые присутствовали). Все будет преобразовано в значения. Кстати говоря, иногда требуется выполнить именно такую задачу.
     

    Цитата:
    Сугубо частный случай. Нужно общее решение. И для 10-ти и 20-ти...  

    Кто не дает использовать цикл For i=1 To 20 ? Явного перебора ячеек в макросе нет (что есть хорошо). А цикл Replace-ов много времени не займет.
     

    Цитата:
    А вот как быть в общем случае, когда этот невидимый апостроф является значащим?  
    Могут ведь и последовательности пробелов тоже оказаться значащими

    Благодаря опции xlWhole, примененной в методе Replace, очищены будут только те ячейки, которые кроме пробела(ов) больше не содержат ни одного символа. Логично предположить, что такие пробелы вряд ли могут быть значащими. Аналогично и с апострофом: если ячейка, помимо лидирующего апострофа содержит хотя бы один значащий символ (пусть даже еще один апостроф), то, во-первых, ее содержимое будет видно на рабочем листе. Во-вторых, она считается непустой и, соответственно, очищена не будет.
    Вообще, я преследовал цель, убрать все символы, которые не видно в ячейках рабочего листа, т.е. сделать их пустыми. Вторая цель - это избежать явный перебор ячеек.
     

    Цитата:
    Впрочем, когда доходит уже до таких узких задач обработки текстовых данных...
    Абсолютно с Вами согласен. Если есть полный и точный список того, что нужно очищать, то все выполнимо. А если нет... К каждой задаче требуется индивидуальный подход. Но в данном конкретном случае, автор вопроса просил удалить все пустые, а также те, которые "кажутся" пустыми (т.е. содержат символы невидимые на рабочем листе) строки и столбцы.
     

    Цитата:
    Я уже второй раз обращаю внимание ВСЕХ на необходимость отбойного  
    Application.ScreenUpdating = True  
    По большому счету, Вы правы. Но, если в проекте не предусматривается вызов процедуры из процедуры, то True восстанавливается поле окончания работы макроса. Попробуйте, например, выполнить процедуру, после выхода из которой, значение Application.ScreenUpdating не устанавливается в True. Затем попробуйте выполнить другую процедуру, которая никак не затрагивает Application.ScreenUpdating. Очевидно, что обновление экрана осуществляется.
    Повторяюсь, что во избежании возможных неприятностей, для более сложных проектов и для проектов, использующих события, лучше это значение восстанавливать. А если речь идет об отдельно взятом макросе, то можно этого и не делать. Каюсь. Грешен. Я часто "не закрываю скобки", применяя ScreenUpdating, DisplayAlerts, On Error Resume Next и т.п. Во-первых, просто лень. Во-вторых, в таком случае, нужно следить за ходом выполнения всех процедур проекта в целом.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 11:09 23-03-2011 | Исправлено: SAS888, 06:14 24-03-2011
    golkanavt



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

    Цитата:
    Всем привет. Вводная часть - есть Delphi-проект, в котором посредством Afalina XLReport создается прайс-лист с несколькими именованными листами (sheet). Каким образом можно в данном отчете после его создания добавить в начало книги еще один лист с оглавлением, т.е. чтобы в оглавлении были перечислены все листы со ссылками, т.е. чтобы по клику можно было переходить на нужный лист? В идеале кроме названия листов туда же желательно добавить и структурированное содержимое каждого листа, содержащего цены на те или иные объекты. Заранее спасибо откликнувшимся, готовым помочь в создании - буду благодарен посредством WMZ.
     

    Ну что, нет желающих взяться за задачу?

    ----------
    Shit happens...

    Всего записей: 1069 | Зарегистр. 08-04-2002 | Отправлено: 18:25 24-03-2011
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день!
    Если возможность средствами vba excel перевести строку из символов HTML в латиницу?
     
    Например, строка - &#50;&#52;&#48;&#110;&#111;&#107
    Когда я получаю данные, я могу скопировать их в блокнот и сохранить файл в формате .html и все читается. Но так не совсем годится.
    Подскажите, пожалуйста.
    Заранее спасибо.
     

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 22:33 24-03-2011
    AndVGri

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

    Код:
     
    Public Sub AddSheetLinks()
        Dim i As Long, pSheet As Excel.Worksheet, sName As String
        Set pSheet = ActiveWorkbook.Worksheets.Add(ActiveWorkbook.Worksheets(1))
        For i = 2 To ActiveWorkbook.Worksheets.Count
            sName = ActiveWorkbook.Worksheets(i).Name
            pSheet.Hyperlinks.Add pSheet.Cells(i, 1), "", sName & "!A1", , sName
        Next i
    End Sub
     

    andrewkard1980

    Код:
     
    'Подключить Microsoft VBScript Regular Expressions 5.5
    Public Function htmlStrToStr(forThis As String)
        Dim pReg As New VBScript_RegExp_55.RegExp
        Dim pMatches As VBScript_RegExp_55.MatchCollection
        Dim pMatch As VBScript_RegExp_55.Match, sResult As String
         
        pReg.Global = True: pReg.IgnoreCase = True: pReg.Pattern = "\d+"
        Set pMatches = pReg.Execute(forThis)
        sResult = ""
        For Each pMatch In pMatches
            sResult = sResult & Chr(CLng(pMatch.Value))
        Next pMatch
        htmlStrToStr = sResult
    End Function
     

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 04:38 25-03-2011
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndVGri
    Спасибо. Может что то не так делаю, но выдает ошибку:
    byref argument type mismatch
     
    Вот так вставляю в код:
         s7 = Split(m3, "ailto:")
         s8 = s7(1)
         s9 = Split(s8, "?")
         s10 = s9(0)
         
         If InStr(1, m3, "ailto:") > 0 Then s12 = htmlStrToStr(s10) Else s12 = ""

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

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

    Код:
    Public Function htmlStrToStr(ByVal forThis As String)  

    ну и, на всякий случай, приведение типа

    Код:
     If InStr(1, m3, "ailto:") > 0 Then s12 = htmlStrToStr(CStr(s10)) Else s12 = ""

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 07:10 27-03-2011
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Хорошо, спасибо, попробую.
     
    Добавлено:
    AndVGri
    Добрый день.
    Благодарю, все работает!.

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 11:08 27-03-2011
    KolyaP

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

    Всего записей: 43 | Зарегистр. 04-01-2009 | Отправлено: 22:13 31-03-2011
    KF121



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    а чем Replace плейс негодится, если мидом клеить не хотите.

    Всего записей: 170 | Зарегистр. 24-05-2006 | Отправлено: 22:52 31-03-2011
    KolyaP

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

    Всего записей: 43 | Зарегистр. 04-01-2009 | Отправлено: 23:27 31-03-2011
    SAS888

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

    Цитата:
    ...как элегантней это сделать

    Элегантней, все-таки Mid-ом. Например:

    Код:
    Sub Main()
        Dim s As String
        s = "aaabbbcccddd" 'исходная переменная
    'Заменим 5-й символ на "U":
        Mid$(s, 5, 1) = "U"
        MsgBox s 'результат
    End Sub

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 05:29 01-04-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