代码之家  ›  专栏  ›  技术社区  ›  PowerUser

vba中lotus notes自动化中的“内存不足”错误

  •  0
  • PowerUser  · 技术社区  · 14 年前

    此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函数,每条记录调用3-4次,共有20000条记录。出于性能原因,notessessession被设置为静态。你知道为什么它会偶尔出现内存不足的错误吗?

    (另外,我正在启动notessession,以便可以使用lotus的规则将datetime转换为gmt。如果你知道更好的方法,我在听)。

    编辑

    根据Ross先生的问题,我隔离了(或者认为我做了)查询,它是支持函数。在尝试您的建议之前,我先添加了一些参数来确定它在哪个行和字段上崩溃。我运行了几次,它在第一排的第一个字段上崩溃了。

    那么普雷斯托!一切都很顺利。所以我试着回头看看我做了什么。找不到任何东西。我甚至回到了最初的查询,在那里它一直失败,并发现一切运行良好,即使没有任何改变(或者我认为是这样)。

    所以,我不能尝试你的建议,但我还是学到了一些东西。这真让我讨厌。此函数是否与其他Notes进程冲突?

    (另一件事。这不可能是硬件/内存问题。这台机器是双核的,内存为2GB。)

    编辑第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
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Kevin Ross    14 年前

    如果在每次调用函数时将ntsession从静态更改为设置,然后在函数结束时设置为空,会发生什么情况?

    我知道这会影响表现,但是试试看会发生什么,然后回来

    编辑:

    你关于转换为GMT的评论让我想,这个功能有什么用吗?

    http://www.vbaexpress.com/kb/getarticle.php?kb_id=813