Je vous soumet mon premier petit soucis.
Brièvement, je souhaite:
Sur la feuille "tutu" aller dans l'onglet dont le nom est dans la colonne 1, une fois dans cet onglet, copier la cellule "PU", revenir sur la feuille "tutu" et enfin copier (la valeur) dans la colonne 4 (en face du nom d'onglet correspondant - cellules en jaune).
La macro doit prendre en compte le fait qu'il y a parfois des cellules vide (au lieu d'avoir le nom d'onglet), et il peut aussi y avoir des noms qui n'ont rien à voir avec les onglets. Dans ces 2 derniers cas les cellules (en faces de ces noms) de la colonne 4 doivent rester vide.
Alors pour moi tout fonctionne sauf la partie en gras ci dessus.
Je vous joint le fichier (au cas ou vous auriez une idée )
Re : [VBA] déplacement sur onglet via valeur dans une cellule et copie-colle
Bonsoir,
Regarde si ce code te convient.
Code:
Option Explicit
Sub PU()
Dim Plage As Range, Cel As Range
Dim DerLigne As Long
Dim Ws As Worksheet
Application.ScreenUpdating = False
With Worksheets("tutu")
DerLigne = .Cells.SpecialCells(xlCellTypeLastCell).Row
Set Plage = .Range("A2:A" & DerLigne) 'Plage contenant les noms de feuille
Plage.Offset(0, 3).ClearContents 'On efface la plage contenant les "pu"
For Each Cel In Plage 'la variable va de 2 jusqu'a DerLigne
If Not IsEmpty(Cel) Then 'si la cellule incrémenté de la feuille "tutu" n'est pas vide
On Error Resume Next 'On évite le message d'erreur si la feuille n'existe pas.
Set Ws = Worksheets(Cel.Value)
On Error GoTo 0
If Not Ws Is Nothing Then 'Si la feuille existe, on effectue la copie
Ws.Range("pu").Copy
Cel.Offset(0, 3).PasteSpecial xlPasteValues
Set Ws = Nothing
End If
End If
Next Cel
Set Plage = Nothing
End With
Application.ScreenUpdating = True
End Sub
Re : [VBA] déplacement sur onglet via valeur dans une cellule et copie-colle
C'est parfait, mais je ne comprends pas tout, peux tu m'expliquer les lignes en entre tirets STP ?
J'ai changé les variables pour plus de compréhension de mon coté.
Code:
Option Explicit
Sub test()
Dim var_pla As Range, var_cel As Range
Dim nbr_lig As Long
Dim var_wst As Worksheet
Application.ScreenUpdating = False 'désactivation de l'actualisation de l'écran
With Worksheets("tutu") 'execution dans la feuille "tutu"
nbr_lig = .Cells.SpecialCells(xlCellTypeLastCell).Row 'compte le nombre de ligne du tableau
Set var_pla = .Range("A2:A" & nbr_lig) 'Plage contenant les noms de feuille
'pas nécessaire
'var_pla.Offset(0, 3).ClearContents 'On efface la plage contenant les "pu"
-------For Each var_cel In var_pla 'la variable va de 2 jusqu'a nbr_lig-------
If Not IsEmpty(var_cel) Then 'si la cellule incrémenté de la feuille "tutu" n'est pas vide
On Error Resume Next 'On évite le message d'erreur si la feuille n'existe pas.
Set var_wst = Worksheets(var_cel.Value)
On Error GoTo 0
If Not var_wst Is Nothing Then 'Si la feuille existe, on effectue la copie
var_wst.Range("pu").Copy
var_cel.Offset(0, 3).PasteSpecial xlPasteValues
Set var_wst = Nothing 'réinitialisation de la variable
End If
End If
Next var_cel
Set var_pla = Nothing
End With
Application.ScreenUpdating = True
End Sub
Re : [VBA] déplacement sur onglet via valeur dans une cellule et copie-colle
Je définis tout d’abord la plage sur laquelle j’effectue le traitement :
Code:
Set var_pla = .Range("A2:A" & nbr_lig) 'Plage contenant les noms de feuille
J’indique ensuite que je vais effectuer un traitement sur chaque cellule de cette plage
Code:
For Each var_cel In var_pla
Cela se traduit par "Pour chaque cellule de la plage var_pla ".
C’est équivalent à la formule "Pour chaque cellule de la ligne 2 à la ligne nbr_lig" que tu écrirais
Code:
For i=2 to nbr_lig
If Range("A" & i).value <> "" then ....
Next i
La différence, c’est que j’opère directement sur les cellules (et non pas sur les valeurs ou les adresses des cellules).
Re : [VBA] déplacement sur onglet via valeur dans une cellule et copie-colle
J’indique ensuite que je vais effectuer un traitement sur chaque cellule de cette plage
Code :
Code:
For Each var_cel In var_pla
Cela se traduit par "Pour chaque cellule de la plage var_pla ".
C’est équivalent à la formule "Pour chaque cellule de la ligne 2 à la ligne nbr_lig" que tu écrirais
Code :
Code:
For i=2 to nbr_lig
If Range("A" & i).value <> "" then ....
Next i
Car mis a part avoir dimensionner "var_cel", tu n'as pas définie de plage pour cette variable, alors quand tu écris:
"Pour chaque cellule de la plage var_pla " var_cell correspond à quoi ? toutes les cellules qui sont en face des de la plage A2:A12 ?
Re : [VBA] déplacement sur onglet via valeur dans une cellule et copie-colle
Je vais tenter d’être plus concret.
Prenons pour exemple la plage A2:A20
Pour affecter une variable range à cette plage, je vais procéder en 2 temps
1) Déclaration de la variable var_pla :
Code:
Dim var_pla as range
2) Affectation de la plage à cette variable :
Code:
Set var_pla = Range("A2:A20")
La plage var_pla se compose donc de 19 cellules.
Pour effectuer une traitement sur chaque cellule de cette plage, je vais utiliser une autre variable range qui se composera d’une seule cellule : var_cel.
Je vais déclarer cette plage de 1 cellule comme la précédente :
Code:
Dim var_cel as range
Avec la boucle For Each...Next, cette variable sera redéfinie à chaque itération.
A la première itération, var_cel correspondra à A2, à la deuxième itération, elle correspondra à A3, etc.
Maintenant, si j’écris
Code:
For Each var_cel In var_pla
If Not IsEmpty(var_cel) Then MsgBox “Je ne suis pas vide !”
Next var_cel
Cela se traduit par :
Boucle sur chaque cellule (var_cel ) de la plage A2 :A20 (var_pla) ;
Si la cellule (var_cel ) n’est pas vide, alors affiche le message “Je ne suis pas vide !”
Re : [VBA] déplacement sur onglet via valeur dans une cellule et copie-colle
Bonjour,
Je reprends ce jour mon fichier, et Oh surprise j'ai un soucis que je ne comprends pas ...
Voici le fichier ci-dessous. Regarde la pièce jointe Copie_PU.xlsm
Et le code ici:
Code:
Option Explicit
Sub test()
Dim var_pla As Range, var_cel As Range
Dim nbr_lig As Long
Dim var_wst As Worksheet
Application.ScreenUpdating = False 'désactivation de l'actualisation de l'écran
With Worksheets("tutu") 'execution dans la feuille "tutu"
nbr_lig = .Cells.SpecialCells(xlCellTypeLastCell).Row 'compte le nombre de ligne du tableau
Set var_pla = .Range("A2:A" & nbr_lig) 'Plage contenant les noms de feuille, plage sur laquelle on effectue le traitement
'pas nécessaire
'var_pla.Offset(0, 3).ClearContents 'On efface la plage contenant les "pu"
For Each var_cel In var_pla 'traitement sur chaque cellule de la plage, la variable va de 2 jusqu'a nbr_lig
If Not IsEmpty(var_cel) Then 'si la cellule incrémenté de la feuille "tutu" n'est pas vide
On Error Resume Next 'On évite le message d'erreur si la feuille n'existe pas.
Set var_wst = Worksheets(var_cel.Value)
On Error GoTo 0
If Not var_wst Is Nothing Then 'Si la feuille existe, on effectue la copie
var_wst.Range("pu").Copy
var_cel.Offset(0, 3).PasteSpecial xlPasteValues
Set var_wst = Nothing 'réinitialisation de la variable
End If
End If
Next var_cel
Set var_pla = Nothing
End With
Application.ScreenUpdating = True
End Sub