IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Intersecter deux Recordset - ou intersecter deux bdd [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2014
    Messages : 24
    Par défaut Intersecter deux Recordset - ou intersecter deux bdd
    Bonjour,

    je butte sur un souci depuis 2 jours.
    Je développe une macro Excel 2010 pour mettre en forme des données access.
    Je souhaite faire un intersect sur deux tables différentes.

    Dans ma première table, nommée Inscrits, je sélectionne les numéro de numéros de téléphone des inscrits (chaque numéro est unique).
    Dans ma deuxième table, nommée TransactionsClient, je sélectionne les numéros de téléphone qui ont été actifs
    J'arrive sans souci à charger mes résultats dans des Recordset nommés RS1 et RS2.

    Maintenant, je souhaite créer un nouveau recordset RS3 qui contiendra les numéros de téléphones qui sont dans les deux bases.
    Le but est de compter les numéros qui ont été actifs (numéros contenus dans les deux reccordset).

    Resultat RS1
    0202020202
    0101010101
    0303030303
    0404040404
    0505050505


    Resultat RS2
    0202020202
    0909090909
    0707070707
    0505050505

    Je souhaite obtenir le nombre de numéro RS1 contenu dans RS2 soit "2" dans mon exemple.

    Voici mon code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
        '''''''''''''''''''''''''''''''''''''''''''''''
        'Je charge un buffer avec les nouveaux inscrits
        'Je configure le type de connexion Access, et le chemin
        Set Cn1 = CreateObject("ADODB.Connection")
        strConnection1 = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & ThisWorkbook.Path & "Inscrits.accdb"
        Cn1.Open strConnection1
        'Je détermine les variables
        Dim rs1 As New ADODB.Recordset
        Dim strSql1 As String
        'Je configure la requête SQL
        strSql1 = "SELECT NumeroTel FROM Inscrits WHERE Date >=#" & DateDebut & "# and Date <#" & DateFin & "#;"
        'Je lance la requête
        Set rs1 = Cn1.Execute(strSql1)
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''
        'Je charge un buffer avec les numéros actifs
        'Je détermine les variables
        'Je configure le type de connexion Access, et le chemin
        Set Cn2 = CreateObject("ADODB.Connection")
        strConnection2 = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & ThisWorkbook.Path & "TransactionsClient.accdb"
        Cn2.Open strConnection2
        'Je détermine les variables
        Dim rs2 As New ADODB.Recordset
        Dim strSql2 As String
        'Je configure la requête SQL
        strSql2 = "SELECT DISTINCT NumeroTel FROM TransactionsClient WHERE Type in ('actif') and Date >=#" & DateDebut & "# and Date <#" & DateFin & "# ;"
        'Je lance la requête
        Set rs2 = Cn2.Execute(strSql2)
    Auriez-vous une idée sur la manière de procéder pour faire une telle intersection ?
    Les RS1 et RS1 sont des recordset temporaires, si vous avez une autre métode pour faire un intersect sur deux tables contenues dans deux bases différentes, je suis preneur.

    J'ai tenté de créer une boucle pour tester pour chaque enregistrement de RS1 s'il existe dans RS2 (si c'est le cas j'incrémente un compteur), mais cela ne fonctionne pas du tout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
        Dim mycompteur As Long
        'Je sélectionne l'objet RS1 (qui contient les numéros inscrits)
        rs1.MoveFirst
        'J'effectue une boucle pour tous les enregistrements de RS1
        Do While Not rs1.EOF
            'Pour chaque enregistrement dans RS1 (clients inscrit)
            For fCount = 0 To rs1.Fields.Count - 1
                'Je cherche dans ma requête rs2 (actifs) la présence de chaque enregistrement rs1 (inscrit)
                rs2.Find "[MsisdnBeneficiaire]=" & rs1.Fields(fCount).Value, , adSearchForward, 1
                Do While Not rs2.EOF
                    mycompteur = mycompteur + 1
                Loop
            'Je passe à l'enregistrement suivant
            Next fCount
            rs1.MoveNext
        Loop
        MsgBox "Resultat : " & mycompteur
    Merci à tous.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sql = "SELECT Inscrits.NumeroTel "
    Sql = Sql & "FROM Inscrits "
    Sql = Sql & "INNER JOIN TransactionsClient  ON TransactionsClient.NumeroTel = Inscrits.NumeroTel "
    Sql = Sql & "WHERE Inscrits.[Date] >=#" & DateDebut & "# and Inscrits.[Date] <#" & DateFin & "#;"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sql = "SELECT count(Inscrits.NumeroTel) "
    Sql = Sql & "FROM Inscrits "
    Sql = Sql & "INNER JOIN TransactionsClient  ON TransactionsClient.NumeroTel = Inscrits.NumeroTel "
    Sql = Sql & "WHERE Inscrits.[Date] >=#" & DateDebut & "# and Inscrits.[Date] <#" & DateFin & "#;"

  3. #3
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2014
    Messages : 24
    Par défaut
    Merci pour ce retour, mais comment l'intégrer dans mon code car je fait appel à deux bdd différentes et non deux tables dans une même base ?
    Est-ce une modification des mes RS1 ou 2, ou bien un RS3 ?
    Ce n'est pas très clair pour moi.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    je n'ai pas réécrits toute la requête mais le minimum pour te montrer.
    après tu peux rajouter la comparaison des date, le count ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test()
     Set Cn1 = CreateObject("ADODB.Connection")
        strConnection1 = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=C:\Users\Robert\Desktop\TransactionsClient.accdb"
        Cn1.Open strConnection1
        'Je détermine les variables
        Set rs1 = CreateObject("ADODB.Recordset")
        Sql = "SELECT DISTINCT TransactionsClient.NumeroTel FROM TransactionsClient "
        Sql = Sql & "WHERE TransactionsClient.NumeroTel in ("
        Sql = Sql & "SELECT [Inscrits].[NumeroTel] FROM  [Inscrits] IN 'C:\Users\Robert\Desktop\Inscrits.accdb'"
        Sql = Sql & ") "
        rs1.Open Sql, Cn1
    End Sub
    INNER JOIN marche également

  5. #5
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2014
    Messages : 24
    Par défaut
    C'est parfait.
    Merci pour cette résolution rapide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Excel] Fusionner deux LISTES avec Intersection
    Par courriervirtuel dans le forum Excel
    Réponses: 3
    Dernier message: 17/09/2011, 19h44
  2. intersection d'un volume et deux plans
    Par foufouta dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 17/05/2008, 20h33
  3. Réponses: 3
    Dernier message: 19/05/2006, 13h34
  4. impossible d'ouvrir deux recordset sur la meme connection ?
    Par requiemforadream dans le forum ASP
    Réponses: 3
    Dernier message: 28/04/2005, 09h31
  5. [VB6]Joindre deux recordsets en un seul
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 11/06/2003, 21h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo