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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет.
    Подскажите код для сортировки массива строк по алфавиту.  
    Нашел вариант сортировки, основанный на методе "пузырёк" (http://www.cyberforum.ru/vba/thread222888.html), но что-то он не совсем грамотно сортирует: первые буквы - ок, а вторые - уже как повезет. Хотелось бы что-то более корректно сортирующее.

    Всего записей: 2975 | Зарегистр. 04-01-2005 | Отправлено: 18:48 10-12-2015 | Исправлено: mrdime, 11:04 11-12-2015
    KDPoid



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime,
    Вам, в целях обучения, нужно продемонстрировать преподавателю, что вы можете на VBA написать сортировку ?
     
    Я к тому, что если нужен результат, а не процесс... То сортировку проще доверить Excel-у...
    У него голова железная, пусть он и сортирует

    Код:
     
    Sub qweqwe()
        With ActiveSheet.Sort
            .SetRange Range("A5:A12") ' диапазон сортировки
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End Sub
     

    Как-то так...

    Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 15:21 11-12-2015
    mrdime



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

    Цитата:
    Вам, в целях обучения, нужно продемонстрировать преподавателю, что вы можете на VBA написать сортировку ?  

    Все намного сложнее. У жены на работе таблица в Excel, куда забиваются люди (фамилии, имена, должности). Таблица хитрым образом обрабатывается и выводится в документ Ворд (конечный документ нужен в Ворде). Точнее - люди выводятся "порциями" по несколько человек (по специальностям/ должностям), каждую из которых надо сортировать в алфавитном порядке (фамилии).
    В Excel сортировать не годится, т.к. таблица должна оставаться без изменений (люди вносятся в порядке поступления по датам).
    В принципе в алгоритме (коде) который у меня есть все устраивает, проблемы возникают с нестандартными кирилличными символами (в дан. случае - укр. языка). Если фамилия содержит (а особенно - начинается) на такой символ, такие фамилии сортируются не по алфавиту, а идут почему-то в начале. В общем если коротко - то проблема с сортировкой фамилий (значений массива), содержащими спец. кирилличные символы.

    Всего записей: 2975 | Зарегистр. 04-01-2005 | Отправлено: 15:33 11-12-2015
    KDPoid



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Если вас устраивает код по ссылке, то реализованный там пузырёк будет странновато вести себя из-за:

    Код:
     
            If Asc(UCase(Массив(i - 1))) > Asc(UCase(Массив(i))) Then
                vВременный = Массив(i - 1)
                Массив(i - 1) = Массив(i)
                Массив(i) = vВременный
            End If
     

    Если (i-1)-й элемент больше i-го, то поменять их местами...
    А больше или меньше - определяется кодом символа, т.е. предполагается, что коды идут по порядку. Всякие умляуты обычно расположены в стороне и будут проблемы.
    Так что нужно лишь написать свой Asc, который по букве выдаст число для сравнения.
    В украинском алфавите я не силён, пример для Ё:

    Код:
     
    Function MyAsc(Ch As String) As Double
      If Ch = "Ё" Then
        MyAsc = 197.5
      Else
        MyAsc = Asc(Ch)
      End If
    End Function
     

    Тогда Ё будет возвращать не свой номер, а число между "Е" и "Ж"
    А
    Код:
     
    If MyAsc(UCase(Массив(i - 1))) > MyAsc(UCase(Массив(i))) Then
     

    всё отлично отсортирует.
     
    Дополните функцию всеми нужными буквами и наслаждайтесь.
     

    Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 15:59 11-12-2015
    mrdime



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KDPoid
    Спасибо подход, понятен и решение оч. хорошее.
    Но при дальнейших экспериментах с кодом (по указанной выше ссылке), я увидел, что кроме проблем со спец. кирилличными символами есть проблема и в самом подходе.
    Встроенная функция Asc() вовращает код лишь первого символа в из переменной Массив (i), т.е. если встречается несколько человек, фамилии которых начинаются на одну букву, то в сортировке необходимо анализировать вторую, а при необходимости - третью и т.д. букву (если первые 2 совпадут). Данный код этого не может сделать, соответственно люди с похожими началами фамилий располагаются как попало.
    Я несколько изменил подход, вместо сложной конструкции
    Цитата:
    If Asc(UCase(Массив(i - 1))) > Asc(UCase(Массив(i))) Then  
    , скормил Екселю упрощенный вариант, т.е.
    Цитата:
    If UCase(Массив(i - 1)) > UCase(Массив(i)) Then

    Не знаю, как Ексел или VBA (в данном случае) это обрабатывает, но сортировать начал абсолютно грамотно, т.е. учитывать все символы в процессе сравнения. Думаю, сравнение тоже базируется на кодах ASCI, только как-то комплексно (т.е. перебирая все символы).
    НО, при этом проблема со спец. кирилличными символами осталась (фактически - это одна украинская буква "І", т.к. на другие спец. буквы обычно фамилии не начинаются.) Если фамилии начинаются на эту букву, такие элементы массива сабж бросает в начало списка (очевидно потому, что эта буква имеет код ASCI 178, т.е. меньше, чем у всех других букв алфавита). Поскольку от функции сравнения с использованием функции Asc(), я ушел, то и использование пользовательской функции MyAsc(), тоже уже не сработает.  
    Соответсвенно вопрос остается открытым: как правильно отсортировать элементы массива с учетом вышеописанной проблемы со спец. символами (буквой "І")?
    Интересует сам принцип решения проблемы, а не конкретный символ, т.к. в русском это может быть буква "Ё" например при сортировке фамилий.

    Всего записей: 2975 | Зарегистр. 04-01-2005 | Отправлено: 20:30 11-12-2015
    KDPoid



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

    Код:
     
    Sub qweqwe()
        Range("A1:A10").Select ' выделяем диапазон, который хотим перенести.
        Selection.Copy  ' копируем
        Range("Z1").Select ' переходим на чистое место.
        ActiveSheet.Paste ' вставляем.
        With ActiveSheet.Sort ' сортируем привычным способом
            .SetRange Range("Z1:Z10")  
            .Header = xlNo  
            .MatchCase = False  
            .Orientation = xlTopToBottom  
            .Apply  
        End With  
     
    ' Где-то тут переносим в Word
     
        Range("Z1:Z10").Select ' прибираемся за собой.
        Selection.ClearContents
    End Sub
     

    Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 20:54 11-12-2015
    mrdime



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

    Цитата:
    Следующий вариант...  

    Спасибо за код. Если честно, то мне не особо нравится что-то куда-то копировать, потом, удалять. Хотелось бы сделать это все внутри кода... это с т. зрения красоты и эстетичности. А если с позиции "главное, чтобы работало", то вроде бы ок. Потестирую, посмотрю что будет лучше по юзабельности: новый вариант или существующий с проблемной буквой "І" (фамилий не особо много, начинающихся на "І"): можно каждый раз проверять начало полученных таблиц в Ворде и руками переносить нужные куски на место.  
     
    Раскопал еще "клондайк" с разными решениями сортировки массивов (цифровых и текстовых) в vba (но на английском) + там надо разбираться (на что сейчас времени нет). Кому интересна эта тема (для себя), можете посмотреть:
    http://stackoverflow.com/questions/152319/vba-array-sort-function
    Если когда-то допилю код, то здесь отпишусь. Думаю, что проблема будет актуальна в любом языке, основанном на кириллице.

    Всего записей: 2975 | Зарегистр. 04-01-2005 | Отправлено: 19:26 14-12-2015 | Исправлено: mrdime, 19:27 14-12-2015
    Alex_Piggy

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Доброе время, mrdime
    Тут вопрос не в алгоритме сортировки, а в алгоритме сравнения. Расширенная идея от KDPoid.

    Код:
     
    Function IsAlphabetGreater(vStr1, vStr2)
    Const cCharList = "АБВГҐДЕЁЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
    Dim i, vChar1, vChar2, vCharCode1, vCharCode2, vOut
    IsAlphabetGreater = False
    For i = 1 To IIf(Len(vStr1) < Len(vStr2), Len(vStr1), Len(vStr2)) + 1
      vChar1 = Mid(vStr1, i, 1)
      vChar2 = Mid(vStr2, i, 1)
      vCharCode1 = InStr(1, cCharList, vChar1, vbTextCompare)
      vCharCode2 = InStr(1, cCharList, vChar2, vbTextCompare)
      If (vCharCode1 = 0) Or (vCharCode2 = 0) Then
        vCharCode1 = Asc(vChar1)
        vCharCode2 = Asc(vChar2)
      End If
      If vCharCode1 <> vCharCode2 Then
        If vCharCode1 > vCharCode2 Then IsAlphabetGreater = True
        Exit For
      End If
    Next
    End Function
     

    И в любой сортировке вместо  "If str1>str2 Then" использовать "If IsAlphabetGreater(str1,str2) Then"
    UPD Добавил сравнение длин, если по тексту различий нет Подробнее...

    Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 20:36 14-12-2015 | Исправлено: Alex_Piggy, 12:47 15-12-2015
    mrdime



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Piggy
    Огромное спасибо. То, что надо. Потестил код - работает безупречно.
    Насчет апдейта: не совсем понял зачем добавлять сравнение длин.
    Завтра на свежую голову попробую разобраться.

    Всего записей: 2975 | Зарегистр. 04-01-2005 | Отправлено: 02:19 16-12-2015
    KDPoid



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime,
    Предпоследний вариант был такой:
    В цикле сравниваются символы до меньшей из длин строк.
    Т.е. если строки
    vStr1 = "АБВГДЕ"
    vStr2 = "АБВ"
     То сравниваться будут только первые три символа.
    Они равны, и ответ функции "АНеБольшеЛи(vStr1,vStr2)" будет "Нет"
     
    Добавленная проверка длины, это "Если общая часть строк одинакова, кто длиннее, тот и больше"

    Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 07:46 16-12-2015 | Исправлено: KDPoid, 07:48 16-12-2015
    lsd11



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Еще вопрос.
    Есть некий массив.
    Как в макросе реализовать следующее:
    если длина строки в ячейке столбца А =10, то в сооветствующей ячейке столбца B вписать "Город", иначе "Пригород". Продлить формулу на весь массив.
    Пробовал делать через "Запись макроса", получилось как-то некрасиво - если длина столбца в массиве изменится, надо будет продлять или удалять формулы в B.

    Всего записей: 146 | Зарегистр. 29-08-2007 | Отправлено: 08:58 17-12-2015
    ZlydenGL



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А зачем макросом-то? Обычной формулой! Для русского офиса: =ЕСЛИ(ДЛСТР(А1)=10;"Город";"Пригород")
    Для макроса и массива это соответственно

    Код:
    If len(элемент_массива) = 10 Then
         Элемент_массива_2 = "Город"
    Else
         Элемент_массива_2 = "Пригород"
    End If
    Но если в задаче реально столбцы А и В, я бы в код вообще не лез.

    Всего записей: 4268 | Зарегистр. 22-06-2002 | Отправлено: 12:08 17-12-2015
    Alexzzy

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    lsd11
    Ну и что такое "некий массив" и как он связан с ячейками? Такое мутное описание наводит на мысли, что под массивом понимается набор ячеек. В терминах VBA "массив" это не "набор ячеек".

    Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 13:35 17-12-2015
    lsd11



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Если некорректно поставил задачу, извиняюсь.
    ZlydenGL
    Цитата:
    А зачем макросом-то?  

    Это не единоразовая работа. Каждый раз забивать формулы не очень целесообразно.
    Проще написать кучу макросов (или один большой), чтобы сразу привести все в нужный вид по нажатию кнопки.
    Alexzzy

    Цитата:
    Ну и что такое "некий массив" и как он связан с ячейками?

    Массив - 15 столбцов, 10 000 строк
    привожу пример, что у меня получилось (массив не тот, но принцип понятен):
    массив вида:
       

    Код:
    Sub к2()
        ActiveCell.FormulaR1C1 = "=IF(LEN(RC[-7])=10,""Город"",""Пригород"")"
        Range("H2").Select
        Selection.AutoFill Destination:=Range("H2:H4")
        Range("H2:H4").Select
    End Sub
     

    Это через запись макроса. Недостатки видно сразу  
    Длина столбца будет меняться. ну не через вставку-заполнение формулой сделать...
    Пробовал изменить ранее выданный макрос уважаемого  KDPoid

    Цитата:
    lsd11, волшебный макрос квекве спасёт тебя
     
    Код:
     
    Sub qweqwe()
      i = 3 ' Начинаем с третьей строки. В первой заголовки, а второй не с чем совпадать.
      While ActiveSheet.Range("A" + CStr(i)) <> "" ' Проверяем строки, пока в первом столбце что-то есть
        If ActiveSheet.Range("A" + CStr(i)) = ActiveSheet.Range("A" + CStr(i - 1)) Then ' Если значение столбца A совпадает со строкой выше
          ActiveSheet.Range("G" + CStr(i - 1)) = ActiveSheet.Range("G" + CStr(i - 1)) + "/" + ActiveSheet.Range("G" + CStr(i)) ' Добавим значение столбца G наверх через разделитель
          Rows(i).EntireRow.Delete ' удалим текущую строку
        Else
          i = i + 1 ' Если не совпало, переходим к следующей строке
        End If
      Wend
    End Sub
     
     
    Что-то не пошло. Чуть позже скину измененный код, который не пошел.

    Всего записей: 146 | Зарегистр. 29-08-2007 | Отправлено: 05:11 18-12-2015
    KDPoid



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

    Код:
     
    Sub qweqwe()  
      i = 2 ' Начинаем со второй строки. В первой заголовки
      While ActiveSheet.Range("A" + CStr(i)) <> "" ' Проверяем строки, пока в первом столбце что-то есть  
          ActiveSheet.Range("B" + CStr(i)).FormulaR1C1 = "=IF(LEN(RC[-1])=10,""Город"",""Пригород"")"
          i = i + 1 ' переходим к следующей строке  
        End If  
      Wend  
    End Sub  
     
     
     

    Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 07:19 18-12-2015
    lsd11



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KDPoid, спасибо!
    только вылазит
    Compile error:
    En If without block If
     
    P.S. Убрал в скрипте "End If", помогло.
    А можно без заполнения формулой сделать?
    P.P.S.

    Код:
     
    Sub qweqwe()
      i = 2 ' Начинаем со второй строки. В первой заголовки
      While ActiveSheet.Range("A" + CStr(i)) <> "" ' Проверяем строки, пока в первом столбце что-то есть
      If Len(ActiveSheet.Range("A" + CStr(i))) = 10 Then ActiveSheet.Range("B" + CStr(i)) = "Город" Else ActiveSheet.Range("B" + CStr(i)) = "Пригород"
      i = i + 1 ' переходим к следующей строке
        Wend
    End Sub
     

    Real cool!

     
    Спасибо огроменное!
    Ничего не писал на VBA И вообще с 2002 г., все забыл напрочь!
     
    P.P.P.S. Иногда жаль, что на руборде кармы нет)) Я б добавил плюсов)))

    Всего записей: 146 | Зарегистр. 29-08-2007 | Отправлено: 09:12 18-12-2015 | Исправлено: lsd11, 09:24 18-12-2015
    KDPoid



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    "Если делаешь добро рассчитывая на благодарность, то это не добро, а навязанная сделка".
    Помогло, и хорошо.

    Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 09:53 18-12-2015
    JekG

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

    Всего записей: 2695 | Зарегистр. 12-10-2005 | Отправлено: 11:48 20-12-2015
    Winand



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

    Код:
    While ActiveSheet.Range("A" + CStr(i)) <> ""

    Мне всегда нравилось для определения конца данных использовать вот это:

    Код:
    lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1

    Всего записей: 57 | Зарегистр. 20-01-2008 | Отправлено: 12:11 28-12-2015
    Alexzzy

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Winand
    Да, такое надо знать и использовать когда надо, но "конец данных" в общем случае не равен "концу значимых данных".

    Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 13:10 28-12-2015
    Открыть новую тему     Написать ответ в эту тему

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