Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Как справиться с Автофильтром? Добавлено: 13.06.07 15:02  

Автор вопроса:  Andrew_nik
Есть лист, на котором находится данные оплат ряду компаний. Стоит задача создать на новом листе несколько таблиц, одна под другой - оплата каждой из компаний.
Руками это можно делать, но занимает довольно много времени, если компаний накапливается около 100. Напмсал код. Но есть проблема - я никогда раньше не работал с автофильтром - не получается программно перебирать Criteria1 - уникальные значения, которые формирует EXCEL при создании Автофильтра.
На всякий случай прилагаю файл с таблицами.
Подскажите что нужно сделать! Буду премного благодарен!

Option Explicit

Public Sub Копир_данных()
Dim lastrow As Long
Dim OldSheet As Object, NewSheet As Object
' c - Критерий criteria1 в Автофильтре
Dim c As Object
Set OldSheet = Sheets("Все")
Set NewSheet = Sheets("Лист1")

OldSheet.Activate
lastrow = Cells(65536, 2).End(xlUp).Row

'Применяем Автофильтр
With ActiveSheet
    Range(.Cells(2, 2), .Cells(lastrow, 12)).Select
    Selection.AutoFilter
End With

'Определяем для Автофильтра уникальное значение и копирум данные в таблицу на новый лист
For Each c In Selection.AutoFilter
    Selection.AutoFilter Field:=2, Criteria1:=c
    lastrow = Cells(65536, 2).End(xlUp).Row
    Range(ActiveSheet.Cells(2, 2), ActiveSheet.Cells(lastrow, 12)).Select
    Selection.Copy

    'Активирум новый лист, считаем количество строк
     NewSheet.Activate
     Range("B2").Select
     lastrow = Cells(65536, 2).End(xlUp).Row + 1
      
     'Проверяем, если ячейка "В2" не пустая - значит сдвигаем начало ввода на Lastrow+1 строк вниз
     If Not IsEmpty(ActiveCell) Then
         ActiveCell = Range("B2").Offset(lastrow, 0)
         NewSheet.Paste
     Else: NewSheet.Paste
     End If
      'Задаем жирную границу для нововставленной таблицы
      Формат_таблицы      
      OldSheet.Activate
'Берем другой критерий Автофильтра
Next c

'Изменяем ширину столбцов и выравниваем строки
Формат_Столбцов
End Sub

Private Sub Формат_Столбцов()
NewSheet.Activate

With NewSheet
    Columns("B:B").ColumnWidth = 6
    Columns("C:C").ColumnWidth = 25
    Columns("D:D").ColumnWidth = 23
    Columns("C:C").ColumnWidth = 22
    Columns("G:G").ColumnWidth = 14
    Columns("K:K").ColumnWidth = 16
    Columns("M:M").ColumnWidth = 18
    Columns("M:M").ColumnWidth = 20
    Selection.Rows.AutoFit
End With

End Sub

Private Sub Формат_таблицы()
With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
End With

End Sub

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 Meh&vb



ICQ: 195578509 

Вопросов: 8
Ответов: 25
 Профиль | | #1 Добавлено: 18.06.07 08:45
В этом коде что-то не то - ты меняешь параметры автофильтра внутри цикла
For Each c In Selection.AutoFilter
    Selection.AutoFilter Field:=2, Criteria1:=c
, а это приведёт к неожиданным последствиям.
И мне кажется, что твои данные удобнее будет выбрать с помощью сводных таблиц(с промежуточными итогами). Напиши макрос по их созданию, откорректируй его и пользуйся.

Ответить

Номер ответа: 2
Автор ответа:
 Andrew_nik



Вопросов: 15
Ответов: 30
 Профиль | | #2 Добавлено: 18.06.07 17:46
Спасибо за совет Meh&vb. Я уже обошёл Автофильтр обычной сортировкой данных по столбцу, потом добавил по одной строке между отсортированными данными - так чтобы получились отдельные таблицы. и после этого задал таблицам границы.
Автофильр выходит смысла нет использовать в программировании?

Может кому-то понадобится аналог Автофильтра:

'Количество колонок в таблице
Public Const col = 12

Private Sub Отчет_складские_запасы()
'Разделение оплат по компаниям для того, чтобы прсомотреть,
'что покупалось для восстановления запасов
Dim str1 As String, str2 As String
Dim a As Integer, i As Integer, b As Integer, m As Long
Dim lastrow As Long, cel As Long
Dim OldSheet As Object, NewSheet As Object

Application.ScreenUpdating = False
Set OldSheet = Sheets("Все";)
Set NewSheet = Sheets.Add
ActiveSheet.Name = "Отчет"
ActiveSheet.Select
ActiveSheet.Move After:=OldSheet

  Формат_столбцов
      
a = 2
Range("B2";).Select
Do While ActiveCell.Value <> 0
    str1 = ActiveCell.Value
    str2 = ActiveCell.Offset(1, 0).Value
'*************************************
  If str1 <> str2 Then
     ActiveCell.Offset(1, 0).EntireRow.Select 'm - номер строки
     Selection.Insert Shift:=xlDown
          
     Selection.Borders(xlEdgeLeft).LineStyle = xlNone
     Selection.Borders(xlEdgeRight).LineStyle = xlNone
     Selection.Borders(xlInsideVertical).LineStyle = xlNone
     Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
     
     a = a + 1
  End If
'*************************************
    a = a + 1
    Cells(a, 2).Select ' переход на следующую ячейку
Loop

'Задаем жирную линию границы вставленной таблице
b = Cells(65536, 2).End(xlUp).Row
For i = b To 2 Step -1
    If IsEmpty(Cells(i, 2).Offset(-1, 0)) = True Then
        Cells(i, 2).CurrentRegion.Select
        cel = Selection.Rows.Count
        Cells(i, 2).Resize(cel, col).Select
        
         Формат_таблицы
    End If
Next i

Заголовки_таблицы

Application.ScreenUpdating = True
End Sub

Private Sub Формат_столбцов()
   Dim b As Long
   Set OldSheet = Sheets("Все";)
   Set NewSheet = Sheets("Отчет";)
   OldSheet.Activate
   OldSheet.Range("B2";).Select
   ActiveCell.CurrentRegion.Select
   Selection.Copy

NewSheet.Activate

ActiveSheet.Paste
With Selection
       .MergeCells = False
End With
With ActiveSheet
   Range("A:A";).EntireColumn.Delete
   lastrow = Cells(65536, 2).End(xlUp).Row
   Range(.Cells(1, 1), .Cells(lastrow, 13)).Select
   Selection.Sort Key1:=Range("a1";), Order1:=xlAscending, Header:=xlGuess, _
           OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
           ;DataOption1:=xlSortNormal
End With
With NewSheet
    Columns("A:A";).ColumnWidth = 20
    Columns("B:B";).ColumnWidth = 25
    Columns("C:C";).ColumnWidth = 10
    Columns(";D:D";).ColumnWidth = 10
    Columns("E:E";).ColumnWidth = 14
    Columns("F:F";).ColumnWidth = 11
    Columns("G:G";).ColumnWidth = 10
    Columns("H:H";).ColumnWidth = 10
    Columns("I:I";).ColumnWidth = 2
    Columns("J:J";).ColumnWidth = 20
    Columns("K:K";).ColumnWidth = 20
    Columns("L:L";).ColumnWidth = 20
    Selection.Rows.AutoFit
End With
    Columns("A:A";).Select
    Selection.Insert Shift:=xlToRight
    Selection.ColumnWidth = 4

Range("A2";).Select
'Удаляем пустые ячейки после форматирования - Апрель 2007, Май 2007 и пр.
b = ActiveSheet.UsedRange.Rows.Count
For i = b To 1 Step -1
    If IsEmpty(Cells(i, 5)) Then
        Cells(i, 5).EntireRow.Delete
    End If
Next i

For i = b To 1 Step -1
    If Not IsEmpty(Cells(i, 7)) Then
        Cells(i, 7).Select
        Selection.Font.Bold = True
    End If
Next i

Rows("1:1";).Select
Selection.Insert Shift:=xlDown
    
End Sub

Private Sub Формат_таблицы()
With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
'        .LineStyle = xlContinuous
        .Weight = xlThin
'        .ColorIndex = xlAutomatic
End With

End Sub

Private Sub Заголовки_таблицы()
    Range("B1";).Value = "Название организации"
    Range("c1";).Value = "Назначение платежа"
    Range("d1";).Value = "Сумма оплаты, грн."
    Range("f1";).Value = "ОКПО"
    Range("g1";).Value = "Оплатили:"
    Range("h1";).Value = "№ и дата"
    Range("k1";).Value = "Цель приобретения, заявитель"
    Range("l1";).Value = "Распределение по бюджету"
    Range("b1:M1";).Select
    
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
            
    Формат_таблицы
    Объед_яч
End Sub

Private Sub Объед_яч()
    Range(";D1:E1";).Select
    With Selection
        .MergeCells = False
    End With
    Selection.Merge
    
    Range("H1:I1";).Select
    With Selection
        .MergeCells = False
    End With
    Selection.Merge
    
    Range("L1:M1";).Select
    With Selection
        .MergeCells = False
    End With
    
    Selection.Merge
    Rows("2:2";).Select
    ActiveWindow.FreezePanes = True
    
    ActiveWindow.Zoom = 90
    Range("B2";).Select
End Sub
Public Sub Вход()
Dim Msg, Style, Title, Help, Ctxt, Response, MyString
Dim bolA As Boolean
On Error Resume Next
bolA = Worksheets("Отчет";).Activate

If bolA Then
    Msg = "Удалить лист Отчет и сформировать новый?"
    Style = vbYesNo + vbQuestion + vbDefaultButton2
    Title = "Внимание!"
    Help = ";DEMO.HLP"
    Ctxt = 1000
    
    Response = MsgBox(Msg, Style, Title, Help, Ctxt)
      If Response = vbYes Then
      Application.DisplayAlerts = False
      Worksheets("Отчет";).Delete
      Application.DisplayAlerts = True
      
      Отчет_складские_запасы
        Else: Exit Sub
      End If
Else: Отчет_складские_запасы
End If
End Sub

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам