Страницы: 1
RSS
Перенос данных на другие листы
 
Добрый день.
К сожалению, знания VBA у меня сильно скудны, а потому написать адекватный макрос не получается.

В общем, требуется автоматическая фильтрация по столбцу H на листе "Лист для выгрузки" в соответствии с листом кодов (код = район).
Затем в трех столбцах из отфильтрованных строк требуется выбрать информацию из столбцов B, С и D (не более 20 строк) и перенести на лист "Опись" в соответствующие графы в столбцах B и C. (Т.е. "Регистрационный номер" в "Регистрационный номер", "ФИО клиента" в "ФИО клиента" и "Адрес доставки" в "Адрес доставки").

И так для каждого из кодов: отфильтровываем столбец H по коду, если что-то есть, то оно нужные столбцы переносятся на другой лист. Проблема в том, что в случае, если фильтр ничего не находит, то вся информация из столбцов переносится на другой лист и с этим ничего не сделать.

Затем фильтры сбрасываются и вся информация по столбцам переносится в "Журнал на сайт" (вот с этим я вроде справился).

Заранее спасибо за помощь!

Код
Sub Макрос1()
 
  Sheets("Лист для выгрузки").Select
    ActiveSheet.Range("$A$1:$I$1000").AutoFilter Field:=8, Criteria1:= _
        "40262563000, г. Санкт-Петербург"
    Range("B2").Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(19, 1)).Select
    Selection.Copy
    Sheets("Опись").Select
    Range("B27:C46").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Лист для выгрузки").Select
    Range("D2").Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(19, 0)).Select
    Selection.Copy
    Sheets("Опись").Select
    Range("E27:E46").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        
        ' Далее следует то же самое для других кодов и районов:
        '

        Sheets("Лист для выгрузки").Select
    ActiveSheet.Range("$A$1:$I$1000").AutoFilter Field:=8, Criteria1:= _
        "40263561000, г. Санкт-Петербург"
    Range("B2").Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(19, 1)).Select
    Selection.Copy
    Sheets("Опись").Select
    Range("B63").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Лист для выгрузки").Select
    Range("D2").Select
    Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(19, 0)).Select
    Selection.Copy
    Sheets("Опись").Select
    Range("E63").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
  '
  ' И т.д. Заканчивается переносом в журнал:
        
        ActiveWindow.ScrollRow = 1
    ActiveWindow.ScrollColumn = 1
        
    Sheets("Лист для выгрузки").Select
    ActiveSheet.Range("$A$1:$I$1000").AutoFilter Field:=8
    Range("A2:G200").Select
    
    Selection.Copy
    Sheets("Журнал на сайт").Select
    Range("B2:H200").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub
 
Код
Sub Main()
    Dim arr As Variant: arr = GetArr()
    Dim arB As Variant: arB = GetArrCol(arr, 2)
    Dim arC As Variant: arC = GetArrCol(arr, 3)
    Dim arD As Variant: arD = GetArrCol(arr, 4)
    
    OutOpis arB, arC, arD
    OutJurn arr
End Sub
'
Sub OutJurn(arr As Variant)
    Dim sh As Worksheet: Set sh = Worksheets("Журнал на сайт")
    With sh.Range("B1").Resize(UBound(arr, 1), UBound(arr, 2))
        .Value = arr
        .Columns("H:H").Clear
    End With
End Sub
'
Sub OutOpis(arB As Variant, arC As Variant, arD As Variant)
    Dim sh As Worksheet: Set sh = Worksheets("Опись")
    With sh
        .Range("B27").Resize(UBound(arB, 1)).Value = arB
        .Range("C27").Resize(UBound(arC, 1)).Value = arC
        .Range("E27").Resize(UBound(arD, 1)).Value = arD
    End With
End Sub
'
Function GetArrCol(arr As Variant, x As Byte) As Variant
    Dim b As Variant
    ReDim b(1 To UBound(arr, 1) - 1, 1 To 1)
    Dim y As Long
    For y = 2 To UBound(arr, 1)
        b(y - 1, 1) = arr(y, x)
    Next
    GetArrCol = b
End Function
'
Function GetArr() As Variant
    Dim sh As Worksheet: Set sh = Worksheets("Лист для выгрузки")
    
    Dim arr As Variant
    With sh
        arr = .Range(.Cells(1, 1), .Cells(.Rows.Count, "H").End(xlUp))
    End With
    SortArr arr
    GetArr = arr
End Function
'
Function SortArr(arr As Variant) As Variant
    Dim sh As Worksheet
    Set sh = Worksheets.Add
    Dim r As Range
    Set r = sh.Cells(1, 1).Resize(UBound(arr, 1), UBound(arr, 2))
    r = arr
     
    With sh.Sort
        .SortFields.Clear
        .SortFields.Add Key:=r.Range("H2").Resize(UBound(arr, 1) - 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange r
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Dim y As Long
    y = Application.Min(21, UBound(arr, 1))
    arr = sh.Cells(1, 1).Resize(y, UBound(arr, 2))
    
    Application.DisplayAlerts = False
    sh.Delete
    Application.DisplayAlerts = True
    
    SortArr = arr
End Function
Страницы: 1
Наверх