Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion: Formule macro, boucle sur un tableau [LibreOffice][Tableur]

  1. #1
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut Formule macro, boucle sur un tableau

    bonjour


    J'ai trouvé dans ce site, une macro

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub BoucleTableauxFeuille()
    Dim Ws As Worksheet
    Dim ListObj As ListObject
     
    Set Ws = Worksheets("Données brutes")
     
    For Each ListObj In Ws.ListObjects
        MsgBox ListObj.Name & " : " & ListObj.Range.Address & vbCrLf & _
        "Style: " & ListObj.TableStyle
    Next
    End Sub
    qui permettrait, si j'ai bien compris, de "boucler" un tableau se trouvant sur une feuille.

    J'ai changé Ws = Worksheets("feuill1") en Ws = Worksheets("Données brutes") mais, je pense qu'il manque les références de mon tableau.

    Pouvez-vous m'aider ?

  2. #2
    Membre éprouvé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 537
    Points : 996
    Points
    996

    Par défaut

    Bonjour,

    Cette macro en VBA affiche successivement le nom des différents tableaux structurés situés sur une feuille Excel.

    Ce n'est pas une macro LibreOffice Basic.

    PS : Libre Office ne reconnait pas les tableaux structurés d'Excel.
    Cordialement,
    Patrice

  3. #3
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut

    Bonjour,

    Ok merci pour l'explication



    Je cherche le moyen de répéter un tableau se trouvant sur une feuille autant de fois que nécessaire. Je suppose que c'est possible avec des macros openoffice / libreoffice, mais concernant les macros, je suis nul part et je ne sais pas par où commencer.

    Je cherche pour le moment, des exemples de code afin d'apprendre mais j'en trouve beaucoup pour excel et pas pour libOO. J'ai sûrement mal cherché mais je n'en trouve pas.

  4. #4
    Membre éprouvé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 537
    Points : 996
    Points
    996

    Par défaut

    Bonjour,

    Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Option Explicit
    Sub CopyTableau()
     Dim Classeur as Object
     Dim Feuille as Object
     Dim Tableau as Object
     Dim Cible as Object
     Dim Copie as Object
    	Classeur = thisComponent
    	Feuille = Classeur.Sheets.getByName("Feuille1")
    	Tableau = Feuille.getCellRangeByName("A1:D4")
    	Classeur.CurrentController.select(Tableau)
    	Copie = Classeur.CurrentController.getTransferable()
    	Cible = Feuille.getCellRangeByName("C22")
    	Classeur.CurrentController.select(Cible)
    	Classeur.CurrentController.insertTransferable(Copie)
    End Sub
    Cordialement,
    Patrice

  5. #5
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Auditeur
    Inscrit en
    juillet 2012
    Messages
    6 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Auditeur
    Secteur : Conseil

    Informations forums :
    Inscription : juillet 2012
    Messages : 6 671
    Points : 70 279
    Points
    70 279
    Billets dans le blog
    15

    Par défaut

    Salut,

    Voici un tutoriel pour apprendre à utiliser les macros sous LibreOffice Calc : Utiliser oBasic dans le Tableur (Calc)

    Bonne lecture
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut

    Bonjour

    Merci à vous deux pour votre aide.

    Malik , je vais aller lire le lien que tu m'as transmis

    Patrice740 , j'ai essayé ton code et effectivement celui-ci fait bien la copie de mon tableau , merci à toi.

    Mais j'ai deux soucis

    1° il copie les formules de mon tableau de départ et j'aimerai n'avoir que les valeurs et non les formules du tableau de départ. Sinon lors de la copie il modifie les valeur en fonction de la zone de copie d'où des erreurs #REF
    2° De plus j'aimerai ajouter une boucle pour que la copie soit répétée autant de fois que nécessaire.

    Après lecture de la docu et recherche çi et là, j'ai trouvé un code (il devrait copier que les valeurs et non les formules) et je l'ai modifié en tenant compte des infos de ton code et de la docu mais il y a un problème donc je n'ai pas pu vérifier le résultat

    Ou peut-on modifier ton code pour qu'il ne copie que les valeurs et non la formule pour éviter un problème de référence ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     Option Explicit
            Sub CopyTableau()
             Dim Classeur as Object
             Dim DonneesCopier, DonneesColler, oRange, da as Object
             Dim nbreMois, i As Integer
             Dim Args(),Opts()
     
     
     
     
    Classeur = ThisComponent          
    DonneesCopier = Classeur.Sheets().getByName("Données brutes")
    nbreMois = DonneesCopier.getCellRangeByName("AA13")
    ' on copie la plage de cellules source
    oRange = DonneesCopier.getCellRangeByName("AD2:AI205")
    da = oRange.getDataArray
    ' on choisit la feuille de destination
    DonneesColler = Classeur.Sheets().getByName("Données brutes")
    ' on colle la plage de cellules source dans la plage destination
    oRange = DonneesColler.getCellRangeByName("AM2:AS205") 'la plage doit être de même taille que celle de la source
     
     
    oRange.setDataArray(da)
     
     
    End Sub

    Le problème, il y a une erreur d'exécution au niveau de la ligne "oRange.setDataArray(da)"
    Erreur de variable ?

    Pour la boucle j'avais imaginé de mettre quelque chose comme cela

    nbreMois , donnée venant de la feuille "Données brutes"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i=0 to nbreMois-1
    oRange.setDataArray(da)
    next
    C'est correcte ?




    Merci

  7. #7
    Membre éprouvé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 537
    Points : 996
    Points
    996

    Par défaut

    Bonjour,

    Pour copier les valeurs d'un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Sub CopierValeursTableau
     Dim Classeur as Object
     Dim Feuille as Object
     Dim Tableau as Variant
     Dim Source as Object
     Dim Cible as Object
     Dim ColDeb as Long
     Dim LigDeb as Long
     Dim ColFin as Long
     Dim LigFin as Long
    	' Définir la source et la cible
    	Classeur = thisComponent
    	Feuille = Classeur.Sheets.getByName("Feuille1")
    	Source = Feuille.getCellRangeByName("A1:D4")
    	Cible = Feuille.getCellRangeByName("C22")
    	' Redimensionner la cible en fonction de la source
    	ColDeb = Cible.RangeAddress.StartColumn
    	LigDeb = Cible.RangeAddress.StartRow
    	ColFin = ColDeb + Source.Columns.Count - 1
    	LigFin = LigDeb + Source.Rows.Count - 1
    	Cible = Feuille.getCellRangeByPosition(ColDeb,LigDeb,ColFin,LigFin)
    	' Copier les valeurs
    	Tableau = Source.DataArray
    	Cible.DataArray = Tableau
    End Sub
    Cordialement,
    Patrice

  8. #8
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut

    Bonjour,

    Merci pour le code, cela fonctionne sans soucis.


    Maintenant, j'aimerai compléter le fonctionnement de la macro.


    Le but serait de copier une à une la ligne d'un tableau et lorsqu'il arrive à une cellule vide par exemple la AF, les lignes se trouvant au-dessus sont répétées autant que nécessaires pour arriver à un nombre de ligne équivalent à une période (entre deux dates).

    Je mets mon fichier complet pour illustrer mon propos;

    synchropert1.ods

    donc



    tableau à recopier AD2 À AI205
    )
    ici cellule AF vide 16 --> AF16, le tableau doit être recopier de AD2 à AI15 ( à répéter autant que nécessaire pour avoir un tableau avec une période de 3 mois)



    Au niveau de la macro, ne faudrait-il pas traiter chaque ligne du tableau avec une boucle, si mes souvenirs lointain du basic pc sont bons

    Au forcep, souvenirs très très loin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    :onrecommence
     
    for i=1 to NbreDeMois
     
    si cellule AF ="" alors fin
    tableau[i]=colonne 1, colonne2, colonne 3, colonne 4
     
    :fin goto onrecommence
    next

    Encore merci pour ton aide

  9. #9
    Membre éprouvé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 537
    Points : 996
    Points
    996

    Par défaut

    Bonjour,

    Pas sur d'avoir tout compris !

    Peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Option Explicit
    Sub CopierValeursTableau
     Dim SS as Object		'Sheet Source
     Dim SC as Object		'Sheet Cible
     Dim RS as Object		'Range Source
     Dim RC as Object		'Range Cible
     Dim CD as Long			'Colonne Début
     Dim LD as Long			'Ligne Début
     Dim CF as Long			'Colonne Fin
     Dim LF as Long			'Ligne Fin
     Dim Tb as Variant		'Tableau
     Dim Tt as Variant		'Tableau temporaire
     Dim I1 as Long         'Index 1
     Dim I2 as Long         'Index 2
     Dim DD as Long         'Date de Début 
     Dim DF as Long         'Date de Fin
     Dim NL as Long         'Nombre de lignes 
    	' Définir la source et la cible
    	SS = thisComponent.Sheets.getByName("Données brutes")
    	RS = SS.getCellRangeByName("AD2:AI205")
    	SC = thisComponent.Sheets.getByName("Sortie")
    	RC = SC.getCellRangeByName("A6")
    	' Redimensionner la cible en fonction de la source
    	CD = RC.RangeAddress.StartColumn
    	LD = RC.RangeAddress.StartRow
    	CF = CD + RS.Columns.Count - 1
    	LF = LD + RS.Rows.Count - 1
    	RC = SC.getCellRangeByPosition(CD,LD,CF,LF)
    	' Copier les valeurs
    	Tb = RS.DataArray
    	' Traitement des données
    	DD = SS.getCellRangeByName("AA1").Value
    	DF = SS.getCellRangeByName("AA3").Value
    	' Mémoriser les lignes concernées
    	NL = -1
    	For I1 = LBound(Tb) to UBound(Tb)
    		If Tb(I1)(1) >= DD And Tb(I1)(1) <= DF Then
    			If Not (IsEmpty(Tb(I1)(2)) Or Tb(I1)(2) = "") Then
    		    	NL = Nl + 1
    		    	Redim Preserve Tt(0 to NL)
    		    	Tt(NL) = Tb(I1)
    			End If
    		End If 
    	Next I1
    	If NL >= 0 then
    		' Transferer et répéter les lignes mémorisées dans le tableau
    		For I1 = LBound(Tb) to UBound(Tb)
    			I2 = I1 Mod 14
    			Tb(I1) = Tt(I2)
    		Next I1
    		' Coller les valeurs
    		RC.DataArray = Tb
    	End If
    End Sub
    Cordialement,
    Patrice

  10. #10
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut

    Merci beaucoup pour ton aide. J'essaye ta solution le plus rapidement possible.

    Désolé pour mon explication boiteuse.
    Bonne fin de journée.


    EDIT:

    La solution est proche , un très très grand merci. la copie fonctionne très bien

    j'ai modifié un peu ta macro pour ajouter une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim NS as Long         'Nombre de service , ajout par micmor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'définir nombre de service
    	NS = SS.getCellRangeByName("AA9").Value * 7
    Et pour finir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ' Transferer et répéter les lignes mémorisées dans le tableau, MOD 14 transformé en MOD NS
    		For I1 = LBound(Tb) to UBound(Tb)
    			I2 = I1 Mod NS
    			Tb(I1) = Tt(I2)
    		Next I1

    BUT: Comme cela quelque soit le nombre de ligne de service dans le tableau de gauche 1 à 20 , la copie fonctionne.


    Le dernier problème, la date lors de la copie ne doit pas être répétée mais incrémenter de 1 (allant de la date de début à la date de fin). Comment peut-on modifier cette boucle pour que la colonne date (AM) soit incrémenter et non recopiée lors de la nouvelle boucle


    synchropert200.ods

    Merci

  11. #11
    Membre éprouvé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 537
    Points : 996
    Points
    996

    Par défaut

    Re,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		DD = Tt(0)(1)
    		For I1 = LBound(Tb) to UBound(Tb)
    			I2 = I1 Mod NS
    			Tb(I1) = Tt(I2)
    			Tb(T1)(1) = DD: DD = DD + 1
    		Next I1
    Cordialement,
    Patrice

  12. #12
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut

    Merci pour la correction.


    j'ai remplacé la portion de code initiale par ton nouveau code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' Transferer et répéter les lignes mémorisées dans le tableau, MOD 14 transformé en MOD NS
     
    For I1 = LBound(Tb) to UBound(Tb)
    			I2 = I1 Mod NS
    			Tb(I1) = Tt(I2)
    		Next I1
     
    ' Coller les valeurs
    PAR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ' Transferer et répéter les lignes mémorisées dans le tableau
    	DD = Tt(0)(1)
    		For I1 = LBound(Tb) to UBound(Tb)
    			I2 = I1 Mod NS
    			Tb(I1) = Tt(I2)
    			Tb(T1)(1) = DD: DD = DD + 1
    		Next I1
    ' Coller les valeurs

    J'ai une erreur de variables non définies

    Tb(T1)(1) = DD: DD = DD + 1


    Pourtant elles sont bien définies

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Tb as Variant		'Tableau
    Dim Tt as Variant		'Tableau temporaire
     
    Dim DD as Long         'Date de Début

    EDIT 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tb(T1)(1) = DD: DD = DD + 1
    remplacé par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tb(I1)(1) = DD: DD = DD + 1
    plus d'erreur mais des dates étonnantes 30/06/99, 24/06/99

  13. #13
    Membre éprouvé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 537
    Points : 996
    Points
    996

    Par défaut

    Re,

    Poste ton dernier fichier
    Cordialement,
    Patrice

  14. #14
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut

    voilà

    synchropert300.ods

    Merci


    En mettant un print par çi et là, je me rend compte que la boucle prend la dernière date du tableau AD2:AH205 pour commencer.

  15. #15
    Membre éprouvé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 537
    Points : 996
    Points
    996

    Par défaut

    Re,

    C'est un comportement surprenant pour un débutant comme moi.

    Je comprend ce qui se passe : les lignes des tableaux sont définies par références mais je ne sais pas comment dissocier Tb et Tt.
    Je pense qu'en les transférant Byval vers une procédure ça fonctionnerait mais je ne sais pas comment faire dans la même procédure.

    J'ai opté pour la modification de chaque donnée de la ligne en ajoutant un troisième Index

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Option Explicit
    Sub CopierValeursTableau
     Dim SS as Object		'Sheet Source
     Dim SC as Object		'Sheet Cible
     Dim RS as Object		'Range Source
     Dim RC as Object		'Range Cible
     Dim CD as Long			'Colonne Début
     Dim LD as Long			'Ligne Début
     Dim CF as Long			'Colonne Fin
     Dim LF as Long			'Ligne Fin
     Dim Tb as Variant		'Tableau
     Dim Tt as Variant		'Tableau temporaire
     Dim I1 as Long         'Index 1
     Dim I2 as Long         'Index 2
     Dim I3 as Long         'Index 3
     Dim DD as Long         'Date de Début 
     Dim DF as Long         'Date de Fin
     Dim NL as Long         'Nombre de lignes
     Dim NS as Long         'Nombre de service , ajout par micmor 
    	' Définir la source et la cible
    	SS = thisComponent.Sheets.getByName("Données brutes")
    	RS = SS.getCellRangeByName("AD2:AI205")
    	SC = thisComponent.Sheets.getByName("Données brutes")
    	RC = SC.getCellRangeByName("AL2")
    	'définir nombre de service
    	NS = SS.getCellRangeByName("AA9").Value * 7
    	' Redimensionner la cible en fonction de la source
    	CD = RC.RangeAddress.StartColumn
    	LD = RC.RangeAddress.StartRow
    	CF = CD + RS.Columns.Count - 1
    	LF = LD + RS.Rows.Count - 1
    	RC = SC.getCellRangeByPosition(CD,LD,CF,LF)
    	' Copier les valeurs
    	Tb = RS.DataArray
    	' Traitement des données
    	DD = SS.getCellRangeByName("AA1").Value
    	DF = SS.getCellRangeByName("AA3").Value
    	' Mémoriser les lignes concernées
    	NL = -1
    	For I1 = LBound(Tb) to UBound(Tb)
    		If Tb(I1)(1) >= DD And Tb(I1)(1) <= DF Then
    			If Not (IsEmpty(Tb(I1)(2)) Or Tb(I1)(2) = "") Then
    		    	NL = NL + 1
    		    	Redim Preserve Tt(0 to NL)
    		    	Tt(NL) = Tb(I1)
    			End If
    		End If 
    	Next I1
    	If NL >= 0 then
    		' Transferer et répéter les lignes mémorisées dans le tableau
    		DD = Tb(0)(1)
    		For I1 = LBound(Tb) to UBound(Tb)
    			I2 = I1 Mod NS
    			For I3 =LBound(Tb(0)) to UBound(Tb(0)) 
    				If I3 = 1 then
    					Tb(I1)(I3) = DD
    					DD = DD + 1
    				Else
    					Tb(I1)(I3) = Tt(I2)(I3)				
    				End If
    			Next
    		Next I1
    		' Coller les valeurs
    		RC.DataArray = Tb
    	End If
    End Sub
    Cordialement,
    Patrice

  16. #16
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut

    Merci, je regarderai à cela ce soir lorsque je serai devant mon pc.

    Si tu es débutant, alors moi, je suis un futur aspirant débutant.

    Encore merci.


    EDIT

    Il ne reste plus qu'à traiter le problème avec l'index de la colonne AL, il devrait être le même que celui de la colonne AC.

    Ce qui permettra d'utiliser la fonction
    (RECHERCHEV($R2;base;COLONNE(C$1);0)) du tableau (R2:W92) Sinon, vu que l'index est différent, cela ne fonctionne pas.

    Donc pour résumer,la colonne index AD et la colonne date AE doit être recopiée telle quelle
    Les autres colonnes doivent être répétées AF AG AH AI


    je cherche le moyen de passer l'index et la date de début dans les différentes boucles de la macro sans répétitions

  17. #17
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut

    En ajoutant la boucle suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	For I4 = LBound(Tb) to UBound(Tb)
    	Tb(I4)(0)
    '	
    	Next I4
    Je parviens à récupérer les index de la colonne AD mais je ne parviens pas à les mettre dans la colonne AL du tableau final RC.DataArray = Tb .


    Comment puis-je ajouter cette partie de tableau dans le tableau final ?

    Merci
    Fichiers attachés Fichiers attachés

  18. #18
    Membre éprouvé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 537
    Points : 996
    Points
    996

    Par défaut

    Bonjour,

    Si j'ai bien compris (avec le fichier synchropert300), j'ai ajouté la variable ED (écart de date) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Option Explicit
    Sub CopierValeursTableau
     Dim SS as Object		'Sheet Source
     Dim SC as Object		'Sheet Cible
     Dim RS as Object		'Range Source
     Dim RC as Object		'Range Cible
     Dim CD as Long			'Colonne Début
     Dim LD as Long			'Ligne Début
     Dim CF as Long			'Colonne Fin
     Dim LF as Long			'Ligne Fin
     Dim Tb as Variant		'Tableau
     Dim Tt as Variant		'Tableau temporaire
     Dim I1 as Long         'Index 1
     Dim I2 as Long         'Index 2
     Dim I3 as Long         'Index 3
     Dim DD as Long         'Date de Début 
     Dim DF as Long         'Date de Fin
     DIM ED as Long			'Ecart de date
     Dim NL as Long         'Nombre de lignes
     Dim NS as Long         'Nombre de service , ajout par micmor 
    	' Définir la source et la cible
    	SS = thisComponent.Sheets.getByName("Données brutes")
    	RS = SS.getCellRangeByName("AD2:AI205")
    	SC = thisComponent.Sheets.getByName("Données brutes")
    	RC = SC.getCellRangeByName("AL2")
    	'définir nombre de service
    	NS = SS.getCellRangeByName("AA9").Value * 7
    	' Redimensionner la cible en fonction de la source
    	CD = RC.RangeAddress.StartColumn
    	LD = RC.RangeAddress.StartRow
    	CF = CD + RS.Columns.Count - 1
    	LF = LD + RS.Rows.Count - 1
    	RC = SC.getCellRangeByPosition(CD,LD,CF,LF)
    	' Copier les valeurs
    	Tb = RS.DataArray
    	' Traitement des données
    	DD = SS.getCellRangeByName("AA1").Value
    	DF = SS.getCellRangeByName("AA3").Value
    	' Mémoriser les lignes concernées
    	NL = -1
    	For I1 = LBound(Tb) to UBound(Tb)
    		If Tb(I1)(1) >= DD And Tb(I1)(1) <= DF Then
    			If Not (IsEmpty(Tb(I1)(2)) Or Tb(I1)(2) = "") Then
    		    	NL = NL + 1
    		    	Redim Preserve Tt(0 to NL)
    		    	Tt(NL) = Tb(I1)
    			End If
    		End If 
    	Next I1
    	If NL >= 0 then
    		' Transferer et répéter les lignes mémorisées dans le tableau
    		DD = Tb(0)(1)
    		For I1 = LBound(Tb) to UBound(Tb)
    			I2 = I1 Mod NS
    			For I3 =LBound(Tb(0)) to UBound(Tb(0)) 
    				If I3 = 1 then
    					Tb(I1)(I3) = DD
    					DD = DD + 1
    				ElseIf I3 = 4 then
    					ED = Tt(I2)(4) - Tb(I2)(1) - 1
    					Tb(I1)(I3) = DD + ED
    				Else
    					Tb(I1)(I3) = Tt(I2)(I3)				
    				End If
    			Next
    		Next I1
    		' Coller les valeurs
    		RC.DataArray = Tb
    	End If
    End Sub
    Cordialement,
    Patrice

  19. #19
    Membre à l'essai
    Homme Profil pro
    Utilisateur non professionnel
    Inscrit en
    mars 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Utilisateur non professionnel

    Informations forums :
    Inscription : mars 2013
    Messages : 31
    Points : 15
    Points
    15

    Par défaut

    Un très grand merci. Cela fonctionne sans problème pour les dates.



    Il reste le soucis de la colonne R (index) qui doit être recopiée telle quelle dans la colonne AD (index)

    Et encore une fois, un très très grand merci pour ton aide

  20. #20
    Membre éprouvé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    mars 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : mars 2007
    Messages : 537
    Points : 996
    Points
    996

    Par défaut

    Citation Envoyé par micmor Voir le message
    Il reste le soucis de la colonne R (index) qui doit être recopiée telle quelle dans la colonne AD (index)
    Bonjour,

    Je ne comprend pas ce que tu voudrais :
    - AD est calculé par une formule
    - R aussi et dépend du résultat d'AD

    Est-ce pour copier R vers le nouveau tableau (actuellement en AL ?
    Que voudrais tu, une formule ? une macro ?

    Et penser à cliquer sur pour chaque message ayant aidé ...
    Cordialement,
    Patrice

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Explication pour une boucle sur un tableau ( débutant)
    Par serna dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/04/2015, 11h44
  2. [XL-2007] Boucle sur un tableau nommé
    Par thorgal1612 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/11/2014, 11h10
  3. [XL-2010] Boucle sur un tableau
    Par octane dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/05/2013, 03h47
  4. Boucle sur un tableau de variable en SQL
    Par sekaijin dans le forum Débuter
    Réponses: 4
    Dernier message: 27/01/2010, 21h52
  5. [Tableaux] Boucle sur un tableau associatif
    Par alexfrere dans le forum Fonctions
    Réponses: 11
    Dernier message: 28/06/2006, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo