Sisa:
Mam takie uwagi
1. Podejrzewam, że nie masz Option Explicit, ponieważ wówczas kod by się poprawnie nie kompilował !
- brak deklaracji MyConn, lecz to mały problem
- AdForwardOnly - nie ma takiej stałej i kompilator by Ci to wskazał.
Przypuszczam, że miałeś na myśli adOpenForwardOnly.
Wartości tych stałych i innych zmiennych przy obsłudze bazy danych są bardzo istotne.
2. W zestawie:
CursorType:=adOpenForwardOnly, LockType:=adLockOptimistic
kursor po stronie servera i tak nie jest wcale adOpenForwardOnly tylko adOpenKeyset, podejrzyj sobie.
Musiałbyś użyć: CursorType:=adOpenForwardOnly, LockType:=adLockReadOnly.
Cytat:When you select a CursorType that is not supported, the provider should select the CursorType...
Nie wiem, jaki masz powód, aby kursor był po stronie servera.
FinalRow = Range("A65536").End(xlUp).row, nawet z uwagą Rysia nie zawsze jest OK.
Zwłaszcza, gdy już coś do zakresu było wpisywane i nie tylko wtedy.
Ja bym wykorzystała: adUseClient, adOpenStatic, adLockReadOnly
Ponieważ CopyFromRecordset przesuwa na EOF, potem MoveLast i RecordCount.
3. O tym czy Recordset ma, że tak powiem rekordy, informuje:If Not (Rst.BOF And Rst.EOF) Then
4. Przenigdy nie należy pomijać obsługi błędów, jeżeli sięgamy do bazy danych.
Grozi to pozostaniem pliku ldb (laccdb) - niemożnością ponownego otwarcia, a nawet uszkodzeniem bazy danych.
Nawet jeśli Bill takie przykłady prezentuje.
5. Jeśli już Set WSOrig = ActiveSheet to w obsłudze błędów musi być:
Set WSOrig = Nothing
6. Aby wpisywać do komórek nie trzeba "wachlować" Select ani Activate (tylko w wyjątkowych wypadkach jest to potrzebne)
7. Do procedury przekazałabym Range docelowe itd...
8. Polskie znaki...w nazwach się zemszczą...
P.S. Formalnie należałoby jeszcze sprawdzić czy mdb nie jest otwarta w trybie wyłączności przez innego usera, pominęłam...
W przybliżeniu tak:
Dim strMdbFullName As String
strMdbFullName = Sciezka2Mdb & "\nazwa_pliku.mdb"
Call ImportDanych(strMdbFullName, "1", Sheets("ark1").Range("A1")) Option Explicit
Sub ImportDanych(ByVal MyConn As String, _
ByVal sID As String, _
Target As Excel.Range)
On Error GoTo ImporDanyc_Error
Dim Cnn As ADODB.Connection
Dim Rst As ADODB.Recordset
Dim sSQL As String
Dim FinalRow As Long
sSQL = "SELECT IDartykulu, nr_artykulu, Opis, Ilosc, Nr_atestu FROM nazwa_tabeli "
sSQL = sSQL & " WHERE IDartykulu=" & sID
' Call ScreenCalcEvents(False)
Set Cnn = New ADODB.Connection
With Cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.CursorLocation = adUseClient
.Open MyConn
End With
Set Rst = New ADODB.Recordset
With Rst
.CursorType = adOpenStatic
.LockType = adLockReadOnly
Set .ActiveConnection = Cnn
.Open sSQL, , , , adCmdText
FinalRow = 1
Target.Cells(1, 1).Resize(, 5) = Array("ID", "Nr artykułu", "Opis", "Ilość", "Nr atestu")
If Not (.BOF And .EOF) Then ' to jest info ze nie ma Recs
Target.Cells(1, 1).Offset(1, 1).CopyFromRecordset Rst
.MoveLast ' bo jest EOF
FinalRow = .RecordCount
End If
.Close
End With
Set Rst = Nothing
Cnn.Close
Set Cnn = Nothing
If FinalRow = 1 Then
' ....
MsgBox "Brak danych"
Else
MsgBox FinalRow
End If
'---------------------
ImporDanyc_Exit:
On Error Resume Next
Call CloseRSObject(Rst)
Call CloseRSObject(Cnn)
' Call ScreenCalcEvents(True)
Exit Sub
ImporDanyc_Error:
MsgBox "Błąd : ( " & Err.Number & " ) " & Err.Description & vbCrLf & _
"Procedura : " & "ImporDanyc", vbExclamation
Resume ImporDanyc_Exit
End Sub
'--------------------------------------------
Public Sub CloseConObject(Cnn As ADODB.Connection)
On Error Resume Next
If Not (Cnn Is Nothing) Then
If Cnn.State = adStateOpen Then Cnn.Close
Set Cnn = Nothing
End If
End Sub
Public Sub CloseRSObject(Rs As ADODB.Recordset)
On Error Resume Next
If Not (Rs Is Nothing) Then
With Rs
If CBool(.State And adStateOpen) Then
If .EditMode <> adEditNone Then .CancelUpdate
.Close
End If
End With
Set Rs = Nothing
End If
End Sub
Public Sub ScreenCalcEvents(Optional ByVal bTrue As Boolean)
On Error Resume Next
With Application
If bTrue Then
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
Else
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End If
End With
End Sub |