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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aks sv
    Код чего?
    Ты скажи, что не получается - может, подскажу. Я тут уже немного разбираться стал.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:07 20-12-2006
    Gtto



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Огромная просьба в помощи.
    я не знаю куда писать в гугле нашёл этот форум....
    дело такое есть книга в ней порадка 200 листов, все листы идентичны по заполнению, НО представляют из себя небольшие журналы перемещения оборудования (т.е. в них заполняются строки с датой и прочими характеристиками в 5 столбцов).
    нужно сделать итоговую ведомость. я её частично сделал, но не могу заставить выбирать из конкретного листа (т.е. из каждого по порядку) последнюю заполненную строку (т.е. последнюю запись в журнале)... помогите очень надо.

    Всего записей: 2 | Зарегистр. 20-12-2006 | Отправлено: 13:12 20-12-2006
    The okk



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

    Код:
    Listview1.Listitems.Add(SelectedItem.Index)

     
    Добавлено:
    Gtto
    Что значит "выбрать"? Ты явно имеешь в виду не Select.
    Последнюю строку можно получить, например, так:
    Range("A65536").End(xlUp).Row
     
     
    Если выбирать из кажого по порядку, то:
    Код:
     
    Sub stroka()
    Dim list as Worksheet
    Dim stroka as Long
     
    For Each list in worksheets
    stroka = list.Range("A65536").End(xlUp).Row 'получил строку
    '
    'тут пишешь, что ты хочешь сделать с этой строкой
    '
    Next
    End Sub

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 13:13 20-12-2006 | Исправлено: The okk, 13:24 20-12-2006
    Gtto



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    возможно не правильно выразился..
    перенести значения из 4х ячеек в одной строке каждого листа на 1й (ну на итоговый..)
    а унать какую именно строку надо - последнюю запоненную (т.е. после нужной строки лист не заполнен)

    Всего записей: 2 | Зарегистр. 20-12-2006 | Отправлено: 13:31 20-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кто-нибудь с ListView вообще работал?
    Добавляю элемент:
    ListItems.Add(1) = Cells(1,1)
    Listitems.Item(1).SubItems(1) = Cells(1,2)
    Потом пытаюсь сортировать по второму столбцу:
    Sortkey = Family
    Sorted = True
    Реакции - ноль.
    Если сортирую по первому столбцу:
    Sortkey = TabNum
    Sorted = True
    , сортирует нормально.
    Почему не работает сортировка по второму столбцу?
     
    Добавлено:
    И вообще, не могу понять, почему у SubItem'ов свойств нет и свойства Item'ов они не наследуют. Как ими управлять? Должно же у них что-то меняться, кроме значения.
     
    Добавлено:
    И при копировании они не подцепляются - копирую Item, а его SubItems приходится отдельно копировать.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 09:19 21-12-2006 | Исправлено: The okk, 09:30 21-12-2006
    Anton T

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

    Цитата:
    порадка 200 листов

    Откуда берет 200 листов???
    Максимум 99.
     
    The okk
    Yuk
    Все в порядке. Вот смтри рисунок, который The okk написал код в предыдущем странице, но выглядить не порядок:
       
    А вот Yuk выглядить хорошо, но не могу сделать отображать все листы в списке:
       


    Сейчас 3850/18, а надо разделить на 3850 и на 18:
       
     
    ЗЫ. Если вами надо просмотреть код в форме, могу скинут...
     
     
    Добавлено:
    Вот код для формы h--p://files.people.overclockers.ru/AntonT/excelvbaform.rar
    Распакуй в любом каталоге, загрузи из надстройки и открывается панель"Моя панель" над панелью "Форматирование".

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 20:35 21-12-2006
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Anton T
    Цитата:
    Откуда берет 200 листов???  
    Максимум 99.  
    Вы не правы. Зависит от версии. в Excel 2003 в одной книге максимум 255 листов.
     
     
    Добавлено:
    Gtto
    Цитата:
    перенести значения из 4х ячеек в одной строке каждого листа на 1й (ну на итоговый..)  
    как раз над вашим постом уважаемый The okk привёл код, который проходит по всем (!) листам вашей книги (хоть 255 ;-)) и находит в них последнюю стоку. Допишите код обработки:  
    "'тут пишешь, что ты хочешь сделать с этой строкой"  
    например так (только не забудьте исправить строку для итогов и имя итогового листа (в примере ниже это "Лист1":
    Код:
     
    Sub stroka()
    Dim list As Worksheet
    Dim stroka As Long
     
    ' Строчка в первом листе, начиная с которой будут идти итоговые значения
    StrokaForSaved = 3
     
    For Each list In Worksheets
    'получил номер максимальной строки на листе

    stroka = list.Range("A65536").End(xlUp).Row
    'тут пишешь, что ты хочешь сделать с этой строкой
    If list.Name <> "Лист1" Then
      For i = 1 To 4 'сколько стобцов нужно переносит в итоговый лист
        Worksheets("Лист1").Cells(StrokaForSaved, i).Value = list.Cells(stroka, i).Value
      Next i
      StrokaForSaved = StrokaForSaved + 1
    End If
     
    Next
    End Sub
     

     
    p.s.всё это нужно вставить через Alt-F11, потом вызывать Alt-F8 - Выполнить макрос.
     

    Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 01:36 22-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Anton T
    Дык, сказал бы, что надо, чтобы выглядело нормально. Лови код:

    Код:
     
    Private Sub UserForm_Initialize()  
    Dim RowCounter As Long  
    Dim ls As Worksheet  
     
    For Each ls In Worksheets                                                'в каждом листе
        For RowCounter = 1 To ls.UsedRange.Rows.Count         'проходим по всем строкам
            With ListView1                                                        'и в ListView
            .Gridlines = True                                                    'рисуем сетку (ибо удобно!)
            With .ListItems
            .Add = ls.Cells(RowCounter, 1)                                'добавляем элемент (Фамилию)
            .Item(.Count).SubItems(1) = ls.Cells(RowCounter,2) 'и его подэлементы
            .Item(.Count).Subitems(2) = ls.Cells(RowCounter,3) 'и т.д. ...
            End With
            End With
        Next  
    Next  
     
    End Sub  

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

    Код:
    Public Sub SplitNum(BaseNum As Range)  
    Dim FirstNum As Integer, SecondNum As Integer  
     
    FirstNum = CInt(Left(BaseNum, InStr(1, BaseNum, "/") - 1))  
    SecondNum = CInt(Right(BaseNum, Len(BaseNum) - InStr(1, _
    BaseNum, "/")))  
     
    BaseNum = FirstNum
    BaseNum.Offset(0, 1) = SecondNum
     
    End Sub

    Подавай на вход ячейку и получишь на выходе две ячейки - с первым и со вторым числом.
     
    А что значит "отображать все листы в списке"?

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:11 22-12-2006 | Исправлено: The okk, 08:38 22-12-2006
    Aladdinych



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть две проблемы
     
    1. FileCopy "D:\b.txt", "c:\"
     
    Почему-то выдает "Path not found" хотя файл на диске D есть. Диск С тоже есть.
     
    2. Из модуля Workbook_open создается еще одна книга. Указатель на нее хранится в переменной newdoc. Эта переменная в разделе general объявлена как Public.
    Мне нужно из модуля CommandButton_Click закрыть книгу newdoc. Как получить доступ к переменной newdoc из этого модуля? Я пробовал делать ЭтаКнига.newdoc.close. По певому клику все срабатывает. По второму клику получаю почему-то "Object required".
    Как победить проблему?
     
    Добавлено:
    Да, забыл CommandButton находится на Лист1.

    Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 08:37 22-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aladdinych
    1. FileCopy "D:\b.txt", "c:\b.txt"  
     
    2. Не факт, что правильно тебя понял, но если ты уверен, что делаешь правильно:

    Код:
     
    On Error Resume Next  'забить на ошибки
    ЭтаКнига.newdoc.close
    On Error GoTo 0           'перестать забивать на ошибки
     

    Только вот, сдается мне, что после первого клика newdoc все же закрывается и, как результат, при втором клике закрывать уже нечего.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 08:42 22-12-2006 | Исправлено: The okk, 09:48 22-12-2006
    Aladdinych



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
    Еще вопрос у меня по клику на кнопке запускается архиватор
     
    Shell ("rar ....") и т.д.
    а за ней идет Filecopy aaa.rar, c:\aaa.rar
    Выкидывается ошибка Permission denied  
    Если выполнить Filecopy  с некоторой задержкой то копирование выполняется нормально.
    Как проверить файл, занят он другим процессом или нет?

    Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 10:02 22-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aladdinych
    может, я опять не понял замысла, но почему бы просто не проверять - есть ошибка или нет?
    Код:
     
    Povtor:
    On Error Goto Povtor             'если ошибка, попробовать еще раз
    Filecopy aaa.rar, c:\aaa.rar
    On Error Goto 0

    Думаю, это гораздо быстрее, чем следить за процессом другого приложения.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 10:40 22-12-2006
    Troitsky



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

    Цитата:
    Povtor:  
    On Error Goto Povtor             'если ошибка, попробовать еще раз  
    Filecopy aaa.rar, c:\aaa.rar  
    On Error Goto 0

    Так можно и в бесконечный цикл войти

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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 10:48 22-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Troitsky
    Если ошибка возникает только по причине занятости файла, бесконечного цикла не будет. Другое дело - при копировании могут возникнуть ошибки, вызванные другими факторами (не найден путь и т.д.). Но в таком случае проблема решается просто - надо контролировать не только наличие ошибки, но и ее номер.
    Код:
     
    Povtor:  
    On Error Resume Next             'если ошибка, попробовать еще раз  
    Filecopy aaa.rar, c:\aaa.rar  
    If Err = номер_ошибки GoTo Povtor
    On Error Goto 0  

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 11:06 22-12-2006 | Исправлено: The okk, 11:13 22-12-2006
    weg

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите кто может. Сделал как смог первый свой макрос, а он ругается.  
    Есть столбец с текстом. В каждой ячейки записана одна строка. Длина строк может быть очень большой(> 1000 символов). Так вот.
    Задача в том чтобы отредактировать текст таким образом, чтобы.  
    1) если строка длинее 230 символов, то создать ячейку со здвигом вниз и все символы начиная с 231-го перенести в неё, а в конец предыдущей ячейки (на 231-ю позицию) вставить символ "\".
    Короче, должен получиться столбец текста, строки в котором не длиньше 230 символов, а вместо знака переноса вставить "\"
     
    Написал следующее. Не судите строго. Нужна помощь.  
     
     
     
    Sub Макрос1 ()
     
    Dim addr As String
    Dim a As String
    Dim k As String
    a = "A"
    k = "\"
     
    Dim L As Integer
    Dim s As String
    Dim x As Integer
    Dim cut As String
    Dim cut2 As String
    L = 1
    x = 1
     
             
          Do Until L = 0
              s = a + LTrim(Str(x))
              Range("s").Select
              L = ДЛСТР("s")                                   <------даёт ошибку Compile error: Sub or Function not defined
              If L > 230 Then
               cut = ЛЕВСИМВ("s", 230)
               cut2 = ПСТР("s", 231, L - 230)
               Selection.Insert Shift:=xlDown
               ActiveCell.FormulaR1C1 = cut + k
               x = x + 1
               s = a + LTrim(Str(x))
               Range("s").Select
               ActiveCell.FormulaR1C1 = cut2
               x = x - 1
              End If
               
               
             
              Next x
               
           Loop
     
    End Sub

    Всего записей: 3 | Зарегистр. 22-12-2006 | Отправлено: 11:21 22-12-2006
    Troitsky



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

    Цитата:
    Из модуля Workbook_open создается еще одна книга. Указатель на нее хранится в переменной newdoc. Эта переменная в разделе general объявлена как Public.  
    Мне нужно из модуля CommandButton_Click закрыть книгу newdoc. Как получить доступ к переменной newdoc из этого модуля? Я пробовал делать ЭтаКнига.newdoc.close. По певому клику все срабатывает. По второму клику получаю почему-то "Object required".  
    Как победить проблему?

    Если область видимости переменной - глобальная в приложении, то почему бы не использовать такой код
    Код:
    Sub newDocClose()
      If newDoc Is Nothing Then
        Exit Sub
      Else
        newDoc.Close
        Set newDoc = Nothing
      End If
    End Sub
    это если иметь ввиду, что переменной newDoc присвоена ссылка на книгу. Например, таким образом:
    Код:
    Set newDoc = Workbooks.Add

     
     
    Добавлено:
    weg

    Цитата:
     L = ДЛСТР("s")

    ДЛСТР() - это функция только Excel, но не VBA. В VBA для определения длины строки есть функция Len()
     
     
    Добавлено:
    То же самое и с ЛЕВСИМВ() - Left(), ПСТР() - Mid()
     
     
    Добавлено:
    Макрос за тебя писать не буду - если уж решил разбираться, то попробуй все-таки разобраться сам. Так будет правильнее, а, главное, полезнее.
     


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 11:35 22-12-2006
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    The okk
    И где взять ListView? В екселе не нашел, только ВБ.
     
    НЕ РАБОТАЕТ РАЗДЕЛЕНИЯ! И куда в обычном модуле? Совсем неработает и в код листе тоже неработает.

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 12:12 22-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    weg
    похвально! Пару советов:
    1. Не используй Do Until. Всегда используй For Next. - Работает значительно быстрее.
    2. Не используй select. Практически все действия можно выполнить без него (я пока знаю только одно исключение)
    3. Не надо прописывать каждую переменную в отдельной строке. Можно же написать несколько в одну строку. Например:
    Dim a As String, Dim k As String
    Хотя, это уже кому как удобнее.
     
    Добавлено:
    Anton T
    1. Открой свою форму. Tools - additional controls - и там выбирай Microsoft Listview Control.
    2.
    Цитата:
    НЕ РАБОТАЕТ РАЗДЕЛЕНИЯ!

    а на вход точно подаешь ячейку?
    Прописывается в любой модуль. Потом из любого модуля можно вызвать. Например:
    Код:
    Sub Calling()
    Call SplitNum(Cells(1, 1))
    End Sub

    При таком вызове дробь в первой ячейке разделится на 2 числа в разных ячейках.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 12:13 22-12-2006
    weg

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

    Цитата:
    Troitsky

    [
     
    Спасибо!  
    Теперь ошибка
     
    Range("s").Select       ------  Run-time error '1004': Method 'Range'  of object '_Global' failed
     
    Да... Что-то я вообще ничего не понимаю.  С чем это связано?
     

    Всего записей: 3 | Зарегистр. 22-12-2006 | Отправлено: 12:23 22-12-2006 | Исправлено: weg, 12:34 22-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Запись
    Цитата:
    Range("s")
    в данном случае означает: вызвать метод Range со строковым параметром "s".
    В скобки надо ставить либо переменную, либо значение типа Range.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 12:50 22-12-2006
       

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