powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите ускорить код пожалуйста!
57 сообщений из 57, показаны все 3 страниц
Помогите ускорить код пожалуйста!
    #37493666
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно проблема такая:
Все замечательно работает, но долго.. лист с 200 строками обрабатывает 30 сек, помогите ускорить макрос если это возможно.
Макрос вставляет в три таблички значения из другого файла..по критериям.

Вот код:
Код: 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.
Sub Импорт()
    Application.ScreenUpdating = False
    Workbooks.Open Filename:="C:\Users\Юрец\Desktop\Sheet1.xls"
    Windows("Шаблон 2.0.xlsm").Activate
    Range("AJ36").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,2,ROW(R[-35]C[-35]),4)"
    Range("AL36").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,2,ROW(R[-35]C[-37]),7)"
    Range("AJ36:AL36").Select
    Selection.AutoFill Destination:=Range("AJ36:AL127"), Type:=xlFillDefault
    Range("AJ36:AL127").Select
    Range("AM36").Select
    ActiveCell.FormulaR1C1 = "=RC[-1]*R36C43"
    Range("AM36").Select
    Selection.AutoFill Destination:=Range("AM36:AM127"), Type:=xlFillDefault
    Range("AL36:AL127").Select
    Range("AL127").Activate
    Range("AJ133").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,3,ROW(R[-132]C[-35]),4)"
    Range("AL133").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,3,ROW(R[-132]C[-37]),7)"
    Range("AJ133:AL133").Select
    Selection.AutoFill Destination:=Range("AJ133:AL188"), Type:=xlFillDefault
    Range("AJ133:AL188").Select
    Range("AM133").Select
    ActiveCell.FormulaR1C1 = "=RC[-1]*R36C43"
    Range("AM133").Select
    Selection.AutoFill Destination:=Range("AM133:AM188"), Type:=xlFillDefault
    Range("AM133:AM188").Select
    Range("AJ194").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,1,ROW(R[-193]C[-35]),4)"
    Range("AK194").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,1,ROW(R[-193]C[-36]),3)"
    Range("AJ194:AK194").Select
    Selection.AutoFill Destination:=Range("AJ194:AK286"), Type:=xlFillDefault
    Range("AJ194:AK286").Select
    Range("AJ194:AK286").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AJ36:AJ127").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AM36:AM127").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AJ133:AJ188").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AM133:AM188").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AL133:AL188").Select
    Selection.ClearContents
    Range("AL36:AL127").Select
    Range("AL127").Activate
    Selection.ClearContents
    Windows("Sheet1.xls").Activate
    ActiveWindow.Close
    Range("AJ32").Select
    ActiveCell.FormulaR1C1 = ""
    Application.ScreenUpdating = True
    Range("AJ31").Select
End Sub


Очень прошу помощи!
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37493692
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала научиться оформлять код на форуме (см. правила и FAQ по оформлению сообщений)

Потом избавиться от всех Select, Selection и Active
ибо констукция
Код: plaintext
1.
Range("AJ36:AL36").Select
 Selection.AutoFill Destination:=Range("AJ36:AL127"), Type:=xlFillDefault
безболезненно меняется на
Код: plaintext
Range("AJ36:AL36").AutoFill Destination:=Range("AJ36:AL127"), Type:=xlFillDefault
и т.п.

После этого можно посмотреть, что там в коде такого тормозного.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37493730
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот: удалил Select Selections. Еще пробовал отключать расчет по формулам...и вставлялось всё моментально, но по понятным причинам везде одно и то же значение..А так время выполнения макроса все то же 30 сек....прошу помощи в оптимизации кода..

Код: 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.
Sub Импорт()
    Application.ScreenUpdating = False
    Workbooks.Open Filename:="C:\Users\Юрец\Desktop\Sheet1.xls"
    Windows("Шаблон 2.0.xlsm").Activate
    Range("AJ36").FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,2,ROW(R[-35]C[-35]),4)"
    Range("AL36").FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,2,ROW(R[-35]C[-37]),7)"
    Range("AJ36:AL36").AutoFill Destination:=Range("AJ36:AL127"), Type:=xlFillDefault
    Range("AM36").FormulaR1C1 = "=RC[-1]*R36C43"
    Range("AM36").AutoFill Destination:=Range("AM36:AM127"), Type:=xlFillDefault
    Range("AJ133").FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,3,ROW(R[-132]C[-35]),4)"
    Range("AL133").FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,3,ROW(R[-132]C[-37]),7)"
    Range("AJ133:AL133").AutoFill Destination:=Range("AJ133:AL188"), Type:=xlFillDefault
    Range("AM133").FormulaR1C1 = "=RC[-1]*R36C43"
    Range("AM133").AutoFill Destination:=Range("AM133:AM188"), Type:=xlFillDefault
    Range("AJ194").FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,1,ROW(R[-193]C[-35]),4)"
    Range("AK194").FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,1,ROW(R[-193]C[-36]),3)"
    Range("AJ194:AK194").AutoFill Destination:=Range("AJ194:AK286"), Type:=xlFillDefault
    Range("AJ133:AL133").AutoFill Destination:=Range("AJ133:AL188"), Type:=xlFillDefault
    Range("AJ133:AL188").Select
    Range("AM133").Select
    ActiveCell.FormulaR1C1 = "=RC[-1]*R36C43"
    Range("AM133").Select
    Selection.AutoFill Destination:=Range("AM133:AM188"), Type:=xlFillDefault
    Range("AM133:AM188").Select
    Range("AJ194").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,1,ROW(R[-193]C[-35]),4)"
    Range("AK194").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP2([Sheet1.xls]Переводчик!R1C1:R380C7,1,1,ROW(R[-193]C[-36]),3)"
    Range("AJ194:AK194").Select
    Selection.AutoFill Destination:=Range("AJ194:AK286"), Type:=xlFillDefault
    Range("AJ194:AK286").Select
    Range("AJ194:AK286").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AJ36:AJ127").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AM36:AM127").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AJ133:AJ188").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AM133:AM188").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("AL133:AL188").Select
    Selection.ClearContents
    Range("AL36:AL127").Select
    Range("AL127").Activate
    Selection.ClearContents
    Windows("Sheet1.xls").Activate
    ActiveWindow.Close
    Range("AJ32").Select
    ActiveCell.FormulaR1C1 = ""
    Application.ScreenUpdating = True
    Range("AJ31").Select
End Sub



...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37493748
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geo28от: удалил Select Selectionsкак же удалил, когда еще 17 раз встречается...

Нет никакого смысла делать Select, а потом работать с Selection или с ActiveCell, можно все методы применять сразу к Range.
То же касается закрытия активного окна....

Ну а по производительности... хорошо бы файл иметь, чтобы на нем смотреть
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37494059
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, ускорить "вставление" здесь сможет отключение/включение автопересчета (ибо ВПР() летуча...)
Ну и, естественно, изучение объекной модели.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37494061
Фотография Serge 007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM...ибо ВПР() летуча...
ВПР не летуча.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37494177
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. сперва тянете данные кучей ВПР(), потом меняете их на значения?
Можно сразу всё взять кодом, но нужен пример в файле.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37494324
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge 007,

а, да, тормознул... суббота была
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37494448
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так или иначе, выложи автор свой пример в виде файла, наверняка получил бы уже несколько конкретных решений. Шокер, не сочти это за критику в твой адрес. Твоя реплика тривиальна и(а значит) безусловно верна. Давайте подождем автора.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37495734
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо всем за советы...но у меня возникла идея совсем от ВПР отказаться...ибо долго он считает( мне так кажется)...проверял отключением авторасчета...и все мгновенно вставилось, но одно и то же (я формулу растягивал по диапазону)..В целом у меня дело обстоит так:
Есть Файл №1. Так вот на листе 1 есть три таблицы. На листе 2 - только одна. На листе 3 как должно получиться.
Таблица вида:
1 текст число
1 текст число
1 текст число
2 текст число
2 текст число
2 текст число
3 текст текст
3 текст текст
Задача: Сделать выборку данных, затем автоматом их распихать по трем соответствующим таблицам ( для данных напротив 1 , 2 и 3)
Затем удалить пустые строки и обрамить...
Вопрос выборки сначала попробовал решить ВПР - но долго. - соответственно вопрос выборки - не решил))
Вопрос удаления строк - решил
Вопрос обрамления - решил
Так вот есть код
Код: 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

Так вот теперь самый главный вопрос: Как мне привязать номер строки к значению в первом столбце?
чтобы Range("B1:D14") - был динамическим, а именно только последняя строка...тоесть (B1:Di ) где i Меняется в зависимости от значения в первом столбце..
может как то так, например для первой таблицы: пишу словами, т.к. не знаю как это выдать на языке VBA
Код: plaintext
1.
2.
3.
4.
i = переменная
Если Cells(i , 1 ).Text =  1     - если значение в первом столбце равно  1 
Тогда Count(i)      -  считать кол-во строк(i) где в первом столбце встретилось значение  1   (например   10  строк)
Затем Range("B1:Di").Copy    - копировать данный диапазон, ну и далее я вроде разобрался...
Потом..для второй таблицы т.к. после строк со значением 1 в таблице сразу идут строки со значением 2, тогда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
j = переменная
s= переменная
e=переменная
Тогда j = i +  1       -  задаем первую строку со значением "2", которая идёт сразу же после i
Если Cells(s , 1 ).Text =  2     - если значение в первом столбце равно  2 
Тогда Count(s)      -  считать кол-во строк(s) где в первом столбце встретилось значение  2    (например он выдаст  15  строк)
е = i + s         -  последняя строка со значением  2   (т.к. первые  10  строк(i) - были под значение"1" и следующие за ними строки (s) со значением "2")
Затем Range("Bj:De").Copy    - копировать данный диапазон, ну и далее как вставить я разобрался
Вот , а для третьей таблицы так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
с=переменная
d=переменная
f= переменная
с=e +  1      - так как строки со знач "3" идут сразу после строк со знач "2"
Если Cells(d , 1 ).Text =  3     - если значение в первом столбце равно  3 
Тогда Count(d)      -  считать кол-во строк(d) где в первом столбце встретилось значение  3    (например он выдаст  5  строк)
Затем 
f = e + d
Затем Range("Bc:Df").Copy

вот...помогите теперь всё это на язык VBA перевести)
файл приложил
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37495757
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я толком не понял - что есть и что нужно получить?
Как понял - есть данные на листе2 и пустые таблицы на листе1.
Зачем пустые и нельзя ли их генерить макросом как нужно (чтоб не искать, что удалять)?
Зачем вообще лист3 и что на нём уже есть, а что добавляется макросом (и зачем)?
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37495788
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
... мне кажется, что можно сделать быстро на массивах и словаре/коллекции.
Но объясните, что именно нужно.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37495800
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на листе 3 - образец что должно получиться, так сказать наглядный пример.
А нужно след.:
Нужно данные из одной таблицы, рассортировать по трем разным таблицам. Из условия что в первую таблицу заносятся данные если на листе 2 (в ОБЩЕЙ таблице) напротив этих данных в столбце 1 (A) стоит значение 1, во вторую таблицу заносятся данные если на листе 2 (в ОБЩЕЙ таблице) напротив этих данных в столбце 1 (A) стоит значение 2, в третью таблицу заносятся данные если на листе 2 (в ОБЩЕЙ таблице) напротив этих данных в столбце 1 (A) стоит значение 3
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37495887
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что значит на массивах и коллекциях/словарях?
мне хочется запустить импорт данных одним нажатием кнопки...а это ж только макросом и можно сделать...вот сначала записал макрос с впр, но долго...руками быстрее...теперь пытаюсь осилить более оптимизированный код...
Если есть решения ещё проще я бы был вам очень благодарен, если бы Вы меня направили в нужное русло...я не прошу мне код готовый прислать, мне в принципе самому интересно разобраться, хотя в программировании я полный профан...))
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37495907
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hugo121... мне кажется, что можно сделать быстро на массивах и словаре/коллекции.
Но объясните, что именно нужно.
Я фигею. Игорь, ну наф... зачем? Почему не дать автору высказаться? Ты же умничка! Такое ощущение, что мне в пику делаешь.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37495948
R Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kuklp, Привет Сергей !
Я для себя такой алгоритм нарисовал :
ADO
2 рекордсета: 1 - группируем по F1 и заодно подсчитываем значения(для смещения диаапзона вставки)
2- делаем единый формат таблицы из 3 столбов
затем перебираем 1 рекордсет, 1 значением фильтруем 2 рекордсет
выгружаем на лист, берем значение из первого рекордсета и смещаем точку вставки следующей таблицы,
так границы таблиц определены не составляет труда после вставки таблицы, отформатировать ее как надо.(добавить заголовки и стили)

как то так, но писать лениво -Q
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37495953
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей, так я дал. Полчаса :)
И всё равно до конца не понятно - эти значения 1, 2 и 3 - заранее известны, и по ним нужно отбирать?
Столбцы A и B всегда заполнены, а числа могут быть или в C, или в D?

Если так, то просто - исходные данные в массив (словарь не нужен), создаём ещё 3 пустых таких же по размеру, но на 3 столбца (или 6 на 1 столбец).
И 3 переменных для подсчёта.
Перебираем первый массив, анализируем первый столбец. Набираем данные в пустые массивы, считаем количество в каждом (т.е. используем индекс и для заполнения, и потом для выгрузки - это по одной переменной на массив или параллельную пару массивов).
В итоге имеем 3 (или 6) массивов с данными, верхушку которых выгружаем куда нужно.
Вопрос - куда нужно?
Один под другим с промежутком в 2 строки или как?
Ну а красоту и рамки потом можно навести - координаты данных будут известны.
Find не нужен, один цикл не по листу, а по массиву - будет меньше секунды на 200 строк. Основное время вероятно натягивание рамок займёт :)
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37495967
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дима, Игорь - чесслово - рад вам! Но еще Шокер в теме написал(см. сообщение №2). Помимо моей радости от увиденного, давайте братья подождем автора?
П.С. Вы, безусловно, лучшие!
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496006
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Geo28что значит на массивах?


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

Sub otbor()
    Dim arr, i&, ai&, bi&, ci&, b(), c(), poz&

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

    'данные в массив
    With Sheets( 2 )
        arr = .Range(.Range("A" & .Rows.Count).End(xlUp), .[D1]).Value
        'или так
        'arr = .Range(.[D1], .Range("A" & .Rows.Count).End(xlUp)).Value
        'или даже в данном случае так
        'arr = .[a1].CurrentRegion.Value
    End With

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

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

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

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

        With .Cells(poz,  1 )
            .Resize(bi,  3 ).Value = b
            .Resize(bi,  3 ).Borders.Weight = xlThin
            .Resize( 1 ,  3 ).Borders.Weight = xlMedium
        End With
        poz = poz + bi +  2 

        With .Cells(poz,  1 )
            .Resize(ci,  3 ).Value = c
            .Resize(ci,  3 ).Borders.Weight = xlThin
            .Resize( 1 ,  3 ).Borders.Weight = xlMedium
        End With
    End With
    
    'включаем обновление экрана
    Application.ScreenUpdating = True
End Sub

Чего уж ждать, раз написано?
Не подойдёт ТС - может другим сгодится :)
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496010
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помарка, так нужно объявить:
Код: plaintext
Dim arr()
Будет в 2 раза быстрее бегать :)
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496057
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упс, ещё проглядел - 1, 2 и 3 ведь не нужно в массив забивать :(
Тогда этот блок должен быть таким - 3 строки изменил, 3 удалил:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    'перебор массива
    For i =  1  To UBound(a)
        'отбор данных
        Select Case arr(i,  1 )
        Case  1 
            ai = ai +  1 
            a(ai,  1 ) = arr(i,  2 )
            a(ai,  3 ) = IIf(Len(arr(i,  3 )), arr(i,  3 ), arr(i,  4 ))
        Case  2 
            bi = bi +  1 
            b(bi,  1 ) = arr(i,  2 )
            b(bi,  3 ) = IIf(Len(arr(i,  3 )), arr(i,  3 ), arr(i,  4 ))
        Case  3 
            ci = ci +  1 
            c(ci,  1 ) = arr(i,  2 )
            c(ci,  3 ) = IIf(Len(arr(i,  3 )), arr(i,  3 ), arr(i,  4 ))
        End Select
    Next
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496087
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВЫ реально лучшие, СПАСИБО ВАМ ОГРОМНОЕ ЗА ПОМОЩЬ...
Но я чесслово вообще ничего не понял))))) Все что связано с массивами))) Но это круто...То что вы так вот сходу такие темы лабаете - это круто...Респект))
Но позвольте, мне еще тогда раз все более подробно разъяснить, а то вижу что люди мне пытаются помочь, а я блин толком не могу рассказать что мне надо...Итак ещё раз о моей задаче:
У меня есть файл, допустим он называется Книга1.
В нем на первом листе есть таблицы, которые необходимо заполнить. Таблиц три штуки, идут они друг за другом, в конце каждой таблицы есть итог. (пример я прикрепил). Тоесть если в табличке в столбце числа идут 1,2,3 то в графе ИТОГ в конце будет их сумма - 6. Графа "Итог" должна быть в конце обязательно, поэтому я и сделал сначала в каждой таблице пустых строк с запасом, а потом просто их удалить по условию, что в них стоит "0" в графе число...
Теперь как формируются данные на листе 2. Таблица всегда одного вида. НИКОГДА не меняются столбцы. Никогда не меняется условие отбора - это всегда числа в первом столбце либо 1, либо 2, либо 3. Но количество строк с каждым числом может меняться...В примере на листе 2 я привел пример...Нарисовал две таблицы какие они могут быть...
Теперь что куда надо импортировать:
Например для первой таблицы
грубо говоря по аналогии с формулой впр: если в таблице на листе2 в столбце A:A, есть число 2, то нужно скопировать из этой строки данные их столбцов D и G в соответственно первую таблицу на первом листе в первую строку в столбцы A и D (как в прикрепленном примере)
Руками я делаю так: выделяю массив данных все что напротив Числа 2 из первого столбца, потом Ctrl+C, перехожу на самую верхнюю и левую ячейку первой таблицы Ctrl+V...потом удалял пустые строки и обрамлял. Вот и все и так для каждой таблицы.
Надеюсь что Вы меня поняли...
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496101
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне самое главное это тупо отобрать массив, это если бы я руками выделял по условию все напротив 1, 2 или 3
и тупо вставить в верхнюю левую ячейку соответствующей таблицы...Мне нельзя формировать таблицы с нуля...Есть форма, но она пустая, в ней набито пустых строк с запасом..., надо просто выделить отобранный массив и вставить, потом удалить пустые строки, и обрамить вставленный ранее массив, ну либо последнюю строку обрамить снизу( ну после которой идёт графа Итог). Мне кажется это самый простой вариант...
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496109
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Geo28,
Примерно понятно.
Не понятно, почему нельзя генерить таблицу? В ней ещё что-то есть?
Столбец "Номер" вообще не учитывается?
Итого можно сразу при заполнении массива считать - ещё 3 переменных для этого завести.
Т.е. таблицы на первом листе легко генерить кодом, это просто.
Сложнее сделать заливку - она и впрямь нужна? Лениво прописывать... :)
И рамки тоже сложные - в первом варианте проще было.
И объединение ячеек...
Давайте это Вам домашнее задание? :)
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496116
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, номер учитывается в таблице №3, куда забиваются данные №1, так :)
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #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
Помогите ускорить код пожалуйста!
    #37496285
kuklp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Классно, ребят! Игорь, Дима - мой респект. Извините, был занят доселе. И сейчас отрывают:-) Вы оба в привычном вам стиле. Мне нравится.
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496381
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Утро вечера мудренее...
Вчера с удалением немного поторопился.
Так, как привёл пример - можно удалять только последнюю таблицу.
Если удалять ещё и таблицы выше, то номера строк изменятся.
Тогда нужно или вводить переменную, на которую делать поправку при удалении таблиц, и котрую изменять при удалении первой и втрой таблицы (удаление третьей не влияет), или (что в данном случае проще, т.к. шаблон) обозвать диапазоны именами, и удалять имена:

Код: plaintext
1.
2.
3.
4.
With Sheets( 1 )
If ai >  0  Then заполнение_массива Else .[first_t].EntireRow.Delete
If bi >  0  Then заполнение_массива Else .[second_t].EntireRow.Delete
If ci >  0  Then заполнение_массива Else .[third_t].EntireRow.Delete
End With
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37496413
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя чего это я всё усложняю...
Нужно просто работать с таблицами снизу вверх - тогда удаление например второй таблицы не повлияет на третью, т.к. она уже будет заполнена.
И номера строк тогда можно указывать явно, как я в примере [11492576] привёл - в момент работы с ними они будут на месте.
Надеюсь, что Вы так и сделали :)
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37497815
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, с удалением разобрался...на самом деле все оч круто получилось...как говорится Знание - Сила! Не солгу если скажу ещё раз Вам огромное спасибо и что Вы мне оч помогли! Вот сейчас дела на работе разгребу и чего-нибудь новое в шаблоне придумывать буду)) Вот параллельно думаю как делать окантовку...у меня там В самой самой главной таблице ( а их так же три) уже есть окантовка изначально, они ж там и со строками пустыми с запасом...но когда их удаляешь, то нижняя граница горизонтальная окантовка изчезает...таблицы после удаления соответственно скачут...но как я говорил в каждой таблице после строк с данными идёт строка типо ИТОГА..вот и думаю как если бы это выглядело на языке VBA:
ввести переменную, затем найти в какой строке есть слово ИТОГ, затем в этой строке выделить ячейки от A до H (тоесть получается мы выделяем строку с ИТОГОМ и шлёпнуть этому выделению верхнюю горизонтальную линию в обрамлении...как то так))
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37497839
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Geo28,
типа так - только синтаксис рамки рекордером запишите, тут полужирная тянется:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub tt()
Dim r, i As Byte
Set r = [A1]
For i =  1  To  3 
Set r = Cells.Find(What:="итого", After:=r, LookIn:=xlValues, _
LookAt:=xlPart)
r.Offset(- 1 ).Resize( 1 ,  8 ).Borders.Weight = xlMedium
Next
End Sub

И тянется над "итого" - если надо по, то уберите .Offset(-1).
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37498027
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
..попробую Ваш код примастачить на свой шаблон)) О результатах обязательно доложу)
...
Рейтинг: 0 / 0
Помогите ускорить код пожалуйста!
    #37498032
Geo28
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот так он только нижнюю границу рисует)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Sub tt()
Dim r, i As Byte
Set r = [A1]
For i =  1  To  3 
Set r = Cells.Find(What:="èòîãî", After:=r, LookIn:=xlValues, _
LookAt:=xlPart)
Next
r.Offset(- 1 ).Resize( 1 ,  8 ).Borders(xlEdgeBottom).Weight = xlMedium
End Sub

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


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