Vba Excel中外部数据刷新的编程控制

Vba Excel中外部数据刷新的编程控制,vba,excel,Vba,Excel,我们有一个内部系统,可以生成excel报告,通过使用外部连接的表和透视表直接从数据库获取数据 然而,这些报告有时需要发送到外部客户机,因此,显然连接将失败,他们将得到错误报告和空报告 在工作簿VBA中,我们有以下函数用于检查连接是否有效: Public Function ConnectADO() As Boolean Dim retry As Boolean Dim provider As String Dim ConnectionString As String

我们有一个内部系统,可以生成excel报告,通过使用外部连接的表和透视表直接从数据库获取数据

然而,这些报告有时需要发送到外部客户机,因此,显然连接将失败,他们将得到错误报告和空报告

在工作簿VBA中,我们有以下函数用于检查连接是否有效:

Public Function ConnectADO() As Boolean

    Dim retry As Boolean
    Dim provider As String
    Dim ConnectionString As String

    On Error Resume Next

    retry = False
    ConnectADO = False

    ConnectionString = "MyConnectionString"
    If mycon Is Nothing Then
        Set mycon = New ADODB.Connection
        mycon.CommandTimeout = 30
        mycon.ConnectionTimeout = 1 'so external clients aren't waiting ages
        mycon.CursorLocation = adUseClient
        mycon.Open ConnectionString
    End If

    If (mycon.State <> 1) Then
        ConnectADO = False
        Set mycon = Nothing
    Else
        ConnectADO = True
    End If

    If Err Then
        ConnectADO = False
        Set mycon = Nothing
    End If

End Function
公共函数ConnectADO()作为布尔值 将重试设置为布尔值 将提供程序设置为字符串 Dim ConnectionString作为字符串 出错时继续下一步 重试=错误 ConnectADO=False ConnectionString=“MyConnectionString” 如果mycon什么都不是 Set mycon=New ADODB.Connection mycon.CommandTimeout=30 mycon.ConnectionTimeout=1',因此外部客户端不会等待太久 mycon.CursorLocation=adUseClient mycon.开放连接字符串 如果结束 如果(mycon.State 1),则 ConnectADO=False 设置mycon=Nothing 其他的 ConnectADO=True 如果结束 如果有错误,那么 ConnectADO=False 设置mycon=Nothing 如果结束 端函数 打开电子表格时调用该函数,如果连接失败,则不会运行或刷新任何导入代码。但这感觉像是一种笨拙的方法——在一个缓慢的网络日,对于初学者来说,内部用户将被
ConnectionTimeout=1
咬到。如果有人忘记专门为客户保存一份填好的表格副本,他们会得到一份空的电子表格


有没有更细致的方法来实现这一点?

我建议让您的代码创建一个新工作簿来保存要导出的数据。将新文件发送给您的客户。这可以实现以下几点:

  • 您不必担心向客户发送空白工作簿
  • 您不会向客户端发送宏,这将避免它们看到安全警告
  • 您可以增加代码中的超时时间,因为它将不再对客户端产生影响

我们实际上是沿着这条路线开始的,但我们放弃了它,因为我们发现使用DocumentFormat.OpenXml是一场燃烧恐惧的无休止的噩梦。因此,恢复为具有外部连接的模板。我不愿意重蹈覆辙:(那我一定是遗漏了什么。我不明白为什么你在处理不同的文件时会遇到任何问题。你可以从现有工作簿创建新工作簿,这样你仍然可以使用现有的“模板”(此“模板”)可以是普通的.xls或.xlsx文件,不一定是Excel.xlt或.xlst模板文件)。例如,
Set wb=Workbooks.Add(“C:\Path\To\MyTemplate.xls”)
。此时,对代码所需的唯一更改是将引用从
ActiveWorkbook
更改为
wb