Microsoft 365 VBA Copier Range avec Cells, problème de feuille

Zimzim

XLDnaute Nouveau
Bonjour,
Malgres les test et recherche:
Excel n'accepte pas cette ligne :

Sheets("f2").Range(Cells(Numlig, 4), Cells(Numlig, 15)).Copy

J'ai testé un certain nombre de choses, il semble qu'il n'accepte pas ma feuille 2 (içi f2) car le programme fonctionne avec Feuil1
J'ai également essayé de remplacer numlig par deux, de mettre des guillemets, de tester d'autre fonction que copy, de passer par des variables intermédiaires ect ect... Sans succès

Ci dessous et joint le programme complet

Sub copiecolonne()

'Déclaration des variables
Dim MOIS As Integer
Dim Annee As Integer
Dim Numlig As Integer




'Programme (copie les données de la feuille 1, les stockes dans la feuille2 puis en ressort certaines pour les coller à nouveau dans la feuille 1)

'Cherche le numéro du rapport en fonction de la date
MOIS = Sheets("Feuil1").Cells(1, 5).Value
Annee = Sheets("Feuil1").Cells(1, 6).Value
Numlig = MOIS + Annee - 2026

'Copie les données
Sheets("Feuil1").Range("B5:B15").Copy
'Colle les données en ligne sur une autre feuille
Sheets("f2").Cells(Numlig, 4).PasteSpecial Transpose:=True
'rapatrie les données de la ligne de mon choix pour la comparaison

Sheets("f2").Range(Cells(Numlig, 4), Cells(Numlig, 15)).Copy 'Ligne problématique
Sheets("Feuil1").Cells(5, 4).PasteSpecial Transpose:=True

End Sub




Merci pour votre aide,
 

Pièces jointes

  • Programme copie colonne.xlsm
    27.6 KB · Affichages: 9
Solution
Bonjour Zimzim, le fil,

bienvenue sur le site XLD ! :)

je te retourne ton fichier Excel (joint en fin de ce post).

sur la feuille "f2", note qu'il n'y a que 2 lignes de données : lignes 2 et 3 ; note que la ligne 4 est vide ; va sur "Feuil1" ; regarde les données de B1, E1:F1, et B5:B15 ; clique sur le bouton "Enregistrer" ➯ copie des données effectuée sur "f2", en ligne 4 ; si tu le faisais de nouveau, ça copierait en ligne 5, puis 6, etc...

clique sur le bouton...​

soan

XLDnaute Barbatruc
Bonjour Zimzim, le fil,

bienvenue sur le site XLD ! :)

je te retourne ton fichier Excel (joint en fin de ce post).

sur la feuille "f2", note qu'il n'y a que 2 lignes de données : lignes 2 et 3 ; note que la ligne 4 est vide ; va sur "Feuil1" ; regarde les données de B1, E1:F1, et B5:B15 ; clique sur le bouton "Enregistrer" ➯ copie des données effectuée sur "f2", en ligne 4 ; si tu le faisais de nouveau, ça copierait en ligne 5, puis 6, etc...

clique sur le bouton "Récupérer" ; oh ! mais ça fait rien du tout ! exact, et c'est normal ! c'est car la cellule active est A1, et sur la ligne 1 y'a aucune donnée à récupérer ! si la cellule active était en ligne 5 ou en dessous, idem : comme ces lignes sont vides, y'a pas non plus de données à récupérer ! donc par rapport aux données présentes actuellement en lignes 2 à 4, regarde la ligne que tu veux récupérer, puis sélectionne n'importe quelle cellule de cette ligne (donc en n'importe quelle colonne) ; par exemple, tu veux récupérer la ligne 3 ; sélectionne alors A3 ou D3 (peu importe la colonne) ; clique sur le bouton "Récupérer" ➯ sur "Feuil1" : a) toutes les anciennes données de B1, E1, et B5:B15 ont été effacées (pour éviter toute interférence entre les anciennes données affichées et les nouvelles ; mais j'ai quand même laissé l'année de F1 : 2021) ; b) ça a copié toutes les données de la ligne 3 que tu as choisie sur "f2" (y compris le nom du technicien ; et en E1, ça a mis le mois en fonction de l'année et du numéro du rapport).​



attention : tu avais mis ton code VBA dans le module de "Feuil1" ! comme ce n'est pas des subs événementielles, il faut les mettre dans un module standard tel que Module1 ; pour insérer un module standard, c'est très facile : quand tu es sur la fenêtre "Microsoft Visual Basic", fais : Alt i m (c'est le raccourci clavier de Insertion / Module).​



code VBA de Module1 (47 lignes) :

VB:
Option Explicit

Sub Enregistrer()
  If ActiveSheet.Name <> "Feuil1" Then Exit Sub 'on doit être sur "Feuil1"
  Dim m&, n&: m = Rows.Count 'm = nombre de lignes maximum
  n = Cells(m, 2).End(3).Row 'n° dernière ligne, selon la colonne B
  If n < 5 Then Exit Sub 'sortie de la sub, car y'a aucune donnée à copier !
 
  Dim lig&: Application.ScreenUpdating = 0
  With Worksheets("f2")
    lig = .Cells(m, 4).End(3).Row + 1
    With .Cells(lig, 1)
      .Value = [B1] 'Technicien
      .Offset(, 1) = DateSerial([F1], [E1], 1) 'date
      .Offset(, 2) = [F1] + [E1] - 2026 'n° du rapport (en fonction de la date)
    End With
    Range("B5:B" & n).Copy 'Copie les données en colonne de "Feuil1" (B5 et dessous)
    .Cells(lig, 4).PasteSpecial -4163, , , True 'Colle les données en ligne sur "f2"
    Application.CutCopyMode = 0: .Select: [A1].Select 'va sur la feuille "f2"
  End With
End Sub

Sub Récupérer()
  If ActiveSheet.Name <> "f2" Then Exit Sub 'on doit être sur "f2"
  Dim m&, n&: m = Rows.Count 'm = nombre de lignes maximum
  n = Cells(m, 4).End(3).Row 'n° dernière ligne, selon la colonne D
  Dim lig&: lig = ActiveCell.Row 'ligne de la cellule active
  If lig = 1 Or lig > n Then Exit Sub 'sortie car y'a aucune donnée à copier !
 
  'rapatrie les données de la ligne désignée par la cellule active de "f2" ;
  'donc il faut D'ABORD sélectionner la BONNE ligne de "f2" AVANT de lancer
  'cette macro, donc AVANT de cliquer sur le bouton "Récupérer".
 
  Application.ScreenUpdating = 0
 
  With Worksheets("Feuil1")
    n = .Cells(m, 2).End(3).Row 'n° dernière ligne, selon la colonne B
    .Range("B1, E1, B5:B" & n).ClearContents 'efface les anciennes données
    .[B1] = Cells(lig, 1) 'récupère le nom du technicien en B1 de "Feuil1"
    .[E1] = 2026 + Cells(lig, 3) - .[F1] 'mois (selon n° rapport et année)
    n = Cells(lig, Columns.Count).End(1).Column 'n° de la dernière colonne
    Cells(lig, 4).Resize(, n - 3).Copy '-3 car SAUF colonnes A à C : D à N
    .[B5].PasteSpecial -4163, , , True 'Coller en colonne sur "Feuil1"
    Application.CutCopyMode = 0: .Select: [A1].Select 'va sur "Feuil1"
  End With
End Sub

si besoin, tu peux demander une adaptation.
à te lire pour avoir ton avis. ;)

soan
 

Pièces jointes

  • Programme copie colonne.xlsm
    25.2 KB · Affichages: 3

Zimzim

XLDnaute Nouveau
Bonjour,
Merci pour vos réponses rapides
J'ai essayer vos différentes manières d'écrire la ligne qui me pose problème mais elle provoquant toujours la fameuse erreur "1004".
J'ai aussi essayer d'écrire la partie de la feuille deux sur le VBA de la feuille deux mais ça n'a pas fonctionné
Je ne comprenais pas pourquoi mon code fonctionnait pour la feuille 1 mais pas pour f2.

SOLUTION:
Finalement comme vous me l'avez proposé j'ai crée un module et cela semble fonctionner Merci a tous !!!
J'imagine que le module permet de travailler sur la feuille 1 et 2 en même temps.

Ton programme est génial Soan je n'ose imaginer le temps que tu as dû y passer je n'en demandais pas tant.
Le soucis c'est que j'ai besoin d'un programme assez simple pour que je puisse l'expliquer facilement et mon approche me semblait correcte jusqu'à maintenant.
Autre point mon but n'est de faire réapparaître une colonne décidé par sélection mais plutôt la colonne du mois précédent et celle 6 mois plutôt de manière systématique.
Je piocherais certainement dedans si j'ai le temps pour rajouter en plus de n-1 et n-6 un transfert d'un mois au choix
 

Discussions similaires

Haut Bas