vinzopus
Messages postés4Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention25 mars 2008
-
14 mars 2008 à 11:44
vinzopus
Messages postés4Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention25 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!
vinzopus
Messages postés4Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention25 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
vinzopus
Messages postés4Date d'inscriptionvendredi 14 mars 2008StatutMembreDernière intervention25 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?