Comment transmettre les paramètres de connexion entre les modules dans une macro Excel

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

  •  24-12-2019
  •  | 
  •  

Question

Je crée 2 rapports sur une seule feuille à l'aide d'une macro Excel.Les rapports se connectent à Oracle DB pour extraire les données.J'ai la chaîne de connexion qui extrait les données et cela fonctionne bien.Ce que j'essaie de faire, c'est de déplacer la chaîne de connexion vers une fonction et de la transmettre au rapport correspondant en fonction de la saisie de l'utilisateur.Voici un flux de haut niveau :1.L'utilisateur clique sur un bouton de menu.En arrière-plan, il essaie de se connecter à DB.2.Si la connexion réussit, il ouvre un formulaire avec 2 boutons (quel rapport l'utilisateur souhaite exécuter).Bouton A et bouton B 3.Supposons que l'utilisateur clique sur le bouton A, le rapport doit être exécuté et affiché.

Le problème auquel je suis confronté se situe à l'étape 2.Pour une raison quelconque, je ne parviens pas à transmettre les paramètres de connexion à la fonction du bouton A.

Vous trouverez ci-dessous l'extrait de code expliquant comment j'essaie de me connecter au dB.J'ai besoin d'aide pour savoir comment transmettre les paramètres de connexion à la fonction du bouton A.

Code de connexion à la base de données

       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

Dans le formulaire Générateur de rapport en passant les paramètres de date à la fonction

Private Sub Login_Click()
    Call ReportGenerator(FromDate.Value, ToDate.Value)
End Sub

Je dois transmettre les paramètres de connexion à la fonction CallReportGenerator.

Tous les indicateurs seront utiles.

Était-ce utile?

La solution

Il y en a plusieurs où vous pouvez faire ceci :

Option 1:Utiliser une variable globale

Si vous déclarez une variable comme Global sur le dessus d'un module, c'est-à-direavant tout sous/fonction, vous pouvez y accéder depuis n'importe quel autre module :

Exemple - Module1 :

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

Formulaire:

Private Sub CreateReport()
    dbConnect.Open gStrConnection
    ...
End Sub

Option 2:Passer la variable à une variable de formulaire locale

Déclarez une variable à l'échelle du module dans le module du formulaire (c'est-à-direoù vous placez l'autre code du formulaire).Ensuite, fournissez un petit sous-setter qui attribue la valeur.

Exemple - Module1 :

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

Formulaire:

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

Autres conseils

Déclarez la connexion et le jeu d'enregistrements en haut du module standard, en dehors des procédures et définir leurs accesseurs au public.

N'oubliez pas de nettoyer les ressources après votre fin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top