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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
     
    СПАСИБО ПРЕОГРОМНОЕ !!!!!
    всё зашуршало )

    Всего записей: 44 | Зарегистр. 19-08-2003 | Отправлено: 09:53 02-03-2007
    Stasssm

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

    Цитата:
    Данные - Автофильтр - Выбираешь первый столбец. В фильтре выбираешь "Пустые". Удаляешь. Все. Зачем тут VBA?  

     
    Согласен с Вами полностью (в данном примере это делать лучше именно так), но мне хотелось на основе этого примера используя Ваш код в дальнейшем пытаться самому делая в коде небольшие изменения работать со списками, а не напрягать Вас из-за каждой проблемы. Если конечно это вас каждый раз не напрягает, то я буду с удовольствием писать.
     
    Например недавно была ситуация, что из-за определенных данных второй ячейки списка (столбец В) нужно было скопировать данные рядом стоящей ячейки (столбец D) и поместить на другой лист (столбец С), но желательно чтобы данные шли по порядку, т.е. без пробелов в строках.  
    Если честно то расчитывал от вас получить что-то типа: Для всего списка данных, если данные ячейки (столбца В) = тому-то, то скопировать рядом стоящую ячейку на Лист2 в столбец С и так по всему списку.

    Всего записей: 109 | Зарегистр. 12-05-2006 | Отправлено: 10:45 02-03-2007
    The okk



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

    Цитата:
    Например недавно была ситуация, что из-за определенных данных второй ячейки списка (столбец В) нужно было скопировать данные рядом стоящей ячейки (столбец D) и поместить на другой лист (столбец С), но желательно чтобы данные шли по порядку, т.е. без пробелов в строках.  

    Это тоже решается без VBA - только уже вместо автофильтра просто Фильтр. Он как раз для этих целей и существует - копирует отфильтрованный список туда, куда укажешь.

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

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

    Всего записей: 12 | Зарегистр. 02-03-2007 | Отправлено: 11:00 02-03-2007
    Stasssm

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    The okk
     
    Сдаюсь! Вы победили!!!!
    Хотя, все же иметь такой код очень хочется даже для того чтобы разобраться в нем, т.к. Help в Excele по VBA все же не для новичков, а в будущем кто знает что придется со списками творить, может не все проблемы смогут решаться фильтрацией или функциям  типа ВПР.

    Всего записей: 109 | Зарегистр. 12-05-2006 | Отправлено: 11:24 02-03-2007
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Stasssm
    "Золотое правило" VBA в Excel: "Если можешь обойтись без VBA - обойдись!"
    Говорю на полном серьезе. Каждый раз, когда захочется что-то написать, убедись сначала, что это не реализуется формулами, фильтрами, условным форматированием и т.д.
    Написать макрос фильтра несложно - нажми "Запись макроса" и сделай фильтр, потом нажми "Остановить" и посмотри полученный код - вот тебе и будет макрос.
     
    tec4
    А почему просто не поставить в последнюю ячейку формулу суммы? Или так: Данные - Итоги...

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



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

    По поводу хелпа в новых офисах хочется долго и матерно ругаться. Такое ощущение, что у них там великие реформы затянулись - да так, что никак не вернутся к уровню хелпа 97 офиса... С VBA-хелпом традиционно все еще хуже, чем в среднем по больнице.
     

    Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 15:05 02-03-2007
    aar



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT
    А что вызывает нарекания?

    ----------
    * * *

    Всего записей: 7080 | Зарегистр. 20-11-2003 | Отправлено: 15:07 02-03-2007
    The okk



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

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

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

    Всего записей: 12 | Зарегистр. 19-12-2005 | Отправлено: 17:07 03-03-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Stasssm
    Цитата:
    Если честно то расчитывал от вас получить что-то типа: Для всего списка данных, если данные ячейки (столбца В) = тому-то, то скопировать рядом стоящую ячейку на Лист2 в столбец С и так по всему списку.

    таких программок здесь было вагон и малюсенькая тележка!
    вот, например, так можно:

    Код:
     
    Sub Example1()
    ' Определить число используемых рядов:
    nr = ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count
    ' Прыгаем вверх до последней заполненной ячейки:
    col = 2 ' работать будем со столбцом 2 (это B)
    firstrow = ActiveWorkbook.ActiveSheet.Cells(1, col).End(xlDown).Row ' первая использованная строка в столбце Col
    lastrow = ActiveWorkbook.ActiveSheet.Cells(nr, col).End(xlUp).Row ' последняя использованная строка в столбце Col
    MsgBox "First Row in B = " & firstrow & "  last Row in B = " & lastrow
     
    'как вариант - самая первая используемая строка и самая последняя во всём листе
    ' мы их не используем
    Row1 = ActiveWorkbook.ActiveSheet.UsedRange.Row
    Row2 = Row1 + ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count - 1
    MsgBox "First  Row = " & Row1 & "  last Row = " & Row2
     
     
    MaxRow_List2 = ActiveWorkbook.Worksheets("Лист2").UsedRange.Rows.Count
    ' добавляемые данные будут ПОСЛЕ всех данных на листе 2!!
    Col_in_2 = 3 ' это столбец C
     
    'начинаем перенос данных из с текущего листа на "лист 2"
    For k = firstrow To lastrow
        If ActiveWorkbook.ActiveSheet.Cells(k, Col).Value > 0 Then
          ActiveWorkbook.Worksheets("Лист2").Cells(MaxRow_List2 + 1, Col_in_2).Value = _
            ActiveWorkbook.ActiveSheet.Cells(k, Col + 1).Value
          MaxRow_List2 = MaxRow_List2 + 1
        End If
    Next k
    End Sub
     

     
    но рекомендую сделать плакатик:
    "Золотое правило" VBA в Excel: "Если можешь обойтись без VBA - обойдись!" (с)The okk

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



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

    Код:
     
    Sub Copy_Cells()
        LastRow1 = Worksheets("Sheet1").Cells.SpecialCells(xlCellTypeLastCell).Row
        LastRow2 = Worksheets("Sheet2").Cells.SpecialCells(xlCellTypeLastCell).Row
         
        For Row1 = 1 To LastRow1
            For Row2 = 1 To LastRow2
                If (Worksheets("Sheet1").Cells(Row1, 1) = Worksheets("Sheet2").Cells(Row2, 1)) Then
                    Worksheets("Sheet1").Cells(Row1, 2) = Worksheets("Sheet2").Cells(Row2, 2)
                End If
            Next Row2
        Next Row1
    End Sub
     

     
    Видео (внутри .exe)

    ----------
    * * *

    Всего записей: 7080 | Зарегистр. 20-11-2003 | Отправлено: 22:45 03-03-2007
    vzbzdnov



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

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

    Да уж.. Копаться в MSDN это не самый лучший хелп
     
    aar

    Цитата:
    А что вызывает нарекания?

    Отсутствие такового
     
    А у кого как с performance в 2007-ом? Я, лично, уже все волосья себе на голове повыдёргивал от отчаяния. Приходится гонять доволино сложный макрос, с классами, динамическими charts и прочими наворотами. Так вот, на лаптопе с Pentium 1.6G 512mb стоит Excel 2003 и макро работает секунд 20-25, а на десктопе Pentium 2.53 1gb стоит Excel 2007 и тот же файл с тем же макросом идёт почти 3 минуты! О Б А Л Д Е ТЬ ! Особенно тормозят charts. Прямо, видно, как комп тужится.
     
    И совместимости никакой.
     
    У кого есть доступ к 2м версиям - 2007 и более ранними, протестируйте, плз, сей код и расскажите, что у вас получается
     

    Цитата:
     
    Sub AddChart()
    Dim ch As ChartObject
       Set ch = Worksheets("Sheet2").ChartObjects.Add(10, 10, 210,210)
        With ch.Chart
                .SetSourceData Source:=Sheets("Sheet1").Range("A1:C7"), PlotBy:=xlColumns
                .ChartType = xl3DPie
                 With .SeriesCollection(1)
                     .XValues = Sheets("Sheet1").Range("A1:A7")
                     .ApplyDataLabels ShowPercentage:=True
                 End With
     
            With .PlotArea
                .Border.LineStyle = xlContinuous
                .Interior.ColorIndex = 2
                .Left = 50#
                .Top = 25#
                .Width = 160#
            End With
             
            With .ChartArea.Font
                .Name = "Arial Narrow"  
                .FontStyle = "Regular"
                .Size = 7
            End With
        End With
    End Sub
     
    Sheet1:
    1101    Product1    $2,197.99
    1102    Product2    $5,731.24
    1103    Product3    $9,613.70
    1104    Product4    $6,053.07
    1105    Product5    $6,177.96
    1106    Product6    $3,700.14
    1107    Product7    $3,765.61
     


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

    Всего записей: 3955 | Зарегистр. 27-03-2002 | Отправлено: 01:53 04-03-2007 | Исправлено: vzbzdnov, 02:09 04-03-2007
    xonix

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aar
     
    Пасиб огромное !!! с меня виртуальное пиво
     
    SERGE_BLIZNUK
     а эта что то не заработала  
    колонки и строки постчитала а добавлять не хочет  
     

    Всего записей: 12 | Зарегистр. 19-12-2005 | Отправлено: 08:33 04-03-2007
    Troitsky



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

    Цитата:
    У кого есть доступ к 2м версиям - 2007 и более ранними, протестируйте, плз, сей код и расскажите, что у вас получается

    К 2007-ому доступа нет, но в Office XP на Duron 700 сей код отрабатывает моментально. Построение сотни этих круговых диаграмм в цикле занимает секунды две.

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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 10:38 04-03-2007
    SERGE_BLIZNUK

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xonix
    Цитата:
    а эта что то не заработала    
    колонки и строки постчитала а добавлять не хочет  

    и не должна была!!! я же не Вам писал - это был пример кода для Stasssm
    Это раз. Этот код проходит по столбцу B и для всех значений больше нуля копирует данные из соседнего столбца на "Лист2" в столбец С.
     
    а второе - крайне рекомендую на будущее, прежде чем использовать какой-бы не было код, хотя бы оценить, что он может делать - иначе можно получить весьма забавные (и не очень) сюрпризы... Из кода VBA лёгко не только очистить все открытые книги и сохранить их, но и удалить файлики на диске и даже скачать и выполнить код из интернета...  
    Так что тщательнее надо, тщательнее... ;-)))
     

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



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aar и The okk
     
    Поставьте, хоть в виртуалку, офис 97 и сами сравните хелп - хотя бы по таким фичам как "см. также" и примеры кода.  
     
    Его теперь просто по объему раза в три меньше (антифлейм: линейкой не мерял). Причем отнюдь не за счет "воды" - в этом можно убедиться, опять-таки ознакомившись со старым хелпом.

    Всего записей: 17149 | Зарегистр. 14-10-2001 | Отправлено: 12:48 04-03-2007 | Исправлено: LevT, 12:52 04-03-2007
    aar



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LevT
    Ну, а можно этот старый хэлп от 97-го офиса отдельно выложить? Просто нет дистрибутива.
     
    vzbzdnov
    Моментально отрабатывается (Excel 2003 SP2, ноутбук с Athlon 1.6 ГГц, 512 Мб).

    ----------
    * * *

    Всего записей: 7080 | Зарегистр. 20-11-2003 | Отправлено: 13:51 04-03-2007
    kandi



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Это снова я с вопросом о том, как определить нажатую кнопку на листе Excel.
    Решение найдено. Помог Димитр с форума РЕЛИБа. Если кому интересно, публикую.

    Код:
    ' Вариант-1.
    ' С использованием OLE-объекта "CommandButton".
    ' -----------------------------------------------------
    ' Class Modules
    ' Class1
     
    ' (Declatations)
    Option Explicit
    Public WithEvents myCmdButton As MSForms.CommandButton
    Dim i As Long
     
    ' Click
    Private Sub myCmdButton_Click()
    ' здесь любой код, использующий свойства "myCmdButton"
    ' например
        MsgBox myCmdButton.Caption
            Range("anyName1").Value = myCmdButton.Index
            Range("anyName2").Value = myCmdButton.Name
            Range("anyName3").Value = myCmdButton.Top
    End Sub
     
    ' -----------------------------------------------------
    ' Modules
    ' Module1
     
    ' (Declatations)
    Option Explicit
    Public arrCmdBut() As New Class1
    Dim objCmdBut As OLEObject
     
    ' AddMassiv
    Sub AddMassiv()
    Dim i As Long
        i = 1
        For Each objCmdBut In Sheets(1).OLEObjects
            If TypeName(objCmdBut.Object) = "CommandButton" Then
                ReDim Preserve arrCmdBut(1 To i)
                Set arrCmdBut(i).myCmdButton = objCmdBut.Object
                i = i + 1
            End If
        Next
    End Sub
    ' -----------------------------------------------------
     
    ' Microsoft Excel Objects
    ' Лист1
     
    ' Activate
    Private Sub Worksheet_Activate()
        AddMassiv
    End Sub
     
    ' ЭтаКнига
    ' Open
    Private Sub Workbook_Open()
        AddMassiv
    End Sub
    ' ----------------------------------------------------
     
    ' Вариант-2.
    ' С использованием объекта "Button" (Toolbars "Forms").
    ' Просто назначить всем кнопкам макрос "arrButtonID".
    ' -----------------------------------------------------
    ' Modules
    ' Module1
     
    Option Explicit
    Sub arrButtonID()
        Dim strTemp As String
        strTemp = CStr(Application.Caller)
        Range("anyName1").Value = strTemp
        Range("anyName2").Value = Mid(strTemp, InStr(strTemp, " ") + 1)
    End Sub

    Всего записей: 38 | Зарегистр. 27-12-2003 | Отправлено: 15:35 04-03-2007
    olinka1986



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый вечер, подскажите пожалуйста как решить такую вот задачу
     
    Составить событийную процедуру, которая при изменении значения количества товара в клетке (Кол-во), и если в клетке слева цена товара (Цена) задана, вычисляет стоимость (Стоимость) и записывает ее в клетку справа.
    Использовать процедуру:
    Private Sub Worksheet_Change(ByVal Target As Range)
    Товар выбирается с помощью валидирования, которое уже задано.  
    Для нахождения цены использовать функции поиска и данные на листе 2, при этом если товар в клетке не задан, то и клетка с ценой остается пустой.
    Имена диапазонам на листе 2 заданы.  
     
    Ооочень жду от вас помощи....

    Всего записей: 3 | Зарегистр. 04-03-2007 | Отправлено: 21:03 04-03-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