powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
22 сообщений из 47, страница 2 из 2
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37166980
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем,
маски не пересекаются точно, а как ставится флаг? можно подробнее?, плиз.
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37167059
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробуй камнем2 The_PristThe_PristТ.к. надо в массив загонять сами значения и затем на лист выгружать. А для этого надо хотя бы видеть куда . ...
Куда: - туда же, откуда читали в массив.Это я понимаю. Я не совсем глуп, чтобы, написав код и загрузив значения с листа в массив, не знать куда потом выгрузить. Меня больше вопрос интересовал нет ли на этом листе формул. Иначе при выгрузке массива их не станет. Поэтому я и написал: видеть куда .
А то так неплохой нежданчик может получиться для автора темы - были формулы - и не стало....
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37167372
mimozka,
на примере кода из Вашего первого поста. Всего-лишь пример. Для продакшн-версии лучше будет, если перепишете с использованием массивов, как предлагал многоуважаемый The_Prist.
Код: 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.
' {skipped}
    sumGO =  0 
    sumF =  0 
With ThisWorkbook.Worksheets("данные1")
    For j =  1  To konec ' проверяем соответствие счетов маскам Приход
    If .Cells(j,  5 ) <> "" Then ' проверка "флага"
    If .Cells(j,  4 ) = "" Then
    If Mid(.Cells(j,  2 ),  10 ,  2 ) <> "00" Then
            
            If reDtF.Test(.Cells(j,  2 ).Value) Then ' из этих двух условий первым должно стоять то,
            If reKtF.Test(.Cells(j,  3 ).Value) Then ' которое реже выполняется
 
          sumF = sumF + CDbl(.Cells(j,  5 ).Value)
          .Cells(j,  5 ).Value = "" ' <-- установка "флага". Если не желательно менять исходные данне - выделить под флаг отдельный столбец

            End If 'reKtF.Test(.Cells(j, 3).Value)
            End If 'reDtF.Test(.Cells(j, 2).Value)
    Else         

            If reDtGO.Test(.Cells(j,  2 ).Value) Then
            If reKtGO.Test(.Cells(j,  3 ).Value) Then
          
          sumGO = sumGO + CDbl(.Cells(j,  5 ).Value)
          .Cells(j,  5 ).Value = "" ' <-- установка "флага". Если не желательно менять исходные данне - выделить под флаг отдельный столбец

            End If 'reKtGO.Test(.Cells(j, 3).Value)
            End If 'reDtGO.Test(.Cells(j, 2).Value)
    End If 'Mid(.Cells(j, 2), 10, 2) <> "00"
    End If '.Cells(j, 4) = ""
    End If '.Cells(j, 5) <> ""
    Next j
End With
' {skipped}
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37167389
ОФФ:
The_Prist,
про возможность наличия формул в диапазонах, где данные обновляются методом "+=", каюсь, не подумал.
Век живи - век учись. Всё равно ...(с)
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37167551
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем,
формул никаких нет.
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37167606
mimozka,
тогда сам Аллах велел загружать данные с листов в массивы в циклах уже массивы гонять.
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37167731
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mimozkaформул никаких нет.Ну так в чем проблема? :-)
Код: 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.
    Dim avArr, j As Long, avМаски_приход_ГО_Arr, avМаски_приход_Ф_Arr, i As Long
    Dim avSvodArr
    With ThisWorkbook
        With .Worksheets("маски_приход_ГО")
            avМаски_приход_ГО_Arr = Range(.Cells( 1 ,  1 ), .Cells(kol_maska,  5 )).Value
        End With
        With .Worksheets("маски_приход_Ф")
            avМаски_приход_Ф_Arr = Range(.Cells( 1 ,  1 ), .Cells(kol_maska,  5 )).Value
        End With
        With .Worksheets("данные1")
            avArr = Range(.Cells( 1 ,  1 ), .Cells(konec,  5 )).Value
        End With

        With .Worksheets("Свод")
            lENDSvod = .Cells(.Rows.Count,  2 ).End(xlUp).Row
            avSvodArr = Range(.Cells( 1 ,  1 ), .Cells(lENDSvod,  5 )).Value
        End With

        For i =  2  To kol_maska
            reDtF.Pattern = avМаски_приход_ГО_Arr(i,  2 ): reDtF.IgnoreCase = True: reDtF.Global = True
            reKtF.Pattern = avМаски_приход_ГО_Arr(i,  3 ): reKtF.IgnoreCase = True: reKtF.Global = True

            reDtGO.Pattern = avМаски_приход_ГО_Arr(i,  2 ): reDtGO.IgnoreCase = True: reDtGO.Global = True
            reKtGO.Pattern = avМаски_приход_ГО_Arr(i,  3 ): reKtGO.IgnoreCase = True: reKtGO.Global = True

            sumGO =  0 : sumF =  0 

            For j =  1  To konec    ' проверяем соответствие счетов маскам Приход
                If Mid$(avArr(j,  2 ),  10 ,  2 ) <> "00" Then
                    If reKtF.test(avArr(j,  3 )) And reDtF.test(avArr(j,  2 )) Then
                        sumF = sumF + Val(Replace(avArr(j,  4 ), ",", "."))    'сразу число прибавляем
                    End If
                Else
                    If reDtGO.test(avArr(j,  2 )) And reKtGO.test(avArr(j,  3 )) Then
                        sumGO = sumGO + Val(Replace(avArr(j,  4 ), ",", "."))
                    End If
                End If
            Next j

            If (sumF + sumGO) <>  0  Then
                For q =  2  To lENDSvod
                    If avSvodArr(q,  1 ) = avМаски_приход_Ф_Arr(i,  5 ) And _
                       avSvodArr(q,  2 ) = avМаски_приход_Ф_Arr(i,  1 ) Then
                        avSvodArr(q,  4 ) = Val(Replace(avSvodArr(q,  4 ), ",", ".")) + sumF

                    ElseIf avSvodArr(q,  1 ) = avМаски_приход_ГО_Arr(i,  5 ) And _
                           avSvodArr(q,  2 ) = avМаски_приход_ГО_Arr(i,  1 ) Then
                        avSvodArr(q,  4 ) = Val(Replace(avSvodArr(q,  4 ), ",", ".")) + sumGO
                    End If
                Next q
            End If
        Next i
        With .Worksheets("Свод")
            Range(.Cells( 1 ,  1 ), .Cells(lENDSvod,  5 )).Value = avSvodArr
        End With
    End With
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37167743
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл. Вот это:
Код: plaintext
1.
2.
3.
4.
reDtF.IgnoreCase = True: reDtF.Global = True
reKtF.IgnoreCase = True: reKtF.Global = True

reDtGO.IgnoreCase = True: reDtGO.Global = True
reKtGO.IgnoreCase = True: reKtGO.Global = True
Можно тоже за цикл убрать.
Код: 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.
Dim avArr, j As Long, avМаски_приход_ГО_Arr, avМаски_приход_Ф_Arr, i As Long
    Dim avSvodArr
    With ThisWorkbook
        With .Worksheets("маски_приход_ГО")
            avМаски_приход_ГО_Arr = Range(.Cells( 1 ,  1 ), .Cells(kol_maska,  5 )).Value
        End With
        With .Worksheets("маски_приход_Ф")
            avМаски_приход_Ф_Arr = Range(.Cells( 1 ,  1 ), .Cells(kol_maska,  5 )).Value
        End With
        With .Worksheets("данные1")
            avArr = Range(.Cells( 1 ,  1 ), .Cells(konec,  5 )).Value
        End With

        With .Worksheets("Свод")
            lENDSvod = .Cells(.Rows.Count,  2 ).End(xlUp).Row
            avSvodArr = Range(.Cells( 1 ,  1 ), .Cells(lENDSvod,  5 )).Value
        End With
        
        reKtGO.IgnoreCase = True: reKtGO.Global = True
        reDtGO.IgnoreCase = True: reDtGO.Global = True
        reDtF.IgnoreCase = True: reDtF.Global = True
        reKtF.IgnoreCase = True: reKtF.Global = True

        For i =  2  To kol_maska
            reDtF.Pattern = avМаски_приход_ГО_Arr(i,  2 )
            reKtF.Pattern = avМаски_приход_ГО_Arr(i,  3 )

            reDtGO.Pattern = avМаски_приход_ГО_Arr(i,  2 )
            reKtGO.Pattern = avМаски_приход_ГО_Arr(i,  3 )

            sumGO =  0 : sumF =  0 

            For j =  1  To konec    ' проверяем соответствие счетов маскам Приход
                If Mid$(avArr(j,  2 ),  10 ,  2 ) <> "00" Then
                    If reKtF.test(avArr(j,  3 )) And reDtF.test(avArr(j,  2 )) Then
                        sumF = sumF + Val(Replace(avArr(j,  4 ), ",", "."))    'сразу число прибавляем
                    End If
                Else
                    If reDtGO.test(avArr(j,  2 )) And reKtGO.test(avArr(j,  3 )) Then
                        sumGO = sumGO + Val(Replace(avArr(j,  4 ), ",", "."))
                    End If
                End If
            Next j

            If (sumF + sumGO) <>  0  Then
                For q =  2  To lENDSvod
                    If avSvodArr(q,  1 ) = avМаски_приход_Ф_Arr(i,  5 ) And _
                       avSvodArr(q,  2 ) = avМаски_приход_Ф_Arr(i,  1 ) Then
                        avSvodArr(q,  4 ) = Val(Replace(avSvodArr(q,  4 ), ",", ".")) + sumF

                    ElseIf avSvodArr(q,  1 ) = avМаски_приход_ГО_Arr(i,  5 ) And _
                           avSvodArr(q,  2 ) = avМаски_приход_ГО_Arr(i,  1 ) Then
                        avSvodArr(q,  4 ) = Val(Replace(avSvodArr(q,  4 ), ",", ".")) + sumGO
                    End If
                Next q
            End If
        Next i
        With .Worksheets("Свод")
            Range(.Cells( 1 ,  1 ), .Cells(lENDSvod,  5 )).Value = avSvodArr
        End With
    End With
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37178765
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тяжелая была неделька, некогда было доделывать...

сейчас пытаюсь запустить макрос, ругается на строчку avМаски_приход_ГО_Arr = Range(.Cells(1, 1), .Cells(kol_maska, 4)).Value

Run-time error '1004'
Application-defined or object-defined error

что не так?

и еще, размерность массива разве не нужно указывать?
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37178792
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mimozka,

Размерность не нужно - сама определится.

Попробуйте так:
Код: plaintext
.Range(.Cells( 1 ,  1 ), .Cells(kol_maska,  4 )).Value
Хотя обычно точка не требуется в данном случае. Поэтому есть предположение, что ошибка в переменной: kol_maska . Может быть она у Вас нулю равна? Или за пределы листа выходит значение(больше 65536)?
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37179056
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist,
Спасибо! ошибка ушла, дело было в точке! смотрю дальше :)
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37181423
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
If (sumF + sumGO) <> 0 Then
For q = 2 To lENDSvod
If avSvodArr(q, 1) = avМаски_приход_Ф_Arr(i, 5) And _
avSvodArr(q, 2) = avМаски_приход_Ф_Arr(i, 1) Then
avSvodArr(q, 4) = Val(Replace(avSvodArr(q, 4), ",", ".")) + sumF

ElseIf avSvodArr(q, 1) = avМаски_приход_ГО_Arr(i, 5) And _
avSvodArr(q, 2) = avМаски_приход_ГО_Arr(i, 1) Then
avSvodArr(q, 4) = Val(Replace(avSvodArr(q, 4), ",", ".")) + sumGO
End If
Next q
End If

выскакивает ошибка "Run-time error '9': Subscript out of range", что не так?
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37181678
mimozka,
предположу, что пытаетесь получить из массива элемент по несуществующему индексу.

ЗЫ: указание строки, на которой получаете ошибку в совокупности со значениями переменных ускорят обнаружение жука/граблей значительно.
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37182103
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем,

максимальное значение индекса i = 65536, поиск строки на которой получаю ошибку займет часа 3-4 методом перебора..
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37182116
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mimozkaмаксимальное значение индекса i = 65536, поиск строки на которой получаю ошибку займет часа 3-4 методом перебора..А кто говорил про метод перебора? Проверьте в коде в момент возникновения ошибки - какое значение у переменной i (какое число) и какое значение у переменной kol_maska . Наверное, kol_maska меньше i . Вот и получается, что Вы пытаетесь обратиться к несуществующему элементу массива.
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37182696
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist,
похоже ты прав, только я не пойму почему???

If sumGO <> 0 Then
For q = 2 To lENDSvod
If avSvodArr(q, 1) = avМаски_приход_ГО_Arr(i, 5) And _
avSvodArr(q, 2) = avМаски_приход_ГО_Arr(i, 1) Then

avSvodArr(q, 4) = Val(Replace(avSvodArr(q, 4), ",", ".")) + sumGO
End If
Next q
End If

у меня lENDSvod =35, так вот как только Next q = 35, выходит ошибка "Subscript out of range", разве при q=35 не заканчивается просто цикл?
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37182725
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mimozka,

цикл закончится как только q =36. Т.к. цикл идет от 2 до lENDSvod(а оно у нас = 35). И это 35 проходит через цикл. А вот 36 уже нет.
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37182751
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist,
ну это да, но почему ошибка?
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37182829
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, кажется разобралась, всё долеплю и отпишусь уже :)
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37227016
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
правильно ли писать маску следующим образом [0156789][12345689][1356789][13456789][046789][0-9]{15} , например, для счета 20223810700012348451, почему то ответ false ?!
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37227188
mimozka,
маска: [0156789][12345689][1356789][13456789][046789][0-9]{15} (длина "поиска" от 20-и до 20-и символов)
счет: 20223810700012348451 (длина 20 символов)
элемент маски описаниеможно заменить насоответствующие символы счета совпадение[0156789]один из символов 0 1 5 6 7 8 9[015-9]2 False[12345689]один из символов 1 2 3 4 5 6 8 9[1-689]0 False[1356789]один из символов 1 3 5 6 7 8 9[135-9]2 False[13456789]один из символов 1 3 4 5 6 7 8 9[134-9]2 False[046789]один из символов 0 4 6 7 8 9[046-9]3 False[0-9]{15}15 символов каждый из которых цифра от 0 до 9менять нечего810700012348451 True
...
Рейтинг: 0 / 0
Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
    #37227203
mimozka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуй камнем,
ой! точно!!! дурында я )), составила называется пример счета )), почти от обратного )))
Спасибо, пробуй камнем!
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как ускорить работу макроса по сбору данных с помощью регулярных выражений?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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