1

我对 VBA Excel 相当陌生。我试图通过将代码块插入函数然后调用函数而不是块来重构一些 VBA 宏。这段代码在宏中被多次复制粘贴(仅更改一个常量)。但是,旧解决方案有效,而具有功能的新解决方案则无效。它甚至不会抛出错误消息,它只会冻结整个 Excel 应用程序。你碰巧知道我可能做错了什么吗?

编辑:宏从 SAP 调用,如果它有任何区别。

老的:

Dim tbl As Object
If ThisWorkbook.Container.LinkServer.Items("ITEMS").Table Is Nothing Then
  Exit Sub
Else
  Set tbl = ThisWorkbook.Container.LinkServer.Items("ITEMS").Table
  maxNumRow = ThisWorkbook.Container.LinkServer.Items("ITEMS").Table.rowCount
  '... (do stuff)

新的:

Dim tbl As Object
If LinkServer_Table("ITEMS", tbl, maxNumRow) = True Then
  '... (do stuff)

...
Function LinkServer_Table( _
  ByVal name As String, _
  ByRef tbl As Object, _
  Optional ByRef rowCount As Long)

  If ThisWorkbook.Container.LinkServer.Items(name).Table Is Nothing Then
    LinkServer_Table = False
  Else
    Set tbl = ThisWorkbook.Container.LinkServer.Items(name).Table
    rowCount = ThisWorkbook.Container.LinkServer.Items(name).Table.rowCount
    LinkServer_Table = True
  End If
End Function
4

2 回答 2

2

Treb指出“名称”参数存在问题后,我专注于它,经过一些试验错误后,我得到了下面的工作版本。我仍然不太明白发生了什么,但它正在工作。

Function LinkServer_Table( _
  ByVal name As String, _
  ByRef tbl As Object, _
  Optional ByRef maxRows As Long)

    If ThisWorkbook.Container.LinkServer.Items(CVar(name)).Table Is Nothing Then
        LinkServer_Table = False
    Else
        Set tbl = ThisWorkbook.Container.LinkServer.Items(CVar(name)).Table
        maxRows = ThisWorkbook.Container.LinkServer.Items(CVar(name)).Table.RowCount
        LinkServer_Table = True
    End If
End Function

但是,我也高度重视Jean-François Corbett的意见,并尝试以更简洁的方式重构代码。最后我意识到代码可以直接在原地重写成非常短且可读的块:

Dim tbl As Object        
Set tbl = ThisWorkbook.Container.LinkServer.Items("ITEMS").Table
If Not tbl Is Nothing Then
  maxNumRow = tbl.RowCount
  '...(do stuff)

谢谢你们两位的意见。

于 2012-09-07T08:35:39.057 回答
0

您需要定义函数的返回类型:

Function LinkServer_Table( _
  ByVal name As String, _
  ByRef tbl As Object, _
  Optional ByRef rowCount As Long) As Boolean
于 2012-09-07T07:20:24.647 回答