Спокойно можех да кръстя темата "Как да не използваме Now()":)) Проблемът се крие в "умните" функции Now() и Today() които се самообновяват при преизчисляване (натискане на F9 или някой от другите комбинации за преизчисляване). Това е доста досадно и съм виждал много некадърно направени таблици в които датите (например дата на фактура) е с помощта на Today() или Now()! И в резултат на което получавате дата която се мени постоянно:):) Когато искаме датата да не се променя най-бързия начин за въвеждане е с помощта на комбинациите Ctrl+; (точка и запетая) за въвеждане на текущата дата и Ctrl+Shift+; за въвеждане на текущия час. Така въведените стойности няма да се променят!!
По сложен е въпросът ако искаме датата (или часът) да се въвеждат автоматично при промяна или попълване на дадена клетка.
Задача:
Да се направи таблица в която автоматично да се попълва дата и час при промяна на дадена клетка:
Автоматична дата |
В посочения пример се иска когато потребителя въвежда данни в колонка А автоматично да се въведе текущата дата и час в колонка В и то без да се променя при всяко преизчисляване на листа!
Вариант едно: Явно варианта с формула в клетка В2 =IF(A2="","", now()) е примамлив но неприложим по простата причина, че при всяко преизчисляване ще се променя дата и часа:( !
Да опитаме да се направим на умни. =IF(A2="","",IF(B2="",NOW(),B2)). Тази формула има лееек дефект:):) Проблемът е, че самата тя зависи от себе си (казано на кратко получава се зацикляне (circular reference!) на формулата. Колкото и да се мъчим (например с помощта на други клетки) винаги формулата се самозацикля:( Но от това също има изход. Малко груб, но работи. Excel позволява самозациклянето на формули в определени ситуации. Това са така наречени итерационни изчисления. Нашия случай не е точно такъв, но ще "излъжем" Excel че искаме той да не обръща внимание на самозациклените формули. Настройките се извършват от Excel/Options.
Включване на итерациите |
Това е. Но по принцип е трик от типа "не правете така в къщи":) Хубавото му е, че няма нужда от макроси и свързани с това промени в сигурността и т.н.
Вариант две: С помощта на макрос. Натискане десен бутон на името на листа и показвате редактора на код чрез View Code. В прозорецът вкарвате следния код (Copy/Paste). В кодът съм сложил доста коментари, но обещавам следваща тема да бъде за параметъра Target и как се използва той.
'Събитие при промяна на клетки
Private Sub Worksheet_Change(ByVal Target As Range)
' Ако се прави групова промяна на клетки се излиза от подпрограмата
' Функцията не работи с промяна/изтриване на повече от една клетка!
If Target.Count > 1 Then Exit Sub
' Ако променяната клетка е в зоната A2:A999
If Not (Intersect(Target.Cells, Range("A2:A999")) Is Nothing) Then
'Ако НЕ изтриваме клетката
If Not IsEmpty(Target.Value) Then
' Ако съседната клетка все още е празна
If Target.Offset(0, 1) = "" Then
' В съседната и клетка записваме текущата дата
Target.Offset(0, 1) = Now()
' Оформяме съседната клетка като дата и час
Target.Offset(0, 1).NumberFormat = "dd.mm.yyyy HH:MM"
End If
Else ' Ако изтриваме клетката
' Премахваме съдържанието и на съседната клетка
Target.Offset(0, 1) = ""
End If
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
' Ако се прави групова промяна на клетки се излиза от подпрограмата
' Функцията не работи с промяна/изтриване на повече от една клетка!
If Target.Count > 1 Then Exit Sub
' Ако променяната клетка е в зоната A2:A999
If Not (Intersect(Target.Cells, Range("A2:A999")) Is Nothing) Then
'Ако НЕ изтриваме клетката
If Not IsEmpty(Target.Value) Then
' Ако съседната клетка все още е празна
If Target.Offset(0, 1) = "" Then
' В съседната и клетка записваме текущата дата
Target.Offset(0, 1) = Now()
' Оформяме съседната клетка като дата и час
Target.Offset(0, 1).NumberFormat = "dd.mm.yyyy HH:MM"
End If
Else ' Ако изтриваме клетката
' Премахваме съдържанието и на съседната клетка
Target.Offset(0, 1) = ""
End If
End If
End Sub
Както казах втория вариант има недостатък, че трябва да е книга от тип XLSM , но има по-големи възможности и не се пипат настройките за калкулиране. Както споменах, ще направя няколко теми да разясня нещата в този код в детайли. Успех и внимателно със датите:)
Много полезна информация. Търсих я от доста време. Благодаря!
ОтговорИзтриванеЗдравейте, а как да се сменя дата автоматично или по точно ако 05.03 и мине тази дата да се смени на 05.04 и да е работен ден? Благодаря!
ОтговорИзтриване