powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / копия определённых столбцов
30 сообщений из 30, показаны все 2 страниц
копия определённых столбцов
    #34791484
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Sub stolbec()
Const List1 = "K1"
Const List2 = "H bb"
Dim ww As Integer
Dim wwCTOL As Integer


Application.ScreenUpdating = False
Sheets(List1).Activate

Range("a1").Select

wwCTOL =  0 
ww =  0 

        Do Until ww = ActiveSheet.UsedRange.Columns.Count
            If ActiveCell.Value = "Месяц" Or ActiveCell.Value = "Работник1" _
            Or ActiveCell.Value = "Работник1" Or ActiveCell.Value = "xp" Then

                Selection.EntireColumn.Copy
                Sheets(List2).Activate

                 ActiveSheet.PasteSpecial xlValues  '******** здесь выдаёт ошибку

                ActiveCell.Offset( 0 ,  1 ).Select
                Sheets(List1).Select
                 ActiveCell.Offset( 0 ,  1 ).Select
                 wwCTOL = wwCTOL +  1 
                 Else
                 ActiveCell.Offset( 0 ,  1 ).Select
            End If
        ww = ww +  1 
        Loop
Application.CutCopyMode = False
Application.ScreenUpdating = True
MsgBox "bylo skopirowano " & wwCTOL & "  stolbcow"

End Sub

копирую столбцы только с определенными названиями ("Месяц", "Работник1", "Авто", "xp")
с одного листа в другой - всё это в одном и том же файле.
Макрос не работает.
Подскажите, пожалуйста, где и на что исправить, чтобы заработало?

Файл приложил.
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34791769
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На этом форуме уже ни раз говорилось, что не стоит использовать Select без особой нужды,
и ещё алгаритм с методом find гораздо быстрее работает (проверено врнменем).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Sub stolbec()
    Const List1 = "K1"
    Const List2 = "H bb"
    Dim i As Integer
    Dim mList( 3 ) As String
    Dim xlSh1 As Worksheet, xlSh2 As Worksheet, rng As Range
    mList( 0 ) = "Месяц"
    mList( 1 ) = "Работник1"
    mList( 2 ) = "Авто"
    mList( 3 ) = "xp"
    
    Set xlSh1 = Worksheets(List1)
    Set xlSh2 = Worksheets(List2)
    
    For i =  0  To UBound(mList)
        Set rng = xlSh1.Range("1:1").Find(mList(i), xlSh1.Range("A1"), LookIn:=xlFormulas, LookAt:= _
            xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True)
        If Not rng Is Nothing Then
            rng.EntireColumn.Copy
            xlSh2.Cells( 1 , xlSh2.Cells( 1 , Columns.Count).End(xlToLeft).Column +  1 ).PasteSpecial xlValues
        Else
            MsgBox "Не найден параметр " & mList(i)
        End If
    Next
    Application.CutCopyMode = False
    MsgBox "bylo skopirowano " & wwCTOL & "  stolbcow"

End Sub
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792012
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodorНа этом форуме уже ни раз говорилось, что не стоит использовать Select без особой нужды,
и ещё алгаритм с методом find гораздо быстрее работает (проверено врнменем).


Большое спасибо!

Копируются все столбцы по заданным параметрам.
Только вот после вставки в листе =H bb= 1-й столбец пустой.

Это исправляю вот этим:

Код: plaintext
1.
Range("a:a").Select
Selection.Delete

А всё-таки, почему появляется пустой столбец?


А здесь что происходит?
Код: plaintext
1.
2.
3.
Set rng = xlSh1.Range("1:1").Find(mList(i), xlSh1.Range("A1"), LookIn:=xlFormulas, LookAt:= _
          xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True)
      ....
         xlSh2.Cells( 1 , xlSh2.Cells( 1 , Columns.Count).End(xlToLeft).Column +  1 ).PasteSpecial xlValues
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792140
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nPUBETЭто исправляю вот этим:

Код: plaintext
1.
Range("a:a").Select
Selection.Delete

как-то не красиво, ну тебе выбирать, только начни хотябы не использовать "select"
Код: plaintext
Range("a:a").Delete
это тоже самое что и ты написал

а лучше
Код: plaintext
xlSh2.Range("a:a").Delete
т.к.
Код: plaintext
Range("a:a").Delete
ссылается на активный лист, а тебе надо на "H bb"
Код: plaintext
Set xlSh2 = Worksheets(List2)
этой строкой мы присвоили обьектной переменной "xlSh2" лист под названием "H bb"

nPUBET
А всё-таки, почему появляется пустой столбец?

дело в том что строка
Код: plaintext
xlSh2.Cells( 1 , Columns.Count).End(xlToLeft).Column

вернет "1" и при заполненом столбце и при пустом (увы прими как должное)
лучше наверно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        If Not rng Is Nothing Then
            If xlSh2.Cells( 1 , 1 ) = "" Then
                mCol =  1 
            Else
                mCol = xlSh2.Cells( 1 , Columns.Count).End(xlToLeft).Column +  1 
            End If
            rng.EntireColumn.Copy
            xlSh2.Cells( 1 , mCol ).PasteSpecial xlValues
        Else
            MsgBox "Не найден параметр " & mList(i)
        End If
nPUBETА здесь что происходит?

Код: plaintext
1.
2.
3.
Set rng = xlSh1.Range("1:1").Find(mList(i), xlSh1.Range("A1"), LookIn:=xlFormulas, LookAt:= _
          xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True)
      ....
         xlSh2.Cells( 1 , xlSh2.Cells( 1 , Columns.Count).End(xlToLeft).Column +  1 ).PasteSpecial xlValues

Спомощью метода Find c параметрами искать "ячейку целиком" (LookAt:=xlWhole) и "Учитывать регистр" (MatchCase:=True) мы ищем значение mList(i) (которое переберается по очереди) и присваиваем обьектной переменной "rng" найденую ячейку, а дальше проверяем её на Nothing
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792148
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если количество параметров mList(i) увеличиваю до 4 (т.е. i=0,1,2,3,4):

Код: plaintext
1.
2.
3.
4.
    mList( 0 ) = "Месяц"
    mList( 1 ) = "Работник1"
    mList( 2 ) = "Работник2"
    mList( 3 ) = "Авто"
    mList( 4 ) = "xp"

выходит ошибка 9 и код перестаёт копировать.

Как эту ошибку устранить?
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792161
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nPUBETесли количество параметров mList(i) увеличиваю до 4 (т.е. i=0,1,2,3,4):

Код: plaintext
1.
2.
3.
4.
    mList( 0 ) = "Месяц"
    mList( 1 ) = "Работник1"
    mList( 2 ) = "Работник2"
    mList( 3 ) = "Авто"
    mList( 4 ) = "xp"

выходит ошибка 9 и код перестаёт копировать.

Как эту ошибку устранить?
В начале мы обьявили массив, измени размерность массива
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792175
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodor nPUBETесли количество параметров mList(i) увеличиваю до 4 (т.е. i=0,1,2,3,4):

выходит ошибка 9 и код перестаёт копировать.

Как эту ошибку устранить?
В начале мы обьявили массив, измени размерность массива

OK.
Большое спасибо!

...понял

Код: plaintext
Dim mList( 20 ) As String
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792197
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodor .....
....
nPUBET
А всё-таки, почему появляется пустой столбец?

дело в том что строка
Код: plaintext
xlSh2.Cells( 1 , Columns.Count).End(xlToLeft).Column

вернет "1" и при заполненом столбце и при пустом (увы прими как должное)


тоже хорошо :)
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792210
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, читать так
vkodor
дело в том что строка
Код: plaintext
xlSh2.Cells( 1 , Columns.Count).End(xlToLeft).Column

вернет "1" и при заполненом первом столбце и при пустом (увы прими как должное)
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792239
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
xlSh2.Range("B:L").Select
    Selection.Clear


Код: plaintext
xlSh2.Range("B:L").Clear

А почему в этих 2-х случаях выходит ошибка ' 91 ' ?
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792284
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nPUBET
Код: plaintext
1.
xlSh2.Range("B:L").Select
    Selection.Clear


Код: plaintext
xlSh2.Range("B:L").Clear

А почему в этих 2-х случаях выходит ошибка ' 91 ' ?
если переменная "xlSh2" определена, то нет никакой ошибки
наверно ставишь до строки
Код: plaintext
Set xlSh2 = Worksheets(List2)
Описание кодов ошибок
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792404
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodor ...если переменная "xlSh2" определена, то нет никакой ошибки
наверно ставишь до строки
Код: plaintext
Set xlSh2 = Worksheets(List2)
...

Ты абсолютно прав...

(те 2 варианта строк были
действительно выше, т.е. до назначения переменной xlSh2)
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792572
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Sub del2()

Dim r As Range
Dim n As Integer
Dim gh As Long
Sheets("H bb").Activate
Application.ScreenUpdating = False
gh = ActiveSheet.UsedRange.Rows.Count '*****
                                
Set r = Range("a2:k2")

For n =  1  To gh          '****
    If r.Cells(n,  6 ).Value = r.Cells(n,  7 ).Value = r.Cells(n,  8 ).Value = r.Cells(n,  9 ).Value Then
    Cells(n,  6 ).Offset( 1 ,  0 ).Interior.ColorIndex =  37 
'
'
'    If Cells(n, 6).Offset(1, 0).Interior.ColorIndex = 37 Then
     Cells(n,  6 ).Offset( 1 ,  0 ).EntireRow.Delete
        
'    Exit For

    'End If
    'Else
    
    End If
'    n = n + 1
Next n

End Sub

код удаляет строки, если значеня в ячейках столбцов с 6-го по 9-й равны
(эти ячейки у меня равны 0, но условие равны нулю не смог сформулировать).
Так вот для удаления этих пустых строк я должен постоянно
кликать на кнопку запуска макроса, иначе не идёт.

Подскажите, пожалуйста, как сформулировать шаг цикла:
удаляю строки, если значеня в
ячейках столбцов с 6-го по 9 - й равны (=если есть идеи, то= нулю)?
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34792664
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nPUBET
Код: plaintext
Sub del2()..

код удаляет строки, если значеня в ячейках столбцов с 6-го по 9-й равны
(эти ячейки у меня равны 0, но условие равны нулю не смог сформулировать).
Так вот для удаления этих пустых строк я должен постоянно
кликать на кнопку запуска макроса, иначе не идёт.

Подскажите, пожалуйста, как сформулировать шаг цикла:
удаляю строки, если значеня в
ячейках столбцов с 6-го по 9 - й равны (=если есть идеи, то= нулю)?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
For n =  1  To gh         
    If r.Cells(n,  6 ).Value = r.Cells(n,  7 ).Value = r.Cells(n,  8 ).Value = r.Cells(n,  9 ).Value Then
    'Cells(n, 6).Offset(1, 0).Interior.ColorIndex = 37
    Cells(n,  6 ).Offset( 1 ,  0 ).EntireRow.Delete
    
    Else            '********!
    ActiveCell.Offset( 1 ,  0 ).Select  '********!
  
End If
Next n

даже так не помогает...
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34793241
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй такой алгоритм.
При выполнении условия не удалять строку а накапливать их в некую переменную,
а после выполнения цикла разом удалить все строки.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Sub del2()

    Dim rng As Range
    Dim n As Integer
    Dim xlSh As Worksheet
    
    Set xlSh = Sheets("H bb")

    For n =  2  To xlSh.UsedRange.Rows.Count
        If xlSh.Cells(n,  6 ).Text = "0" And _
            xlSh.Cells(n,  7 ).Text = "0" And _
            xlSh.Cells(n,  8 ).Text = "0" And _
            xlSh.Cells(n,  9 ).Text = "0" Then
            If rng Is Nothing Then
                Set rng = xlSh.Cells(n,  6 )
            Else
                Set rng = Union(rng, xlSh.Cells(n,  6 ))
            End If
        End If
    Next
    If Not rng Is Nothing Then rng.EntireRow.Delete
End Sub
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34793465
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!

С нулями код у меня не работает. Не знаю, почему. Может дело в формате ...
Т.е запускаю макрос - никаких движений
(пустые строки не удаляются, никаких изменений в таблице не происходит),
даже ошибки не выдаёт.


А вот так, прохoдит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  ....
  Set xlSh = Sheets("H bb")

    For n =  2  To xlSh.UsedRange.Rows.Count
     If xlSh.Cells(n,  6 ).Value = xlSh.Cells(n,  7 ).Value = xlSh.Cells(n,  8 ).Value = _
            xlSh.Cells(n,  9 ).Value Then
    
'        If xlSh.Cells(n, 6).Text = "0" And _
'            xlSh.Cells(n, 7).Text = "0" And _
'            xlSh.Cells(n, 8).Text = "0" And _
'            xlSh.Cells(n, 9).Text = "0" Then
'
            '**************
            If rng Is Nothing Then
            Set rng = xlSh.Cells(n,  6 )
....

И скорость приличная. Еще раз спасибо!
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34793544
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если ячейки пустые, то условие пишут так
Код: plaintext
Cells( 1 , 1 ) = ""
если в результате вычисления формул или каких-либо др. действий в ячейке 0
то так
Код: plaintext
Cells( 1 ,  1 ) =  0 
но нужно понимать что при таком условии удалятся и пустые строки тоже
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34793648
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  ...   If xlSh.Cells(dr,  6 ).Value = xlSh.Cells(dr,  7 ).Value = xlSh.Cells(dr,  8 ).Value = _
            xlSh.Cells(dr,  9 ).Value Or xlSh.Cells(dr,  3 ).Text = "C101*" Then
    
          '   If xlSh.Cells(dr, 3).Value = "C101*" Then '**
            If pnk Is Nothing Then
                Set pnk = xlSh.Cells(dr,  6 )
            Else
                Set pnk = Union(pnk, xlSh.Cells(dr,  6 ))
            End If
        End If
        'End If ...'**

удаляю строки, если ячейки в 3-ем столбце
содержат значение "C101*" (т.е. C101 плюс какой-то текст или какие-то цифры).
Не удаляется (ни ошибки, ни движний)...
Пробовал 2 варианта:
- вместе через =OR= (как наверxу)
- отдельно через = if ..then... end if= (строки помечены *)

Где я не так сформулировал?
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34793785
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно использовать оператор Like
Код: plaintext
 xlSh.Cells(dr,  3 ).Text Like "C101*" 
но не забывайте этот оператор значительно замедляет работу (т.е. при многочисленном использовании лучше продумать другой вариант) например
Код: plaintext
Mid(xlSh.Cells(dr,  3 ).Text,  1 ,  3 ) = "C101"
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34793819
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodorнужно использовать оператор Like
Код: plaintext
 xlSh.Cells(dr,  3 ).Text Like "C101*" 
но не забывайте этот оператор значительно замедляет работу (т.е. при многочисленном использовании лучше продумать другой вариант) например
Код: plaintext
Mid(xlSh.Cells(dr,  3 ).Text,  1 ,  3 ) = "C101"


Спасибо!

Вот так работает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
....
    If Not pnk Is Nothing Then pnk.EntireRow.Delete
    
            'Sub del_C()
        
        Dim ctr As Range
        Dim cti As Integer
        Set ctr = Range("a1:k1")
        Set xlSh = Sheets("H bb")
        For cti =  1  To xlSh.UsedRange.Rows.Count
            If ctr.Cells(cti,  3 ).Text Like "*C101*" Then
            ctr.Cells(cti,  3 ).EntireRow.Delete
            End If
        Next cti
        Application.ScreenUpdating = True
            'End Sub
....
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34793967
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    ....Dim xlSh As Worksheet
      Application.ScreenUpdating = False
....
            Else
                Set pnk = Union(pnk, xlSh.Cells(dr,  6 ))
            End If
        End If
        'End If '**
       ' if pnk.Cells(dr,3).Value="C101"
    Next
    If Not pnk Is Nothing Then pnk.EntireRow.Delete
    
            'Sub del_C()
        
        Dim ctr As Range
        Dim cti As Integer
        Set ctr = Range("a1:k1")
        Set xlSh = Sheets("H bb")
        For cti =  1  To xlSh.UsedRange.Rows.Count
            If ctr.Cells(cti,  3 ).Text Like "*C101*" Then
            ctr.Cells(cti,  3 ).EntireRow.Delete
            End If
        Next cti
        Application.ScreenUpdating = True
        
        'End Sub
End Sub

Всё обьединил.
Обрабатываю около 800 строк.
Операция занимает примерно 3 минуты (Excel 2003).

Это нормально?
Можно, как-нибудь ускорить процесс?


P.S.
Еще заметил, что =Sub del_C= не удаляет с одного раза все =*C101*=. Приходится опять несколько раз кликать на =ComButton=...
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34794345
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nPUBET
Это нормально?
Можно, как-нибудь ускорить процесс?

Нормально ли это? Вам решать. У каждого свои запросы.
Ускорить можно.
1. Если делаешь два пробега то, не надо использовать
Код: plaintext
For n =  2  To xlSh.UsedRange.Rows.Count
а использовать.
Код: plaintext
    For n =  2  To xlSh.Cells(Rows.Count,  6 ).End(xlUp).Row
2. не использовать Like (см. пост выше)
3. лучше делать все в одном пробеге
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Sub del2()

    Dim rng As Range
    Dim n As Integer
    Dim xlSh As Worksheet
    Dim fl As Boolean
    
    Set xlSh = Sheets("H bb")

    For n =  2  To xlSh.Cells(Rows.Count,  6 ).End(xlUp).Row
        fl = False
        If xlSh.Cells(n,  6 ) =  0  And xlSh.Cells(n,  7 ) =  0  And _
            xlSh.Cells(n,  8 ) =  0  And xlSh.Cells(n,  9 ) =  0  Then
            fl = True
        ElseIf xlSh.Cells(n,  3 ).Text Like "*C101*" Then
            fl = True
        End If
        If fl Then
            If rng Is Nothing Then
                Set rng = xlSh.Cells(n,  6 )
            Else
                Set rng = Union(rng, xlSh.Cells(n,  6 ))
            End If
        End If
    Next
    If Not rng Is Nothing Then rng.EntireRow.Delete
End Sub
4. можно делать все через Find (отдельный вопрос)


nPUBET
P.S.
Еще заметил, что =Sub del_C= не удаляет с одного раза все =*C101*=. Приходится опять несколько раз кликать на =ComButton=...
Естественно.
Сами подумайте вот код:
Код: plaintext
1.
2.
3.
4.
        For cti =  1  To xlSh.UsedRange.Rows.Count ' допустим cti = 3
            If ctr.Cells(cti,  3 ).Text Like "*C101*" Then 
            ctr.Cells(cti,  3 ).EntireRow.Delete ' при удалении то что было на 4-ой строке стало на третьей т.к. 3-я удалилась далее счетчик прибавит на 1 cti станет 4, следовательно та строка которая переместилась на 3-ю вообще не просматриваится.
            End If
        Next cti  ' прибавление счетчика 

Повторюсь, используйте алгоритм накопления.
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34794375
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nPUBET....

Всё обьединил.
Обрабатываю около 800 строк.
Операция занимает примерно 3 минуты (Excel 2003).
Это нормально?
Можно, как-нибудь ускорить процесс?
P.S.
Еще заметил, что =Sub del_C= не удаляет с одного раза все =*C101*=.
Приходится опять несколько раз кликать на =ComButton=...

знаете, что я придумал...
Я заменил
Код: plaintext
Delete
на
Код: plaintext
ClearContents
и в самом конце
включил сортировку по 3-ему столбцу.
Вот мои замеры скорости (применяю Like, около 800 строк):
1. Вариант с =Delete=: 00:05:39 - 00:09:31.
2. Вариант с =ClearContents= плюс сортировка: 00:03:44 - 00:05:11.
Значительная экономия времени :)


Подскажите, пожалуйста, как заполнить все ячейки (кроме А1)
до =ActiveSheet.UsedRange.Rows.Count=
в 1-ом столбце значением "Сентябрь" ?
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34794393
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodor.....

Повторюсь, используйте алгоритм накопления.

Спасибо!
изучаю...
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34794423
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nPUBET

Подскажите, пожалуйста, как заполнить все ячейки (кроме А1)
до =ActiveSheet.UsedRange.Rows.Count=
в 1-ом столбце значением "Сентябрь" ?


Код: plaintext
Range(Cells( 2 , 1 ), Cells(ActiveSheet.UsedRange.Rows.Count, 1 )) = "Сентябрь"
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34794947
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodor nPUBET
Подскажите, пожалуйста, как заполнить все ячейки (кроме А1)
до =ActiveSheet.UsedRange.Rows.Count=
в 1-ом столбце значением "Сентябрь" ?
Код: plaintext
Range(Cells( 2 , 1 ), Cells(ActiveSheet.UsedRange.Rows.Count, 1 )) = "Сентябрь"
Спасибо!


vkodor ... 4. можно делать все через Find (отдельный вопрос)... Оператор Find для меня пока трудноват.

Новые замеры скорости:
1. Вариант: -> 00:07:57 - 00:10:47
vkodor, 12.09, 13:56...
3. лучше делать все в одном пробеге
2-ой вариант:
00:09:04 - 00:09:29 - первая космическая :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
.....

    For n =  2  To xlSh.UsedRange.Rows.Count              '***Cells(Rows.Count, 6).End(xlUp).Row
        fl = False
        If xlSh.Cells(n,  6 ) =  0  And xlSh.Cells(n,  7 ) =  0  And _
            xlSh.Cells(n,  8 ) =  0  And xlSh.Cells(n,  9 ) =  0  Then
            fl = True
        ElseIf xlSh.Cells(n,  3 ).Text Like "*C101*" Then
            fl = True
        End If
     
        If fl Then
            If rng Is Nothing Then
                Set rng = xlSh.Cells(n,  6 )
            Else
                Set rng = Union(rng, xlSh.Cells(n,  6 ))
            End If
        End If
    Next
    If Not rng Is Nothing Then rng.EntireRow.ClearContents  '*****
       '**********
         If xlSh.Cells(n,  6 ).Value = "" And xlSh.Cells(n,  7 ).Value = "" And _
            xlSh.Cells(n,  8 ).Value = "" And xlSh.Cells(n,  9 ).Value = "" Then
            xlSh.Cells(n,  6 ).EntireRow.ClearContents '******
        End If
            '*********
'        Sub CopT_()
    Columns("C:C").Select
    Range("A1:j7000").Sort Key1:=Range("C1"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:= 1 , MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    Range("A1").Select
            'End Sub
                '**********
    Range(Cells( 2 ,  1 ), Cells(ActiveSheet.UsedRange.Rows.Count,  1 )) = "Сентябрь"
   ' Sub Kriter_()
    Range("A1").Select
    Selection.AutoFilter Field:= 6 , Criteria1:=">0", Operator:=xlAnd
    Selection.AutoFilter Field:= 7 , Criteria1:=">0", Operator:=xlAnd
    Selection.AutoFilter Field:= 8 , Criteria1:=">0", Operator:=xlAnd
    Selection.AutoFilter Field:= 9 , Criteria1:=">0", Operator:=xlAnd
    'End Sub
    
    '********

End Sub
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34795222
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему же ты так упорно хочешь использовать "Select"?
И ещё всегда пиши имя листа, иначе инструкция будет ссылаться на активный лист.
Код: plaintext
Range("A1").Select
это тоже самое что и
Код: plaintext
ActiveWorkbook.ActiveSheet.Range("A1").Select

А вдруг активный лист будет другой. Результат будет некорректный.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
     xlSh.Range("A1:j" & xlSh.UsedRange.Rows.Count).Sort Key1:=xlSh.Range("C1"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:= 1 , MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    i = xlSh.Cells(Rows.Count,  6 ).End(xlUp).Row
    xlSh.Range(Cells( 2 ,  1 ), Cells(i,  1 )) = "Сентябрь"

    With xlSh.Range("A1")
        .AutoFilter Field:= 6 , Criteria1:=">0", Operator:=xlAnd
        .AutoFilter Field:= 7 , Criteria1:=">0", Operator:=xlAnd
        .AutoFilter Field:= 8 , Criteria1:=">0", Operator:=xlAnd
        .AutoFilter Field:= 9 , Criteria1:=">0", Operator:=xlAnd
    End With

P.S. не понял где быстрей а где медленей
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34795621
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodorПочему же ты так упорно хочешь использовать "Select"?1) при простых операциях записываю свои действия на "плёнку",
потом результат вставляю, куда нужно (а в такой записи всегда появляется =Select=)
2) с помошью =Select= вижу, где курсор,
3) кроме =Select= пока не знаю, что применять...

vkodor
И ещё всегда пиши имя листа, иначе инструкция будет ссылаться на активный лист.
... стараюсь после =Sub name()= сразу активировать нужный лист, например, так:
Код: plaintext
1.
2.
Sub del12()
Sheets("H bb").Activate
...

vkodor
Код: plaintext
Range("A1").Select
это тоже самое что и
Код: plaintext
ActiveWorkbook.ActiveSheet.Range("A1").Select
А вдруг активный лист будет другой. Результат будет некорректный. Я этого не знал. Буду знать. Учусь :)

vkodor
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
     .....        DataOption1:=xlSortNormal  '*********
    Dim i as Integer '  ****
    i = xlSh.Cells(Rows.Count,  6 ).End(xlUp).Row
    xlSh.Range(Cells( 2 ,  1 ), Cells(i,  1 )) = "Сентябрь"
    With xlSh.Range("A1") '******
        ....
    
'**************
Все три блока применил. Спасибо!

vkodor
P.S. не понял где быстрей а где медленей
Ответ выделил жирным шрифтом.
nPUBETНовые замеры скорости:
1. Вариант: -> 00:07:57 - 00:10:47 = 2 минуты 50 секунд. Здесь медленно.
vkodor, 12.09, 13:56 ..3. лучше делать все в одном пробеге
2-ой вариант:
00:09:04 - 00:09:29 - первая космическая :) = только 25 секунд! Здесь быстрее!

Т.е. Твой вариант после "в одном пробеге..." я чуть-чуть изменил, и оказалось быстрее (Твой пост, 12.09, 13:56, 3-й пункт).
vkodor..3. лучше делать все в одном пробеге..
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34800481
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
Sub M_Hbb()
   Sheets("H bb").Activate
     
         '**********
    'Sub VKL()
 
     Rows("1:1").Select
     On Error Resume Next
    Selection.AutoFilter

    '************
        
    Const List1 = "K1"
    Const List2 = "H bb"
    Dim i As Integer
    Dim mList( 18 ) As String
    Dim xlSh1 As Worksheet, xlSh2 As Worksheet, rng As Range
    '   

    mList( 0 ) = "Участок*"
    mList( 1 ) = "Работник*"
    mList( 2 ) = "TC*"
    
    Range("a:L").Clear
    Range("A1").Select
    Application.ScreenUpdating = False

    Set xlSh1 = Worksheets(List1)
    Set xlSh2 = Worksheets(List2)
       '********
    For i =  0  To UBound(mList)
        Set rng = xlSh1.Range("1:1").Find(mList(i), xlSh1.Range("A1"), LookIn:=xlFormulas, LookAt:= _
            xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=True)
        If Not rng Is Nothing Then
            rng.EntireColumn.Copy
            xlSh2.Cells( 1 , xlSh2.Cells( 1 , Columns.Count).End(xlToLeft).Column +  1 ).PasteSpecial xlValues
        Else
       MsgBox "не найден параметер:" & mList(i)
            
        End If
        
    Next
    
    Application.CutCopyMode = False
  
    '********
'    Cells.Columns.AutoFit
    Columns("F:I").NumberFormat = "m/d/yyyy"
    'Range("A1").Select
 '**********


'Sub del22()
'**********
    Dim rngB As Range
    Dim n As Integer
    'Dim xlSh2 As Worksheet
    Dim fl As Boolean
    
    'Set xlSh2 = Sheets(List2)
'************

    For n =  2  To xlSh2.UsedRange.Rows.Count              'Cells(Rows.Count, 6).End(xlUp).Row
        fl = False
        If xlSh2.Cells(n,  6 ) =  0  And xlSh2.Cells(n,  7 ) =  0  And _
            xlSh2.Cells(n,  8 ) =  0  And xlSh2.Cells(n,  9 ) =  0  Then
            fl = True
        ElseIf xlSh2.Cells(n,  3 ).Text Like "*B*" Then
            fl = True
        End If
     
        If fl Then
            If rngB Is Nothing Then
                Set rngB = xlSh2.Cells(n,  6 )
            Else
                Set rngB = Union(rngB, xlSh2.Cells(n,  6 ))
            End If
        End If
    Next
    If Not rngB Is Nothing Then rngB.EntireRow.ClearContents  '*****
       '**********
         If xlSh2.Cells(n,  6 ).Value = "" And xlSh2.Cells(n,  7 ).Value = "" And _
            xlSh2.Cells(n,  8 ).Value = "" And xlSh2.Cells(n,  9 ).Value = "" Then
            xlSh2.Cells(n,  6 ).EntireRow.ClearContents '******
        End If
        
        '***********
          '*********
'        Sub CopT_()

        xlSh2.Range("A1:j" & xlSh2.UsedRange.Rows.Count).Sort Key1:=xlSh2.Range("C1"), Order1:=xlAscending, Header:= _
        xlGuess, OrderCustom:= 1 , MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal

             '**********
    Dim asy As Integer
    asy = xlSh2.Cells(Rows.Count,  6 ).End(xlUp).Row  '******
    xlSh2.Range(Cells( 2 ,  1 ), Cells(asy,  1 )) = "Сентябрь"   '******
 
       Range("a1") = "Месяц"
'        '********
'          If xlSh1.Cells(0, 3).Value = xlSh1.Cells(0, 4).Value = _
'       xlSh1.Cells(0, 5).Value = xlSh1.Cells(0, 6).Value = _
'       xlSh1.Cells(0, 7).Value = xlSh1.Cells(0, 8).Value Then
'      Cells.ClearContents
'      Else
'      End If
'        '*********
        '*********
          Rows("1:1").Select
    Selection.Font.Bold = True
    Range("A1").Select
'    Columns("A:A").ColumnWidth = 10
    
    '******
    '*********
'    Sub Kriter_()
  With xlSh2.Range("A1")
        .AutoFilter Field:= 6 , Criteria1:=">0", Operator:=xlAnd
        .AutoFilter Field:= 7 , Criteria1:=">0", Operator:=xlAnd
        .AutoFilter Field:= 8 , Criteria1:=">0", Operator:=xlAnd
        .AutoFilter Field:= 9 , Criteria1:=">0", Operator:=xlAnd
    End With
    'End Sub
    
    '********
'End Sub
'End If
Application.ScreenUpdating = True
     '  *******
          If xlSh1.Cells( 0 ,  3 ) =  0  And xlSh1.Cells(,  4 ) =  0  And _  ' проблемный участок
          xlSh1.Cells( 0 ,  5 ).Value = xlSh1.Cells( 0 ,  6 ).Value = _
          xlSh1.Cells( 0 ,  7 ).Value = xlSh1.Cells( 0 ,  8 ).Value Then
           Cells.Clear                 ' проблемный участок
' Exit Sub
          End If
'***************

End Sub


............
.AutoFilter Field:=9, Criteria1:=">0", Operator:=xlAnd
End With
'End Sub

'********
'End Sub
'End If
Application.ScreenUpdating = True
' *******
If xlSh1.Cells(0, 5) = 0 And xlSh1.Cells(, 4) = 0 And _
xlSh1.Cells(0, 5).Value = xlSh1.Cells(0, 6).Value = _
xlSh1.Cells(0, 7).Value = xlSh1.Cells(0, 8).Value Then
Cells.Clear
' Exit Sub
End If

'***************
End Sub
Выделенное жирным шрифтом - проблемный участок.

В конце этого макроса вставил небольшое условие =If .... then..= (проблемный участок):
-если определеённые ячейки в листе для запроса =К1= равны нулю,
тогда чищу все ячейки в листе =H bb=.Это условие работает, но странно:
если в =К1= есть данные (заголовок не выводится, данные не сортируются,
между строками видны группы пустых cтрок - короче бред),
-если в =К1= нет данных - тогда и в =H bb= пусто (т.е. как надо). =Exit Sub= пробовал, тоже не получается.


Подскажите, пожалуйста, как правильно сформулировать условие:
-если в листе =К1= группа ячеек равна нулю (для надёжности),
тогда в =H bb= ничего не копировать, т.е выполнение =Sub M_Hbb()= сразу завершаю (а то юзер поставит в А1 или в К4 или в B3, например, "текст" или цифры - так от нечего делать);
-если в =К1= та группа ячеек заполнена, тогда запускаю весь макрос =Sub M_Hbb()=.
...
Рейтинг: 0 / 0
копия определённых столбцов
    #34801087
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nPUBET, Корректировка - жирным шрифтом....
.....
-если в =К1= нет данных - тогда в =H bb= выводит следующее: А1="Месяц", "А2"="Сентябрь" , а в остальныx ячейках пусто (а должно быть везде пусто). =Exit Sub= пробовал, тоже не получается.


Подскажите, пожалуйста, как правильно сформулировать условие:
-если в листе =К1= группа ячеек равна нулю (для надёжности),
тогда в =H bb= ничего не копировать, т.е выполнение =Sub M_Hbb()= сразу завершаю (а то юзер поставит в А1 или в К4 или в B3, например, "текст" или цифры - так от нечего делать);
-если в =К1= та группа ячеек заполнена, тогда запускаю весь макрос =Sub M_Hbb()=.

Файл приложил...
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / копия определённых столбцов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]