Copier la valeur d'une cellule dans une autre

Hello !

Bon voilà je bloque médiocrement sur un simple copié/collé de cellule.

 n = 1
    While n <= higher_row             
        Task_Ref.Offset(n, 0).Value = Task_Ref.Value  
        n = n + 1
    Wend

J'ai une cellule non vide nommée Task_Ref dont je souhaite copier la valeur "higher_row" fois dans les cellules en dessous de Task_Ref.

Mais sans succès, les cellules restent vides. Alors qu'un MsgBox m'affiche correctement le contenu de la valeur de Task_Ref.

Merci de bien vouloir me guider sur ce point.

Bonjour,

j'aurais tendance à dire que c'est parce que N n'est pas incrémenté, mais c'est faux, il est incrémenté.

J'aurais tendance à dire que c'est parce que Task_Ref est égale à rien mais là je ne peux l'infirmer ou le confirmer (pas de fichier).

J'aurais tendance à dire que higher_row vaut 0 mais là je ne peux l'infirmer ou le confirmer (pas de fichier).

Donc si toutes les variables sont "bonnes" alors cela devrait fonctionner...

Donc il y a autre chose qui interfère.

Y a t il un code de surveillance événementielle sur la feuille ?

Auquel cas essayez de mettre

Application.EnableEvents = Fasle

au début du code puis

Application.EnableEvents =True

en fin de code.

Mais encore une fois sans fichier...

@ bientôt

LouReeD

Merci de la réponse.

Je joints le fichier, je pensais qu'une erreur de ma part serait flagrante

Il faut sélectionner la cellule M37, lancer la macro Ctrl + w (module 3), valider les 3 inputsbox (cellule M37 dans les 3 cas), et pour la 4ème inputbox sélectionner K37.

Je souhaite que la valeur de K37 soit copiée en dessous un certain nombre de fois ("higher_row" fois).

Merci d'avance.

8split-cell.xlsm (45.07 Ko)

Essayez de remplacer ceci :

numb_occur = a - b

par cela :

numb_occur = a - (a - b)

@ bientôt

LouReeD

Navré mais non seulement ça ne répond pas au problème mais en plus ça fait disfonctionner toute la macro car le résultat de numb_occur est incohérent par rapport à tout le reste du code.

Toutes les variables ont la valeur qu'il faut au moment où il faut (je viens de le vérifier).

D'autres pistes ?

Où me conseilles-tu d'insérer le code de surveillance par ailleurs ?

Toutes les variables ont la valeur qu'il faut au moment où il faut (je viens de le vérifier).

et bien j'aurais tendance à dire : refaites un test...

Valeur de $M37 : AAAZZZ

valeur de ActiveCell = $M37

valeur de a = Len(ActiveCell) = 6

valeur de my_txt = Replace(ActiveCell, Chr$(10), "", 1, -1, vbTextCompare) = "AAAZZZ"

valeur b = Len(my_txt) = 6

valeur de numb_occur = a - b = 0

du coup le test :

If numb_occur > 0 Then est faux,

du coup le test :

If numb_occur > higher_row Then

higher_row = numb_occur

Else

higher_row = higher_row 'no changes'

End If

n'est pas "joué",

du coup :

valeur de higher_row = vide = 0

du coup la boucle :

n = 1

While n <= higher_row

Range(Task_Ref).Offset(n, 0).Value = Range(Task_Ref).Value

n = n + 1

Wend

n'est pas jouée car 1> higher_row = 0 !

Alors peut-être que dans un cas où il y a des retour chariot cela fait quelque chose mais là il ne se passe rien, non ?

En faisant la modification, je me suis retrouvé avec 6 fois AAAZZZ d'inscrit sur les 6 lignes en dessous de $K37

Ce n'est pas ce qu'il fallait ?

@ bientôt

LouReeD

a = Len(ActiveCell) 'Lenght of the cell considered'

my_txt = Replace(ActiveCell, Chr$(10), "", 1, -1, vbTextCompare) 'Creation of a similar cell, removing Chr$(10)'

b = Len(my_txt) 'Lenght of that previous creation'

numb_occur = a - b

En fait l'idée de la macro c'est de diviser chaque cellule en autant de lignes (row) qu'il y a de retour à la ligne dans la cellule (Alt+Entrée), i. e. le caractère Chr$(10).

Si tu as éxecuté la macro alors qu'il ne reste qu'une seule ligne dans la cellule, c'est normal que numb_occur pose problème pour le copié/collé souhaité car alors tel qu'écrit sa valeur est de 0. Normalement la macro n'agit pas et Exit Sub. Or en modifiant la formule comme tu l'as fais, le code est fondamentalement modifié et donc permet la lecture complète.

Es-tu sûr d'avoir joué le code avec en $M37 : ZZZAAA Chr$(10) BBVFG Chr$(10) IUJLL

La 2ème boucle FOR permet d'agir sur toutes les cellules d'une seule ligne considérée, et donc la valeur la plus grande de numb_occur est sauvegardée dans la variable higher_row (vérifié, comme tu peux le voir dans les différents MsgBox que j'ai placé ci-joint).

Cette valeur higher_row permet de copier le nombre de fois nécessaire la valeur de la cellule Task_Ref dans les celules juste en dessous (dans notre exemple il faut copier "Task Ref 3")

Donc en bref, toutes les variables, ont exactement la valeur attendue à chacune des étapes.

5split-cell-1.xlsm (45.46 Ko)

En fait la macro zappe les cellules qui ne correspondent pas au critère numb_occur > 0.

Donc même en analysant des centaines de cellule ça ne pose pas de problème.

Task_Ref est défini ainsi :

Task_Ref = Cells(ActiveCell.Row, col_ref)

Cela fonctionne parfaitement pour tout le reste du code.

Cela peut poser problème d'y faire référence ainsi (?) :

 n = 1
    While n <= higher_row             
        Task_Ref.Offset(n, 0).Value = Task_Ref.Value  
        n = n + 1
    Wend

La boucle ci-dessus tourne effectivement le bon nombre de fois, c'est juste que la valeur n'est pas copiée.

Sur la fin du code j'ai essayé ceci, d'abord indépendamment sur une autre macro, puis je l'ai ajouté et adapté à la macro concerné.

Je réalise que la cellule Task_Ref ne veut pas être sélectionnée ! Pourtant si j'affiche sa valeur, msgbox m'affiche sa bonne valeur

 Task_Ref.Select

            f = 1
            m = higher_row

            While m > 0
                ActiveCell.Offset(f, 0).Value = Task_Ref
                m = m - 1
                f = f + 1
            Wend

Je voulais éviter à la base d'utiliser ActiveCell, donc le copié/collé fonctionne à présent mais je ne peux pas sélectionner la bonne cellule (Task_Ref) afin de copier les données en dessous...

En fait l'idée de la macro c'est de diviser chaque cellule en autant de lignes (row) qu'il y a de retour à la ligne dans la cellule (Alt+Entrée), i. e. le caractère Chr$(10).

En effet, les variables ont donc les bonnes valeurs... Mais ça fallait l'expliquer dès le début :

je cherche le nombre retour chariot afin de connaitre le nombre de "morceaux de cellules" à recopier, donc si a-b=0 alors numb_occur=1

car cellule non vide...

Bref à partir de la cellule $M37 et $K37 que doit faire le code car quand on le suis pas à pas on arrive à se perdre !!!

Sous $K37 il doit y avoir écrit quoi .

une fois AAAZZZ ou bien tout autre chose ?

Je suis à deux doigts de penser qu'il faille ré écrire le code, en plus simple sans passer par des variables intermédiaires, ni par des Select, car activecell.offset(1,2).select, du coup le activecell du début n'est plus le même...

@ bientôt

LouReeD

Le code est pensé pour fonctionner quelque soit le type de cellule ou le contenu rencontré. Les variables sont donc toutes bonnes. Il n'y a entre guillemets rien a changer au code. Tout fonctionne et très bien.

Le code split le texte de chaque cellule (M38, N38, O38..........) en plusieurs lignes. Ça c'est bon, que ce soit avec 1 ou 15 cellules à chaque ligne... Cependant, dans la colonne K chaque nouvelle cellule de chaque nouvelle lignes ajoutées restent vides, et je veux les remplir de la même valeur que K37. Jusque là tout va bien, je souhaite juste ajouter la fonction suivante : je veux juste rajouter la copie des données de la cellule K37 dans les celulles juste en dessous (dans la même colonne K).

Taks Ref 3 --> K37 Je veux juste copier Task Ref 3...

Task Ref 3 --> K38 ...ici

Task Ref 3 --> K39 ...ici

........etc

Si je fais ça avec 450 lignes on aura évidemment :

Task Ref 1

Task Ref 1

Task Ref 2

Task Ref 3

Task Ref 3

Task Ref 3

Task Ref 4

Task Ref 4

Task Ref 5

etc... selon ce qu'il faut remplir.

Bref, c'est pour le coup inutile de préciser tout ça car ça fonctionne et les variables sont bonnes, depuis le début.

Donc, je constate que tout fonctionne très bien sauf ce que j'ai mentionné plus tôt, la selection de la cellule Task_Ref, à partir de laquelle le code balaie chaque cellule en dessous (on est dans la colonne K) pour y copier "Task Ref 3".

Plus tôt dans le code ceci fonctionne :

Task_Ref.Select

Dans les dernières lignes cette selection est juste ignorée. C'est ce qui m'embête.

Dans la partie gauche on a les cellules de départ, après la macro les cellules sont divisées en autant de alt+enter qu'il y a dans les cellules initialement.

On constate qu'il manque la copie de Task Ref dans les lignes crées. Je veux juste rajouter cela.

3split-cell.xlsm (47.56 Ko)

Vous me dites que ça marche, mais vous êtes là parce que ça ne marche pas...

Regardez le fichier joint :

C'est un petit test pour que vous compreniez le défaut de tous vos "Select" accouplés avec ActiveCell :

un ActiveCell jumelé avec un OffSet suivi d'un Select modifie le "ActiveCell"

Donc dans votre code si le ActiveCell fait référence à $K37 après quelques lignes ce n'est plus le cas...

Voilà ce que je veux dire dans le sens : il y a trop de Select et que je suis à deux doigts de dire qu'il faut ré écrire le code

@ bientôt

LouReeD

Je suis d'accord que .Select n'est pas la meilleure solution, et c'est bien parce que je débute en VBA que je suis ouvert à toute autre possibilité.

Ici le problème c'est que je fais référence à une cellule en particulier (Task_Ref.Select), et qu'elle ne devient pas ActiveCell. C'est ce que je ne comprends pas. Alors qu'en amont, en écrivant la même chose (Task_Ref.Select) la cellule a bien été sélectionnée comme ActiveCell.

un ActiveCell jumelé avec un OffSet suivi d'un Select modifie le "ActiveCell"

Effectivement, et c'est mon intention comme constaté dans le code.. Cela a été fait plusieurs fois tout au long du code et cela fonctionne.

Seulement, quand j'écris

Task_Ref.Select

dans la toute dernière partie concernée, cela devrait immédiatement sélectionner cette cellule comme ActiveCell n'est-ce pas ?

Je précise ma question : comment donner un nom à une cellule (Set, ou = quelque chose ?) et ensuite comment la sélectionner (par son nom) comme ActiveCell ?

J'ai trouvé le problème :

J'avais écris cela :

Task_Ref = Cells(ActiveCell.Row, col_ref)

Il fallait écrire cela en fait :

Set Task_Ref = Cells(ActiveCell.Row, col_ref)

C'est pour cela que dans la suite du code Task_Ref.Select ne fonctionnait pas car sans Set, Task_Ref ne pouvait pas être défini et donc sélectionné.

Merci en tout cas de ta contribution.

Bonjour et bravo à vous !

je me souviens dans mes différents tests avoir modifié cette ligne, mais comme il devait y avoir d'autre modifications... je suis revenu en arrière du fait d'un résultat non concluant...

Toujours est il que je n'ai pas saisie l'objectif du code, pouvez vous m'éclairsir le sujet, c'est juste pour moi

Donc on sélectionne une cellule de départ qui contient du texte avec ou sans retour chariot.

Ici c'était $M37 qui contient : AAAZZZ sans retour chariot,

on sélectionne une cellule de "départ" ici $K37 et à ce moment là le code fait quoi, qu'y a t il d'inscrit dans les cellules et quelles cellules ?

@ bientôt

LouReeD

L'idée c'est d'avoir au départ un tableau de données mal classé : Il y a des Numéros liés à des Références.

Référence 1 : Numéro

Numéro

Numéro

Référence 2 : Numéro

Référence 3 : Numéro

Numéro

Numéro

Le problème, c'est que chaque référence est sur UNE SEULE LIGNE, Donc tous les Numéros liés à cette Référence sont aussi sur la même ligne, dans une même cellule du coup (différente de la cellule de Référence bien sûr). Ce qui est gênant car on ne peut pas travailler sur chaque Numéro indépendamment, alors qu'on sait pertinement que chacun de ces Numéros est lié à une Référence.

L'idée c'est donc de diviser en nouvelles lignes le contenu des cellules dans lesquelles il y a plusieurs Numéros, et donc d'y associer la Référence à chaque ligne. C'est ce que fait le code globalement.

La multitude des variables et incrémentations est utile pour palier à une mauvaise selection dans chaque inputbox. C'est donc pas mal de bidouillage pour automatiser au maximum tout le processus.

Pour diviser le texte je me suis basé sur cela : https://exceljet.net/formula/split-text-with-delimiter

Pour le reste c'est des sélections continues avec des noms de cellules qui s'adaptent à chaque ligne afin que les différents ".Select" travaillent sur les bonnes lignes pour les copie/collé de données.

Donc dans l'exemple qui nous concerne il n'y avait rien à écrire sous Task_3 car il n'y a qu'un numéro dans la cellule $M37 ?

@ bientôt

LouReeD

Exactement, s'il n'y a qu'un seul numéro, aucune nouvelle ligne ne sera créée au terme du code, et donc pas de copie de Task Ref 3 (par exemple dans le cas de cette ligne).

Rechercher des sujets similaires à "copier valeur"