Эта функция VBA время от времени завершается сбоем с ошибкой автоматизации Notes «Ошибка времени выполнения» 7 «Недостаточно памяти». Естественно, когда я пытаюсь вручную воспроизвести его, все работает нормально.
Function ToGMT(ByVal X As Date) As Date
Static NtSession As NotesSession
If NtSession Is Nothing Then
Set NtSession = New NotesSession
NtSession.Initialize
End If
(do stuff)
End function
Чтобы поместить это в контекст, эта функция VBA вызывается запросом Access, 3-4 раза на запись, с 20 000 записей. По соображениям производительности NotesSession был сделан статическим. Любые идеи, почему это время от времени дает ошибку нехватки памяти?
(Кроме того, я запускаю NotesSession только для того, чтобы преобразовать дату и время в GMT, используя правила Lotus. Если вы знаете лучший способ, я слушаю).
Редактировать
В ответ на вопрос мистера Росса я изолировал (или думал, что сделал) запрос и его вспомогательную функцию. Прежде чем я попробовал ваше предложение, я сначала добавил несколько аргументов, чтобы определить, на какой строке и в каком поле он возник. Я запустил его несколько раз, и он упал на первом поле первого ряда.
Тогда давай! Все прошло нормально. Поэтому я попытался вернуться, чтобы увидеть, что я сделал. Не могу ничего найти. Я даже вернулся к исходному запросу, в котором он постоянно терпел неудачу, и обнаружил, что все работает нормально, хотя ничего не изменилось (или я так думаю).
Итак, я не смог опробовать ваше предложение, но я все же кое-что узнал. Это действительно раздражает меня. Может ли эта функция конфликтовать с каким-либо другим процессом Notes?
(1 другое. Это не может быть проблема с аппаратным обеспечением / памятью. Это двухъядерный компьютер с 2 ГБ ОЗУ.)
Редактировать # 2
Это действительно отнимает у меня слишком много времени. Я решил просто жестко закодировать даты. Мистер Росс, ваша ссылка выглядит как полноценная, полнофункциональная функция, но у меня больше нет времени проверять логику. Вот что я использовал вместо этого: (в моих целях это работает лучше, чем я думал. Я ожидал большего расхождения)
Function ToGMT(ByVal X As Date) As Date
'Ugly? Yes. A cheap hack? Yes.
'But this method is fast and verifiable. So let's go with it.
'Of course, if you're reading this in the year 2016, well,
'you should be able to figure out what to do.
If X >= #4/2/2006 1:00:00 AM# And X <= #10/29/2006 3:00:00 AM# Or _
X >= #3/11/2007 1:00:00 AM# And X <= #11/4/2007 3:00:00 AM# Or _
X >= #3/9/2008 1:00:00 AM# And X <= #11/2/2008 3:00:00 AM# Or _
X >= #3/8/2009 1:00:00 AM# And X <= #11/1/2009 3:00:00 AM# Or _
X >= #3/14/2010 1:00:00 AM# And X <= #11/7/2010 3:00:00 AM# Or _
X >= #3/13/2011 1:00:00 AM# And X <= #11/6/2011 3:00:00 AM# Or _
X >= #3/11/2012 1:00:00 AM# And X <= #11/4/2012 3:00:00 AM# Or _
X >= #3/10/2013 1:00:00 AM# And X <= #11/3/2013 3:00:00 AM# Or _
X >= #3/9/2014 1:00:00 AM# And X <= #11/2/2014 3:00:00 AM# Or _
X >= #3/8/2015 1:00:00 AM# And X <= #11/1/2015 3:00:00 AM# Then
ToGMT = DateAdd("h", -1, X)
Else
ToGMT = X
End If
End Function