ExcelのSQLテーブルおよびビューへの多数のOLEDBデータ接続の更新日をプログラムで確認する必要があります。それらはすべて同じ方法で構成され、同じ接続文字列を使用します。VBAで次を使用してチェックしています。
Connections.OLEDBConnection.RefreshDate
ただし、これらの接続のいくつかには更新日がありません。RefreshDateプロパティがNULLを返すという意味ではなく、そのプロパティも存在しません。VBAは「アプリケーション定義またはオブジェクト定義のエラー」をスローし、接続プロパティを確認すると、「最後に更新された」フィールドが空白になります。
接続の構築方法や更新の回数に関係なく、これらの特定のSQLテーブルおよびビューへの接続は一貫しています。OLEDBの使用に追われており、一部のマシンにはPowerQueryとの互換性の問題があります。ExcelまたはSQLのいずれかで、これを引き起こす原因や変更が必要なものを誰かが知っていますか?
refreshDate
が満たされていない場合は、おそらく運が悪いです。
回避策として、自分で更新について追跡することができます。開始点は、afterRefresh
テーブルのイベントです。このためには、次のコードをWorkbook
-Moduleに追加するWith Events
必要があります(が必要なため、通常のモジュールでは機能しませんclass
。
Option Explicit
Private WithEvents table As Excel.QueryTable
Private Sub table_AfterRefresh(ByVal Success As Boolean)
Debug.Print table.WorkbookConnection.name & " refreshed. (success: " & Success & ")"
If Success Then
Call trackRefreshDate(table.WorkbookConnection.name, Now)
End If
End Sub
これで、更新イベントを保存するためのロジックが必要になります。私の例では、ブックレベルで名前として保存します。もちろん、(非表示の)シートに保存することもできます。これを通常のモジュールに入れます。
Sub trackRefreshDate(tableName As String)
Dim nameObj As Name, nName As String
Set nameObj = Nothing
nName = "Refresh_" & tableName
On Error Resume Next
' Check if name already exists
Set nameObj = ThisWorkbook.Names(nName)
On Error GoTo 0
Dim v
v = Format(Now, "dd.mm.yyyy hh:MM:ss")
If nameObj Is Nothing Then
' No: Create new
Call ThisWorkbook.Names.Add(nName, v)
Else
nameObj.Value = v
End If
End Sub
Function getRefreshDate(tableName As String)
Dim nName As String
nName = "Refresh_" & tableName
On Error Resume Next
getRefreshDate = Replace(Mid(ThisWorkbook.Names(nName), 2), """", "")
On Error GoTo 0
End Function
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加