![]() |
|
Модераторы: mihanik |
![]()
|
|
| alyam |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| alyam |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
![]()
|
| Правила форума "Программирование, связанное с MS Office" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще!
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование, связанное с MS Office | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |