Проверка того, был ли excel включен сегодня в первый раз(VBA)

#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:

  1. Храните дату «Где-нибудь» в стороне, возможно, на скрытом листе (назовите его каламбуром диапазонов).
  2. Проверьте это на открытом

    IF Range("Somewhere").Value = Date then Exit Sub

  3. Распечатайте результат где-нибудь в стороне, какие бы показатели вам ни понадобились из этого
  4. Обновите дату и немедленно сохраните ее автоматически, чтобы не вмешиваться

введите описание изображения здесь

Вы видите, что именованный диапазон не нуждается в 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
 

Запись в реестре выглядит следующим образом
введите описание изображения здесь