كيفية تمرير معلمات الاتصال بين الوحدات النمطية في ماكرو إكسيل

StackOverflow https://stackoverflow.com//questions/22080934

  •  24-12-2019
  •  | 
  •  

سؤال

أنا خلق 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

نصائح أخرى

تعلن الاتصال ومجموعة السجلات في الجزء العلوي من الوحدة النمطية القياسية، خارج أي إجراءات وتعيين ملحقاتهم للجمهور.

تذكر تنظيف الموارد بعد الانتهاء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top