VBA - إنشاء ADODB.Recordset من محتويات جدول البيانات
سؤال
أنا أعمل على تطبيق Excel الذي يستفسر عن قاعدة بيانات SQL. يمكن أن تستغرق الاستعلامات وقتًا طويلاً للركض (20-40 دقيقة). إذا فاتني شيء ما ، فقد يستغرق الأمر وقتًا طويلاً للخطأ أو الوصول إلى نقطة استراحة. يمكنني حفظ النتائج إلى ورقة غرامة ، عندما أعمل مع مجموعات السجلات التي يمكن أن تنفجر الأشياء.
هل هناك طريقة لتحميل البيانات في ADODB.RecordSet عندما أقوم بتصحيح الأخطاء لتخطي الاستعلام عن قاعدة البيانات (بعد المرة الأولى)؟
هل سأستخدم شيئًا كهذا؟
ورقة عمل Query Excel في MS-Access VBA (باستخدام مجموعة سجل ADODB)
المحلول
اضطررت إلى تثبيت MDAC للحصول على msado15.dll وبمجرد أن حصلت عليه أضفت إشارة إليها من (على Win7 64bit):
C: Program Files (x86) Common Files System ado msado15.dll
ثم قمت بإنشاء وظيفة لإرجاع كائن ADODB.RecordSet عن طريق تمرير اسم ورقة موجود في المصنف النشط حاليًا. إليك الرمز لأي شخص آخر إذا احتجوا إليه ، بما في ذلك Sub Test () لمعرفة ما إذا كان يعمل:
Public Function RecordSetFromSheet(sheetName As String)
Dim rst As New ADODB.Recordset
Dim cnx As New ADODB.Connection
Dim cmd As New ADODB.Command
'setup the connection
'[HDR=Yes] means the Field names are in the first row
With cnx
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source='" & ThisWorkbook.FullName & "'; " & "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"
.Open
End With
'setup the command
Set cmd.ActiveConnection = cnx
cmd.CommandType = adCmdText
cmd.CommandText = "SELECT * FROM [" & sheetName & "$]"
rst.CursorLocation = adUseClient
rst.CursorType = adOpenDynamic
rst.LockType = adLockOptimistic
'open the connection
rst.Open cmd
'disconnect the recordset
Set rst.ActiveConnection = Nothing
'cleanup
If CBool(cmd.State And adStateOpen) = True Then
Set cmd = Nothing
End If
If CBool(cnx.State And adStateOpen) = True Then cnx.Close
Set cnx = Nothing
'"return" the recordset object
Set RecordSetFromSheet = rst
End Function
Public Sub Test()
Dim rstData As ADODB.Recordset
Set rstData = RecordSetFromSheet("Sheet1")
Sheets("Sheet2").Range("A1").CopyFromRecordset rstData
End Sub
بيانات SEET1: Field1 Field2 Field3 Red A 1 Blue B 2 Green C 3
ما يجب نسخه إلى الورقة 2: أحمر A 1 BLUE B 2 Green C 3
هذا يوفر لي قدراً هائلاً من الوقت من الاستعلام ضد SQL في كل مرة أرغب في إجراء تغيير واختباره ...
-روبرت
نصائح أخرى
الأسهل سيكون للاستخدام rs.Save "filename"
و rs.Open "filename"
لتسلسل السجلات من جانب العميل إلى الملفات.