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 :

Copie données issues de ADOdb et SQL dans feuille Excel. Double boucle trop longue [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut Copie données issues de ADOdb et SQL dans feuille Excel. Double boucle trop longue
    Bonjour,

    Nous utilisons SAP B1 HANA.
    Après avoir défini une connexion ADODB avec Recordset

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim cNBusinessPartner As ADODB.Connection
        Dim rsUserFacture As ADODB.Recordset
        Dim rsBusinessParner As Recordset
    j'établis la connexion (les XXX sont remplacés par mes valeurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       cNBusinessPartner.ConnectionString = "Driver={HDBODBC};ServerNode=XXX:XXX;Database=" & MyBaseSap & "; Uid=XXX;Password=XXX;"
       cNBusinessPartner.Open
     
      Set rsUserFacture = New ADODB.Recordset
    je créé une requête SQL qui va me chercher les données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         requete = "SELECT * FROM " & vbNewLine
         requete = requete & " (  " & vbNewLine
         requete = requete & "  SELECT T0.""DocNum"" AS ""DocNum"" " & vbNewLine
    etc...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       With rsUserFacture
           .CursorLocation = adUseClient
           .ActiveConnection = cNBusinessPartner
           .Open requete, cNBusinessPartner
        End With
    Par ailleurs, j'ai défini un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Dim MyRange() As Variant
    dans lequel je verse les données reçues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            MyRange = rsUserFacture.GetRows
            NbrCol = UBound(MyRange, 1)
            NbrRow = UBound(MyRange, 2)
    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Activité").Range(Cells(4, 4), Cells(NbrRow, NbrCol)) = MyRange
    C'est la cata, le positionnement des cellules n'est pas respecté.

    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
           For i = 0 To (NbrRow - 1)
            '  For i = 0 To 100
                For j = 0 To NbrCol
                    Worksheets("Facture").Cells(MyDebRowFactureData + i, MyDebColumnFacture + j).Value = MyRange(j, i)
                Next j
            Next i
    Nickel, cela fonctionne parfaitement ... avec quelques lignes (exemple ici 100 lignes pour le 1ier For mis en commentaire) !

    Sauf que j'ai 22 colonnes et environ plus de 10 000 lignes.

    L'utilisation de la double boucle pour remplir le tableau est beaucoup, beaucoup trop longue.

    Comment faire, quelle méthode utiliser pour être plus performant ?

  2. #2
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 290
    Par défaut
    Bonjour
    Vous demandez quelle méthode sera plus performante, je pense que Power Query sera plus approprié pour récupérer vos données que VBA.

    Menu Données/Obtenir des données/A partir d'une base de données/ A partir d'une base de données SAP HANA

    Stéphane

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut
    Citation Envoyé par Raccourcix Voir le message
    Bonjour
    Vous demandez quelle méthode sera plus performante, je pense que Power Query sera plus approprié pour récupérer vos données que VBA.

    Menu Données/Obtenir des données/A partir d'une base de données/ A partir d'une base de données SAP HANA

    Stéphane
    Merci pour votre réponse.
    Je n'ai copié qu'une partie du code qui fait bien d'autres choses.
    Mon but est que l'utilisateur ait simplement à appuyer sur un bouton.
    La solution PowerQuery que j'utilise personnellement par ailleurs n'entre pas dans ce contexte

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    Il existe la fonction Excel CopyFromRecordSet
    Worksheets("Activité").Range("D4").CopyFromRecordSet cNBusinessPartner.execute(requete)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim requete As String
    requete = "SELECT * FROM " & vbNewLine 'je créé une requête SQL qui va me chercher les données :
    requete = requete & " ( " & vbNewLine
    requete = requete & " SELECT T0.""DocNum"" AS ""DocNum"" " & vbNewLine
    'etc...
    With CreateObject("ADODB.Connection")
        .Open "Driver={HDBODBC};ServerNode=XXX:XXX;Database=" & MyBaseSap & "; Uid=XXX;Password=XXX;" 'j 'établis la connexion (les XXX sont remplacés par mes valeurs)
        Worksheets("Activité").Range("D4").CopyFromRecordset .Execute(requete)
        .Close
    End With
    End Sub

  5. #5
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Bonjour,

    Autre chose aussi. Quand on insère des données dans des cellules il faut d'abord désactiver les filtres éventuels sur la zone de destination sinon les données s'insère n'importe comment.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Bonjour,
    Il existe la fonction Excel CopyFromRecordSet
    Worksheets("Activité").Range("D4").CopyFromRecordSet cNBusinessPartner.execute(requete)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim requete As String
    requete = "SELECT * FROM " & vbNewLine 'je créé une requête SQL qui va me chercher les données :
    requete = requete & " ( " & vbNewLine
    requete = requete & " SELECT T0.""DocNum"" AS ""DocNum"" " & vbNewLine
    'etc...
    With CreateObject("ADODB.Connection")
        .Open "Driver={HDBODBC};ServerNode=XXX:XXX;Database=" & MyBaseSap & "; Uid=XXX;Password=XXX;" 'j 'établis la connexion (les XXX sont remplacés par mes valeurs)
        Worksheets("Activité").Range("D4").CopyFromRecordset .Execute(requete)
        .Close
    End With
    End Sub
    J'ai essayé la solution de Thumb down basée sur .CopyFromRecordset .Execute(requete)
    C'est exactement ce que je recherchais , la copie est instantanée.
    Un grand merci.
    J'indique que le post a été résolu

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

Discussions similaires

  1. [MySQL] Intercallage et affichage avec des données issues de plusieurs tables SQL
    Par vinceom92 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 02/03/2014, 14h37
  2. [RegEx] Utilisation de preg_replace sur des données issues d'une base SQL
    Par lorentdups dans le forum Langage
    Réponses: 5
    Dernier message: 04/02/2014, 12h12
  3. Transfert de données issues d'un formulaire vers une feuille excel
    Par elo1989 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/01/2014, 23h11
  4. [MySQL] Les données issues d'une requête SQL sont erronées
    Par edenreal dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 21/08/2009, 00h41
  5. Réponses: 5
    Dernier message: 27/05/2008, 18h43

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