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 :

Probleme de performance extraction données de BD Oracle vers Excel


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut Probleme de performance extraction données de BD Oracle vers Excel
    Bonjour,

    j'ai un problème de performance sur une extraction de données d'une base Oracle vers un classeur Excel. Le problème reside sur le nombre de colonne que contient le résultat de la requete (25 colonnes). ci joint le code qui parcours les enregistrement et qui les inserent dans chaque céllule.


    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
     
    '**************** Déclaration base de donnée
    Private OraSession As Object
    Private OraDatabase As Object
    Private theDynaset As Object
    ... connexion a la base de données ....
    '*******
     
    If theDynaset.RecordCount > 0 Then
     
        'On se place sur le premier enregistrement
        theDynaset.MoveFirst
        Dim i As Integer
        i = 1
     
        'on boucle pour retourner tous les enregistrements ( à remplacer par EOF car parcours table avec count)
         While Not Me.eof
        'On insère les résultats dans des tableaux excel
            For j = 1 To theDynaset.Fields.Count
            With Worksheets(resultatFeuille)
                .Cells(i + 8, j) = theDynaset.Fields(j - 1).Value
            End With
            Next j
            theDynaset.MoveNext
            i = i + 1
        Wend
     
    End If
    Si quelqu'un à une idée je suis preneur, merci d'avance de vos réponses

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    J'imagine que theDynaset est une requête, si c'est le cas test avec la méthode CopyFromRecordset de l'objet Range en te positionnant sur la première cellule que tu veux remplir.

    Starec

  3. #3
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 104
    Points : 124
    Points
    124
    Par défaut
    Salut,
    Trois pistes :
    1. Pourquoi ne pas utiliser une liaison de type Données, Données externes ?
    2. Regarde CopyFromRecordset
    3. S'il y a des formules dans ton classeur, encadre ton code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    application.calculation = xlmanual
    ' ton code ici
    application.calculation = xlautonatic

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    J'avais penser a la copy par cellule mais donc je recupere ligne par ligne et je les colle grace a la methode de copy dois je préciser un delimiteur ? Est ce fait automatiquement ? si vous auriez un petit bout de code ca serait hyper sympas !!

    Sinon les coups du manual et automatique j'ai pas trop compris l'intérêt, il faut que je mette juste mes traitements (insertion des enregistrements) à lintérieurs ?

    merci pour vos réponses aussi rapide je suis carément bluffé !!

  5. #5
    Invité
    Invité(e)
    Par défaut
    Re

    La méthode CopyFromRecordset (voir l'aide), te permets de redistribuer tes enregistrement de ton recordset dans un feuille Excel, à partir de la cellule de départ que tu lui donnes.

    Essayes et tu verras le résultat.

    Starec

  6. #6
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 104
    Points : 124
    Points
    124
    Par défaut
    Re,
    Citation Envoyé par Balbo Voir le message
    Sinon les coups du manual et automatique j'ai pas trop compris l'intérêt,
    Dès que tu affectes une cellule le recalcul démarre. Dans un classeur un peu lourd, c'est en général ça qui pénalise le plus les grosses boucles. En passant en manuel, tu n'auras qu'un recalcul en fin...
    il faut que je mette juste mes traitements (insertion des enregistrements) à lintérieurs ?
    Toute la boucle ! Sinon tu auras un recalcul à chaque fois pareil !
    Pense à traiter les erreurs pour être sûr de repasser en auto à la fin en cas de plantage...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    Donc ca donnerais ca ?

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    application.calculation = xlmanual
    Set theDynaset = OraDatabase.CreateDynaset(sReq, 0&)
    GoTo Fin
    Error:
        
        If Err.Number = 91 Then
            DB_Connect
            GoTo req
        Else
            MsgBox Err.Description & " " & Err.Number
        End If
        execSQL = Err.Number * -1
        GoTo Finfin
        'en fonction de l'erreur, ouvrir la base de donnée
    
    Fin:
     If theDynaset.RecordCount > 0 Then
    
        'On se place sur le premier enregistrement
        theDynaset.MoveFirst
        Dim i As Integer
        i = 1
     
    application.calculation = xlmanual  
        'on boucle pour retourner tous les enregistrements
    
         While Not Me.eof
        'On insère les résultats dans des tableaux excel
            For j = 1 To theDynaset.Fields.Count
            With Worksheets(resultatFeuille)
                .Cells(i + 8, j) = theDynaset.Fields(j - 1).Value
            End With
            Next j
            theDynaset.MoveNext
            i = i + 1
        Wend
    application.calculation = xlautonatic
    
    nd If
    Finfin:
    
    End Function
    Merci

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    Pour le CopyFromRecordSet je pense ne pas utiliser le bon driver pour la connexion a la base de données (ci joint le code ci dessous) puis je utiliser le recordSet avec cette methode de connexion à la base de données ?
    Et j ai compris en faite pour le calcul manuel et auto (merci pour l astuce au faite) mais il n'y as pas de formule sur les cellules en questions

    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
     
     
    '****************** Connexion a la base de donnees
    Sub DB_Connect()
    Dim sConnect As String
     
    On Error GoTo Error
    sConnect = sUser & "/" & sPsw
    sBase = strConnect
     
    ' Connexion à la base
    Set OraSession = CreateObject("OracleInProcServer.XOraSession")
    Set OraDatabase = OraSession.OpenDatabase(sBase, sConnect, 0&)
    connectBD = True
    ' Définition de la requête
    GoTo Fin
    Error:
        MsgBox Err.Description
        connectBD = False
        'en fonction d  e l'erreur, (ouverture déjà effectué) faire un resume next
    Fin:
     
    'Donne des informations sur la base de donnee sur laquelle on travail
     
    End Sub

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    Problème résolu j'ai utiliser la méthode CopyFromRecordSet en utiliser le driver de connexion de BD ADO et now plus de problème de performance.
    Merci a tous

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

Discussions similaires

  1. Extraction de donnée d'Oracle vers Excel
    Par risyalgy dans le forum Oracle
    Réponses: 0
    Dernier message: 09/07/2009, 15h24
  2. Probleme conversion fichier provenant d'une base oracle vers une base mysql
    Par jonnyboy dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 18/06/2009, 09h40
  3. Extraction de donnée par ADO ACCESS vers Excel
    Par roidurif dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/05/2009, 18h29
  4. [Oracle] extraire des données oracle vers excel
    Par chahrazed dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/04/2009, 11h29
  5. Export de données Oracle vers Excel via PHP
    Par Yanos dans le forum Oracle
    Réponses: 1
    Dernier message: 11/01/2006, 18h11

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