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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2013, 12:15   #1
drozd1
 
Регистрация: 19.09.2013
Сообщений: 3
По умолчанию Копирование строк с условием по ячейкам

Добрый день.

Подскажите, пожалуйста...
Задача: выбрать сотрудников одного подразделения и скопировать строки по отдельным листам, чтобы листы назывались как подразделения.

Пример

ps если есть такая возможность, то на каждый лист вставить еще шапку, которая находится в области A1:D5

Последний раз редактировалось drozd1; 19.09.2013 в 12:16. Причина: опечатка
drozd1 вне форума Ответить с цитированием
Старый 19.09.2013, 14:11   #2
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Написал кусочек, пошел домой =) Вообщем сие творение ищет в столбце "B" уникальные значения начиная с адреса B5.
После чего помещает в массив и потом разносит по листам, по дороге доставляя шапку А1:D5. Код всяко неидеальный,но было интересно поиграться. Если никто не поможет -завтра допишу.

Код:
Function UniqueValuesFromArray(ByVal arr, ByVal col As Long) As Variant
    ' перебирает все значения в столбце Col двумерного массива arr
   ' в поисках уникальных значений. Возвращает двумерный вертикальный массив
   ' размерностью N * 1, содержащий уникальные значения из столбца col
   If Not IsArray(arr) Then MsgBox "Это не массив!", vbCritical: Exit Function
    If col > UBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function
    If col < LBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function

    On Error Resume Next: Dim coll As New Collection, txt$
    For i = LBound(arr) To UBound(arr)
        txt$ = Trim(arr(i, col)): coll.Add txt$, txt$
    Next i
    ReDim newarr(1 To coll.Count, 1 To 1)
    For i = 1 To coll.Count: newarr(i, 1) = coll(i): Next i
    UniqueValuesFromArray = newarr
 
End Function
Sub ВыборкаУникальных()
    ' берем диапазон ячеек из первого столбца активного листа
   Dim ПервыйСтолбец As Range: Set ПервыйСтолбец = Range("B6", Range("B" & Rows.Count).End(xlUp))

    ' выбираем из него уникальные значения
   МассивУникальных = UniqueValuesFromArray(ПервыйСтолбец.Value, 1)

 
   
   On Error Resume Next
   ii = UBound(МассивУникальных)
   For i = 1 To ii
Sheets(МассивУникальных(i, 1)).Select
If Err Then
    Err.Clear
    Sheets.Add.Name = МассивУникальных(i, 1)
    Sheets("Лист 1").Range("A1:D5").Copy Range("A1")
    Else
   
End If
   
Next
Sheets("Лист 1").Select
   
End Sub
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 20.09.2013, 06:09   #3
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Барабанная дробь!!!
Код:
Function UniqueValuesFromArray(ByVal arr, ByVal col As Long) As Variant
    ' перебирает все значения в столбце Col двумерного массива arr
   ' в поисках уникальных значений. Возвращает двумерный вертикальный массив
   ' размерностью N * 1, содержащий уникальные значения из столбца col
   If Not IsArray(arr) Then MsgBox "Это не массив!", vbCritical: Exit Function
    If col > UBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function
    If col < LBound(arr, 2) Then MsgBox "Нет такого столбца в массиве!", vbCritical: Exit Function

    On Error Resume Next: Dim coll As New Collection, txt$
    For i = LBound(arr) To UBound(arr)
        txt$ = Trim(arr(i, col)): coll.Add txt$, txt$
    Next i
    ReDim newarr(1 To coll.Count, 1 To 1)
    For i = 1 To coll.Count: newarr(i, 1) = coll(i): Next i
    UniqueValuesFromArray = newarr
 
End Function
Sub ВыборкаУникальных()
    ' берем диапазон ячеек из искомого столбца активного листа
   Dim ИскомыйСтолбец As Range: Set ИскомыйСтолбец = Range("B6", Range("B" & Rows.Count).End(xlUp))

    ' выбираем из него уникальные значения
   МассивУникальных = UniqueValuesFromArray(ИскомыйСтолбец.Value, 1)

    ' и заносим их в другой столбец, начиная с ячейки Е2
 '  Range("E2").Resize(UBound(МассивУникальных)).Value = МассивУникальных
   
   ' в "лист 1"
With Sheets("Лист 1")
' нашли последнюю запись в столбце "B"
iLastRow = .Range("B" & .Rows.Count).End(xlUp).Row
a = .Range(.Cells(6, 1), .Cells(iLastRow, 4)) ' загрузили массив
End With
'


' Создали Листы с нужными разделами.
   On Error Resume Next
   ii = UBound(МассивУникальных)
jj = 1
For i = 1 To ii
    Sheets(МассивУникальных(i, 1)).Select  '  нужно изменить метод поиска листа
    If Err Then                            '  прыгать на каждый лист не прикольно
        Err.Clear
        Sheets.Add.Name = МассивУникальных(i, 1)
    End If
    
    ' докинули шапку
    Sheets("Лист 1").Range("A1:D5").Copy Range("A1")
    
    ' заносим информацию на листы
    For j = 1 To UBound(a, 1)
    'Если элемет массива "а", где 2- это подразделение = уникальному названию подразделения
     If a(j, 2) = МассивУникальных(i, 1) Then
     ' тогда переносим значения на этот лист
   Sheets(МассивУникальных(i, 1)).Cells(jj + 5, 1) = a(j, 1)
   Sheets(МассивУникальных(i, 1)).Cells(jj + 5, 2) = a(j, 2)
   Sheets(МассивУникальных(i, 1)).Cells(jj + 5, 3) = a(j, 3)
   Sheets(МассивУникальных(i, 1)).Cells(jj + 5, 4) = a(j, 4)
   jj = jj + 1
   End If
Next
jj = 1
Next

Sheets("Лист 1").Select ' если метод поиска листа сменить, это нафиг не надо
      
End Sub
Вложения
Тип файла: rar drozd1.rar (27.9 Кб, 9 просмотров)
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!

Последний раз редактировалось SaLoKiN; 20.09.2013 в 06:12.
SaLoKiN вне форума Ответить с цитированием
Старый 20.09.2013, 08:11   #4
drozd1
 
Регистрация: 19.09.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от SaLoKiN Посмотреть сообщение
Барабанная дробь!!!
Код:
Function
...
End Sub
Большое спасибо!!! Все работает! Все гуд!! А подскажите еще как указать тип ячеек в столбце "Начало дня"? (чтобы время там показывало, а не число)
drozd1 вне форума Ответить с цитированием
Старый 20.09.2013, 08:37   #5
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Добавьте строчку
Код:
Sheets(МассивУникальных(i, 1)).Cells(jj + 5, 4).NumberFormat = "[$-F400]h:mm:ss AM/PM"
Где происходит перенос значений на лист
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 20.09.2013, 08:46   #6
drozd1
 
Регистрация: 19.09.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от SaLoKiN Посмотреть сообщение
Добавьте строчку
Код:
Sheets(МассивУникальных(i, 1)).Cells(jj + 5, 4).NumberFormat = "[$-F400]h:mm:ss AM/PM"
Где происходит перенос значений на лист
Спасибо, огромное!
drozd1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование строк с разных листов в один с определенным условием Lancelot-r Microsoft Office Excel 4 07.11.2012 00:59
копирование строк, соответствующих условию фильтра и копирование на новый лист xorek Microsoft Office Excel 0 09.07.2012 18:13
Макрос: копирование строки с условием MaxxVer Microsoft Office Excel 9 05.12.2011 21:54
Копирование с условием kzld Microsoft Office Excel 11 13.12.2010 10:17
Копирование с условием (Макрос Excel) Gvaridos Microsoft Office Excel 0 09.12.2010 11:44