كيفية تمرير معلمات الاتصال بين الوحدات النمطية في ماكرو إكسيل
سؤال
أنا خلق 2 تقارير في ورقة واحدة باستخدام إكسيل ماكرو.تقارير الاتصال أوراكل ديسيبل لسحب البيانات.لدي سلسلة الاتصال التي تسحب البيانات وأنها تعمل بشكل جيد.ما أحاول القيام به هو نقل سلسلة الاتصال إلى وظيفة وتمريرها إلى التقرير المعني بناء على إدخال المستخدم.هنا هو تدفق مستوى عال:1.ينقر المستخدم على زر القائمة.في الخلفية يحاول الاتصال ديسيبل.2.إذا كان الاتصال ناجحا فإنه يفتح نموذجا مع 2 أزرار (التي تقرير المستخدم يريد تشغيل).الزر أ والزر ب 3.لنفترض أن المستخدم ينقر على الزر أ يجب تنفيذ التقرير وعرضه.
المشكلة التي أواجهها هي في الخطوة 2.لسبب ما أنا لست قادرا على تمرير المعلمات اتصال إلى زر وظيفة.
أدناه هو مقتطف من التعليمات البرمجية على كيف أحاول الاتصال دب.تحتاج إلى مساعدة حول كيفية تمرير معلمات الاتصال إلى زر وظيفة.
رمز للاتصال ديسيبل
Dim dbConnect As ADODB.Connection
Dim GetData As ADODB.Recordset
'Declare a set of variables to hold the username and password for the database
Dim strUserName As String
Dim strPassword As String
Dim strDatabase As String
Set GetData = New ADODB.Recordset
'***
On Error Resume Next
Set dbConnect = New ADODB.Connection
dbConnect.Open ( _
"User ID=" & strUserName & "; Password=" & strPassword & "; Data Source=" & strDatabase & "; Provider=msdaora")
'If the username or password is incorrect throw an error message
If (dbConnect.State <> 1) Or (Err <> 0) Then
intResult = MsgBox("Could not connect to the database. Check your user name and password." & vbCrLf & Error(Err), 16, " ")
Else
'.ConnectionString = dbConnect
ReportGenerator.Show ' this opens up another form where
' user can input the dates.
'This is turn calls the actual code...
End If
End Sub
في نموذج مولد التقرير تمرير معلمات التاريخ إلى الوظيفة
Private Sub Login_Click()
Call ReportGenerator(FromDate.Value, ToDate.Value)
End Sub
أحتاج إلى تمرير معلمات الاتصال إلى وظيفة كالريبورتجينيراتور.
أي مؤشرات ستكون مفيدة.
المحلول
هناك عدة كان يمكنك القيام بذلك:
الخيار 1:استخدم متغيرا عموميا
إذا قمت بتعريف متغير باسم Global
في الجزء العلوي من وحدة نمطية ، أي.قبل أي الغواصات / وظائف ، يمكنك الوصول إليها من أي وحدة أخرى:
مثال-الوحدة النمطية 1:
Option Explicit
Global gStrConnection As String 'g for Global scope
Sub Connect()
gStrConnection = "User ID=" & strUserName & "; Password=" & strPassword & "; Data Source=" & strDatabase & "; Provider=msdaora")
dbConnect.Open gStrConnection
...
End Sub
شكل:
Private Sub CreateReport()
dbConnect.Open gStrConnection
...
End Sub
الخيار 2:تمرير المتغير إلى متغير نموذج محلي
قم بتعريف متغير واسع للوحدة النمطية في وحدة النموذج (أي.حيث يمكنك وضع رمز آخر من النموذج).ثم قم بتوفير وحدة فرعية صغيرة تقوم بتعيين القيمة.
مثال-الوحدة النمطية 1:
Option Explicit
Sub Connect()
Dim strConnection as String
strConnection = "User ID=" & strUserName & "; Password=" & strPassword & "; Data Source=" & strDatabase & "; Provider=msdaora")
dbConnect.Open strConnection
...
ReportGenerator.StoreConnectionString strConnection
ReportGenerator.Show
...
End Sub
شكل:
Private mStrConnection as String 'm for module-wide scope
Public Sub StoreConnectionString(strConnection as String)
mStrConnection = strconnection
End Sub
Private Sub CreateReport()
dbConnect.Open mStrConnection
...
...
End Sub
نصائح أخرى
تعلن الاتصال ومجموعة السجلات في الجزء العلوي من الوحدة النمطية القياسية، خارج أي إجراءات وتعيين ملحقاتهم للجمهور.
تذكر تنظيف الموارد بعد الانتهاء.