#excel #vba
Вопрос:
У меня есть функция difference_dat (возвращает в днях разницу между текущей датой и заданной датой). Результат (увеличивается на 1 каждый день) находится в A1.
Я собираюсь создать таблицу и искать в ней информацию. Я придумал количество таблиц = difference_dat и проверил, был ли рабочий лист запущен сегодня в первый раз (каждый последующий запуск в тот же день не имеет значения). Однако я понятия не имею, как это проверить.
Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
i = Range("A2").Value 1
End If
End Sub
Этот код был бы в порядке, за исключением того, что при запуске Excel весь рабочий лист пересчитывается, и это дисквалифицирует результат. В то же время я использую другие события при запуске, поэтому я не могу их отключить. Рабочий лист.SelectionChange также не передает результат (не обнаруживает выделение при запуске Excel).
Овации
Комментарии:
1. Пересчет функции в ячейке не вызовет
Worksheet_Change
события.2. Да, но он ссылается на ячейку (переменную), связанную с Worksheet_Change. В результате событие срабатывает.
Ответ №1:
Вы можете использовать процедуру события Workbook_Open, подобную этой:-
Private Sub Workbook_Open()
' 289
Dim Ws As Worksheet
Set Ws = Worksheets("STO_68477673") ' specify the sheet here
With Ws.Cells(1, 1) ' specify the cell here
If .Value <> Date Then
' do your updating here
MsgBox "Updated"
.Value = Date
.NumberFormat = "dd mmmm, yyyy" ' change to suit
End If
End With
End Sub
Обновление будет выполняться не чаще одного раза в день, независимо от того, как часто книга открывается и закрывается. Однако вы можете принудительно обновить, удалив дату в A1, а затем выполнив процедуру.
Ответ №2:
- Храните дату «Где-нибудь» в стороне, возможно, на скрытом листе (назовите его каламбуром диапазонов).
- Проверьте это на открытом
IF Range("Somewhere").Value = Date then Exit Sub
- Распечатайте результат где-нибудь в стороне, какие бы показатели вам ни понадобились из этого
- Обновите дату и немедленно сохраните ее автоматически, чтобы не вмешиваться
Вы видите, что именованный диапазон не нуждается в get activesheet
обновлении, вы просто вызываете именованный диапазон, вот почему мы его назвали.
Ответ №3:
Вот простой способ, который записывает Comments
в BuiltinDocumentProperties
Option Explicit
Private Sub Workbook_Open()
With ThisWorkbook.BuiltinDocumentProperties("Comments")
If DateValue(.Value) = Date Then
'~~> Was opened earlier today
Else
.Value = Date
ThisWorkbook.Save
DoEvents
End If
End With
End Sub
Ответ №4:
Вы можете использовать реестр и события:
' in the workbook module
Private Sub Workbook_Open()
IsFirstToday
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object) 'if the workbook has not been closed overnight
If Sh.Name = "Sheet1" Then IsFirstToday
End Sub
' registry root is 'ComputerHKEY_CURRENT_USERSoftwareVB and VBA Program Settings'
Private Sub IsFirstToday()
LastDate = GetSetting(appname:="MyExcelFile", section:="Startup", _
Key:="LastDate", Default:="01.01.1900")
If CDate(LastDate) < Date Then
Debug.Print "Sheet1 activated for the first time today"
SaveSetting appname:="MyExcelFile", section:="Startup", _
Key:="LastDate", setting:=Date
Else
Debug.Print "Sheet1 activated NOT for the first time today"
End If
End Sub