Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2011, 15:41   #1
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
Радость Макрос не правильно работает

Доброго времени суток, Ув. форумчане!
Почти дописал макрос, все вроде хорошо, но есть одна проблема
Код:
Private Sub Worksheet_Change(ByVal Target As Range) ' Отслеживать событие изменения/внесения данных
If Not Application.Intersect(Target, Range("C4:C34")) Is Nothing Then
On Error GoTo EndMacro
If Target.Value <> "" Then
Dim i&, r%, c%
    r = ActiveCell.Row          'Определение активной строки
    c = ActiveCell.Column       'Определение активного столбца
    With Application                ' С приложением
        .EnableEvents = False           ' отключить обработку событий
        With Target                     ' С ячекой
            If .Count = 1 Then              ' Кол-во измененных ячеек не более 1-ой?
                For i = r To Application.InputBox("Введите количество дней", "ВНИМАНИЕ!!!", Type:=1) + r
                    If Cells(i, 2) <> 0 Then
                        Cells(i - r + r, c).Value = .Value  ' Записать значение
                    End If
                Next
            End If
        End With
        .EnableEvents = True            ' включить обработку событий
    End With
End If
End If
Exit Sub
EndMacro:
End Sub
в коде, где выделено красным не правильно работает копирование. Суть в чем, по второму столбцу просматриваю если значение <>0 то в копировать активную ячейку вниз по активному столбцу, если =0 не копировать. Все работает только когда я задаю допустим копировать на 5 ячеек вниз по активному столбцу и если в столбце 2 попадается допустим одна ячейка со значение =0, то макрос не копирует конечно, но и в следующую ячейку после пустой не добавляет тоже. Вообщем получается вместо 5 скопированных ячеек, только 4.
Как это можно подправить? И правильно ли я написал синтаксис макроса?
Спасибо!
Вложения
Тип файла: rar Книга1.rar (17.2 Кб, 15 просмотров)
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 11.10.2011, 16:13   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Пробуйте .
Вложения
Тип файла: rar Книга1.rar (11.1 Кб, 13 просмотров)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 11.10.2011, 17:02   #3
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
Пробуйте .
Спасибо огромное!

Вот что получилось:

Код:
Private Sub Worksheet_Change(ByVal Target As Range) ' Отслеживать событие изменения/внесения данных
If Not Application.Intersect(Target, Range("C6:CX4155")) Is Nothing Then
On Error GoTo EndMacro
If Target.Value <> 0 Then
Dim i&, r%, c%, j&
    r = ActiveCell.Row          'Определение активной строки
    c = ActiveCell.Column       'Определение активного столбца
    With Application                ' С приложением
        .EnableEvents = False           ' отключить обработку событий
        With Target                     ' С ячекой
            If .Count = 1 Then              ' Кол-во измененных ячеек не более 1-ой?
                j = Application.InputBox("Введите количество дней", "ВНИМАНИЕ!!!", Type:=1)
                For i = r + 1 To 4155 'последняя строка!
                    If Cells(i, 2) <> 0 Then
                        Cells(i - r + r, c).Value = .Value  ' Записать значение
                        j = j - 1
                        If j = 0 Then Exit For
                    End If
                Next
            End If
        End With
        .EnableEvents = True            ' включить обработку событий
    End With
End If
End If
Exit Sub
EndMacro:
End Sub
я выделил красным, то что я изменил. А обязательно объявлять последнюю строку? И почему вы переместили For i = r + 1 To 4155? И чем вам не понравился вот этот цикл For i = r + 1 To r + j + 1?
Спасибо!
Единственный способ стать умнее, играть с более умным противником...

Последний раз редактировалось staniiislav; 11.10.2011 в 17:22.
staniiislav вне форума Ответить с цитированием
Старый 11.10.2011, 17:36   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

> чем вам не понравился вот этот цикл For i = r + 1 To r + j + 1?

Тем, что мы не знаем, до какой строки вниз надо будет пройти. Из-за наличия пустых ячеек номер этой строки больше, чем r + j + 1.
С другой стороны, нельзя просто идти и идти вниз пока j не станет равным 0. Потому что если макрос запустить внизу таблицы, заполненных ячеек в ст. В может не хватить. Поэтому выход из цикла происходит либо по достижению последней строки таблицы, либо по заполнению заданного числа ячеек (j = 0).

Последнюю строку можно определять программно:
Код:
For i = r + 1 To Cells(Rows.Count, 2).End(xlUp).Row 'последняя строка
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 11.10.2011, 17:40   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Да, и замените
Код:
Cells(i - r + r, c)
на
Код:
Cells(i, c)
Первый класс, однако
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 12.10.2011, 10:22   #6
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
Хорошо

Цитата:
Сообщение от Казанский Посмотреть сообщение
Да, и замените
Код:
Cells(i - r + r, c)
на
Код:
Cells(i, c)
Первый класс, однако
Спасибо огромное! )))))
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 12.10.2011, 17:02   #7
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Код:
Private Sub Worksheet_Change(ByVal Target As Range) ' Отслеживать событие изменения/внесения данных
If Not Application.Intersect(Target, Range("C6:CX4155")) Is Nothing Then
On Error GoTo EndMacro
If Target.Value <> 0 Then
Dim i&, r%, c%, j&
    r = ActiveCell.Row          'Определение активной строки
    c = ActiveCell.Column       'Определение активного столбца
    With Application                ' С приложением
        .EnableEvents = False           ' отключить обработку событий
        With Target                     ' С ячекой
            If .Count = 1 Then              ' Кол-во измененных ячеек не более 1-ой?
                j = Application.InputBox("Введите количество дней", "ВНИМАНИЕ!!!", Type:=1)
                If j <> 0 Then
                    For i = r + 1 To Cells(Rows.Count, 2).End(xlUp).Row 'последняя строка To 4155!
                        If Cells(i, 2) <> 0 Then
                            Cells(i, c).Value = .Value   ' Записать значение
                             j = j - 1
                            If j = 0 Then Exit For
                        End If
                    Next
                End If
            End If
        End With
        .EnableEvents = True            ' включить обработку событий
    End With
End If
End If
Exit Sub
EndMacro:
End Sub
вот что еще нужно было вставить, или при нажатии отмена, копировало до последней ячейки! )))
Еще раз спасибо Казанский!
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не правильно работает GetPixel Yokka Общие вопросы .NET 2 17.02.2011 01:08
Стуктура работает не правильно RIO Общие вопросы C/C++ 4 20.12.2010 19:18
Не правильно (или правильно?) работает позиционирование в WebKit mutabor HTML и CSS 5 09.12.2010 09:54
программа работает. правильно ли? getUp Общие вопросы C/C++ 10 26.03.2010 07:07
Правильно написать макрос Marisabell Microsoft Office Excel 1 03.01.2010 17:48