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

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

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

ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

RUSmafia



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

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

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами 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.
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов

  • Всего записей: 556 | Зарегистр. 31-07-2002 | Отправлено: 21:40 14-10-2004 | Исправлено: lucky_Luk, 20:44 13-04-2007
    The okk



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

    Цитата:
    А можно сделать так чтобы листы добавлялись в конец а не в начало  
    и чтобы они шли по порядку,а не в обратном порядке.  


    Код:
    Sub CreateOrderofSheets()
        Dim Cell As Range
        Dim wsNewSheet As Worksheet
     
        On Error Resume Next
        Application.ScreenUpdating = False
        For Each Cell In [A:A].SpecialCells(xlCellTypeConstants)
            With Worksheets
            Set wsNewSheet = .Add(After:=.item(.Count))
            End With
            wsNewSheet.Name = Cell
            If Err <> 0 Then _
               wsNewSheet.Name = InputBox( _
               "Лист с таким именем уже существует. Введите другое имя", _  
               "Ошибка")  
        Next Cell
        Application.ScreenUpdating = True
    End Sub

     
    Paul1204
    Выбираешь ячейку(и). В меню Excel выбираешь: Формат - Условное форматирование - Значение Меньше 0 и выбираешь формат, который будет применяться к ячейке при выполнении условия (шрифт, заливку). Никакого VBA тут не надо!
     

    Цитата:
    Собатие Private Sub Worksheet_Change(ByVal Target As Range) не работает, а  только при вводе значения вручную.

    Ну да, конечно. Небось, Application.EnableEvents = False где-нибудь прописал .

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 15:09 02-02-2007 | Исправлено: The okk, 15:14 02-02-2007
    Paul1204

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Большое спасибо. Оказалось гораздо проще чем я думал

    Всего записей: 2 | Зарегистр. 02-02-2007 | Отправлено: 15:29 02-02-2007
    The okk



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

    Цитата:
    Sub Макрос1()  
        Dim LastRow As Long, r As Long  
        'Определяем последнюю строчку  
        LastRow = Range("A65536").End(xlUp).Row  
        For r = 4 To LastRow 'имеется ввиду, что три листа есть  
            Sheets.Add  
        Next r  
    End Sub  

    Надеюсь, мои комментарии помогут тебе лучше понять VBA... хотя бы немного:

    1. Код:
      Dim LastRow As Long, r As Long  
      - Грамотно, в одну строчку. Выбранные типы, соответствуют разрядности системы (32), что даст небольшой выигрыш по быстродействию. Тут претензий нет... только в будущем лучше избегать всяких однобуквенных имен - сам потом запутаешься. Лучше что-то "говорящее". Например, "SheetsCount". Имя переменной лучше начинать с "префикса"-сокращения типа. В данном случае lng. Это, разумеется, необязательно, но иногда бывает полезно.

    2. Код:
      LastRow = Range("A65536").End(xlUp).Row  
      По сути тоже правильно. Можно было бы и Cells вместо Range поставить, но не существенно. Последняя строка определена грамотно.
    3.    
      Код:
      For r = 4 To LastRow 'имеется ввиду, что три листа есть  
              Sheets.Add  
          Next r  
      А вот тут уже хуже. Использован цикл, где без него можно было обойтись. Это, конечно, ошибкой не назовешь, но недочет - это точно. Я имею в виду, что можно было сразу добавить нужное количество листов использовав параметр Count метода Add. А именно:
      Код:
       
      Sheets.Add Count:=LastRow-3

      Кроме того, количество листов можно было и определить (и не надо было бы ничего иметь в виду ). Количество листов можно получить так:
      Код:
      Sheets.Count

    4. Итого, весь твой код умещается в одну строку:

      Код:
      Sub Макрос1()  
              Sheets.Add Count:=Range("A65536").End(xlUp).Row - Sheets.Count
      End Sub  
    5. Понятно, что в таком виде код будет вызывать сбой, если строк в первом столбце меньше, чем в книге листов (можешь проверить). Поэтому надо избавиться от сообщения ошибки:
      Код:
      Sub Макрос1()  
      On Error Resume Next
              Sheets.Add Count:=Range("A65536").End(xlUp).Row - Sheets.Count
      End Sub  
      Теперь ошибку мы не увидим и листы молча не добавятся.
    6. Процесс пойдет быстрее, если мы не станем наблюдать за добавлением листов, т.е. просто отключим обновление экрана:
      Код:
      Sub Макрос1()  
      On Error Resume Next
      Application.ScreenUpdating = False
              Sheets.Add Count:=Range("A65536").End(xlUp).Row - Sheets.Count
      'следующая строка вернет обновление экрана, но она не обязательна,
      'поскольку обновление экрана восстановится автоматически  
      'по завершению процедуры

      Application.ScreenUpdating = True  
      End Sub  

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 15:39 02-02-2007 | Исправлено: The okk, 15:58 02-02-2007
    Troitsky



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

    Цитата:

    Код:
    LastRow = Range("A65536").End(xlUp).Row
    По сути тоже правильно. Можно было бы и Cells вместо Range поставить, но не существенно. Последняя строка определена грамотно.

    В общем случае неверно, т.к. в 2007 версии Excel число строк превышает 65536 и может доходить до миллиона. Для определения последней заполненной строки правильнее будет использовать код вида:
    Код:
    Rows.End(xlDown).Row



    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 18:03 02-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    У меня 2007 нету. И, судя по отзывам, которые я читал, мне он совершенно не нужен.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 18:24 02-02-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Цитата:
    LastRow = Range("A65536").End(xlUp).Row  
    Troitsky
    Цитата:
    Rows.End(xlDown).Row  
    Вроде я не новичок уже. Но тем не менее. ;-))
    Господа, разъясните, пожалуйста: я использую для определения последней используемой строки код вида
    Код:
    LastRow= ThisWorkbook.ActiveSheet.UsedRange.Row + ThisWorkbook.ActiveSheet.UsedRange.Row.Count
    Есть ли отличия в использовании ваших End(xlUp) / End(xlDown) и моим вариантом? И если да - то какие?..
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 08:02 03-02-2007
    vzbzdnov



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

    Цитата:
    Есть ли отличия в использовании ваших End(xlUp) / End(xlDown) и моим вариантом? И если да - то какие?..  

    Вот если на листе засветить последние строчки и очистить их нажав кнопку Delete, то разными методами получишь разные значения LastRow. Поэтому я лично этим значениям никогда не верю, а для подстраховки ещё и почитаю снизу вверх до первой непустой строки.

    Цитата:
     
    Function Last_Row(ws As WorkSheet, colToCheck As String) As Long
        Dim rw As Long, tmpLastRow As Long
     
    '---------------------------------------------------------------------------------
    ' Сначала любым способом находим предполагаемую последнюю строку
    '---------------------------------------------------------------------------------
     
    '-----------------------------------------------------------------------
    'Допустим. так
    '-----------------------------------------------------------------------
        ws.Activate
        tmpLastRow = ActiveWindow.ActiveCell.SpecialCells(xlCellTypeLastCell).Row
     
    '-----------------------------------------------------------------------
    'или же так (лично мне этот больше всех нравится - самый точный)
     '-----------------------------------------------------------------------
       tmpLastRow = ws.Cells.Find(What:="*", After:=[A1],SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
     
    '-----------------------------------------------------------------------
    'или же так
     '-----------------------------------------------------------------------
        tmpLastRow = ws.Range(colToCheck & 1).End(xlDown).Row
     
    '-----------------------------------------------------------------------
    'или же так
    '-----------------------------------------------------------------------
        tmpLastRow = ws.Rows.End(xlDown).Row  
     
    '-----------------------------------------------------------------------
    '-----------------------------------------------------------------------
    'Теперь для подстраховки читаем вверх до первого непустого  
    'значения в проверяемой колонке
    '-----------------------------------------------------------------------
            For rw = tmpLastRow To 1 Step -1
                If Not IsEmpty(ws.Range(colToCheck & rw).Value) Then
                    Last_Row = rw
                    Exit Function
                End If
            Next rw  
    '-----------------------------------------------------------------------
    'Опаньки! А лист-то пустой!  
    '-----------------------------------------------------------------------
            Last_Row = 0
    End Function
     


    ----------
    |^^^пиво^^\\|""\\_,_
    |___________||___|__|)
    (@)(@)""*|(@)(@)**(@)

    Всего записей: 3950 | Зарегистр. 27-03-2002 | Отправлено: 09:20 03-02-2007 | Исправлено: vzbzdnov, 09:31 03-02-2007
    The okk



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

    1. Код:
      Columns(1).End(xlDown)
      На выходе дает нам последнюю ячейку этого столбца (первого в данном случае), содержащую значение (эффект такой же, как если бы ты выделил первый столбец и нажал Ctrl + Вниз).

    2. Код:
      [A65535].End(xlUp)
      Результат дает тот же, что и в первом случае, только способ немного иной. Это все равно что выделить в Excel последнюю ячейку в столбце и нажать Ctrl + Вверх. Но тут уже надо знать максимальное количество ячеек в столбце (зависит от конкретной версии Excel/SpreadSheet). Поэтому, если пишешь надстройку и хочешь сделать ее универсальной, предпочтительнее первый способ.

    3. Код:
      ThisWorkbook.ActiveSheet.UsedRange.Rows.Count
      Отличается от предыдущих тем, что определяет строку последней использованной ячейки во всем листе. Это может быть ячейка, не содержащая значения, а просто скрытая или выдающая в результате вычислений пустую строку, или просто с нарисованной границей.

    В общем, если тебе нужно определить последнюю ячейку со значением (в столбце или строке), используй варианты End. Если нужно определить последнюю использованную ячейку во всем листе (во всех столбцах), пусть даже без значения (просто отформатированную), то UsedRange.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:26 03-02-2007 | Исправлено: The okk, 12:04 03-02-2007
    zaratustra

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

    Всего записей: 442 | Зарегистр. 19-12-2002 | Отправлено: 09:47 03-02-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vzbzdnov
    The okk
    Большое спасибо за разъяснения. (думаю, что они не только мне будут полезны. Кстати, может кто-то в шапку добавит (если это целесообразно, конечно)?)

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 09:55 03-02-2007
    The okk



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

    1. Код:
      ActiveWindow.ActiveCell.SpecialCells(xlCellTypeLastCell)

      Для нахождения последней ячейки не самый лучший вариант. Поскольку в отличие от End является методом (со всеми вытекающими потерями по быстродействию). Метод SpecialCells с параметром xlCellTypeLastCell явно был задуман не для этих целей, поскольку результат (если добавить .Row) аналогичен результату выполнения кода:
      Код:
      ThisWorkbook.ActiveSheet.UsedRange.Rows.Count

      Подойдет только если первая строка не используется (значит ThisWorkbook.ActiveSheet.UsedRange.Rows.Count не позволяет получить номер последней строки).

    2. Код:
      ws.Cells.Find(What:="*", After:=[A1],SearchOrder:=xlByRows, SearchDirection:=xlPrevious)

      Оригинальный метод. Находит последнюю ячейку, где есть какое-нибудь содержимое (в комментариях, формуле или в значении). Мне пока к такой конструкции прибегать не приходилось. Но в некоторых случаях может быть полезной - если нужно найти последнюю ячейку с содержимым, но она не является последней использованной.

    3. Код:
              For rw = tmpLastRow To 1 Step -1  
                  If Not IsEmpty(ws.Range(colToCheck & rw).Value) Then  
                      Last_Row = rw  
                      Exit Function  
                  End If  
              Next rw  

      Если внимательно прочитать описания всех предыдущих методов и свойств, то прибегать к такой конструкции не будет никакой необходимости.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 11:10 03-02-2007 | Исправлено: The okk, 13:10 03-02-2007
    Troitsky



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

    Цитата:

    Код:
    LastRow= ThisWorkbook.ActiveSheet.UsedRange.Row + ThisWorkbook.ActiveSheet.UsedRange.Row.Count
    Есть ли отличия в использовании ваших End(xlUp) / End(xlDown) и моим вариантом? И если да - то какие?..

    The okk

    Цитата:

    Код:
    ThisWorkbook.ActiveSheet.UsedRange.Row
    Отличается от предыдущих тем, что определяет строку последней использованной ячейки во всем листе. Это может быть ячейка, не содержащая значения, а просто скрытая или выдающая в результате вычислений пустую строку, или просто с нарисованной границей.

     
    На самом деле
    Код:
    ThisWorkbook.ActiveSheet.UsedRange.Row
    даст нам номер первой строки используемого диапазона!
     
    Следовательно, тут
    Код:
    ThisWorkbook.ActiveSheet.UsedRange.Row + ThisWorkbook.ActiveSheet.UsedRange.Rows.Count
    мы складываем номер первой строки используемого диапазона и количество строк в нем, что в сумме и дает номер последней используемой строки (к тому же с ошибкой на единицу ).
    На мой взглад, такой подход не рационален.


    ----------
    Мы в хорошем настроении гуляем по лесам.
    Кто обидеть нас захочет – сам получит по усам.
    Сам полу- получит по усам. Сам полу- получит по усам!

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 11:47 03-02-2007 | Исправлено: Troitsky, 11:52 03-02-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Я просто скопировал то, что у него было - только и всего На самом деле, если мне нужно количество строк в листе, использую ThisWorkbook.ActiveSheet.UsedRange.Rows.Count. Но мне в последнее время это не нужно.
    Спасибо, что сказал. Сейчас исправлю то сообщение.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 11:56 03-02-2007 | Исправлено: The okk, 12:03 03-02-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Цитата:
    Я просто скопировал то, что у него было - только и всего  

    по поводу rows.count - тут я ошибся (чисто описка)
    По поводу ошибки на единицу - полностью согласен - надо вычитать...
    Цитата:
    если мне нужно количество строк в листе, использую ThisWorkbook.ActiveSheet.UsedRange.Rows.Count
    только нужно учитывать - что это именно количество ИСПОЛЬЗОВАННЫХ строк - т.е. если в середине листа заполнить одну ячейку - то count резонно вернёт 1 (т.е. я не представляю, зачем может понадобится usedRange.Rows.Count без usedRange.Row...  
     
    Впрочем, господа vzbzdnov, The okk, Troitsky - ещё раз большое спасибо. Обсуждение лично для меня было очень полезным.  
     
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 12:41 03-02-2007
    The okk



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

    Цитата:
    только нужно учитывать - что это именно количество ИСПОЛЬЗОВАННЫХ строк - т.е. если в середине листа заполнить одну ячейку - то count резонно вернёт 1 (т.е. я не представляю, зачем может понадобится usedRange.Rows.Count без usedRange.Row...

    Такой вариант может быть только если первые строки не используются. Если использована первая и, например, сотая строка, то UsedRange.Rows.Count = 100. В случае же, если первые строки не используются (интересно почему?!), пожалуй, стоит использовать
    Код:
    ActiveWindow.ActiveCell.SpecialCells(xlCellTypeLastCell)  

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:07 03-02-2007
    ZORRO2005



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

    Всего записей: 342 | Зарегистр. 08-10-2005 | Отправлено: 13:34 03-02-2007
    vzbzdnov



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

    Цитата:
    если мне нужно количество строк в листе, использую ThisWorkbook.ActiveSheet.UsedRange.Rows.Count.  

    Опять же - если перед этим очистил последние строчки, то они всё равно покажутся в этом счётчике, что не есть гуд. Поэтому я ещё и читаю снизу вверх

    ----------
    |^^^пиво^^\\|""\\_,_
    |___________||___|__|)
    (@)(@)""*|(@)(@)**(@)

    Всего записей: 3950 | Зарегистр. 27-03-2002 | Отправлено: 18:53 03-02-2007
    The okk



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

    Цитата:
    Опять же - если перед этим очистил последние строчки, то они всё равно покажутся в этом счётчике

    Каким образом ты их "очистил"? Удалил значение, а комментарии и/или форматирование оставил? Разумеется, в этом случае они будут учитываться.
    Если же ты использовал ячейки, а потом удалил их (полностью), они в UsedRange не попадут.
    Цикл тут совершенно не нужен. В крайнем случае можно найти последнюю ячейку методом Find.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 20:52 03-02-2007
    vzbzdnov



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

    Цитата:
    Каким образом ты их "очистил"? Удалил значение, а комментарии и/или форматирование оставил? Разумеется, в этом случае они будут учитываться.  
    Если же ты использовал ячейки, а потом удалил их (полностью), они в UsedRange не попадут.  

    Лично мне приходится писать макросы для юзверей. А рассчитывать на умного юзера это утопия. И как он там что почистит-удалит одному Гейтцу ведомо. Тем более, что когда он придёт с предъявой на баг, то повторить, что он там сделал, не сможет в 100 из 100 случаев.
    Поэтому макрос должен быть непробиваемым на 200%. А лишний цикл (в большинстве случаев это будет всего один виток) не повредит.
     
    Тут у меня более интересный вопрос возник - как переименовать Class? (Для тех, кто не в курсе, дальше можно не читать. ) Чичас я его выгружаю, удаляю, редактирую выгруженное и гружу взад. Очень уж много телодвижений получается. А, может, можно как-нить просто переименовать? Не нашёл такой фичи.
     


    ----------
    |^^^пиво^^\\|""\\_,_
    |___________||___|__|)
    (@)(@)""*|(@)(@)**(@)

    Всего записей: 3950 | Зарегистр. 27-03-2002 | Отправлено: 21:18 03-02-2007
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Можно я тоже вставлю свои 5 копеек?
    The okk
    Цитата:

    Код:
    Columns(1).End(xlDown)

    На выходе дает нам последнюю ячейку этого столбца (первого в данном случае), содержащую значение

    Не совсем так. End возвращает либо последнюю непустую ячейку текущей области в данном столбце или строке, либо первую непустую ячейку следующей области. Поэкспериментируйте на столбце с пустыми ячейками в середине. Поэтому, например, если А1 пустая, а А2 нет, код выше вернет ячейку А2. И если после А2 есть непусты ячейки, результат будет не такой как после
    Цитата:
    [A65535].End(xlUp)
    Кстати. это похоже должно быть Range("A65535").End(xlUp).
    Для определения последней непустой ячейки в столбце предлагаю такой код:
    Код:
    Cells(ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count, 1).End(xlUp)

     
    Кстати, не забывайте также про свойство CurrentRegion.Хотя работает это не совсем как описано в хелпе.
     

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 00:22 04-02-2007 | Исправлено: Yuk, 01:05 04-02-2007
       

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

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA
    ShIvADeSt (23-04-2007 01:59): http://forum.ru-board.com/topic.cgi?forum=33&topic=8273


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru