XL 2019 Activer un onglet en fonction d'une variable // copier-coller sur une ligne vide mais à compter de la ligne 16

ALFM2021

XLDnaute Nouveau
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. :eek:
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...:p

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.

Merci à tous de votre bienveillance avec mon cas,
 

Pièces jointes

  • preparatifs suivi stock Vlight.xlsm
    26.6 KB · Affichages: 16
Solution
Bonjour @ALFM2021 , Robert

Je te propose ceci

J'ai commenté le code pour que tu puisses comprendre le code et après copie je supprime les valeurs

1617127598334.png


@Phil69970

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour ALFM, bonjour le forum

Essaie comme ça :

VB:
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
 

ALFM2021

XLDnaute Nouveau
Bonjour ALFM, bonjour le forum

Essaie comme ça :

VB:
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 @ALFM2021 , Robert

Je te propose ceci

J'ai commenté le code pour que tu puisses comprendre le code et après copie je supprime les valeurs

Regarde la pièce jointe 1100570

@Phil69970
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.

Anne-Laure
 

Phil69970

XLDnaute Barbatruc
Bonjour Anne-Laure, le forum

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 ?
1)
Dim Derlig&, VarNom

La variable Derlig est bien déclaré en Long mais je l'ai écrit en raccourci.
J'aurais pu écrire :
Dim Derlig as Long c'est équivalent à Dim as Derlig&

Voici la liste des raccourcis acceptés :

$ veut dire As String
& veut dire As long
# veut dire As double
% veut dire As integer

Quand à VarNom elle n'est pas déclarée avec un type defini elle est du type variant voir la doc.


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.

1617202942846.png

*Ne pas oublier le point . qui fait toute la différence;)

@Phil69970
 
Dernière édition:

ALFM2021

XLDnaute Nouveau
Bonjour Anne-Laure, le forum


1)
Dim Derlig&, VarNom

La variable Derlig est bien déclaré en Long mais je l'ai écrit en raccourci.
J'aurais pu écrire :
Dim Derlig as Long c'est équivalent à Dim as Derlig%

Voici la liste des raccourcis acceptés :

$ veut dire As String
& veut dire As long
# veut dire As double
% veut dire As integer

Quand à VarNom elle n'est pas déclarée avec un type defini elle est du type variant voir la doc.





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.

Regarde la pièce jointe 1100695
*Ne pas oublier le point . qui fait toute la différence;)

@Phil69970
Merci c'est tellement clair ! !
Tu as éclairé ma journée ! (déjà très ensoleillée...)
 

Discussions similaires