powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите ускорить код пожалуйста!
25 сообщений из 57, страница 2 из 3
Помогите ускорить код пожалуйста!
    #37496121
R Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понял что надо в итоге .....
мой вариант
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496132
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мой вариант, с старыми рамками, без объединения ячеек:

Код: 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.
Option Explicit

Sub otbor()
    Dim arr(), i&, ai&, bi&, ci&, b(), c(), poz&
    Dim sa As Double, sb As Double

    'отключаем обновление экрана - сэкономим миллисекунду, но не будет мигать
    Application.ScreenUpdating = False

    'данные в массив
    With Sheets( 2 )
        arr = .Range(.Range("A" & .Rows.Count).End(xlUp), .[G1]).Value
    End With

    'создаём пустые массивы, сразу с заголовком
    ReDim a( 1  To UBound(arr),  1  To  4 )
    a( 1 ,  1 ) = "ТЕКСТ": a( 1 ,  4 ) = "ЧИСЛО"
    b = a
    ReDim c( 1  To UBound(arr),  1  To  2 )
    c( 1 ,  1 ) = "ТЕКСТ": c( 1 ,  2 ) = "НОМЕР"

    'заголовок уже посчитаем
    ai =  1 
    bi =  1 
    ci =  1 

    'перебор массива
    For i =  1  To UBound(a)
        'отбор данных
        Select Case arr(i,  1 )
        Case  2 
            ai = ai +  1 
            a(ai,  1 ) = arr(i,  4 )
            a(ai,  4 ) = arr(i,  7 )
            sa = sa + CDbl(arr(i,  7 ))
        Case  3 
            bi = bi +  1 
            b(bi,  1 ) = arr(i,  4 )
            b(bi,  4 ) = arr(i,  7 )
            sb = sb + CDbl(arr(i,  7 ))
        Case  1 
            ci = ci +  1 
            c(ci,  1 ) = arr(i,  4 )
            c(ci,  2 ) = arr(i,  3 )
        End Select
    Next

    'выгрузка и сразу рамки
    poz =  1 
    With Sheets( 1 )
        With .Cells(poz,  1 )
            .Resize(ai,  4 ).Value = a
            .Resize(ai,  4 ).Borders.Weight = xlThin
            .Resize( 1 ,  4 ).Borders.Weight = xlMedium
        End With
        poz = poz + ai
        .Cells(poz,  1 ) = "Итого:"
        .Cells(poz,  4 ) = sa
        poz = poz +  3 

        With .Cells(poz,  1 )
            .Resize(bi,  4 ).Value = b
            .Resize(bi,  4 ).Borders.Weight = xlThin
            .Resize( 1 ,  4 ).Borders.Weight = xlMedium
        End With
        poz = poz + bi
        .Cells(poz,  1 ) = "Итого:"
        .Cells(poz,  4 ) = sb
        poz = poz +  4 

        With .Cells(poz,  1 )
            .Resize(ci,  2 ).Value = c
            .Resize(ci,  2 ).Borders.Weight = xlThin
            .Resize( 1 ,  2 ).Borders.Weight = xlMedium
        End With
    End With

    'включаем обновление экрана
    Application.ScreenUpdating = True
End Sub
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496142
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hugo121 да Вы точно поняли...все верно номер вставляется в таблицу №3...Генерить таблицу нельзя потому, что из тех трёх что мы с Вами формируем, берутся данные в другие совсем таблицы, они там уже все прописаны, кароче про них лучше не говорить, там все зависит друг от дружки...их лучше не трогать, поэтому задача сводится к тому, чтобы выделить массив соответствующих данных по числу из первого столбца, скопировать их, (как если бы я делал это руками, выделил диапазон и скопировал его) и потом вставить в верхнюю левую ячейку соответствующей таблицы...
С обрамлением то есть мысли как решить...мне бы выборку и копирование выбранного диапазона осилить...Может все же вернуться к тому как я пытался это словами описать в виде кода на VBA...
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496148
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
Sheets("Лист2").Select
    Range("B1:D14").Copy
    Sheets("Лист1").Select
    Range("A2").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False

Вот можно ли так сделать, НО чтобы диапазон он изначально определял исходя из уже вышеописанных условий...И уж на крайняк три разных макроса для каждой табличке написать и потом и в один объединить выполнением друг за дружкой...Мне бы так сделать..Главное это отобрать этот чертов массив исходя из условий..
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496152
R Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geo28,

фильтр+ рекордер ?
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496153
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
R Dmitry - Вот да...только я вот в код глянул и чуть не охренел...)) на свой файл я это прилопатить не смогу...но смысл да тот...делать выборку и вставлять в соответсвующие таблицы...Только они уже готовые...их не надо генерировать..Решение уже так близко...
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496154
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Geo28,
Не маловаты таблицы?

Ну если делать моим кодом, то можно так - выгружать не в одну под другой, а в конкретные ячейки, в начало таблицы.
Они ведь всегда постоянны, как я понял - выгружаем в шаблон?
Тогда и сумму кодом не нужно считать - в шаблон заранее забейте формулу.
И рамки с заливкой можно заранее сделать.

Далее - нам известно количество выгружаемых строк, следовательно можно определить, какие строки лишние.
Или даже проще - забить в шаблон во все потенциально лишние строки например @@@, в конце эти строки удалить с помощью фильтра или цикла снизу вверх по этим символам - в нужных строках они затрутся массивом, в лишних останутся.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496158
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фильтр - это видимо отбор данных - да
Рекордер - я не в теме...не знаю что это...
Нужно что то типо буфера...отфильтровал диапазон, скопировал в буфер, и потом вставил в заранее известную ячейку, таблицы то ведь созданы, их не надо генерировать, поэтому изначально самая верхняя левая ячейка каждой таблицы известна..
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496165
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не не в таблицах строк с запасом набито...
Да да выгружаем в шаблон...только как мне ячейки в Вашем коде задать начальные для каждой из трех таблиц
И сумма все верно уже там формулой считается...
И все верно насчет удаления...так и делаю.. у меня там где числа изначально везде 0 стоят вот по ним и фильтрую сверху вниз и удаляю...ну в САМОЙ САМОЙ Общей таблице, в которую как я говорил вообще лучше не лезть, туда и беруться эти данные из наших ТРЕХ сформированных таблиц...
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496167
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Реализовал - код во втором модуле.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496169
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПАСИБО СПАСИБО, сейчас гляну СПАСИБО СПАСИБО СПАСИБО!!!
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496174
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опять забыл рамки отключить...

Такой код на выгрузку (вместо приложенного, тут убраны рамки) - тут по-моему не надо объяснять, где адреса ячеек прописаны.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
     'выгрузка
    With Sheets( 1 )
        With .Cells( 2 ,  1 ) 'тут промахнулся в приложении, там (1, 1) написано....
            .Resize(ai,  4 ).Value = a
        End With

        With .Cells( 23 ,  1 )
            .Resize(bi,  4 ).Value = b
        End With

        With .Cells( 45 ,  1 )
            .Resize(ci,  2 ).Value = c
        End With
    End With

...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496175
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я ВАМ АХРЕНИТЕЛЬНО БЛАГОДАРЕН!! Вроде все так, теперь буду разбираться и пробовать на свой шаблон подкорректировать))
Но... я ещё потом вернусь))) У меня есть еще пара идей, и видимо без Вашей помощи мне их никогда не реализовать)) Спасибо ещё раз...Вы просто МОНСТРЫ Экселя!!
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496179
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да с адресами я понял...все таки уже как 2 недели над этой проблемой бился...столько всего уже изучил)))) как ячейки определить - знаю)))
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496181
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то я ступил - много от старого кода оставил.
Так нужно :) :

Код: plaintext
1.
2.
3.
4.
5.
6.
    'выгрузка
    With Sheets( 1 )
        .Cells( 2 ,  1 ).Resize(ai,  4 ).Value = a
        .Cells( 23 ,  1 ).Resize(bi,  4 ).Value = b
        .Cells( 45 ,  1 ).Resize(ci,  2 ).Value = c
    End With
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496189
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага спасибо еще раз..выгрузку отредактировал)
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496249
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот появились некоторые шероховатости так сказать...решил пересмотреть все все возможные варианты...и иногда бывает так что таблица с общими данными не генерирует один из массивов данных...например соответственно цифре 1..тоесть идут просто работы с цифрами 2 и 3, а деталей с цифрами 1 нету..в таком случае эксель выкидывает ошибку и прекращает действие кода..обрезки не происходит...подскажите как дополнить код, чтобы если массива соответствующего одной из цифр нету, то продолжить выполнение кода..
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496250
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну тоесть вообще в первом столбце нету цифр "1"
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496255
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Geo28,
чтоб не ругалось, если нет 1:

Код: plaintext
1.
2.
3.
4.
5.
6.
    'выгрузка
    With Sheets( 1 )
        .Cells( 2 ,  1 ).Resize(ai,  4 ).Value = a
        .Cells( 23 ,  1 ).Resize(bi,  4 ).Value = b
       If ci >  0  Then .Cells( 45 ,  1 ).Resize(ci,  2 ).Value = c
    End With

Но вопрос - что делать с таблицей?
Можно в это условие ещё дописать удаление всего диапазона строк ненужной таблицы.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496256
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
     'выгрузка
    With Sheets( 1 )
        .Cells( 2 ,  1 ).Resize(ai,  4 ).Value = a
        .Cells( 23 ,  1 ).Resize(bi,  4 ).Value = b
       If ci >  0  Then
       .Cells( 45 ,  1 ).Resize(ci,  2 ).Value = c
       Else
       Rows("43:62").Delete
       End If
    End With

Аналогично и на отсутствие других цифр пропишите.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496258
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Красивее и понятнее так выглядит:

Код: plaintext
1.
2.
3.
4.
5.
6.
    'выгрузка
    With Sheets( 1 )
        .Cells( 2 ,  1 ).Resize(ai,  4 ).Value = a
        .Cells( 23 ,  1 ).Resize(bi,  4 ).Value = b
       If ci >  0  Then .Cells( 45 ,  1 ).Resize(ci,  2 ).Value = c Else Rows("43:62").Delete
    End With
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496261
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точку забыл перед Rows - нужно ставить, если активным может быть другой лист ( а то удалятся там):
Код: plaintext
1.
2.
 
       If ci >  0  Then .Cells( 45 ,  1 ).Resize(ci,  2 ).Value = c Else .Rows("43:62").Delete
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496272
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что значит Rows(43:62) ?
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496273
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А блин туплю понял...только это они где удаляются то получается в Первой общей таблице, где все 1 2 3 стоят?
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496275
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все разобрался...Спасибо за помощь! Я там у себя все приладил...Блин летает..три секунды и все по своим местам раскидалось...
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 2 из 3
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите ускорить код пожалуйста!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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