imho.ws |
![]() |
![]() |
![]() |
# 1 |
Guest
Сообщения: n/a
|
Проблема с циклами (как мне кажется :) в Vba
Люди, помогите чайнику, плз!
Пишу макрос для EXcel, но он не работает. Подозреваю, что это из-за неправильного написания цикла, но как правильно это сделать пока не имею представления ![]() Макрос запускается, но ничего не делает, при этом он не выдает никаких сообщений об ошибках. Код:
Public knp As Integer Public Sub CommandButton1_Click() Dim i Dim n As Integer Dim a Dim b Dim kolvo_nepustih As Integer Dim kolvo_nepustih2 As Integer Dim kolvo_nepustih3 As Integer Dim key As Integer Dim m As Integer Dim l As Integer Dim o As Integer n = 1 m = 1 l = 1 o = 1 'Определяем количество непустых ячеек в листе For i = 1 To 50000 If Sheets("Новый прайс").Cells(n, 7) = vbNullString Then knp = n Exit For End If n = n + 1 Next i otvet.Caption = knp 'Закончили определять количество непустых ячеек 'Начинаем Поиск совпадений ключа с листом "База". Если ячейка с ключом есть в базе, то проверить, не изменились ли значения в некоторых ячейках строки по сравнению с тем, что есть в листе "Опубликовано на сайте". Если изменения есть, перенести значения из листов "База" и "Новый прайс" на лист "Опубликовать", если нет - внести запись в лист "Протокол". Если записи нет, внести данные из листа "Новый прайс" в лист "Новые поступления!" For i = 1 To hnp key = Sheets("Новый прайс").Cells(m, 7) For a = 1 To 50000 If key = Sheets("База").Cells(l, 16) Then For b = 1 To 50000 If key = Sheets("Опубликован на сайте").Cells(o, 16) And Sheets("Опубликован на сайте").Cells(o, 1) = Sheets("Новый прайс").Cells(m, 4) And Sheets("Опубликован на сайте").Cells(o, 11) = Sheets("Новый прайс").Cells(m, 14) Then 'kolvo_nepustih = Sheets("Протокол").Cells.[a1].CurrentRegion.Rows.Count + 1 Sheets("Протокол").Cells(kolvo_nepustih, 1) = key Sheets("Протокол").Cells(kolvo_nepustih, 2) = "Без изменений" Else: kolvo_nepustih2 = Sheets("Опубликовать").Cells.[a1].CurrentRegion.Rows.Count + 1 Sheets("Опубликовать").Cells(kolvo_nepustih2, 1) = "update" Sheets("Опубликовать").Cells(kolvo_nepustih2, 2) = Sheets("Новый прайс").Cells(m, 4) Sheets("Опубликовать").Cells(kolvo_nepustih2, 3) = Sheets("База").Cells(l, 2) Sheets("Опубликовать").Cells(kolvo_nepustih2, 4) = Sheets("База").Cells(l, 3) Sheets("Опубликовать").Cells(kolvo_nepustih2, 5) = Sheets("База").Cells(l, 4) Sheets("Опубликовать").Cells(kolvo_nepustih2, 6) = Sheets("База").Cells(l, 5) Sheets("Опубликовать").Cells(kolvo_nepustih2, 7) = Sheets("База").Cells(l, 6) Sheets("Опубликовать").Cells(kolvo_nepustih2, 8) = Sheets("База").Cells(l, 7) Sheets("Опубликовать").Cells(kolvo_nepustih2, 9) = Sheets("База").Cells(l, 8) Sheets("Опубликовать").Cells(kolvo_nepustih2, 10) = Sheets("База").Cells(l, 9) Sheets("Опубликовать").Cells(kolvo_nepustih2, 11) = Sheets("База").Cells(l, 10) Sheets("Опубликовать").Cells(kolvo_nepustih2, 12) = Sheets("Новый прайс").Cells(m, 14) Sheets("Опубликовать").Cells(kolvo_nepustih2, 13) = Sheets("База").Cells(l, 12) Sheets("Опубликовать").Cells(kolvo_nepustih2, 14) = Sheets("База").Cells(l, 13) Sheets("Опубликовать").Cells(kolvo_nepustih2, 15) = Sheets("База").Cells(l, 14) Sheets("Опубликовать").Cells(kolvo_nepustih2, 16) = Sheets("База").Cells(l, 15) Sheets("Опубликовать").Cells(kolvo_nepustih2, 17) = Sheets("База").Cells(l, 16) Sheets("Опубликовать").Cells(kolvo_nepustih2, 18) = Sheets("База").Cells(l, 17) Sheets("Опубликовать").Cells(kolvo_nepustih2, 19) = Sheets("База").Cells(l, 18) Sheets("Опубликовать").Cells(kolvo_nepustih2, 20) = Sheets("База").Cells(l, 19) Exit For End If o = o + 1 Next b Else: 'kolvo_nepustih3 = Sheets("Новые поступления").Cells.[a1].CurrentRegion.Rows.Count + 1 Sheets("Новые поступления!").Cells(kolvo_nepustih3, 1) = "insert" Sheets("Новые поступления!").Cells(kolvo_nepustih3, 2) = Sheets("Новый прайс").Cells(m, 4) 'Надо дописать Exit For End If l = l + 1 Next a Exit For l = l + 1 Next i end sub |
![]() |
# 3 |
Junior Member
Регистрация: 16.01.2004
Сообщения: 89
![]() |
Вообще-то в Excel-е есть очень полезное для тебя свойство рабочего листа UsedRange (задействованная область).
Вот как определяется последняя строка, содержащая текст: Код:
Dim ws As Worksheet Dim n As Integer Set ws = Worksheets("Лист1") n = ws.UsedRange.Row |
![]() |