Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sub Worksheet_SelectionChange() 
:(
    Опции темы
alyam
Дата 12.1.2012, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



суть программы состоит: при изменении ячейки идет подсчет на другом листе+небольшая функция поиска.
Мне принесли картридж на заправку, у него есть определенный номер от 1 до 100. Я ввел в соответствующее поле значение "Заправка". После заправки отдаю пользователю, записываю в какой отдел заправленный картридж отправлен. В своде веду отчет по месяцам. Все.

Сама программа работает нормально, если корректно вносить изменения. Но доставляют неудобства следующие два момента:
когда очищаешь ячейку возникает ошибка несоответствия типов, при копировании ячеек возникает ошибка и вычисления не производятся.

функция Worksheet_selectionChange нужна для случая, если вдруг пользователь меняет значение уже заполненной ячейки. Нужно запоминать предыдущее значение, т.е. до внесения изменений.

В вложении файлик с защитой листа без пароля.

Код:

Dim varOldValue As Variant
Dim varNewValue As Variant

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
varOldValue = Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Set Rng1 = Worksheets("Свод").Range("B4:B16")
Set Rng2 = Worksheets("Свод").Range("C3:N3")

For Each varNewValue In Target
Set poz1 = Rng1.Find(What:=varNewValue, LookAt:=xlWhole, SearchOrder:=xlByRows)
Set poz2 = Rng2.Find(What:=Cells(varNewValue.Row, varNewValue.Column + 1).Text, LookAt:=xlWhole, SearchOrder:=xlByColumns)
Set poz3 = Rng1.Find(What:=varOldValue, LookAt:=xlWhole, SearchOrder:=xlByRows)

If varOldValue <> "" Then
Worksheets("Свод").Cells(poz3.Row, poz2.Column).Value = Worksheets("Свод").Cells(poz3.Row, poz2.Column).Value - 1
End If

Worksheets("Свод").Cells(poz1.Row, poz2.Column).Value = Worksheets("Свод").Cells(poz1.Row, poz2.Column).Value + 1
varOldValue = varNewValue
Next varNewValue

End Sub 

Это сообщение отредактировал(а) alyam - 12.1.2012, 02:56

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  _______________________.rar 24,62 Kb
PM MAIL   Вверх
alyam
Дата 12.1.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



подкорректировал. Добавил условие вычисления типа картриджей. Исправил ошибку при очищении ячейки. Теперь при очищении ячейки минусуется значение в своде.
я победил время ) пришлось отказаться от формул. ну и к лучшему.

осталось сделать корректную обработку выделенного диапазона. Допустим я выделяю диапазон на листе Таблица и очищаю. Похоже придется в Sub Worksheet_SelectionChange(ByVal Target As Range) цикл прикручивать. И в массив данные загонять? или можно проще? подскажите, а то я в VBA первый день ) 

Dim varOldValue As Variant
Dim varNewValue As Variant
Dim varmontholdvalue As Variant
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    varOldValue = Target.Value
    varmontholdvalue = Cells(Target.Row, Target.Column + 1).Text
End Sub
Sub Worksheet_Change(ByVal Target As Range)
Set Rng1 = Worksheets("Свод").Range("B4:B16")
Set Rng2 = Worksheets("Свод").Range("C3:N3")
Set Rng3 = Worksheets("Картриджи").Range("B4:B19")
 
Set r1 = Range("$D:$K")
Set r2 = Range("$B:$B")
 
 
 
If Not (Intersect(r2, Target) Is Nothing) Then
 
For Each varNewValue In Target
    Set poz1 = Rng3.Find(What:=varNewValue, LookAt:=xlWhole, SearchOrder:=xlByRows)
    Set poz3 = Rng3.Find(What:=varOldValue, LookAt:=xlWhole, SearchOrder:=xlByRows)
    
    If varNewValue = "" Then
        Worksheets("Картриджи").Cells(poz3.Row, 4).Value = Worksheets("Картриджи").Cells(poz3.Row, 4).Value - 1
    Exit Sub
    End If
    
    If varOldValue <> "" Then
        Worksheets("Картриджи").Cells(poz3.Row, 4).Value = Worksheets("Картриджи").Cells(poz3.Row, 4).Value - 1
    End If
    Worksheets("Картриджи").Cells(poz1.Row, 4).Value = Worksheets("Картриджи").Cells(poz1.Row, 4).Value + 1
    varOldValue = varNewValue
Next varNewValue
Exit Sub
End If
 
 
If Not (Intersect(r1, Target) Is Nothing) Then
    For Each varNewValue In Target
        Set poz1 = Rng1.Find(What:=varNewValue, LookAt:=xlWhole, SearchOrder:=xlByRows)
        Set poz2 = Rng2.Find(What:=Cells(varNewValue.Row, varNewValue.Column + 1).Text, LookAt:=xlWhole, SearchOrder:=xlByColumns)
        Set poz3 = Rng1.Find(What:=varOldValue, LookAt:=xlWhole, SearchOrder:=xlByRows)
 
        If varNewValue = "" Then
            Set poz4 = Rng2.Find(What:=varmontholdvalue, LookAt:=xlWhole, SearchOrder:=xlByColumns)
            Worksheets("Свод").Cells(poz3.Row, poz4.Column).Value = Worksheets("Свод").Cells(poz3.Row, poz4.Column).Value - 1
            Exit Sub
        End If
 
 
        If varOldValue <> "" Then
            Worksheets("Свод").Cells(poz3.Row, poz2.Column).Value = Worksheets("Свод").Cells(poz3.Row, poz2.Column).Value - 1
        End If
 
 
        Worksheets("Свод").Cells(poz1.Row, poz2.Column).Value = Worksheets("Свод").Cells(poz1.Row, poz2.Column).Value + 1
        varOldValue = varNewValue
 
    Next varNewValue
 
End If
End Sub




Это сообщение отредактировал(а) alyam - 12.1.2012, 23:48

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  _______________________.rar 27,53 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0409 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.