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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2012, 00:31   #11
RAN.
Форумчанин
 
Аватар для RAN.
 
Регистрация: 05.07.2011
Сообщений: 208
По умолчанию

Игорь, а ты себя не перехитрил?
может так
Код:
.Columns(6).SpecialCells(12).Copy Sheets("Викладачі").[M3]  
.Columns(27).SpecialCells(12).Copy Sheets("Викладачі").[L3]
RAN. вне форума Ответить с цитированием
Старый 06.04.2012, 00:46   #12
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Да, точно, так проще
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.04.2012, 12:11   #13
Automat
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 18
По умолчанию

спасибо, работает ....

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Можно ещё перебором строк или массива выбрать, но банально
Неудобно просить, но можете еще написать тот же перебор циклом For с условиями If ?.... у меня с vba всё плохо..

И еще, после фильтра, перед копированием, как добавить условие Если в столбце АА повторяется фамилия, то просумировать ячейки столбца F напротив фамилии ?

PS. модераторы пофиксите плз название темы, вместо Н - Р

Последний раз редактировалось Automat; 07.04.2012 в 12:52.
Automat вне форума Ответить с цитированием
Старый 07.04.2012, 13:03   #14
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Через "For с условиями If" быстро так. Но выбираются только данные, без форматов. Зато быстро.
Если идти циклом по листу - то можно копировать с форматом, но это в 40 раз дольше.
Код:
Sub Выборка_вариант2()
    Dim a(), i&, ii&

    a = Sheets("Звіт").[A1].CurrentRegion.Value
    ReDim b(1 To UBound(a), 1 To 2)
    
    For i = 1 To UBound(a)
        If a(i, 2) = "Дипл.Пр. Керівництво" Then
            If a(i, 17) >= 20 Then
                If a(i, 24) = "СІ_51" Then
                    ii = ii + 1
                    b(ii, 1) = a(i, 27)
                    b(ii, 2) = a(i, 6)
                End If
            End If
        End If
    Next

    Sheets("Викладачі").[M3].Resize(ii, 2) = b

End Sub
Для ускорения цепочку из If-Then нужно строить от менее часто встречающегося к более часто встречающемуся.
Чтоб негодные чаще откидывало сразу, без дальнейших проверок.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 07.04.2012 в 13:30. Причина: Поменял местами 27 и 6
Hugo121 вне форума Ответить с цитированием
Старый 10.04.2012, 16:48   #15
Automat
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 18
По умолчанию

Hugo121, спасибо, очень помогли

Подскажите, если после фильтра или цикла, перед копированием, как добавить условие Если в столбце АА повторяется фамилия, то просумировать значения ячеек столбца F напротив фамилии (чтоб фамилии в новой табличке не повторялись)?
Automat вне форума Ответить с цитированием
Старый 10.04.2012, 17:18   #16
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Тогда перед
ii = ii + 1
проверяем фамилию по словарю.
Если в словаре нет, то тогда
ii = ii + 1
заносим фамилию и ii в словарь, данные в массив.
Если в словаре уже есть, то извлекаем из словаря ii, в массиве b ищем нужное поле и суммируем.

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

Код:
Option Explicit

Sub Выборка_вариант2()
    Dim a(), i&, ii&, t&

    a = Sheets("Звіт").[A1].CurrentRegion.Value
    ReDim b(1 To UBound(a), 1 To 2)

    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(a)
            If a(i, 2) = "Дипл.Пр. Керівництво" Then
                If a(i, 17) >= 20 Then
                    If a(i, 24) = "СІ_51" Then
                        If Not .Exists(a(i, 1)) Then
                            ii = ii + 1
                            .Item(a(i, 1)) = ii
                            b(ii, 1) = a(i, 27)
                            b(ii, 2) = a(i, 6)
                        Else
                            t = .Item(a(i, 1))
                            b(t, 2) = b(t, 2) + a(i, 6)
                        End If
                    End If
                End If
            End If
        Next
    End With

    Sheets("Викладачі").[M3].Resize(ii, 2) = b

End Sub
P.S. Файл дома не нашёл - уже удалён... (
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 10.04.2012 в 20:01.
Hugo121 вне форума Ответить с цитированием
Старый 11.04.2012, 21:24   #17
Automat
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
P.S. Файл дома не нашёл - уже удалён... (
макрос протестил чтото нетак

Последний раз редактировалось Automat; 11.04.2012 в 22:14.
Automat вне форума Ответить с цитированием
Старый 11.04.2012, 21:34   #18
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Ну так и есть - вслепую делать...
Всюду вместо a(i, 1) нужно a(i, 27) (т.е. в словарь заносим фамилию, а она в 27-м столбце):
Код:
Sub Выборка_вариант3()
    Dim a(), i&, ii&, t&

    a = Sheets("Звіт").[A1].CurrentRegion.Value
    ReDim b(1 To UBound(a), 1 To 2)

    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(a)
            If a(i, 2) = "Дипл.Пр. Керівництво" Then
                If a(i, 17) > 20 Then
                    If a(i, 24) = "СІ_51" Then
                        If Not .Exists(a(i, 27)) Then
                            ii = ii + 1
                            .Item(a(i, 27)) = ii
                            b(ii, 1) = a(i, 27)
                            b(ii, 2) = a(i, 6)
                        Else
                            t = .Item(a(i, 27))
                            b(t, 2) = b(t, 2) + a(i, 6)
                        End If
                    End If
                End If
            End If
        Next
    End With

    Sheets("Викладачі").[M3].Resize(ii, 2) = b

End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 11.04.2012, 23:31   #19
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

вот здорово!

еще 10-15 соообщений и я начну понимать о чем речь...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 12.04.2012, 08:25   #20
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
еще 10-15 соообщений и я начну понимать о чем речь...
да вроде всё и так понятно: скопировать уникальные значения из одного столбца на другую страницу и туда же сумму соответствующих значений из другого столбца... и всё это из исходной таблицы отфильтрованной по двум условиям) в общем-то, ничего нового...
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм. iamhated Помощь студентам 1 15.01.2012 16:24
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм iamhated Помощь студентам 1 14.01.2012 16:22
создание программы в VBA, реализующей алгоритм получения произведения ряда чисел Mescaline Помощь студентам 0 23.12.2011 23:16
составить программу и алгоритм на языке vba! Маришка бирюкова Microsoft Office Excel 6 19.12.2010 21:56
Как алгоритм перевести в код VBA valerij Microsoft Office Excel 18 29.05.2008 01:32