[VBA] déplacement sur onglet via valeur dans une cellule et copie-colle

Ludo_R

XLDnaute Nouveau
Bonjour,

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 ;) )

Regarde la pièce jointe Copie_PU.xlsm

d'avance merci.
 

Pièces jointes

  • Copie_PU.xlsm
    23.2 KB · Affichages: 98
  • Copie_PU.xlsm
    23.2 KB · Affichages: 97

frangy

XLDnaute Occasionnel
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

A+
 

Ludo_R

XLDnaute Nouveau
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

Merci à toi.
 
Dernière édition:

frangy

XLDnaute Occasionnel
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).
 

Ludo_R

XLDnaute Nouveau
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

Je ne comprends pas cette partie:
Code:
For Each var_cel In var_pla
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 ?
 

frangy

XLDnaute Occasionnel
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 !”

Capiche ?
 

Ludo_R

XLDnaute Nouveau
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

et cette ligne bug sur la feuille 5
Code:
var_wst.Range("pu").Copy

Si quelqu'un à une idée je suis preneur :)
Merci.
 

Pièces jointes

  • Copie_PU.xlsm
    26.9 KB · Affichages: 79
  • Copie_PU.xlsm
    26.9 KB · Affichages: 77

Discussions similaires

Réponses
7
Affichages
183

Statistiques des forums

Discussions
312 198
Messages
2 086 149
Membres
103 132
dernier inscrit
hedfahmi