Страницы: 1
RSS
При изменении размера массива цикл доходит только до конца первоначального массива
 
Код
Sub Razbivka_Kod_Seriya_Mip_Inv()

Dim w&, i&, ob&, LR&, c&, LC&
Dim B(), D(), E(), R(), S(), U(), N() As Variant
Dim Line1 As Object
Dim t As Single
Dim j As Worksheet
Dim NomerDokumenta%, KodTovara%, Naimenovanie%, RaznicaKolvo%, RaznicaGrn%, Hozoperaciya%, Napravl%
Set j = Sheets(1)
't = Timer

LR = j.Cells(Rows.Count, 1).End(xlUp).Row
LC = j.Cells(1, Columns.Count).End(xlToLeft).Column

ReDim B(1 To LR), D(1 To LR), E(1 To LR), R(1 To LR), S(1 To LR), U(1 To LR), N(1 To LR) As Variant


NomerDokumenta = j.Cells.Find("№ документа").Column
KodTovara = j.Cells.Find("Код товара").Column
Naimenovanie = j.Cells.Find("Наименование товара").Column
RaznicaKolvo = j.Cells.Find("Разница, кол-во").Column
RaznicaGrn = j.Cells.Find("Разница, грн").Column
Hozoperaciya = j.Cells.Find("Хоз.операция").Column
Napravl = j.Cells.Find("Направление").Column
    
    For i = 2 To LR
        B(i) = j.Cells(i, NomerDokumenta)
        D(i) = j.Cells(i, KodTovara)
        E(i) = j.Cells(i, Naimenovanie)
        R(i) = j.Cells(i, RaznicaKolvo)
        S(i) = j.Cells(i, RaznicaGrn)
        U(i) = j.Cells(i, Hozoperaciya)
        N(i) = j.Cells(i, Napravl)
    Next i

    For w = LBound(B) To UBound(B)
        For i = LBound(B) To UBound(B)
            If IsEmpty(j.Cells(w, LC + 1)) And IsEmpty(j.Cells(i, LC + 1)) Then
                If D(w) = D(i) Then
                    If w < i Then
                        If (j.Cells(w, RaznicaKolvo) + j.Cells(i, RaznicaKolvo)) <> 0 Then
                            If R(w) < 0 And R(i) > 0 Then
                                If Abs(j.Cells(w, RaznicaKolvo)) > Abs(j.Cells(i, RaznicaKolvo)) Then
                                    If N(w) Like "*МИП*" Or N(w) Like "*ИНВ*" Then
                                        If N(i) Like "*МИП*" Or N(i) Like "*ИНВ*" Then
                                            j.Rows(w + 1).Insert Shift:=xlDown
                                            j.Rows(w + 1).FillDown
                                            j.Cells(w + 1, RaznicaKolvo) = -j.Cells(i + 1, RaznicaKolvo)
                                            j.Cells(w, RaznicaKolvo) = j.Cells(w, RaznicaKolvo) + j.Cells(i + 1, RaznicaKolvo)
                                            j.Cells(w + 1, LC + 1) = "Разбивка/Код/Серия/МИП/ИНВ 1_" & w
                                            j.Cells(i + 1, LC + 1) = "Разбивка/Код/Серия/МИП/ИНВ 1_" & w
                                                LR = j.Cells(Rows.Count, 1).End(xlUp).Row
                                                    ReDim B(1 To LR), D(1 To LR), E(1 To LR), R(1 To LR), S(1 To LR), U(1 To LR), N(1 To LR) As Variant
                                                        For ob = 2 To LR
                                                            B(ob) = j.Cells(ob, NomerDokumenta)
                                                            D(ob) = j.Cells(ob, KodTovara)
                                                            E(ob) = j.Cells(ob, Naimenovanie)
                                                            R(ob) = j.Cells(ob, RaznicaKolvo)
                                                            S(ob) = j.Cells(ob, RaznicaGrn)
                                                            U(ob) = j.Cells(ob, Hozoperaciya)
                                                            N(ob) = j.Cells(ob, Napravl)
                                                        Next ob
                                        End If
                                    End If
                                ElseIf Abs(j.Cells(w, RaznicaKolvo)) < Abs(j.Cells(i, RaznicaKolvo)) Then
                                    If N(w) Like "*МИП*" Or N(w) Like "*ИНВ*" Then
                                        If N(i) Like "*МИП*" Or N(i) Like "*ИНВ*" Then
                                                j.Rows(i + 1).Insert Shift:=xlDown
                                                j.Rows(i + 1).FillDown
                                                j.Cells(i + 1, RaznicaKolvo) = Abs(j.Cells(w, RaznicaKolvo))
                                                j.Cells(i, RaznicaKolvo) = j.Cells(i, RaznicaKolvo) + j.Cells(w, RaznicaKolvo)
                                                j.Cells(w, LC + 1) = "Разбивка/Код/Серия/МИП/ИНВ 2_" & w
                                                j.Cells(i + 1, LC + 1) = "Разбивка/Код/Серия/МИП/ИНВ 2_" & w
                                                    LR = j.Cells(Rows.Count, 1).End(xlUp).Row
                                                        ReDim B(1 To LR), D(1 To LR), E(1 To LR), R(1 To LR), S(1 To LR), U(1 To LR), N(1 To LR) As Variant
                                                            For ob = 2 To LR
                                                                B(ob) = j.Cells(ob, NomerDokumenta)
                                                                D(ob) = j.Cells(ob, KodTovara)
                                                                E(ob) = j.Cells(ob, Naimenovanie)
                                                                R(ob) = j.Cells(ob, RaznicaKolvo)
                                                                S(ob) = j.Cells(ob, RaznicaGrn)
                                                                U(ob) = j.Cells(ob, Hozoperaciya)
                                                                N(ob) = j.Cells(ob, Napravl)
                                                            Next ob
                                        End If
                                    End If
                                End If

                            ElseIf R(w) > 0 And R(i) < 0 Then
                                If Abs(j.Cells(w, RaznicaKolvo)) > Abs(j.Cells(i, RaznicaKolvo)) Then
                                    If N(w) Like "*МИП*" Or N(w) Like "*ИНВ*" Then
                                        If N(i) Like "*МИП*" Or N(i) Like "*ИНВ*" Then
                                            j.Rows(w + 1).Insert Shift:=xlDown
                                            j.Rows(w + 1).FillDown
                                            j.Cells(w + 1, RaznicaKolvo) = -j.Cells(i + 1, RaznicaKolvo)
                                            j.Cells(w, RaznicaKolvo) = j.Cells(w, RaznicaKolvo) + j.Cells(i + 1, RaznicaKolvo)
                                            j.Cells(w + 1, LC + 1) = "Разбивка/Код/Серия/МИП/ИНВ 3_" & w
                                            j.Cells(i + 1, LC + 1) = "Разбивка/Код/Серия/МИП/ИНВ 3_" & w
                                                LR = j.Cells(Rows.Count, 1).End(xlUp).Row
                                                    ReDim B(1 To LR), D(1 To LR), E(1 To LR), R(1 To LR), S(1 To LR), U(1 To LR), N(1 To LR) As Variant
                                                        For ob = 2 To LR
                                                            B(ob) = j.Cells(ob, NomerDokumenta)
                                                            D(ob) = j.Cells(ob, KodTovara)
                                                            E(ob) = j.Cells(ob, Naimenovanie)
                                                            R(ob) = j.Cells(ob, RaznicaKolvo)
                                                            S(ob) = j.Cells(ob, RaznicaGrn)
                                                            U(ob) = j.Cells(ob, Hozoperaciya)
                                                            N(ob) = j.Cells(ob, Napravl)
                                                        Next ob
                                            
                                        End If
                                    End If
                                ElseIf Abs(j.Cells(w, RaznicaKolvo)) < Abs(j.Cells(i, RaznicaKolvo)) Then
                                    If N(w) Like "*МИП*" Or N(w) Like "*ИНВ*" Then
                                        If N(i) Like "*МИП*" Or N(i) Like "*ИНВ*" Then
                                            j.Rows(i + 1).Insert Shift:=xlDown
                                            j.Rows(i + 1).FillDown
                                            j.Cells(i + 1, RaznicaKolvo) = -j.Cells(w, RaznicaKolvo)
                                            j.Cells(i, RaznicaKolvo) = j.Cells(i, RaznicaKolvo) + j.Cells(w, RaznicaKolvo)
                                            j.Cells(w, LC + 1) = "Разбивка/Код/Серия/МИП/ИНВ 4_" & w
                                            j.Cells(i + 1, LC + 1) = "Разбивка/Код/Серия/МИП/ИНВ 4_" & w
                                                LR = j.Cells(Rows.Count, 1).End(xlUp).Row
                                                    ReDim B(1 To LR), D(1 To LR), E(1 To LR), R(1 To LR), S(1 To LR), U(1 To LR), N(1 To LR) As Variant
                                                        For ob = 2 To LR
                                                            B(ob) = j.Cells(ob, NomerDokumenta)
                                                            D(ob) = j.Cells(ob, KodTovara)
                                                            E(ob) = j.Cells(ob, Naimenovanie)
                                                            R(ob) = j.Cells(ob, RaznicaKolvo)
                                                            S(ob) = j.Cells(ob, RaznicaGrn)
                                                            U(ob) = j.Cells(ob, Hozoperaciya)
                                                            N(ob) = j.Cells(ob, Napravl)
                                                        Next ob
                                            
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        Next i
            LR = j.Cells(Rows.Count, 1).End(xlUp).Row
                ReDim Preserve B(1 To LR), D(1 To LR), E(1 To LR), R(1 To LR), S(1 To LR), U(1 To LR), N(1 To LR) As Variant
                    For ob = 2 To LR
                        B(ob) = j.Cells(ob, NomerDokumenta)
                        D(ob) = j.Cells(ob, KodTovara)
                        E(ob) = j.Cells(ob, Naimenovanie)
                        R(ob) = j.Cells(ob, RaznicaKolvo)
                        S(ob) = j.Cells(ob, RaznicaGrn)
                        U(ob) = j.Cells(ob, Hozoperaciya)
                        N(ob) = j.Cells(ob, Napravl)
                    Next ob
Debug.Print w
    Next w

'MsgBox (Timer - t) / 60

End Sub
Доброго времени суток. Дело в том, что код по ходу добавляет строки. Массивы переопределяются, но по итогу проверил и выявил следующую проблему: при запуске кода программа проходит только в пределах первично определенного массива (не учитывая смещенные элементы).

Пример: есть цикл от 1 до 10. Через каждые 2 -е единицы добавляется еще 1. По итогу получим 15. Код при этом доходит до 10-и и завершает работу.

Укажите огненной дланью на путь истинный. Не дайте сгинуть в безвестности.

PS: В программировании деревянный. Прошу не пинать. Спасибо заранее.
 
можете простыми словами рассказать какую земную задачу вы пытались решить этим божественным макросом?
не побрезгуйте, и прикрепите файл с данными к пояснениям
мир вам!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Программа сканирует товар по разным критериям. Находит излишек и недостачу. Объединяет так, чтоб излишек равнялся недостаче.
Проще:
- Товар +10
- Товар -3

Должно получиться:

Товар +7
Товар +3
Товар -3

Код есть в файле.
 
вы сильно переоценили мою сообразительность, нужно добавить подробностей
в файле показано, что есть на старте, а что нужно получить в итоге? можете показать?
(на другом листе, например. назовите листы "есть так", и "нужно так")
Изменено: Ігор Гончаренко - 28.12.2020 22:42:10
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Дело в том, что этот код работает. Меня интересует следующее:
мы определили массив от 1 до 10. В ходе вычислений массив вырос до 15-ти. Перед выходом из цикла я переопределил массив и он стал от 1 до 15, но при этом программа все равно выходит после 10-го круга.
Вопрос состоит в том почему программа не добавляет еще 5 кругов?
 
Цитата
Jerry.Sweer: почему программа не добавляет еще 5 кругов?
насколько я понимаю, конечное/общее/полное количество итераций цикла (… To N) определяется при инициировании/запуске цикла и не пересчитывается (зачем - это пустая трата ресурсов) в процессе выполнения, в отличие от переменной счётчика (For i=…) - его в цикле можно увеличивать или уменьшать (дополнительно от основного шага) и тем самым пропускать или повторять некоторые значения i

Ответ на вопрос получен, насколько я понимаю
Далее последует вопрос: "а как дойти до конца, сколько мне надо" — и это вопрос для новой темы
Изменено: Jack Famous - 29.12.2020 09:21:22
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
и это вопрос для новой темы
Это и был вопрос данной темы. Просто я, в меру своего невежества в программировании, интерпретировал его так как понимаю. Вы поняли суть вопроса, но почему-то не захотели описать в двух словах метод его решения. Интрига наше все...
 
190 просмотров темы, а воз и ныне там... Вас это удивляет? Меня - нет. Заходят, смотрят, уходят...

Прикрепите небольшой пример
Цитата
Ігор Гончаренко написал: не побрезгуйте, и прикрепите файл с данными к пояснениям
Упростите макрос так, чтобы помогающим было желание посмотреть и они не теряли время на просмотр Вашей простыни. Оставьте только то, что касается вопроса. Можно же создать небольшой массив, написать цикл и воспроизвести ошибку.
 
Цитата
vikttur написал:
ожно же создать небольшой массив, написать цикл и воспроизвести ошибку.
Я не прошу написать за меня код. Код написан и работает. Я его приложил только для наглядности. Вопрос состоит только в том, как увеличить размер массива в цикле? Просто направьте в место, кроме ж№пы, где можно найти ответ, либо опишите в двух словах.
 
Объявить новый (больший) массив, переписать туда меньший массив...
Не объявлять новый, взять в существующий массив больший диапазон  с листа...

Ну, ждите...
 
Цитата
vikttur написал:
Не объявлять новый, взять в существующий массив больший диапазон  с листа...
Через ReDim перезаполняю массив, с учетом изменившегося кол-ва строк, но код упорно заканчивает на последнем значении определенного в начале массива.

Должно же быть логичное решение чем просто "взять с запасом".
Изменено: Jerry.Sweer - 29.12.2020 10:25:35 (Додумал)
 
Очевидно, что надо вместо for next использовать do loop и обеспечить своевременный выход из цикла
 
Цитата
Jerry.Sweer написал:
как увеличить размер массива в цикле
https://coderoad.ru/36664051/%D0%9A%D0%B0%D0%BA-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-%D1...
Не бойтесь совершенства. Вам его не достичь.
 
Но вопрос-то:
Цитата
Jerry.Sweer написал: как увеличить размер массива в цикле?
 
Цитата
Jerry.Sweer: почему-то не захотели описать в двух словах метод его решения. Интрига наше все...
прочтите мой ответ столько раз, чтобы увидеть, что ответ на вопрос, выделенный цитатой, получен
Макрос ваш мало кому интересен — вместо него гораздо проще и правильнее написать с нуля новый нормальный, но и это делать мало кто будет бесплатно (неинтересно)
Ответы на вопрос "Как запустить цикл до 15, а не до 10" напрашивается сам собой: укажите верхнюю границу 15, а не 10 (это даже в моём ответе есть). Если не знаете, какая будет верхняя граница, то используйте цикл Do … Loop и выходите из него при выполнении какого-либо условия
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
укажите верхнюю границу 15,
Размер таблицы изменяется от 100 тыс. строк до 1 млн.

Не могу понять почему UBound, при пошаговой обработке, показывает то число что требуется, а заканчивает первоначально определенным...
 
Цикл For .. To.. работает "осюда" и до "забора". И если "отсюда" менять можно, то "забор" ставится один раз при входе в цикл, и дальше не двигается. А вот массив вполне себе растягивается.
Изменено: RAN - 29.12.2020 15:48:05
 
RAN, ТС сам не знает, чего хочет  :D
Точнее, хочет он динамически менять "забор" (о Do … Loop ему ещё doober говорил), но при этом упорно (но по-разному) утверждает, что
Цитата
Jerry.Sweer: Вопрос состоит в том почему программа не добавляет еще 5 кругов?
или
Цитата
Jerry.Sweer: Вопрос состоит только в том, как увеличить размер массива в цикле?
Вот теперь я иногда захожу в тему поржать, т.к. ему ответили на всё возможное, но это вообще ничего не изменило  :D
Изменено: Jack Famous - 29.12.2020 16:11:26
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Вот теперь я иногда захожу в тему поржать, т.к. ему ответили на всё возможное, но это вообще ничего не изменило  
Рад что смог повеселить))) Смех продлевает жизнь.

Цитата
RAN написал:
Цикл For .. To.. работает "осюда" и до "забора". И если "отсюда" менять можно, то "забор" ставится один раз при входе в цикл, и дальше не двигается. А вот массив вполне себе растягивается.
Спасибо за пояснение. Дело в том, что переменная (w) при наведении показывает число с учетом добавленных строк, но не учитывается в работе кода. Меня это ввело в ступор. Теперь понятно. Попробую через "Do". Освоил только For, думал хватит, придется развиваться дальше.

Всем неравнодушным спасибо.
Страницы: 1
Наверх