Bonjour à tous,
Petit préambule qui éclairera sans doute, le niveau très bas de mes questions. Je viens de démarrer la programmation en VBA pour améliorer mon usage d'excel. J'ai passé des heures au carré sur des tutoriels sur internet, et sur votre forum, et j'ai essayé pas mal de choses... mais je reste coincée. D'où mon appel à l'aide.
Ci-joint un fichier très allégé pour comprendre mon besoin.
Je vais devoir saisir des entrées ou des sorties de stock. Ces saisies se feront dans l'onglet "formulaire". A chaque "saisie", je souhaite appuyer sur le bouton et faire un copier/ coller dans un onglet déterminé, en ligne les unes après les autres. (pour être transparente, mais j'ai voulu simplifier, il y a une étape intermédiaire qui cherche les références pour éviter de les taper, ça explique pourquoi je ne saisis pas directement dans le bon onglet...
Premier Problème :
Dans le haut de l'onglet "formulaire", on va déterminer le "nom de l'onglet" dans lequel il faut aller copier la donnée. Dans VBA, j'ai crée une variable, et j'essaye de lui donner la valeur de cette cellule. Ensuite j'utilise cette valeur, comme nom d'onglet à activer... cela ne fonctionne pas. (j'ai essayé avec des types de variable worksheets, string... des .text et des .value...
Deuxième Problème :
Bon là j'avoue j'ai moins d'essais à montrer parce que je me sens moins inspirée.
Comme vous pouvez le constater, cette macro a pour objet de copier/coller sur la ligne 16 les 3 cellules, mais à la prochaine saisie, il va falloir que je copie colle en 17 etc... jusqu'à la fin de cette saisie. Ma piste était de chercher la première ligne vide à compter de 16... Si vous avez des idées je prends.
Sub copier_coller2()
Dim OS As Worksheet
Dim OD As Worksheet
Dim DEST As Range
Set OS = Worksheets("formulaire")
Set OD = Worksheets(OS.Cells(8, 5).Value)
Set DEST = IIf(OD.Cells(16, "A").Value = "", OD.Cells(16, "A"), OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0))
OS.Range("C22:E22").Copy
DEST.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
Sub copier_coller2()
Dim OS As Worksheet
Dim OD As Worksheet
Dim DEST As Range
Set OS = Worksheets("formulaire")
Set OD = Worksheets(OS.Cells(8, 5).Value)
Set DEST = IIf(OD.Cells(16, "A").Value = "", OD.Cells(16, "A"), OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0))
OS.Range("C22:E22").Copy
DEST.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
Bonjour tout le monde,
Déjà un grand merci à Robert et Phil69970 d'avoir pris le temps. Pour une raison que j'ignore je n'ai jamais réussi à faire fonctionner la solution de Robert. Celle de Phil69970 fonctionne chez moi parfaitement.
Un grand grand merci à tous les deux en tous cas.
Comme je n'aime pas ne pas comprendre, si tu as 5 min de plus à perdre pour moi, peux-tu m'expliquer plusieurs petites choses...
1. Lorsque qu'en ligne 4 tu déclares 2 variables en même temps derlig& et Varnom : le fait de ne pas dire de quelle nature il s'agit, implique que c'est du "string" c'est ça ?
2. Lorsque tu déclares la valeur de Varnom, je comprends évidemment que c'est la valeur de la cellule E8 de formulaire, mais je ne connais pas cette syntaxe. tu ré-utilises d'ailleurs cette syntaxe au moment des copier-coller. Peux tu me dire comment s'appelle cette syntaxe que je puisse trouver un peu de littérature à lire /écouter/voir sur ce sujet ?
3. Concernant la boucle que tu as ajoutée, je crois comprendre, qu'en fait pour qu'il trouve le bon onglet, il faut qu'il parcourt tous les onglets ? (contrairement à ce que je pensais, où si il avait le nom de l'onglet il allait forcément le trouver...) Je vois bien ce que cela fait, et cela fonctionne parfaitement. mais je ne comprends pas que le nom de l'onglet ne suffise pas à l'identifier.
Si par hasard tu as du temps pour m'éclairer.
Merci merci merci et merci encore pour le temps.
1. Lorsque qu'en ligne 4 tu déclares 2 variables en même temps derlig& et Varnom : le fait de ne pas dire de quelle nature il s'agit, implique que c'est du "string" c'est ça ?
2. Lorsque tu déclares la valeur de Varnom, je comprends évidemment que c'est la valeur de la cellule E8 de formulaire, mais je ne connais pas cette syntaxe. tu ré-utilises d'ailleurs cette syntaxe au moment des copier-coller. Peux tu me dire comment s'appelle cette syntaxe que je puisse trouver un peu de littérature à lire /écouter/voir sur ce sujet ?
3. Concernant la boucle que tu as ajoutée, je crois comprendre, qu'en fait pour qu'il trouve le bon onglet, il faut qu'il parcourt tous les onglets ? (contrairement à ce que je pensais, où si il avait le nom de l'onglet il allait forcément le trouver...) Je vois bien ce que cela fait, et cela fonctionne parfaitement. mais je ne comprends pas que le nom de l'onglet ne suffise pas à l'identifier.
2)
J'aurais pu écrire et gagner une variable mais c'est plus long à écrire ....
If Ws.Name = VarNom Then c'est égale à If Ws.Name = Worksheets("Formulaire").[E8].Value Then
Je boucle sur chaque onglet en excluant l'onglet "formulaire" et je compare le nom de chaque onglet avec la valeur en en E8
3)
Tu as raison on peut se passer de la boucle.
Et c'est vrai que l'on peut agir directement sur le bon onglet sans boucler par tous les onglets.
On pourrait écrire :
Code:
Sub Transfert_V2()
Application.ScreenUpdating = False
Dim Derlig&
With Worksheets("Formulaire")
Derlig = Worksheets(.[E8].Value).Range("A" & Rows.Count).End(xlUp).Row + 1
Worksheets(.[E8].Value).Range("A" & Derlig) = .[C13].Value: .[C13].ClearContents 'On copie et on supprime la valeur dans le formulaire
Worksheets(.[E8].Value).Range("B" & Derlig) = .[D16].Value: .[C16].ClearContents 'On copie et on supprime la valeur dans le formulaire
Worksheets(.[E8].Value).Range("C" & Derlig) = .[C17].Value: .[C17].ClearContents 'On copie et on supprime la valeur dans le formulaire
End With
End Sub
On gagne 2 variables, on gagne en rapidité d’exécution mais on perd un peu en lisibilité.
Par habitude je boucle sur les onglets, car on ne le connait pas, alors qu'ici je peux aller directement au bon onglet car on le connait.
*Ne pas oublier le point . qui fait toute la différence
2)
J'aurais pu écrire et gagner une variable mais c'est plus long à écrire ....
If Ws.Name = VarNom Then c'est égale à If Ws.Name = Worksheets("Formulaire").[E8].Value Then
Je boucle sur chaque onglet en excluant l'onglet "formulaire" et je compare le nom de chaque onglet avec la valeur en en E8
3)
Tu as raison on peut se passer de la boucle.
Et c'est vrai que l'on peut agir directement sur le bon onglet sans boucler par tous les onglets.
On pourrait écrire :
Code:
Sub Transfert_V2()
Application.ScreenUpdating = False
Dim Derlig&
With Worksheets("Formulaire")
Derlig = Worksheets(.[E8].Value).Range("A" & Rows.Count).End(xlUp).Row + 1
Worksheets(.[E8].Value).Range("A" & Derlig) = .[C13].Value: .[C13].ClearContents 'On copie et on supprime la valeur dans le formulaire
Worksheets(.[E8].Value).Range("B" & Derlig) = .[D16].Value: .[C16].ClearContents 'On copie et on supprime la valeur dans le formulaire
Worksheets(.[E8].Value).Range("C" & Derlig) = .[C17].Value: .[C17].ClearContents 'On copie et on supprime la valeur dans le formulaire
End With
End Sub
On gagne 2 variables, on gagne en rapidité d’exécution mais on perd un peu en lisibilité.
Par habitude je boucle sur les onglets, car on ne le connait pas, alors qu'ici je peux aller directement au bon onglet car on le connait.