2017-01-06 15 views
0

接続文字列(Excel)を作成してワークシートを照会し、結果を取得してレコードセットに配置し、宛先ワークシートに移動できます。ADOレコードセットで古い結果がキャッシュされているようです。

何かの理由で、私が戻ってこのワークシートを(保存せずに)編集すると、レコードセットがOLD結果をキャッシュしてしまうという問題があります。例:最初に10行を照会し、10を返し、7を削除して、もう一度クエリを実行しますが、それは残りの3に対する私の期待とは対照的に元の10を返します。何が価値があるために...

Public Sub sbTest() 

Dim wb As Workbook 

Dim wsData As Worksheet, _ 
wsTmp As Worksheet 

Set wb = ThisWorkbook 
Set wsData = wb.Sheets("Data"): wsData.Cells.ClearContents 
Set wsTmp = wb.Sheets("Temporary") 



sSQL = "SELECT * FROM [" & wsTmp.Name & "$]" 
Call mUtilities.sbRunSQL(sConnXlsm, wb.FullName, sSQL, wsData.Cells(1, 1)) 

    'Cleanup 
Set wb = Nothing 
Set wsData = Nothing 
Set wsTmp = Nothing 

End Sub 


Public Const sConnXlsm As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=zzzzz;Extended Properties=""Excel 12.0 Macro;HDR=YES;IMEX=1"";" 

Public Sub sbRunSQL(ByVal sConn As String, ByVal sSource As String, ByVal sSQL As String, ByVal rDest As Range, _ 
Optional ByVal bHeader As Boolean = True, Optional ByVal bMsg As Boolean = True) 


Dim oCn As ADODB.Connection, _ 
oRs As ADODB.Recordset, _ 
oFld As ADODB.Field 

Dim vArr As Variant 

    'Setup 
On Error GoTo Cleanup 

    'Handle DELETE and INSERT INTO Access queries seperately from other types 
If (UCase(Left(sSQL, 6)) = "DELETE" Or UCase(Left(sSQL, 11)) = "INSERT INTO") And sConn = sConnAccess Then 

    Set oCn = CreateObject("ADODB.Connection") 
    oCn.Open Replace(sConn, "zzzzz", sSource) 

    sSQL = Replace(sSQL, "FROM ", "FROM [Excel 8.0;HDR=YES;DATABASE=" & ThisWorkbook.FullName & "].") 
    oCn.Execute sSQL 

     'Exit if successful 
    oCn.Close 
    Set oCn = Nothing 
    Exit Sub 

Else 

    Set oRs = Nothing 
    Set oRs = New ADODB.Recordset 
    oRs.Open sSQL, Replace(sConn, "zzzzz", sSource), adOpenForwardOnly, adLockReadOnly 

    If Not (oRs.BOF And oRs.EOF) Then 
     vArr = oRs.GetRows 
     vArr = fTranspose(vArr)         'The .GetRows process tranposes the data so we need to undo this 

     If bHeader = True Then 
      For i = 0 To oRs.Fields.Count - 1 
       rDest.Offset(0, i).Value = oRs.Fields(i).Name 
      Next i 
      Range(rDest.Offset(1, 0), rDest.Offset(UBound(vArr, 1) + 1, UBound(vArr, 2))) = vArr 
     Else 
      Range(rDest, rDest.Offset(UBound(vArr, 1), UBound(vArr, 2))) = vArr 
     End If 

      'Exit if successful 
     oRs.Close 
     Set oRs = Nothing 
     Exit Sub 

    End If 
End If 

    'Cleanup 
Cleanup: 
If bMsg = True Then 
    MsgBox "Critical error!" & vbNewLine & vbNewLine & _ 
    "Error: " & Err.Description & vbNewLine & vbNewLine & _ 
    "SQL: " & sSQL, vbCritical + vbOKOnly 
End If 

Set oCn = Nothing 
Set oRs = Nothing 

End Sub 
+1

変更されて保存されていないワークシートはどれですか?あなたが照会しているもの?もしそうなら、あなたがそれらを保存していなければ*あなたの変更を反映するべき*の理由は? – Comintern

答えて

0

を助けてください

...それは何らかの形で関連するメモリであることを信じて、私はこの問題を解決することができたとの問題は、待ち時間のバグのいくつかの種類に関係しているようです複数のExcelインスタンスが開いている場合そのような場合には、ただ一つの本だけを開くように強制しています。

Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
Set oProc = oWMI.ExecQuery("SELECT * FROM Win32_Process WHERE NAME = 'Excel.exe'") 

If oProc.Count > 1 Then 
    MsgBox "There are " & oProc.Count & " instances of Excel open." & vbNewLine & vbNewLine & _ 
    "Only 1 instance is allowed open in order to update database.", vbCritical + vbOKOnly 
    GoTo Cleanup 
End If 
関連する問題