Créer un historique issu de requêtes SQL grâce à une macro
Bonjour,
Comme indiqué dans le titre, je souhaiterai créer un "historique" des résultats de mes requêtes:
Dans les deux premiers onglets de mon fichier, j'ai une requête qui va chercher des données via Oracle. Dans le troisième, je souhaiterai que vienne s'ajouter les les données qui ne sont pas déjà présentes et cela via une macro. Etant novice en VBA, j'ai commencé à écrire un code d'après des codes trouvés sur internet mais celui est, je crois, pas du tout optimisé et prends beaucoup de temps de traitement. Auriez vous quelques idées afin de l'améliorer?
Dans un second temps, je souhaiterai créer une deuxième fonctionnalité à ce fichier :
Dans mon troisième onglet, à partir de la colonne K, je vais remplir des informations soit à la main, soit d'après des listes. En fonction des infos rentrées, je souhaiterai créer une macro qui me génère un document type avec les lignes de mon fichier. Par exemple, je souhaiterai que toutes les lignes avec comme responsabilités moi soient affichées dans ce fichier créé.
Merci pour votre aide et vos réponses.
Cordialement
Pierro26
Ci-dessous le code déjà ecrit :
Sub Invoice_Follow_up()
Application.ScreenUpdating = False
'Declaration variables
Dim BMaximo1 As Variant
Dim BMaximo2 As Variant
'Declaration workbooks & worksheets
Set wb_WMATL = Workbooks("PI OPS Center Facturation Follow-up v1.xlsm")
Set ws_dashboard = wb_WMATL.Sheets("Invoice Follow-up")
Set ws_maximo1 = wb_WMATL.Sheets("Maximo VAN + GAR")
Set ws_maximo2 = wb_WMATL.Sheets("Maximo Betrieb")
'Information
ws_dashboard.Range("B2") = Date & " " & Time
'Refresh Maximo data
ws_maximo1.Activate
ws_maximo1.Range("A2").Select
Selection.ListObject.QueryTable.Refresh
nb_ligne_maximo1 = ws_maximo1.Range("A" & Application.Rows.Count).End(xlUp).Row
ws_maximo1.Range("A2:A" & nb_ligne_maximo1).Select
Selection.TextToColumns Destination:=ws_maximo1.Range("A2:A" & nb_ligne_maximo1), DataType _
:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
Tab:=True, Semicolon:=False, Comma:=False, Space:=False, Other:=True _
, OtherChar:="/", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
ws_maximo2.Activate
ws_maximo2.Range("A2").Select
Selection.ListObject.QueryTable.Refresh
nb_ligne_maximo2 = ws_maximo2.Range("A" & Application.Rows.Count).End(xlUp).Row
ws_maximo2.Range("A2:A" & nb_ligne_maximo2).Select
Selection.TextToColumns Destination:=ws_maximo1.Range("A2:A" & nb_ligne_maximo1), DataType _
:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
Tab:=True, Semicolon:=False, Comma:=False, Space:=False, Other:=True _
, OtherChar:="/", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
'Mise en memoire Maximo data
nb_ligne_maximo1 = ws_maximo1.Range("A" & Application.Rows.Count).End(xlUp).Row
BMaximo1 = ws_maximo1.Range("A2:H" & nb_ligne_maximo1)
nbligne_dbMaximo1 = UBound(BMaximo1)
nb_ligne_maximo2 = ws_maximo2.Range("A" & Application.Rows.Count).End(xlUp).Row
BMaximo2 = ws_maximo2.Range("A2:H" & nb_ligne_maximo2)
nbligne_dbMaximo2 = UBound(BMaximo2)
'Ajout des données
ws_dashboard.Activate
nb_ligne_dashboard = ws_dashboard.Range("A" & Application.Rows.Count).End(xlUp).Row
If nb_ligne_dashboard = 4 Then
nb_ligne_dashboard = 5
End If
'Boucle Maximo
For j = 1 To nbligne_dbMaximo1
addrow = 0
'Boucle dashboard
For i = 5 To nb_ligne_dashboard
'Si le work order correspond
If BMaximo1(j, 1) = ws_dashboard.Range("A" & i) Then
'Update des données de la ligne
ws_dashboard.Range("B" & i) = BMaximo1(j, 2)
ws_dashboard.Range("C" & i) = BMaximo1(j, 3)
ws_dashboard.Range("D" & i) = BMaximo1(j, 4)
ws_dashboard.Range("E" & i) = BMaximo1(j, 5)
ws_dashboard.Range("F" & i) = BMaximo1(j, 6)
ws_dashboard.Range("G" & i) = BMaximo1(j, 7)
ws_dashboard.Range("H" & i) = BMaximo1(j, 8)
addrow = 0
Exit For
Else
addrow = 1
End If
Next i
'Ajout ligne
If addrow = 1 Then
nb_ligne_dashboard = nb_ligne_dashboard + 1
ws_dashboard.Range("A" & nb_ligne_dashboard) = BMaximo1(j, 1)
ws_dashboard.Range("B" & nb_ligne_dashboard) = BMaximo1(j, 2)
ws_dashboard.Range("C" & nb_ligne_dashboard) = BMaximo1(j, 3)
ws_dashboard.Range("D" & nb_ligne_dashboard) = BMaximo1(j, 4)
ws_dashboard.Range("E" & nb_ligne_dashboard) = BMaximo1(j, 5)
ws_dashboard.Range("F" & nb_ligne_dashboard) = BMaximo1(j, 6)
ws_dashboard.Range("G" & nb_ligne_dashboard) = BMaximo1(j, 7)
ws_dashboard.Range("H" & nb_ligne_dashboard) = BMaximo1(j, 8)
ws_dashboard.Range("N1").Copy Destination:=ws_dashboard.Range("N" & nb_ligne_dashboard)
End If
Next j
For j = 1 To nbligne_dbMaximo2
addrow = 0
'Boucle dashboard
For i = 5 To nb_ligne_dashboard
'Si le work order correspond
If BMaximo2(j, 1) = ws_dashboard.Range("A" & i) Then
'Update des données de la ligne
ws_dashboard.Range("B" & i) = BMaximo2(j, 2)
ws_dashboard.Range("C" & i) = BMaximo2(j, 3)
ws_dashboard.Range("D" & i) = BMaximo2(j, 4)
ws_dashboard.Range("E" & i) = BMaximo2(j, 5)
ws_dashboard.Range("F" & i) = BMaximo2(j, 6)
ws_dashboard.Range("G" & i) = BMaximo2(j, 7)
ws_dashboard.Range("H" & i) = BMaximo2(j, 8)
addrow = 0
Exit For
Else
addrow = 1
End If
Next i
'Ajout ligne
If addrow = 1 Then
nb_ligne_dashboard = nb_ligne_dashboard + 1
ws_dashboard.Range("A" & nb_ligne_dashboard) = BMaximo2(j, 1)
ws_dashboard.Range("B" & nb_ligne_dashboard) = BMaximo2(j, 2)
ws_dashboard.Range("C" & nb_ligne_dashboard) = BMaximo2(j, 3)
ws_dashboard.Range("D" & nb_ligne_dashboard) = BMaximo2(j, 4)
ws_dashboard.Range("E" & nb_ligne_dashboard) = BMaximo2(j, 5)
ws_dashboard.Range("F" & nb_ligne_dashboard) = BMaximo2(j, 6)
ws_dashboard.Range("G" & nb_ligne_dashboard) = BMaximo2(j, 7)
ws_dashboard.Range("H" & nb_ligne_dashboard) = BMaximo2(j, 8)
ws_dashboard.Range("N1").Copy Destination:=ws_dashboard.Range("N" & nb_ligne_dashboard)
End If
Next j
'Mettre en forme ligne 4 jusqu'à dernière ligne
ws_dashboard.Rows("5").Copy
ws_dashboard.Rows("6:" & nb_ligne_dashboard).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
ws_dashboard.Range("A1").Select
Application.ScreenUpdating = True
'Supression des lignes non présentent dans l'extract
For i = 5 To nb_ligne_dashboard
For j = 1 To nbligne_dbMaximo1
If BMaximo1(j, 1) = ws_dashboard.Range("A" & i) Then
deleterow = 0
Exit For
Else
deleterow = 1
End If
Next j
If deleterow = 1 Then
ws_dashboard.Range("N" & i) = "6- Parts delivered"
End If
Next i
For i = 5 To nb_ligne_dashboard
For j = 1 To nbligne_dbMaximo2
If BMaximo2(j, 1) = ws_dashboard.Range("A" & i) Then
deleterow = 0
Exit For
Else
deleterow = 1
End If
Next j
If deleterow = 1 Then
ws_dashboard.Range("N" & i) = "6- Parts delivered"
End If
Next i
End SubTout d'abord un grand merci pour ta réactivité et ton aide! Mon objectif est quasi atteint avec ce que tu as déjà fait. Je souhaiterai simplement que les données extraites suivant le critère Go/NoGo, viennent remplir le tableau dans l'onglet extraction. Les champs à remplir sont ceux en vert.
La première colonne sera toujours A, la 3eme correspond à la date de l'extraction, la 4eme, la 9eme et la 10eme sont elles aussi remplies avec des données provenant des deux requêtes.
PS: serait-il possible de rajouter 2/3 commentaires sur ton code afin que je puisse comprendre comment il fonctionne et le modifier si besoin.
Merci pour ta réponse
Cordialement
Pierro26
Bonjour Gmb,
Je te renouvelle à nouveaux tous mes remerciements pour le temps que tu as passé sur le code. Il était parfait selon moi. Malheureusement le besoin a évolué, comme souvent.
Le nouveau besoin est le suivant : L’objectif des macros est de créer une sorte de tableau de bord regroupant différentes informations issues de requêtes. Celles-ci sont dans les deux premiers onglets. Elles vont chercher différentes données dans une base, les mêmes que dans mon exemple.
Sur ce tableau de bord, il faudrait que j’aie 3 boutons dans le 3ème onglet (tableau de bord) :
• Le premier serait un bouton « actualiser » qui viendrait ajouter toute nouvelle ligne non présente dans le tableau de bord mais présente dans un deux premiers onglets. (Fonctionnalité déjà présente)
• Le deuxième serait un bouton qui présenterait une facturation prévisionnelle suivant un critère GO/NOGO. (Fonctionnalité déjà présente)
• Le troisième serait une facturation réelle qui pourrait se faire sur un critère « To do » ou « Not to do ».
Concernant les extractions, elles se feraient toujours dans le même tableau (même nombre de colonnes, même entêtes). Par ailleurs serait-il possible d’enregistrer les extractions sous un fichier PDF séparément ?
Autre point, serait-il possible de faire un historique sur une cinquième feuille de l’ensemble des points réellement facturés ?
Merci pour ta réponse et n’hésite pas si tu as des questions.
Cordialement
Pierro26
Il est en fait facile de faire évoluer un besoin à l'infini, sans prendre la peine de bien réfléchir au départ pour définir qu'il est, surtout si cela ne coûte rien.
Pour ce qui me concerne, je passe la main.
Bye !
Bonsoir Gmb,
Il est vrai que je n'ai pas pris le temps de bien réfléchir à mon besoin, sur ce point je te rejoins. Je tiens à m'excuser pour la perte de temps générée. Je vais essayer de me débrouiller tout seul, bien que le nouveau besoin soit au delà de mes connaissances.
Encore une fois désolé.
Bonne soirée.
Cordialement
Pierro26