| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование, связанное с 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 |