Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2009, 16:51   #1
oboevrulon
 
Регистрация: 29.05.2009
Сообщений: 6
Восклицание код для макроса

привет у меня вопрос, точнее нужен код для макроса в exel...

A B
сиги 0
трава 1
алкоголь 5

с помощью макроса сделать так чтобы макрос создавал новый лист, и туда сортировал данные только те, у которых значение B отличное от нуля, ну если можно по возрастанию... тоесть должно получиться

A B
трава 1
алкоголь 5

A, B - столбцы
oboevrulon вне форума Ответить с цитированием
Старый 29.05.2009, 16:55   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Макрос-то несложный - около 6 строк кода.

Вот только сделать его универсальным (чтобы он подходил к любым файлам) намного сложнее.

Будет файл - будет код.
EducatedFool вне форума Ответить с цитированием
Старый 06.06.2009, 13:33   #3
oboevrulon
 
Регистрация: 29.05.2009
Сообщений: 6
По умолчанию вот пример

вот файлик... там я сделал в одном листе два, в первом листе 2 таблицы.. первый и второй лист, первый можно оставить так как это исходная таблица, вот таблица с названием лист 2 это то что должно получиться... спасибо...
oboevrulon вне форума Ответить с цитированием
Старый 06.06.2009, 19:58   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот весь код:
Код:
Sub main()
    Const НомерСтолбцаСКоличеством = 4, НомерСтолбцаСоСтоимостью = 6
    On Error Resume Next: Application.ScreenUpdating = False
    Dim sh As Worksheet, sumCell As Range: Set sh = ActiveSheet: sh.Copy sh: Set sh = ActiveSheet
    sh.Shapes.SelectAll: Selection.Delete: sh.Name = "Выборка " & Format(Now, "HH-NN-SS")
    For i = sh.Cells(Rows.Count, НомерСтолбцаСКоличеством).End(xlUp).Row To 2 Step -1
        If Val(Cells(i, НомерСтолбцаСКоличеством)) = 0 Then Rows(i).Delete
    Next
    sh.UsedRange.Sort [d1], xlAscending, , , , , , xlYes
    Set sumCell = sh.Cells(Rows.Count, НомерСтолбцаСоСтоимостью).End(xlUp).Offset(1)
    If sumCell.Row > 3 Then
        sumCell.Formula = "=sum(" & Range(sumCell.Offset(-1), sumCell.EntireColumn.Cells(2)).Address & ")"
        sumCell.Font.Bold = True
    End If
End Sub
Нажмите зелёную кнопочку:
Вложения
Тип файла: rar oboevrulon.rar (9.3 Кб, 17 просмотров)
EducatedFool вне форума Ответить с цитированием
Старый 07.06.2009, 11:17   #5
oboevrulon
 
Регистрация: 29.05.2009
Сообщений: 6
Счастье

мегаспасибо! еще не проверял, проверю отредактирую это сообщение! крутан! ) не думал что напишешь ))
oboevrulon вне форума Ответить с цитированием
Старый 10.06.2009, 10:22   #6
oboevrulon
 
Регистрация: 29.05.2009
Сообщений: 6
По умолчанию

EducatedFool, а можно попросить Вас, прокоментировать код... просто хочу разобраться что и как, а вообще я сам сделал через конструктор макрос, но когда включаешь защиту ячеек, он отказывается работать, Ваш работает код, не могли бы прокомментировать его
oboevrulon вне форума Ответить с цитированием
Старый 10.06.2009, 10:33   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub main()
    ' константы - лишь для удобства изменения макроса в даньшейшем (если порядок столбцов изменится)
    Const НомерСтолбцаСКоличеством = 4, НомерСтолбцаСоСтоимостью = 6

    On Error Resume Next    ' отключаем остановку при возникновении ошибок
    Application.ScreenUpdating = False    ' отключаем обновление экрана
    Dim sh As Worksheet, sumCell As Range:
    Set sh = ActiveSheet:    ' берём активный лист (в переменную sh)
    sh.Copy sh:    ' и копируем его
    Set sh = ActiveSheet    ' теперь переменная sh ссылается уже на КОПИЮ листа
    sh.Shapes.SelectAll: Selection.Delete:    ' выделяем все автофигуры (кнопки) и удаляем их
    sh.Name = "Выборка " & Format(Now, "HH-NN-SS")    ' изменяем имя листа
    For i = sh.Cells(Rows.Count, НомерСтолбцаСКоличеством).End(xlUp).Row To 2 Step -1
        ' удаляем ненужные строки (где Количество не указано, или равно нулю)
        If Val(Cells(i, НомерСтолбцаСКоличеством)) = 0 Then Rows(i).Delete
    Next
    sh.UsedRange.Sort [d1], xlAscending, , , , , , xlYes    ' сортируем таблицу

    ' ищем ячейку ддля вставки суммы
    Set sumCell = sh.Cells(Rows.Count, НомерСтолбцаСоСтоимостью).End(xlUp).Offset(1)

    If sumCell.Row > 3 Then    ' если у нас не менее 2 строк с данными в таблице
        ' пишем в ячейку формулу суммы
        sumCell.Formula = "=sum(" & Range(sumCell.Offset(-1), sumCell.EntireColumn.Cells(2)).Address & ")"
        sumCell.Font.Bold = True    ' делаем шрифт полужирным
    End If
End Sub
Цитата:
вообще я сам сделал через конструктор макрос
Научите меня тоже, пожалуйста, делать такие макросы через "конструктор".
А то я даже не знаю, что такое конструктор макросов...
EducatedFool вне форума Ответить с цитированием
Старый 10.06.2009, 10:39   #8
oboevrulon
 
Регистрация: 29.05.2009
Сообщений: 6
Счастье

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код:
Sub main()
    ' константы - лишь для удобства изменения макроса в даньшейшем (если порядок столбцов изменится)
    Const НомерСтолбцаСКоличеством = 4, НомерСтолбцаСоСтоимостью = 6

    On Error Resume Next    ' отключаем остановку при возникновении ошибок
    Application.ScreenUpdating = False    ' отключаем обновление экрана
    Dim sh As Worksheet, sumCell As Range:
    Set sh = ActiveSheet:    ' берём активный лист (в переменную sh)
    sh.Copy sh:    ' и копируем его
    Set sh = ActiveSheet    ' теперь переменная sh ссылается уже на КОПИЮ листа
    sh.Shapes.SelectAll: Selection.Delete:    ' выделяем все автофигуры (кнопки) и удаляем их
    sh.Name = "Выборка " & Format(Now, "HH-NN-SS")    ' изменяем имя листа
    For i = sh.Cells(Rows.Count, НомерСтолбцаСКоличеством).End(xlUp).Row To 2 Step -1
        ' удаляем ненужные строки (где Количество не указано, или равно нулю)
        If Val(Cells(i, НомерСтолбцаСКоличеством)) = 0 Then Rows(i).Delete
    Next
    sh.UsedRange.Sort [d1], xlAscending, , , , , , xlYes    ' сортируем таблицу

    ' ищем ячейку ддля вставки суммы
    Set sumCell = sh.Cells(Rows.Count, НомерСтолбцаСоСтоимостью).End(xlUp).Offset(1)

    If sumCell.Row > 3 Then    ' если у нас не менее 2 строк с данными в таблице
        ' пишем в ячейку формулу суммы
        sumCell.Formula = "=sum(" & Range(sumCell.Offset(-1), sumCell.EntireColumn.Cells(2)).Address & ")"
        sumCell.Font.Bold = True    ' делаем шрифт полужирным
    End If
End Sub
огромное спасибо
Цитата:
Научите меня тоже, пожалуйста, делать такие макросы через "конструктор".
А то я даже не знаю, что такое конструктор макросов...
жошь я эээ... тебе то незнать )
oboevrulon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Условие для макроса sergiksergik Microsoft Office Excel 8 23.05.2009 20:54
Ввод диапазона для макроса мышкой 4yDoBuWe Microsoft Office Excel 5 01.12.2008 00:46
Создание SetUp для макроса Romuald Microsoft Office Excel 3 06.06.2008 12:23