Simplification de Macro

  • Initiateur de la discussion Initiateur de la discussion cissou69
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

cissou69

XLDnaute Junior
Bonjour,

Je suis tout débutant en programmation VBA sous Excel et j'ai créé cette macro qui me sert à rapatrier des données depuis un serveur avec un logiciel particulier "PI".
Mon souci est que je la trouve très répétitive... je pense qu'il est faisable d'améliorer ça mais je ne sais pas comment ?!

J'ai copié le code ci-dessous :

Code:
Sub Recup_PI_EP8()
'
' Recup_PI_EP8 Macro
' Macro recorded 15/07/2010 by Cissou
'
'
Dim sTagname As String
Dim sTime As String
Dim sServer As String
Dim macroResult As Variant

sServer = "10.123.456.78"

i = 8
j = 8
a = 1
b = 1

' Recherche des dates
Do While a <> ""
    a = Cells(j, 7).Value
    j = j + 1
Loop
j = j - 2
    
' Recherche des valeurs pour le premier tag
Do While b <> ""
    b = Cells(i, 21).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 21).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 21).Value = macroResult
        If Cells(k, 21).Value = "No Data" Then
            Cells(k, 21).Value = ""
        End If
    Next
                     
End If

' L'opération est répétée pour chaque tag désiré, le code est copié, seule la colonne est modifiée

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 22).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 22).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 22).Value = macroResult
        If Cells(k, 22).Value = "No Data" Then
            Cells(k, 22).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 23).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 23).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 23).Value = macroResult
        If Cells(k, 23).Value = "No Data" Then
            Cells(k, 23).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 24).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 24).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 24).Value = macroResult
        If Cells(k, 24).Value = "No Data" Then
            Cells(k, 24).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 25).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 25).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 25).Value = macroResult
        If Cells(k, 25).Value = "No Data" Then
            Cells(k, 25).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 26).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 26).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 26).Value = macroResult
        If Cells(k, 26).Value = "No Data" Then
            Cells(k, 26).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 27).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 27).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 27).Value = macroResult
        If Cells(k, 27).Value = "No Data" Then
            Cells(k, 27).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 28).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 28).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 28).Value = macroResult
        If Cells(k, 28).Value = "No Data" Then
            Cells(k, 28).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 29).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 29).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 29).Value = macroResult
        If Cells(k, 29).Value = "No Data" Then
            Cells(k, 29).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 30).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 30).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 30).Value = macroResult
        If Cells(k, 30).Value = "No Data" Then
            Cells(k, 30).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 31).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 31).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 31).Value = macroResult
        If Cells(k, 31).Value = "No Data" Then
            Cells(k, 31).Value = ""
        End If
    Next
                     
End If


i = 8
b = 1

Do While b <> ""
    b = Cells(i, 32).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 32).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 32).Value = macroResult
        If Cells(k, 32).Value = "No Data" Then
            Cells(k, 32).Value = ""
        End If
    Next
                     
End If


i = 8
b = 1

Do While b <> ""
    b = Cells(i, 33).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 33).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 33).Value = macroResult
        If Cells(k, 33).Value = "No Data" Then
            Cells(k, 33).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 34).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 34).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 34).Value = macroResult
        If Cells(k, 34).Value = "No Data" Then
            Cells(k, 34).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 35).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 35).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 35).Value = macroResult
        If Cells(k, 35).Value = "No Data" Then
            Cells(k, 35).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 36).Value
    i = i + 1
Loop
i = i - 2

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 36).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 36).Value = macroResult
        If Cells(k, 36).Value = "No Data" Then
            Cells(k, 36).Value = ""
        End If
    Next
                     
End If

i = 8
b = 1

Do While b <> ""
    b = Cells(i, 37).Value
    i = i + 1
Loop
i = i - 2

If i = j Then MsgBox ("Pas de mise à jour à effectuer")

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 37).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 37).Value = macroResult
        If Cells(k, 37).Value = "No Data" Then
            Cells(k, 37).Value = ""
        End If
    Next
             
    ok = MsgBox("opération terminée", vbOKOnly, "Recup PI EP8")
       
End If

If i > j Then MsgBox ("Il manque des dates")

'
End Sub

Ma demande est de m'orienter pour établir une boucle plus simple et peut être moins répétitive...
Merci d'avance pour votre aide.

Cissou
 
Dernière édition:
Re : Simplification de Macro

Bonjour Cissou,

tu dois mettre ceci (et toute la suite)dans une boucle
Code:
Do While b <> ""
    b = Cells(i, 22).Value
    i = i + 1
Loop
i = i - 2
 
If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, 22).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, 22).Value = macroResult
        If Cells(k, 22).Value = "No Data" Then
            Cells(k, 22).Value = ""
        End If
    Next
 
End If
exemple de boucle:
Code:
[B][COLOR=blue]For f = 22 To 37[/COLOR][/B]
Do While b <> ""
    b = Cells(i, [B][COLOR=blue]f[/COLOR][/B]).Value
    i = i + 1
Loop
i = i - 2
 
If i < j Then
    For k = i + 1 To j
        sTime = Cells(k,[COLOR=black]7[/COLOR]).Value
        sTagname = Cells(5,[B][COLOR=blue] f[/COLOR][/B]).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, [B][COLOR=blue]f[/COLOR][/B]).Value = macroResult
        If Cells(k, [COLOR=blue][B]f[/B][/COLOR]).Value = "No Data" Then
            Cells(k, [COLOR=blue][B]f[/B][/COLOR]).Value = ""
        End If
    Next
 
End If
[COLOR=blue][B]Next f[/B][/COLOR]

à+
Philippe
 
Dernière édition:
Re : Simplification de Macro

Bonjour Cissou et phlaurent55,

J'ai rajouté la définition de quelques variables.

Bien sûr sans test on ne peut guère garantir le résultat car la syntaxe est sûrement améliorable.

Sub Recup_PI_EP8()
Dim sTagname As String, Time As String, sServer As String, macroResult As Variant, sTime, Ok As String
Dim a As Date, b As Date, i As Byte, j As Byte, k As Byte, Col As Byte
sServer = "10.125.243.65"

i = 8: j = 8: a = 1: b = 1

' Recherche des dates
Do While a <> ""
a = Cells(j, 7).Value
j = j + 1
Loop
j = j - 2


For Col = 21 To 36
' Recherche des valeurs pour le premier tag
Do While b <> ""
b = Cells(i, 21).Value
i = i + 1
Loop
i = i - 2

If i < j Then
For k = i + 1 To j
sTime = Cells(k, 7).Value
sTagname = Cells(5, 21).Value
macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
Cells(k, 21).Value = macroResult
If Cells(k, 21).Value = "No Data" Then
Cells(k, 21).Value = ""
End If
Next

End If

Next Col

Do While b <> ""
b = Cells(i, 37).Value
i = i + 1
Loop
i = i - 2

If i = j Then MsgBox ("Pas de mise à jour à effectuer")

If i < j Then
For k = i + 1 To j
sTime = Cells(k, 7).Value
sTagname = Cells(5, 37).Value
macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
Cells(k, 37).Value = macroResult
If Cells(k, 37).Value = "No Data" Then
Cells(k, 37).Value = ""
End If
Next

Ok = MsgBox("opération terminée", vbOKOnly, "Recup PI EP8")

End If

If i > j Then MsgBox ("Il manque des dates")

End Sub
 
Re : Simplification de Macro

Bernard,

ton code est un peu complexe en écriture... et j'avoue ne pas tout comprendre au début...

Philippe,

Ce code me plait mais je ne sais pas comment lui faire afficher une msgbox qui signifie que la boucle a bouclé... car si je la laisse dans la boucle For f ... Next f elle va se répéter 16 fois !!
Or si je la sort de la boucle, est-ce sur que la boucle sera complète ?

Code:
' Recherche des valeurs pour les tag
i = 8
b = 1

For f = 22 To 37
Do While b <> ""
    b = Cells(i, f).Value
    i = i + 1
Loop
i = i - 2

If i = j Then MsgBox ("Pas de mise à jour à effectuer")

If i < j Then
    For k = i + 1 To j
        sTime = Cells(k, 7).Value
        sTagname = Cells(5, f).Value
        macroResult = Application.Run("PITimeDat", sTagname, sTime, sServer)
        Cells(k, f).Value = macroResult
        If Cells(k, f).Value = "No Data" Then
            Cells(k, f).Value = ""
        End If
    Next
             
    Ok = MsgBox("opération terminée", vbOKOnly, "Recup PI EP8")
       
End If

If i > j Then MsgBox ("Il manque des dates")

Next f
 
Dernière édition:
Re : Simplification de Macro

Re,
Ce code me plait mais je ne sais pas comment lui faire afficher une msgbox qui signifie que la boucle a bouclé... car si je la laisse dans la boucle For f ... Next f elle va se répéter 16 fois !!
Or si je la sort de la boucle, est-ce sur que la boucle sera complète ?
tu y parviendra facilement avec ceci ( à mettre en fin de boucle avant Next f )

If f = 27 Then
MsgBox("....ton message....")
End If

après avoir relu ton code, il faut "boucler" de 21 à 27 et pas 22 à 27

à+
Philippe
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
8
Affichages
233
Réponses
4
Affichages
177
Réponses
2
Affichages
201
Réponses
8
Affichages
466
Réponses
10
Affichages
281
Réponses
2
Affichages
123
Réponses
5
Affichages
232
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
169
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
479
Retour