IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Macros et VBA Excel Discussion :

Décaler une plage de cellule en fonction d'une case


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Décaler une plage de cellule en fonction d'une case
    Bonjour et joyeux Noel à tous,

    Je débute sous VBA et j'ai bien progressé mais je reste bloquer. Voici mon problème :

    A B C D E F G H TOTAL
    1
    2
    3
    4
    5

    J'ai des chiffres entrés dans mes lignes 1, 2, ... et je souhaite décaler ces chiffres.
    Par exemple, si une série de chiffre commence en 1D et finisse en 1F je souhaite en fonction d'une cellule (indiquant A par exemple) que ma série de chiffre (1D:1F) commence en A donc serait (1A:1C).

    J'ai essayer d'utiliser un .cut mais le problème c'est que avec un cut en vba cela détruit mes formules (exemple si j'ai une somme à la fin)

    Voilà je ne sais pas si quelqu'un peut m'aider ?

    Encore merci pour cet exellent site avec lequel je progresse beaucoup.

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Si tu avais un exemple avant puis après le traitement ce serait plus facile, car je ne vois pas très bien ce que tu souhaites
    Jérôme

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse
    Avant le traitement
    _ 1 2 3 4 5 6
    A X 0 0 0 X X
    B


    Après le traitement

    _ 1 2 3 4 5 6
    A 0 0 0 X X X
    B

    Tout simplement ma série de donnée (des 0 ici) qui débuter en A2 se déplace pour débuter en A1. Mais la valeur A1 est une variable, c'est à dire qu'elle correspond à une case qui pourrait prendre comme valeur aussi bien A3.

    Je dois faire ce réarrangement pour plusieurs ligne mais si je l'ai pour la première ligne je n'aurais qu'à faire une boucle.

    voilà ou j'en suis :

    J'ai un problème quand je déclare mes variables avec string et range je ne comprends pas ....

    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
     
    Sub Modifié()
    ' Modifié Macro permet de faire démarrer les revenues des projets selon les trimestres
     
    Worksheets("simulation 2").Activate
     
    Dim Tomate As String, x As Integer 'Déclaration des variables
     
    'REcherche des valeurs à stocker
    For x = 0 To 24 ' Recherche des valeurs dans la colonne
     
    If Cells(5, 12).Value = Cells(4, 17 + x) Then
    Tomate = Range(Cells(5, 17 + x), Cells(5, 40)) ' je sauvegarde ma range de donnée
    Exit For ' je sors si j'ai trouvé la bonne valeur
    End If
    Next x
     
    'Coller les valeurs
    If Cells(5, 13).Value = Cells(4, 17 + x) Then
    Range(Cells(5, 17 + x), Cells(5, 40)) = Tomate
    End If
     
    End Sub

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Je n'ai pas essayé de comprendre ton code mais si tu veux garder des valeur d'une plage il faut utiliser une variable de type variant

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Pour utiliser une variable de type range

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dim tomate as range
     
    set tomate = Range(Cells(5, 17 + x), Cells(5, 40))
    Par contre, je suis désolé, mais je ne comprend pas la logique du traitement a effectuer (il faut faire glisser les valeur comme sur un ruban?)
    Jérôme

  6. #6
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    SAlut jfontaine

    Au départ j'avais commencé a rédiger mon message comme toi et en faite il ne cherche pas a conserver l'emplacement de la plage, mais les valeur qu'elle contient.

    En utilisant un variant et en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tomate = Range(Cells(5, 17 + x), Cells(5, 40))
    Tu crées dans Tomate une structure de type tableau contenant les valeurs de la plage.

    Apres par contre je ne saisi pas le décalage que Ender007 veux effectuer, du moins je ne comprend pas par rapport a quoi? quelle valeur.

    Ender007 tu aurais peut être un exemple concret a nous soumette en mettant un bout de fichier?

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Membre confirmé
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Points : 563
    Points
    563
    Par défaut
    Bonsoir,

    Beaucoup de remarques à faire !

    Sur le fond, c'est un peu bizarre comme emploi d'un tableur de saisir des données et de les déplacer.

    Qu'est-ce qui empêche de les entrer directement au bon endroit, ou si ce n’est pas possible lors de la saisie, de les entrer dans une plage quelconque, pas forcément dans la même feuille, et d’utiliser des formules pour les faire apparaître dans les bonnes colonnes dans le tableau de présentation ?

    En ce qui concerne le code, prend l’habitude de l’indenter, ce sera + lisible. Par ailleurs, attention aux déclarations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Tomate As String, x As Integer
    n’est pas compatible avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tomate = Range(Cells(5, 17 + x), Cells(5, 40))
    Range(Cells(5, 17 + x), Cells(5, 40)) renvoie un objet Range (une plage de cellules). Tu ne peux donc le stocker dans «*Tomate*», qui est défini comme une chaîne de caractères.

    Essaye également d’être cohérent : dans la ligne ci-dessous,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells(5, 12).Value = Cells(4, 17 + x)
    tu emploies .Value pour Cells(5, 12) et pas pour Cells(4, 17 + x). Value est la propriété par défaut d’un objet Range et est implicite dans la grande majorité des cas, mais il vaut mieux décider de le mettre systématiquement ou pas du tout (sauf cas particuliers), mais pas d’alterner.

    Il ne faut pas non plus abuser de Cells. Range("AN5") est en général plus facilement compris que Cells(5, 40) ; mais surtout, dans les 2 cas le code sera fragile, car en cas de suppression ou d'insertion de cellules, Cells(5, 40), comme ange("AN5") risquent fort de ne + correspondre à la cellule qui t’intéresse.

    Prend l’habitude de donner des noms aux cellules ou aux plages importantes, et utilise ces noms dans le code. Range("RéfProjet1") sera mis à jour chaque fois que la structure de la feuille sera modifiée, et le code continuera à faire référence à la bonne plage.

    Regarde également les fonctions DECALER() d’Excel et Offset de VBA qui en est l’homologue. Voici un exemple d’utilisation de Range avec des noms, et d’Offset.

    Je t’ai fait un fichier exemple, en PJ. À partir d’une cellule de référence, nommée «*RéfProjet1*», une boucle permet de calculer pour une plage de cellules le montant d’une éventuelle remise. Le nombre de passages dans la boucle repose sur une autre cellule, nommée «*NbItérations*».

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Demo()
    Dim i As Integer
            With Range("RéfProjet1")
                    For i = 1 To Range("NbItérations")
                            If .Offset(i) >= Range("Seuil") Then
                                .Offset(i, 1) = .Offset(i) * Range("TxRemise")
                            End If
                    Next
            End With
    End Sub
    La variante suivante est + souple, car elle utilise la zone en cours associée à la cellule nommée «*RéfProjet1*» (.CurrentRegion) pour déterminer le nombre d’itérations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub DemoBis()
    Dim i As Integer
            With Range("RéfProjet1")
                    For i = 1 To .CurrentRegion.Rows.Count - 1
                            If .Offset(i) >= Range("Seuil") Then
                                .Offset(i, 1) = .Offset(i) * Range("TxRemise")
                            End If
                    Next
            End With
    End Sub
    Ces exemples de codes ne sont pas une réponse directe à ta question, mais devraient te faciliter les choses, en t’incitant à prendre de bonnes habitudes.

    Bon courage.
    Michel Gaboly
    Développeur Excel et VBA


    Pas de question technique par MP, je n’y répondrai pas, utilisez le forum - Merci
    Pensez à ajouter le tag

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    SAlut jfontaine

    Au départ j'avais commencé a rédiger mon message comme toi et en faite il ne cherche pas a conserver l'emplacement de la plage, mais les valeur qu'elle contient.

    En utilisant un variant et en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tomate = Range(Cells(5, 17 + x), Cells(5, 40))
    Tu crées dans Tomate une structure de type tableau contenant les valeurs de la plage.

    Apres par contre je ne saisi pas le décalage que Ender007 veux effectuer, du moins je ne comprend pas par rapport a quoi? quelle valeur.

    Ender007 tu aurais peut être un exemple concret a nous soumette en mettant un bout de fichier?

    ++
    Qwaz

    Wow merci pour les réponses.

    Je vais essayer d'être un peu plus clair et donner plus d'informations (ce que j'aurais du faire dès le début )

    Ma série de chiffre va être décaler en fonction du trimestre que l'utilisateur sélectionnera dans une case.

    Donc pas exemple, si mon trimestre de départ est Q1 alors ma série de chiffre va se décaler pour débuter en Q1 et ainsi de suite, si c'est Q2 alors la série de chiffre va être en Q2

    Dans deux colonnes de mon tableau il y a les données suivantes trimestre de départ et d'origine.
    Le trimestre de départ peut être modifié à la guise par les utilisateurs tandis que le trimestre d'origine lui reste inchangé.

    Si je reprends mon exemple (première colonne trimestre d'origine, deuxième colonne trimestre de départ, modifiable et une ligne avec des trimestres (quarter) Q1, Q2,Q3 et les 0 = nombre)

    Avant traitement
    __ __ Q1 Q2 Q3 Q4 Q5
    Q1 Q2 0__0__0__X__X
    Q2 Q3 X__0__X__X__X
    Q1 Q4 0__0__0__0__X

    Après traitement
    __ __ Q1 Q2 Q3 Q4 Q5
    Q1 Q2 X__0__0__0__X
    Q2 Q3 X__X__0__X__X
    Q1 Q4 X__X__X__0__0

    En cliquant donc sur un bouton, la macro va déplacer chacune des séries de chiffres en fonction de son trimestre de départ.
    Et en cliquant sur un autre bouton, cette série de chiffre va revenir à son trimestre d'origine

    et comme je dis je ne peux pas me permettre d'un cut and paste puisque à la fin de mes colonnes j'ai des sommes si et des calcules qui sont bousillés si on cut and paste.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Bigalo Voir le message
    Bonsoir,

    Beaucoup de remarques à faire !

    Sur le fond, c'est un peu bizarre comme emploi d'un tableur de saisir des données et de les déplacer.

    Qu'est-ce qui empêche de les entrer directement au bon endroit, ou si ce n’est pas possible lors de la saisie, de les entrer dans une plage quelconque, pas forcément dans la même feuille, et d’utiliser des formules pour les faire apparaître dans les bonnes colonnes dans le tableau de présentation ?

    Bon courage.
    Concernant cette remarque, j'avais d'abord réaliser une version comme cela à savoir que je rentrais toutes les données dans une feuille puis en fonction des Q1 de départ ou original je redéplaçais l’ensemble des données vers une autre feuille de présentation ou les chiffres apparaissées au bon Q de départ.

    Par la suite, je me suis dis que avec une macro je pouvais à la fois entrée les données dans une feuille puis les déplacer à ma guise. Est-ce que j'ai été trop gourmand ? j'ai donc voulu fusionner ma feuille donnée et ma feuille présentation.

    Dans tout les cas, si je ne trouve pas de solution je vais retourner à deux feuilles une donnée, puis une présentation tant pis.

    Dans tous les cas merci pour les conseils

    PS: voici comment fonctionne à date ma macro. Elle prend toute les données de quatre autres onglets et les mets en forme dans un onglet donnée puis c'est là que je voudrais une macro pour pouvoir organiser les série de chiffre en fonction du Q de départ ou origine. Sinon je vais créer une autre feuille puis tout simplement copier/coller à partir de cet onglet donnée et placer en fonction du Q de départ / origine.

    En tout cas merci de prendre le temps de me lire

    Citation Envoyé par Bigalo Voir le message
    Bonsoir,

    Prend l’habitude de donner des noms aux cellules ou aux plages importantes, et utilise ces noms dans le code. Range("RéfProjet1") sera mis à jour chaque fois que la structure de la feuille sera modifiée, et le code continuera à faire référence à la bonne plage.

    Bon courage.
    À yes merci ! j'avais pas penser à faire cela. J'avais toujours ce problème dans mes codes lors de modification des tableaux !!
    Merci pour le conseil !!

  10. #10
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Donc en fait si j'ai bien compris
    si on reprend ton exemple, dans la 1ere colonne on est informé que la série commence en Q1, dans la 2eme colonne on sait qu'elle doit être décalé pour commencé en Q2 et donc être décaler de +1 puisque Q2 - Q1 = 1 (si on fait abstraction des lettre Q.

    Il te faut donc faire en sorte de récupérer les indices numériques sans le Q (regarde du cote de la fonction vba Left).


    A partir de la tu dois nous dire si ce décalage sera toujours positif (décalage vers la droite)?

    ++
    Qwaz

    [Edit]
    Je viens de relire vite fait tes postes, le #3 indiquerait que le décalage peut être négatif).
    Le but est donc de pointer dans une variable Range la plage contenant les valeurs (on va nommer cette variable MaSerie),
    pourquoi pas ensuite copier ces valeurs dans dans une variable de type Variant (Tomate), comme tu voulais le faire,
    puis par la suite tu appliques un offset sur série pour faire un décalage de x lignes, x pouvant être positif ou négatif et il sera défini par ce que je t'expliquais tout à l'heure à savoir Qz - Qy = x

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaSerie.offset(0,x).value = Tomate
    [/Edit]

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Qwazerty Voir le message
    Salut
    Donc en fait si j'ai bien compris
    si on reprend ton exemple, dans la 1ere colonne on est informé que la série commence en Q1, dans la 2eme colonne on sait qu'elle doit être décalé pour commencé en Q2 et donc être décaler de +1 puisque Q2 - Q1 = 1 (si on fait abstraction des lettre Q.

    Il te faut donc faire en sorte de récupérer les indices numériques sans le Q (regarde du cote de la fonction vba Left).


    A partir de la tu dois nous dire si ce décalage sera toujours positif (décalage vers la droite)?

    ++
    Qwaz
    non il n'est pas positif surtout pour ma macro qui veux que je revienne à ma position de départ (Q d'origine)...

    Mais le problème n'est pas forcement ou va commencer la série de chiffre (puisque pour cela je dois comparer la colonne Q d'origine / départ avec la ligne des Q) mais plus ou elle va se terminer et donc de stocker cette série de chiffre pour pouvoir ensuite la coller là ou je souhaite.

    en t'expliquant cela j'ai l'impression que sa devient ben trop compliqué ....

    Citation Envoyé par Qwazerty Voir le message
    Salut

    [Edit]
    Je viens de relire vite fait tes poste, le #3 indiquerait que le décalage peut être négatif).
    Le but est donc de pointer dans une variable Range la plage contenant les valeurs (on va nommer cette variable MaSerie),
    pourquoi ensuite copier ces valeurs dans dans une variable de type Variant (Tomate), comme tu voulais le faire,
    puis par la suite tu appliques un offset sur série pour faire un décalage de x lignes, x pouvant être positif ou négatif et il sera défini par ce que je t'expliquais tout à l'heure à savoir Qz - Qy = x

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaSerie.offset(0,x).value = Tomate
    [/Edit]
    Cool je vais essayer donc :
    1. je copie ma serie dans un Maserie
    2. je copie Maserie dans Tomate
    3. j'applique à Tomate un offset

    Dois-je appliquer un clear quelquepart pour que les anciennes données disparaissent, sinon je vais me retrouver avec la serie de chiffre décalé et ma serie de chiffre normale

  12. #12
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    '1 tu pointes la plage
    Dim Maserie as range
    Set MaSerie = range(......)
    [...]
     
    '2 tu copies les valeur contenu dans cette plage dans tomate
    Dim Tomate
    Tomate = MaSerie.value
     
    '3 En effet tu as raison il faut vidé le contenu du tableau
    MaSerie.ClearContent
     
    '4 Appliquer l'offset et coller les valeur
    MaSerie.Offset(0,x).Value = Tomate
    Bien sur tu aura determiné x avant cela
    Ça va déjà t'occuper un peu de tout transcrire je pense :p
    ++ je vais au taff
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'ai l'erreur 91 qui s'affiche variable objet ou variable de bloc with non définie... c'est sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Tomate = Maserie.Value
    Dediou !

    Je crois que je vais abandonner.

    Je vais passer par une autre feuille puis recopier les données en fonction des Q de départ et orginel.

    En tous cas je vous souhaite de belle fête et encore merci pour votre aide.

  14. #14
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Essai comme ça, il faudra peut être modifier un peu si tu as des séries ne comportant qu'une seule valeur.
    Si tu veux des explications en plus des commentaires, demande moi.

    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
    Sub test()
    Dim MaSerie As Range
    Dim Tomate As Variant
    Dim TheCell As Range
    Dim StrTmp As String
    Dim xOri As Integer, xDelta As Integer
     
     
    'On boucle sur chaque cellule de la colonne A contenant des données
    For Each TheCell In Feuil1.Range(Feuil1.Range("A2"), Feuil1.Cells(Rows.Count, "A").End(xlUp))
        'On determine les differents x
        'xOri : Correspond au Q contenu dans la cellule colonne A, donc TheCEll
        StrTmp = TheCell 'sous entendu TheCell.value
        xOri = CInt(Right(StrTmp, Len(StrTmp) - 1)) 'on ne prend en compte que les caracteres apres Q
        'On regarde la cellule a droite (colonne B) pour avoir la destination et on lui soustrait l'origine
        StrTmp = TheCell.Offset(0, 1)
        xDelta = CInt(Right(StrTmp, Len(StrTmp) - 1)) - xOri
     
        'On defini MaSerie, qui represente une plage partant de la cellule en colonne xOri et allant jusqu'a la fin de la serie
        Set MaSerie = Feuil1.Range(TheCell.Offset(0, 1 + xOri), TheCell.Offset(0, 1 + xOri).End(xlToRight))
        'Il faudra peut etre modifié un peu la suite si tu as des cas ou la serie ne comporte qu'une seul colonne
     
        'On transfere les valeur dans la variable Tomate
        Tomate = MaSerie.Value
     
        'On vide le contenu du tableau
        MaSerie.ClearContents
     
        'On place les valeurs contenues dans Tomate en tenant compte du décalage
        MaSerie.Offset(0, xDelta).Value = Tomate
     
    'On passe a la ligne suivante
    Next
     
     
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci encore,

    J'ai cependant une erreur : argument ou appel de procédure incorrect. (5)
    à la ligne

    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
    Sub test()
    Dim MaSerie As Range
    Dim Tomate As Variant
    Dim TheCell As Range
    Dim StrTmp As String
    Dim xOri As Integer, xDelta As Integer
     
     
    'On boucle sur chaque cellule de la colonne A contenant des données
    For Each TheCell In Sheets("Simulation 2").Range(Sheets("Simulation 2").Range("L94"), Sheets("Simulation 2").Cells(Rows.Count, "L").End(xlUp))
        'On determine les differents x
        'xOri : Correspond au Q contenu dans la cellule colonne A, donc TheCEll
        StrTmp = TheCell 'sous entendu TheCell.value
        xOri = CInt(Right(StrTmp, Len(StrTmp) - 1)) 'on ne prend en compte que les caracteres apres Q
        'On regarde la cellule a droite (colonne B) pour avoir la destination et on lui soustrait l'origine
        StrTmp = TheCell.Offset(0, 1)
        xDelta = CInt(Right(StrTmp, Len(StrTmp) - 1)) - xOri
        
        'On defini MaSerie, qui represente une plage partant de la cellule en colonne xOri et allant jusqu'a la fin de la serie
        Set MaSerie = Sheets("Simulation 2").Range(TheCell.Offset(0, 1 + xOri), TheCell.Offset(0, 1 + xOri).End(xlToRight))
        'Il faudra peut etre modifié un peu la suite si tu as des cas ou la serie ne comporte qu'une seul colonne
        
        'On transfere les valeur dans la variable Tomate
        Tomate = MaSerie.Value
        
        'On vide le contenu du tableau
        MaSerie.ClearContents
        
        'On place les valeurs contenues dans Tomate en tenant compte du décalage
        MaSerie.Offset(0, xDelta).Value = Tomate
        
    'On passe a la ligne suivante
    Next
    Merci finalement je commence à comprendre ce que tu veux faire même si cela reste un peu confus. Je vais bientôt quitter mon boulot donc je reprendrais cela l'année prochaine.

    J’essaierai alors de modifier un peu ton code pour le faire fonctionner. Encore merci

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Résolu
    J'ai finalement utilisé une feuille donnée, puis je copie l'ensemble des données vers une autre feuille de présentation en fonction du Q (trimestre) sélectionné dans la feuille de donnée.

    Merci pour votre aide,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Colorer plage de cellules en fonction d'une textbox
    Par Vrancky dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/06/2014, 10h41
  2. [XL-2013] Copier des cellules en fonction d'une plage de cellules
    Par Flows dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/02/2014, 18h38
  3. [XL-2010] Affichage d'un Msgbox en fonction d'une plage de cellules complétées
    Par thomasdu40 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/06/2013, 08h18
  4. Réponses: 12
    Dernier message: 30/12/2010, 14h30
  5. [XL-2003] Effacer colonne en fonction d'une plage de cellule
    Par stressman dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/12/2009, 12h52

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