1

私はVBAExcelにかなり慣れていません。コードのチャンクを関数に挿入し、チャンクの代わりに関数を呼び出すことで、VBAマクロをリファクタリングしようとしています。コードのチャンクは、マクロに何度もコピーペーストされます(1つの定数のみを変更します)。ただし、古いソリューションは機能しますが、機能を備えた新しいソリューションは機能しません。エラーメッセージもスローせず、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が「name」パラメーターに問題があることを指摘した後、私はそれに焦点を合わせ、いくつかの試行錯誤の後で、以下の作業バージョンを入手しました。何が起こっているのかまだよくわかりませんが、機能しています。

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çoisCorbettの入力も高く評価し、よりクリーンな方法でコードをリファクタリングしようとしました。最後に、コードをその場で非常に短くて読みやすいチャンクに直接書き直すことができることに気付きました。

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 に答える