Gestion variable boucle FOR

Résolu
MastJager Messages postés 21 Statut Membre -  
MastJager Messages postés 21 Statut Membre -
Bonjour,

J'ai besoin d'aide pour un problème de gestion de variables.
Le but de mon programme et de genérer un fichier .txt avec un formatage bien particulier de mes données inscrites sur mes feuilles Excel.

Actuellement je suis bloqué voici mon problème :

Je voudrais scruter la totalité de la colonne A jusqu'à la première ligne 'vide' avec un IsEmpty.
Faire une sorte de For 1 to IsEmpty(Feuil5.Cells(IP,1)
Avec ce For les 4 premières valeurs sont inscrites dans les variables E2,S2,E1,S1.
De plus, je voudrais inscrire ces 4 valeurs dans une nouvelle variable "Alarme(1)" qui contient les données E2,S2,E1,S1.

Pour résumé : Il y a x lignes dans ma feuil5 je voudrai que les lignes de 1 à 4 soit contenu dans les variables E2,S2,E1,S1 et que ces dernières soit enregistrer dans une variables Alarme(1) et ensuite ont recommence en prenant les variables 5 à 8 et inscrit dans Alarme(2)

Voici mon programme :
For IP = 1 To 21  '(IsEmpty(Feuil2.Cells(IP, 1)))

E2_ALARME = Feuil5.Cells(IP + 1, 1)
S2_ALARME = Feuil5.Cells(IP + 3, 1)
E1_ALARME = Feuil5.Cells(IP, 1)
S1_ALARME = Feuil5.Cells(IP + 2, 1)

Next

ALARME = "ITEM SYMBOL { " & vbCrLf & "NOM= " & nom_variable & vbCrLf & "TRAME=2000000,2ffffff,ffffffff,0" & vbCrLf & "CONTOUR=2ffffff,fffffff7,1" & vbCrLf & "UID=" & Hex(uID) & vbCrLf & "ANIMATION {" & vbCrLf & "@E2=&" & E2_ALARME & vbCrLf & "@S2=&" & S2_ALARME & vbCrLf & "@EI=&" & E1_ALARME & vbCrLf & "@SI=&" & S1_ALARME & vbCrLf & "}" & vbCrLf & "RECT=767,208,783,224" & vbCrLf & "Rotation = 0" & vbCrLf & "}"

3 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Bonjour

    ça pourrait ressembler à ceci

    Option Explicit  ' oblige à déclarer toutes les variables
    
    Public Sub OK()
    Dim IP As Long, n As Long, lifin As Long
    Dim ALARME()  ' tableau qu'on dimensionnera au fur et à mesure
    Dim E2_ALARME, S2_ALARME, E1_ALARME, S1_ALARME
    Dim AL As String
    Dim nom_variable, uID   ' variables utilisées dans ta procedure
    n = 0
    With Sheets("Feuil5")
      lifin = .Range("A" & Rows.Count).End(xlUp).Row
      For IP = 1 To lifin Step 4  ' on saute 4 ligne à chaque tour de boucle
        E2_ALARME = .Cells(IP + 1, 1)
        S2_ALARME = .Cells(IP + 3, 1)
        E1_ALARME = .Cells(IP, 1)
        S1_ALARME = .Cells(IP + 2, 1)
        AL = "ITEM SYMBOL { " & vbCrLf & "NOM= " & nom_variable & vbCrLf _
             & "TRAME=2000000,2ffffff,ffffffff,0" & vbCrLf & "CONTOUR=2ffffff,fffffff7,1" & vbCrLf _
             & "UID=" & Hex(uID) & vbCrLf & "ANIMATION {" & vbCrLf & "@E2=&" & E2_ALARME & vbCrLf _
             & "@S2=&" & S2_ALARME & vbCrLf & "@EI=&" & E1_ALARME & vbCrLf & "@SI=&" _
             & S1_ALARME & vbCrLf & "}" & vbCrLf & "RECT=767,208,783,224" & vbCrLf _
             & "Rotation = 0" & vbCrLf & "}"
        ' redimensionner le tableau ALARME et affecter à sa dernière case la variable AL
        n = n + 1
        ReDim Preserve ALARME(1 To n)
        ALARME(n) = AL
      Next IP
    End With
    End Sub

    Cdlmnt
    1
    1. MastJager Messages postés 21 Statut Membre
       
      Je test ceci au plus vite et je te redit ! Merci d'avance pour ton aide
      0
    2. MastJager Messages postés 21 Statut Membre
       
      Petite question, est ce que je pourrai utiliser la variable "AL" pour effectuer un Print dans un fichier txt ?
      Je ne sais pas si le VBA pour enregistrer un tableau. En effet la suite de programme ce déroule comme ceci :


      Open "D:\Users\test.txt" For Output As #1
      Print #1, "//EDITEUR DE SYNOPTIQUE - SYNO"
      Print #1, "//TIL TECHNOLOGIES (C)"
      Print #1, "//VERSION 2.8"

      Print #1, "Synoptique {" ' Début du fichier Synoptique
      Print #1, AL 'Ancienne variable ALARME

      Print #1, "CX=600" 'Début déclaration taille du synoptique
      Print #1, "CY=400"
      Print #1, "TRAME=2000000,2dcdcdc,1,1"
      Print #1, "SYMBOL LOCAL=0"
      Print #1, "LIBRAIRIE {"

      Print #1, "}" 'Fin du fichier Synoptique
      Print #1, "// Fin de fichier"

      Close #1 'Fermer le fichier


      Actuellement je répare l'érreur "9" "L'objet n'appartient pas à la sélection" Donc je n'est pas encore testé ton programme.

      Edit : Je viens de comprendre qu'il faut inscrire le Nom de la feuille.
      0
    3. MastJager Messages postés 21 Statut Membre
       
      La macro semble fonctionné, lors de l’exécution de celle ci le programme affiche bien les données de "AL" mais uniquement les dernières valeurs. Ceci doit être dût à mon Print, j'ai du mal le programmer pour qu'il lise toutes les itérations de la variable.

      Je vais tester de mon coter pour résoudre ce problème ! Cela me permettra de mieux comprendre ton programme ( Je débute évidemment :) )



      Option Explicit ' oblige à déclarer toutes les variables

      Public Sub OK()
      Dim IP As Long, n As Long, lifin As Long
      Dim ALARME() ' tableau qu'on dimensionnera au fur et à mesure
      Dim E2_ALARME, S2_ALARME, E1_ALARME, S1_ALARME
      Dim AL As String
      Dim nom_variable, uID ' variables utilisées dans ta procedure
      n = 0
      With Sheets("Ctrl ACCES RESULT ALARME")
      lifin = .Range("A" & Rows.Count).End(xlUp).Row
      For IP = 1 To lifin Step 4 ' on saute 4 ligne à chaque tour de boucle
      E2_ALARME = .Cells(IP + 1, 1)
      S2_ALARME = .Cells(IP + 3, 1)
      E1_ALARME = .Cells(IP, 1)
      S1_ALARME = .Cells(IP + 2, 1)
      AL = "ITEM SYMBOL { " & vbCrLf & "NOM= " & nom_variable & vbCrLf _
      & "TRAME=2000000,2ffffff,ffffffff,0" & vbCrLf & "CONTOUR=2ffffff,fffffff7,1" & vbCrLf _
      & "UID=" & Hex(uID) & vbCrLf & "ANIMATION {" & vbCrLf & "@E2=&" & E2_ALARME & vbCrLf _
      & "@S2=&" & S2_ALARME & vbCrLf & "@EI=&" & E1_ALARME & vbCrLf & "@SI=&" _
      & S1_ALARME & vbCrLf & "}" & vbCrLf & "RECT=767,208,783,224" & vbCrLf _
      & "Rotation = 0" & vbCrLf & "}"
      ' redimensionner le tableau ALARME et affecter à sa dernière case la variable AL
      n = n + 1
      ReDim Preserve ALARME(1 To n)
      ALARME(n) = AL
      Next IP
      End With

      Open "D:\Users\test.txt" For Output As #1
      Print #1, "//EDITEUR DE SYNOPTIQUE - SYNO"
      Print #1, "//TIL TECHNOLOGIES (C)"
      Print #1, "//VERSION 2.8"

      Print #1, "Synoptique {" ' Début du fichier Synoptique
      Print #1, AL

      Print #1, "CX=600" 'Début déclaration taille du synoptique
      Print #1, "CY=400"
      Print #1, "TRAME=2000000,2dcdcdc,1,1"
      Print #1, "SYMBOL LOCAL=0"
      Print #1, "LIBRAIRIE {"

      Print #1, "}" 'Fin du fichier Synoptique
      Print #1, "// Fin de fichier"

      Close #1 'Fermer le fichier

      End Sub
      0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    le programme affiche bien les données de "AL" mais uniquement les dernières valeurs.
    Ben oui, tu fénfint tes n valeurs AL, puis tu ouvres ton fichier, puis tu lui envoie AL (donc la derniere valeur calculée) puis tu envoies au fichier test la derniere valeur de AL
    On va faire ça en deux parties
    1. Remplir le tableau ALARME avec les n valeurs AL
    2. Créer le fichier test puis
    2.1 lui envoyer l'entête
    2.2. lui envoyer le tableau ALARME lihne par ligne (la boucle For ...)
    2.3. lui envoyer la partie fin de fichier
    Comme ceci
    Option Explicit ' oblige à déclarer toutes les variables
    
    Public Sub OK()
    Dim IP As Long, n As Long, lifin As Long, k As Long
    Dim ALARME() ' tableau qu'on dimensionnera au fur et à mesure
                 ' et qui contiendra les AL successifs
    Dim E2_ALARME, S2_ALARME, E1_ALARME, S1_ALARME
    Dim AL As String
    Dim nom_variable, uID ' variables utilisées dans ta procedure
    n = 0
    With Sheets("Ctrl ACCES RESULT ALARME")
      lifin = .Range("A" & Rows.Count).End(xlUp).Row
      For IP = 1 To lifin Step 4 ' on saute 4 ligne à chaque tour de boucle
        E2_ALARME = .Cells(IP + 1, 1)
        S2_ALARME = .Cells(IP + 3, 1)
        E1_ALARME = .Cells(IP, 1)
        S1_ALARME = .Cells(IP + 2, 1)
        AL = "ITEM SYMBOL { " & vbCrLf & "NOM= " & nom_variable & vbCrLf _
             & "TRAME=2000000,2ffffff,ffffffff,0" & vbCrLf & "CONTOUR=2ffffff,fffffff7,1" & vbCrLf _
             & "UID=" & Hex(uID) & vbCrLf & "ANIMATION {" & vbCrLf & "@E2=&" & E2_ALARME & vbCrLf _
             & "@S2=&" & S2_ALARME & vbCrLf & "@EI=&" & E1_ALARME & vbCrLf & "@SI=&" _
             & S1_ALARME & vbCrLf & "}" & vbCrLf & "RECT=767,208,783,224" & vbCrLf _
             & "Rotation = 0" & vbCrLf & "}"
        ' redimensionner le tableau ALARME et affecter à sa dernière case la variable AL
        n = n + 1
        ReDim Preserve ALARME(1 To n)
        ALARME(n) = AL
      Next IP
    End With
    ' le tableau ALARME est rempli avec les n AL
    ' il ne reste qu'à l'envoyer dans le fichier test
    Open "D:\Users\test.txt" For Output As #1
    ' en tête du fichier test
    Print #1, "//EDITEUR DE SYNOPTIQUE - SYNO"
    Print #1, "//TIL TECHNOLOGIES (C)"
    Print #1, "//VERSION 2.8"
    Print #1, "Synoptique {" ' Début du fichier Synoptique
     ' ecriture des n AL du tableau ALARME
    For k = 1 To n
      Print #1, ALARME(k)
    Next k
    ' fin du fichier test
    Print #1, "CX=600" 'Début déclaration taille du synoptique
    Print #1, "CY=400"
    Print #1, "TRAME=2000000,2dcdcdc,1,1"
    Print #1, "SYMBOL LOCAL=0"
    Print #1, "LIBRAIRIE {"
    Print #1, "}" 'Fin du fichier Synoptique
    Print #1, "// Fin de fichier"
    Close #1 'Fermer le fichier
    End Sub

    RQ. Tu devrais utiliser l'indentation dans ton code (décalages pour mettre en evidence les blocs de code)

    Cdlmnt
    1
    1. MastJager Messages postés 21 Statut Membre
       
      Bonjour,

      Désolé du retard ! Mais je tient à grandement te remercier le code fonctionne à merveille !
      Merci pour le temps consacré :=).

      P.S: Je vais coder sur Notepadd maintenant pour y voir plus claire avec les indentations !
      0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    Petite question, est ce que je pourrai utiliser la variable "AL" pour effectuer un Print dans un fichier txt
    oui comme tu as fait
    Print #1, AL

    Je ne sais pas si le VBA pour enregistrer un tableau.
    Comme il faut l'envoyer ligne par ligne, ce n'est pas la peine de mettre les AL dans un tableau
    0
    1. MastJager Messages postés 21 Statut Membre
       
      Pour moi il me semblait nécessaire d'avoir les AL dans un tableau pour pouvoir inscrire les valeurs de E2 E1 S1 S2, j'avoue que je ne savais pas que VBA ne permet pas d'enregistrer ! :/

      Penses-tu qu'il existerai une autre solution ? Ou ce sont les limites de VBA ?
      0