Automatisation de requete ODBC

vinzopus Messages postés 4 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 25 mars 2008 - 14 mars 2008 à 11:44
vinzopus Messages postés 4 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 25 mars 2008 - 25 mars 2008 à 13:29
Bonjour,

Je cherche à automatiser une requete ODBC, ie:
- extraire un certain nbre de données
- les traiter
- effacer les données extraites et en extraire d'autres
...

La difficulté que je rencontre est que je n'arrive pas à faire plus d'une requête, lorsque j'exécute tout mon code: au delà des erreurs apparaissent!
Voici d'abord tout le code (désolé je ne sais pas si on peut le mettre mieux en page que cela sur ce forum):

Option Explicit
Option Base 1





'je commence par créer deux tableaux contenant
'les noms des CF et les heures correspondantes
Public tabCF(40) As String, tabH(40) As Double



'naff est le numéro de l'affaire pour laquelle on va faire la requete
'ligAff est le n° de la ligne correspondante dans la feuille "données"
'ligCoutsMO est le n° de la ligne correspondant au n° d'affaire dans la feuille "couts MO"
Public naff As Integer, ligAff As Integer, ligCoutsMO As Integer



Sub remplirCF()
   
    Dim a As Integer
    For a = 1 To UBound(tabCF)
        tabCF(a) = ""
    Next
   
    tabCF(1) = "n° aff"
   
    'je copie les CF de la feuille "couts" dans le tabCF
    Worksheets("couts").Select
    Dim i As Integer
    For i = 4 To 23
        tabCF(i - 2) = Cells(5, i)
    Next
    tabCF(22) = Cells(5, 3)
    tabCF(23) = Cells(5, 24)
    tabCF(24) = Cells(5, 25)
   
    'je recopie ces valeurs dans la feuille "coutsMO"
    Worksheets("couts MO").Select
    Dim j As Integer
    For j = 1 To 24
        Cells(1, j) = tabCF(j)
    Next j
       
End Sub
Sub completerCF()
    Worksheets("couts MO").Select
    Dim p As Integer
    For p = 25 To UBound(tabCF)
        Cells(1, p) = tabCF(p)
    Next p
End Sub
'effectue la somme des heures par CF de la feuille "requete",
'et les enregistre dans le tableau tabH
Sub sommeH()
    Dim m As Integer, ligne As Integer, som As Double, cf As String
   
    'on reinitialise le tableau des heures
    For m = 1 To UBound(tabH)
        tabH(m) = 0
    Next m
   
    tabH(1) = naff



    cf = Cells(2, 1).Value
    som = 0
    ligne = 2
   
    If cf = "" Then
        MsgBox "Attention: pas de données dans la feuille requete pour l'affaire" & naff
    End If
   
    'on suppose que les CF sont en colonne 1 et les temps passes en colonne 2
    While cf <> ""
        'on somme les h tant qu'on ne change pas de CF
        While cf = Cells(ligne, 1)
            som = som + Cells(ligne, 2)
            ligne = ligne + 1
        Wend
       
        'on enregistre la valeur de som dans tabH, dans la bonne colonne
        tabH(chercheDansTabCF(cf)) = som
       
        'on réinitialise som et on passe au CF suivant
        som = 0
        cf = Cells(ligne, 1)
    Wend
    'ActiveWindow.SelectedSheets.Delete
   
End Sub
Function chercheDansTabCF(CentreFrais As String) As Integer
    Dim n As Integer
    n = 1
   
    While n < UBound(tabCF)
        If tabCF(n) = CentreFrais Then
            chercheDansTabCF = n
            Exit Function
        End If
        n = n + 1
    Wend
   
    'si cf n'est pas dans tabCF on l'ajoute
    n = 25
    While n < UBound(tabCF)
        If tabCF(n) = "" Then
            tabCF(n) = CentreFrais
            chercheDansTabCF = n
            Exit Function
        End If
        n = n + 1
    Wend
    MsgBox "Pb dans la fonction chercheDansTabCF"
       
End Function
Sub remplircoutsMO()
    Worksheets("couts MO").Select
    Dim o As Integer
    For o = 1 To UBound(tabH)
        Cells(ligCoutsMO, o) = tabH(o)
    Next o
End Sub





'la sub renvoie le n° d'affaire suivant
'et la dernière ligne qui lui correspond dans la feuille "données"



Sub prochaineAff()
    Worksheets("données").Select
   
    'si le tableau ne contient pas de données, un message s'affiche
    If naff = 0 Then
        MsgBox "Il n'y pas d'affaires dans la feuille données"
        Exit Sub
    End If
   
    'on cherche le n° de la dernière ligne contenant le n° d'affaire
    While Cells(ligAff + 1, 1) = naff
        ligAff = ligAff + 1
    Wend
   
    'je sélectionne la 1ère ligne du groupe qui contient le n° d'affaire suivant
    ligAff = ligAff + 1
    naff = Cells(ligAff, 1)
      
End Sub
   
Sub Prog()
   
    'je commence par remplir la feuille "couts MO" avec les bons noms de CF
    remplirCF
   
    'j'initialise mes variables naff et ligAff
    naff = Worksheets("données").Cells(2, 1)
    ligAff = 2
    ligCoutsMO = 2
   
    While naff <> 0
        'j'effectue la requete avec le n° d'affaire
        'requeteAffCreeFeuille
        requeteMultiple
        'reqVinz
        'j'effecute la somme des heures par CF et remplie tabH
        sommeH
        'je recopie tabH dans la feuille "couts MO"
        remplircoutsMO
        'je sélectionne le prochain n° d'affaire
        prochaineAff
        ligCoutsMO = ligCoutsMO + 1
    Wend
   
    'j'ajoute les CF "bizarres"
    completerCF
        
End Sub




Et voici celui de la partie qui fait difficulté (naff est le paramètre que je fais varier d'une requête à l'autre):

Sub requeteMultiple()
'
' requeteMultiple Macro
' Macro enregistrée le 12/03/2008 par SCAFFHOLDING
'



    Worksheets("requete").Select
    Cells.Select
    Selection.ClearContents
    'Selection.QueryTable.Delete
    Range("A1").Select
    With ActiveSheet.QueryTables.Add(Connection:= _
        "ODBC;DSN=Base de données WCLIP;;ANA=c:\wclipper\WCLIP.wd5\WCLIP.wdd;;REP=T:\FICHIERS\GALVA-AFA\;" _
        , Destination:=Range("A1"))
        .CommandText = Array( _
        "SELECT POINT.COFRAIS, POINT.TPSPASSE" & Chr(13) & "" & Chr(10) & "FROM c:\wclipper\WCLIP.wd5\WCLIP.wdd~POINT POINT" & Chr(13) & "" & Chr(10) & "WHERE (POINT.NAF=" & naff & ")" & Chr(13) & "" & Chr(10) & "ORDER BY POINT.COFRAIS" _
        )
        .Name = "Lancer la requête à partir de Base de données WCLIP_17"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False
    End With
End Sub





Ce qui est bizarre c'est que quand je lance la requête toute seule, en faisant une boucle et naff variant dans cette boucle, ca marche!

Quelqu'un a-t-il une idée?
Merci beaucoup!

Vincent

5 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 mars 2008 à 11:55
Gaffe ou tu posteras tes futurs messages...

Vous êtes ici : Thèmes / VB.NET et VB 2005 /

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
vinzopus Messages postés 4 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 25 mars 2008
14 mars 2008 à 12:07
Désolé mais je ne trouve pas la section VBA dans la liste déroulante au moment de choisir le thème de mon message...!
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
14 mars 2008 à 12:26
Thèmes
/
Visual Basic 6
/
Langages dérivés
/
VBA
/

remplacer
With ActiveSheet.QueryTables.Add

par

If ActiveSheet.QueryTables.Count = 0 then
   ActiveSheet.QueryTables.Add
End If
With ActiveSheet.QueryTables.Item(1)

simple idée... ne pas ajouter des tas de QueryTable, mais juste mettre a jour

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
vinzopus Messages postés 4 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 25 mars 2008
14 mars 2008 à 14:19
Merci mais ca ne change pas grand chose...
En fait je viens d'essayer une boucle For au lieu de While dans ma Sub Prog(), et ca marche!
je ne sais pas pourquoi! Mais ca devrait me permettre de m'en sortir!

Merci encore
Vincent
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vinzopus Messages postés 4 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 25 mars 2008
25 mars 2008 à 13:29
Bonjour,

Après une pause je me relance dans mon problème de requête.

Voici désormais ma situation:
- si je mets partout False pour BackGroundQuery
>ca marche pour les "bons" numéros d'affaires (ie ceux qui renvoient un enregistrement)
>ca renvoie une erreur '1004' sur BackGroundQuery pour les "mauvais" numéros d'affaires (ie ceux pour lesquelles la requête ne renvoie rien)

- si je mets partout True pour BackGroundQuery
>tous les types de requête marchent bien, mais uniquement à la toute fin de ma procédure. Tout le programme s'exécute ainsi avant que le bon résultat de la requête ne s'affiche (or je veux exploiter ce résultat...)

Quelqu'un saurait-il comment résoudre l'un ou l'autre des problèmes?

Merci encore!

Vincent
0
Rejoignez-nous