copier textbox dans une plage de cellule définie

lydiiee

XLDnaute Junior
Bonjour à tous

Mon utilisateur saisit un code dans une textbox sur la feuille "HANDOUT", ce texte doit se reporter sur la feuille "SCREEN" dans la premiere cellule disponible sur la plage A2:C7.

Mon problème est étant débutante en macro et à l'aide des recherches internet et réponses de chacun, je n'ai réussi qu'à copier le code saisi sur la premiere cellule disponible de la colonne A et non de la plage. Ce qui fait qu'une fois les cellules A2:A7 remplies, le code suivant se place sur la cellule A8 au lieu de B2...

Mon code :

Dim numlignevide As Integer
Worksheets("SCREEN").Activate
numlignevide = ActiveSheet.Columns(1).Find("").Row

ActiveSheet.Cells(numlignevide, 1) = TextBox1.Text


Je ne sais pas si je suis claire, j'ai donc inséré mon fichier en PJ!!

Quelqu'un peut il m'aider?

Merci beaucoup!!
 

Pièces jointes

  • TEST stats.xlsm
    56.4 KB · Affichages: 71
  • TEST stats.xlsm
    56.4 KB · Affichages: 85
  • TEST stats.xlsm
    56.4 KB · Affichages: 85
Dernière édition:

Gurgeh

XLDnaute Occasionnel
Re : copier textbox dans une plage de cellule définie

Salut lydiiee,

Il y a 18 cases dans ta zone, donc je te suggère de procéder ainsi : tu fais un compteur CaseEnCours que tu incrémente de 1 à chaque nouvelle valeur que tu veux copier (il va donc aller de 1 à 18)
Ensuite, tu obtiens la ligne et la colonne où copier la valeur que tu veux ainsi :
Ligne =
Colonne = INT((CaseEnCours-1)/6)+1
Ligne = ((CaseEnCours-1) MOD 6 ) + 1

Gurgeh
 

lydiiee

XLDnaute Junior
Re : copier textbox dans une plage de cellule définie

Hello Gurgeh

Merci pour ta réponse; cependant je n'arrive pas à appliquer ton code
Peux tu me donner plus de précision sur ce qu'est un compteur et ou je peux insérer les formules pour colonne et ligne?

Ce code reconnait il quand une cellule se "libere" (si un utilisateur efface le contenu).
C'est à dire si j'ai des données dans les cellules A1, A2, A3, A4 et A5, si un utilisateur efface la cellule A1, le code va t(il repérer que la cellule A1 est diponible et donc m'envoyer le contenu de ma texte box en A1?

Merci encore pour ton aide
Lydiiee
 

Gurgeh

XLDnaute Occasionnel
Re : copier textbox dans une plage de cellule définie

Ah, OK j'avais pas tout compris.

Bon, un compteur, c'est un mot un peu savant pour dire qu'on va utiliser une variable que l'on va incrémenter (ajouter 1).

Je te propose cet autre code, qui va scruter ta plage, et te renvoyer les coordonnées de la première cellule vide. Il parcourt la plage en faisant toutes les lignes de la première colonne, puis toutes celles de la deuxième, etc. Si tu veux un autre sens de scrutation, pas de problème, il suffit de demander.

Code:
Sub CelluleVide(Plage As Range, ByRef LigneCelluleVide, ByRef ColonneCelluleVide)
    NbreLignes = Plage.Rows.Count 'le nombre de lignes de la plage
    NbreColonnes = Plage.Columns.Count 'le nombre de colonnes de la plage
    CelluleVideTrouvée = False 'cette variable va servir à savoir si on a trouvé une cellule vide
    
    'i & j seront les compteurs que l'on va incrémenter pour scruter la plage
    'dès que l'on trouve une valeur vide, on arrête la scrutation
    j = 1
    'tant que l'on n'a pas trouvé de cellule vide et qu'on a pas atteint la fin des colonnes on continue
    While Not CelluleVideTrouvée And j <= NbreColonnes
        'Dès que l'on change de colonne, on repart de la ligne 1
        i = 1
        'tant que l'on n'a pas trouvé de cellule vide et qu'on a pas atteint la fin des lignes on continue
        While Not CelluleVideTrouvée And i <= NbreLignes
            'on teste la cellule qui se trouve sur la ligne i et la colonne j
            CelluleVideTrouvée = (Plage.Cells(i, j).Value = "")
            'on passe à la ligne suivante
            i = i + 1
        Wend
        'on passe à la colonne suivante
        j = j + 1
    Wend
    'deux cas possibles : on a trouvé une cellule vide, auquel cas on met ses coordonnées dans LigneCelluleVide et ColonneCelluleVide
    'ou alors on ne fait rien et les valeurs ne changent pas
    If CelluleVideTrouvée Then
        LigneCelluleVide = i - 1
        ColonneCelluleVide = j - 1
    End If
End Sub

Le principe de cette procédure, c'est que tu vas lui donner comme argument la plage que tu veux regarder, ainsi que deux variables, dans lesquelles la procédure va stocker les coordonnées de la première cellule vide trouvée.

Ainsi :
Code:
Sub ProcédureQuelconque
 ...
 ...
 LigneCelluleVide = 0
 ColonneCelluleVide = 0
 CelluleVide Sheets("Feuil1").range("A1:C8"), LigneCelluleVide , ColonneCelluleVide 
 ' et après cette procédure tu te retrouve avec dans LigneCelluleVide  et ColonneCelluleVide  les valeurs des coordonnées de la première cellule vide, ou alors des 0 si aucune cellule vide n'est trouvée.
end sub

Bon, si c'est pas clair, n'hésite pas pour les questions !

Gurgeh
 

lydiiee

XLDnaute Junior
Re : copier textbox dans une plage de cellule définie

Hello Gurgeh

J'ai voulu tester ton code que j'ai placé dans un module. Dans ma macro de la feuille "HANDOUT" ou se trouve ma textbox, j'ai mis

Private Sub CommandButton1_Click()

Call CelluleVide

End Sub

Mais il me dit "Argument not optional", du coup je n'arrive pas à tester le code!

Sais tu pourquoi il me met ce message d'erreur?

Bon sinon pour le premier code avec le compteur j'ai réussi à le comprendre je pense, malgré le "cellulevidetrouvée" que l'on défini comme = false (cela permet à Excel de comprendre "vide"?)

Merci encore
Lydiiee
 
Dernière édition:

Gurgeh

XLDnaute Occasionnel
Re : copier textbox dans une plage de cellule définie

Salut lydiiee,

La procédure CelluleVide a besoin de trois arguments, si tu ne lui donnes pas elle n'est pas contente et donc elle râle. Il lui faut trois arguments : la plage à regarder, et deux variables dans lesquelles elle stocke les coordonnées trouvées

Dans mon post précédent, dans la deuxième extrait de code, je te donne un exemple de code à implémenter pour la faire fonctionner.

Quant à CelluleVideTrouvée, c'est un booléen, donc peut prendre la valeur vrai ou faux. Je l'initialise à faux par principe, mais ce n'est pas indispensable (mais c'est une bonne habitude de donner une valeur de départ aux variables que l'on utilise...)

Gurgeh
 

lydiiee

XLDnaute Junior
Re : copier textbox dans une plage de cellule définie

Salut Gurgeh

Je n'y arrive toujours pas, désolée de te donner autant de fil à retordre mais il me manque des bases en VBA, j'apprends sur le tas et grace à internet!

Voici mon code du module :
Sub CelluleVide(Plage As Range, ByRef LigneCelluleVide, ByRef ColonneCelluleVide)

Plage = Sheets("screen").Range("A2:C7")

Nbrelignes = Plage.Rows.Count(7)
NbreColonnes = Plage.Columns.Count(3)

cellulevidetrouvée = Plage.Find("")

cellulevidetrouvée = False 'cette variable va servir à savoir si on a trouvé une cellule vide

'i & j seront les compteurs que l'on va incrémenter pour scruter la plage
'dès que l'on trouve une valeur vide, on arrête la scrutation
j = 1
'tant que l'on n'a pas trouvé de cellule vide et qu'on a pas atteint la fin des colonnes on continue
While Not cellulevidetrouvée And j <= NbreColonnes
'Dès que l'on change de colonne, on repart de la ligne 1
i = 1
'tant que l'on n'a pas trouvé de cellule vide et qu'on a pas atteint la fin des lignes on continue
While Not cellulevidetrouvée And i <= Nbrelignes
'on teste la cellule qui se trouve sur la ligne i et la colonne j
cellulevidetrouvée = (Plage.Cells(i, j).Value = "")
'on passe à la ligne suivante
i = i + 1
Wend
'on passe à la colonne suivante
j = j + 1
Wend
'deux cas possibles : on a trouvé une cellule vide, auquel cas on met ses coordonnées dans LigneCelluleVide et ColonneCelluleVide
'ou alors on ne fait rien et les valeurs ne changent pas

If cellulevidetrouvée Then
LigneCelluleVide = i - 1
ColonneCelluleVide = j - 1
End If

Sheets("SCREEN").Range ("A2:C7"), LigneCelluleVide, ColonneCelluleVide = TextBox1


End Sub


et dans ma feuille "HANDOUT" ou se trouve ma textbox que je veux insérer dans la plage A2:C7 de la feuille SCREEN, voici ce que j'ai mis :
Private Sub CommandButton1_Click()

Call CelluleVide

End Sub
Mais il me dit toujours "argument not optional"
 

Gurgeh

XLDnaute Occasionnel
Re : copier textbox dans une plage de cellule définie

La procédure CelluleVide est une procédure qui attend des arguments, tu ne peux pas l'appeler toute seule sans rien lui donner sur quoi travailler. C'est un peu comme si dans une feuille de calcul, tu tapais =SOMME() avec rien entre les parenthèses, il ne va rien se passer...

Tu n'as pas besoin de modifier la procédure CelluleVide (d'ailleurs supprime la ligne que tu y as rajoutée), mais par contre tu dois écrire une autre procédure qui va l'appeler pour faire ce que tu veux.

Donc tu dois écrire ta procédure CommandButton1_Click() comme ça :

Code:
Private Sub CommandButton1_Click()

'On va utiliser deux variables pour que la procédure CelluleVide puisse écrire les numéros de ligne et de cellule de 'la première cellule vide trouvée
LigneCelluleVide = 0
ColonneCelluleVide = 0
'Maintenant on appelle CelluleVide, avec ses arguments
CelluleVide Sheets("SCREEN").Range ("A2:C7"), LigneCelluleVide, ColonneCelluleVide
'La procédure elle-même ne renvoie rien (ce n'est pas une fonction), mais elle a écrit dans
'LigneCelluleVide et ColonneCelluleVide les valeurs qu'elle a trouvées

'Ensuite il n'y a plus qu'à utiliser ces valeurs
Sheets("SCREEN").cells(LigneCelluleVide, ColonneCelluleVide).value = TextBox1.value

End Sub

Voilà, pour bien faire il faudrait rajouter un test pour le cas où la procédure ne trouve pas de cellule vide (les valeurs de LigneCelluleVide et ColonneCelluleVide sont toujours à 0 après avoir lancé CelluleVide).

Je te conseille ardemment la lecture suivante: Les procédures & fonctions

Gurgeh
 

lydiiee

XLDnaute Junior
Re : copier textbox dans une plage de cellule définie

Hello Gurgeh

Merci beaucoup pour ton aide précieuse, effectivement maintenant elle prend en compte la macro "CelluleVide"

Par contre il me remplace toujours la premiere cellule, il ne cherche pas la cellule vide... Sais tu ce que j'aurais manqué?

Merci encore
Lydiiee
 

Gurgeh

XLDnaute Occasionnel
Re : copier textbox dans une plage de cellule définie

Alors deux points :
* supprimer la ligne
Code:
Plage = Sheets("SCREEN").Range("A2:C7")
du contenu de la macro CelluleVide : la définition de plage, tu l'as déjà donnée au moment où tu appelles CelluleVide : lorsque tu écris
Code:
CelluleVide Sheets("SCREEN").Range("A2:C7"), LigneCelluleVide, ColonneCelluleVide
alors la macro comprend que dans Plage elle stocke Sheets("SCREEN").Range("A2:C7").

* remplacer
Code:
Sheets("SCREEN").Cells(LigneCelluleVide, ColonneCelluleVide).Value = TextBox1.Text
par
Code:
Sheets("SCREEN").Range("A2:C7").Cells(LigneCelluleVide, ColonneCelluleVide).Value = TextBox1.Text
dans la procédure CommandButton1_Click(), et ça marchera beaucoup mieux !

Gurgeh
 

Discussions similaires

Statistiques des forums

Discussions
312 176
Messages
2 085 959
Membres
103 065
dernier inscrit
HB ARPF 95