【问题标题】:Save Excel file in every 2 second without using macro在不使用宏的情况下每 2 秒保存一次 Excel 文件
【发布时间】:2013-09-01 02:25:12
【问题描述】:

我想每 2 秒保存一次 Excel。数据通过 DDE 在此 excel 中更新,并希望每 2 秒读取一次此数据。不幸的是,这些数据没有保存在硬盘上。

我知道宏可用于在指定时间点后保存文件但不想使用宏。

由于此工作表中的数据通过 DDE 频繁更新(每 100 毫秒),因此工作表更改事件触发过于频繁。

下面是我正在尝试但没有成功的代码。

Dim ctme, ptme As Integer

Private Sub Workbook_Open()
  ctme = Second(Now)
  ptme = ctme - 2

End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ctme = Second(Now)

If (ctme - ptme) = 2 Then
 Me.Save
 ptme = ctme

End If


End Sub

请帮忙

【问题讨论】:

  • 通过 DDE 每 100 毫秒更新一次电子表格是不可行的;也不是每两秒保存一个电子表格。 DDE 太慢了,如果有任何数据量的话,磁盘 IO 也是如此。你需要重新考虑你的整个方法,IMO。
  • 我同意@KenWhite 的观点,每两秒钟可能有点过于雄心勃勃。 CPU/内存中的操作可以很容易地频繁完成,但写入磁盘需要更长的时间。如果它是一个特别小的文件和/或您正在写入高速 SSD,这可能是可行的。
  • 我对标题“不使用宏”也有点困惑,因为您稍后会为您尝试使用的宏提供代码。您的意思是您不想使用记录步骤并使用自动代码生成的宏,而只想使用您使用 VBA 手动编码的宏?
  • 实际上我的问题与stackoverflow.com/questions/17008382/… 类似,但正如您所见,这个问题没有一个答案,所以我正在尝试不同的方法,即每 2 秒保存一次文件并阅读它。 @chrisPorsser,通过宏意味着我不想要任何用子例程或函数编写的代码。代码必须在事件处理程序中,否则 DDE 不允许宏运行。虽然我只有 1% 的希望得到解决 :(
  • 您在下面抱怨人们在“事后分析”上使用他们的精力而不是提供帮助。我认为这些更像是“事前分析”,即试图帮助你事先集中注意力。如果答案确实有帮助,请不要忘记点击旁边的复选标记接受它。

标签: vba excel


【解决方案1】:

Nidhi,这里的人们正在努力帮助您,您需要了解没有人可以访问您的大脑来理解您的真正意思。因此,在提出任何答案之前提出问题以清楚地理解问题是很自然的。这里的人,当他们无法理解一个简单的问题时,同样会感到沮丧,如果这个人花一点额外的时间来更好地解释事情,他们所花费的时间本来可以很容易地节省下来。因此,对那些试图帮助你的人表示赞赏,根本不会造成伤害。

好的,回到你的问题。我可能错了,但我认为 SheetChange 事件不会在 DDE 更新时触发。如果我错了,请纠正我。

下一个选项可以是 Application.OnTime 功能。

在 Workbook Open Method 中编写以下代码:

Private Sub Workbook_Open()
    Dim currentTime As Date
    currentTime = DateAdd("s", 2, Now)
    Application.OnTime currentTime, "SaveFile"
End Sub

然后添加一个新模块并在新模块中添加以下函数:

Public Sub SaveFile()
    ThisWorkbook.Save

    Dim currentTime As Date
    currentTime = DateAdd("s", 2, Now)
    Application.OnTime currentTime, "SaveFile"
End Sub

上面的代码将创建一个计时器,它每两秒运行一次以保存您的文件。这种方法有利有弊,但它是 Excel 最好的计时器功能。如果您有任何问题,请告诉我。

谢谢, 维卡斯

【讨论】:

  • 嗨 Vikas,我之前也以同样的方式编码。但问题是当我们编写一些其他函数或子例程时,该应用程序(通过 DDE 更新 excel 不允许打开此文件)。否则在这里问这个问题太简单了。主要问题只是我们必须编写的代码,它必须在事件处理程序中(严格)。我被困在过去 10 天的这个问题 :(
  • 据我所知,Workbook Open 也是一个偶数,我们需要做的就是在 WorkBook Open Event 上启动一个计时器。您是说用于触发 DDE 的应用程序会触发 SheetChange 事件,而不是像 WorkbookOpen 这样的其他事件?好的,我明白了一点。因此,如果我们谈论您的 DDE 应用程序,您是否将 Excel 文件与您的 DDE 应用程序绑定,并且它会不断更新您的文件?您能否告诉我这个 DDE 是可以在 Internet 上下载的标准 DDE,还是您或您的同事制作的?
【解决方案2】:

(这完全远离 OP 标签,但我只是想我会提出一个可能的替代方案)

创建一个小的.NET 控制台应用程序。

使用Timer 对象之一来创建您需要的这个定时循环。

然后在循环的每次扫描中使用对 Excel 互操作库的引用,看起来您可能需要打开此工作簿,保存它,然后再次关闭它......取决于书中的计算和Excel 文件的大小在您的机器上物理上是否可以在 2 秒内打开/计算/保存?

【讨论】:

  • 非常感谢,至少您试了一下。这里最令人失望的是,人们将精力消耗在对问题的事后分析上,而不是试图回答和帮助。再次感谢。你能告诉我当它已经被其他应用程序在计算机上打开并且 DDE 更新正在进行时,是否可以打开、保存和关闭 excel 文件
  • - 如果已经打开它的计算机将它打开 只读 可以吗?
猜你喜欢
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
相关资源
最近更新 更多