Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Sub Worksheet_SelectionChange()


Автор: alyam 12.1.2012, 02:55
суть программы состоит: при изменении ячейки идет подсчет на другом листе+небольшая функция поиска.
Мне принесли картридж на заправку, у него есть определенный номер от 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, 15:18
подкорректировал. Добавил условие вычисления типа картриджей. Исправил ошибку при очищении ячейки. Теперь при очищении ячейки минусуется значение в своде.
я победил время ) пришлось отказаться от формул. ну и к лучшему.

осталось сделать корректную обработку выделенного диапазона. Допустим я выделяю диапазон на листе Таблица и очищаю. Похоже придется в 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



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)