Copier une valeur si la cellule de gauche n'est pas vide

tyranausor Messages postés 3501 Date d'inscription   Statut Membre Dernière intervention   -  
Theo.R Messages postés 585 Statut Membre -
Bonjour,

j'ai un fichier Excel avec une macro. Elle va, en cliquant sur le bouton [Archiver], copier toutes les données de la feuille Saisie sur la feuille Archives. Dans la rédaction de la macro, que vous trouverez dans le fichier ci-joint, je bloque sur :


If Range("B"&i) <> "" Then
'Si la cellule B... est vide, alors
Sheets("Saisie").Select
Range("A2").Select
'Sélectionne la cellule A2
Application.CutCopyMode = False
Selection.Copy
'Copie
Sheets("Archives").Select
'Ouvre la feuille "Archives"
Selection.PasteSpecial Paste:=xlPasteValues
End If



tout le reste de la macro se trouve dans le fichier
le fichier : https://www.cjoint.com/?3ApuaMO23kG



--
Bonnes fêtes de fin d'année

4 réponses

  1. Theo.R Messages postés 585 Statut Membre 31
     
    Salut !

    Tente le Débogage quand ça bloque, ça t'indique à quel niveau ;)

    Dans ton cas, la première ligne n'est pas bien définie :
    If Range("B"&i) <> "" Then

    Il faut définir ton i sans quoi ça ne fonctionnera pas. Par exemple tu peux utiliser :

    'Calcul de la dernière ligne non vide de la colonne B
    Dim DernLigne As Long
    DernLigne = Sheets(TAFEUILLE).Range("B" & Rows.Count).End(xlUp).Row

    If Sheets(TAFEUILLE).Range("B"&i).Value <> "" Then
    For i=1 to DernLigne
    'tu mets ici ton code pour copier-coller
    (...)

    Next i
    End If

    Par ailleurs, je t'invite à préciser .Value ou .Text après Range(...) pour que ce soit bien le contenu de la cellule qui doit être non vide.

    Dis-moi si ça te convient :)
    0
  2. tyranausor Messages postés 3501 Date d'inscription   Statut Membre Dernière intervention   2 060
     
    Bonjour, merci pour ta réponse.

    Je connais le débogage mais je ne comprends pas toujours ce qui ne va pas (je ne suis pas très fort en VBA).

    Sinon, tu mets deux fois IF et ça dérange Excel!
    0
    1. Theo.R Messages postés 585 Statut Membre 31
       
      je n'ai pas saisi ta réponse ^^'

      As-tu essayé de définir le i avec mon conseil ou autre ?

      Où ai-je mis deux fois IF ?
      0
  3. tyranausor Messages postés 3501 Date d'inscription   Statut Membre Dernière intervention   2 060
     
    En fait, j'ai tout recopié mais je me suis planté, j'ai laissé une ligne en trop!

    En fait, j'ai ce code
    Sub Archivage()
    '
    ' Archivage Macro
    '

    '
    If Application.CountA(Range("C6:I12")) = 0 Then
    'Si la plage C6:I12 est vide, on n'exécute pas la macro
    MsgBox "Aucune heure n'a été saisie!", vbCritical + vbOKOnly, "Application de paie"
    'Affiche un message d'erreur
    Else: Range("A6:I12").Select
    'Sinon, la macro est exécutée
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Archives").Select
    'Sélection de la feuille "Archives"
    Range("B65000").End(xlUp).Offset(1).Select
    'ici tu colles
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Range("C40").Select
    Sheets("Saisie").Select
    Range("L6:O12").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Archives").Select
    Range("B65000").End(xlUp).Offset(1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    End If
    'Il faut définir ton i sans quoi ça ne fonctionnera pas. Par exemple tu peux utiliser :
    'Calcul de la dernière ligne non vide de la colonne B
    Dim DernLigne As Long
    DernLigne = Sheets("Archives").Range("B" & Rows.Count).End(xlUp).Row
    If Sheets("Archives").Range("B" & i).Value <> "" Then
    For i = 1 To DernLigne
    'tu mets ici ton code pour copier-coller
    Sheets("Saisie").Select
    Range("A2").Select
    'Sélectionne la cellule A2
    Application.CutCopyMode = False
    Selection.Copy
    'Copie
    Sheets("Archives").Select
    'Ouvre la feuille "Archives"
    Range("A65000").End(xlUp).Offset(1).Select
    'Offset = décalage
    Selection.PasteSpecial Paste:=xlPasteValues

    Next i
    End If

    Sheets("Saisie").Select
    'Ouvre la feuille "Saisie"
    Range("C6:I12").Select
    Selection.ClearContents
    Range("L6:O12").Select
    Selection.ClearContents
    Range("C6").Select
    End Sub


    Excel me dit que la ligne "If Sheets("Archives").Range("B" & i).Value <> "" Then" (en gras dans le code) ne va pas (erreur 1004)

    Tu as une idée?
    0
    1. Theo.R Messages postés 585 Statut Membre 31
       
      AAAh je me suis trompé, il faut mettre cette ligne APRES avoir défini i, soit dans cet ordre :
      For i = 1 To DernLigne
      If Sheets("Archives").Range("B" & i).Value <> "" Then

      N.B: mon premier code n'était qu'une piste à adapter, je n'ai pas eu le temps de prendre en compte ton cas précis..
      0
  4. tyranausor Messages postés 3501 Date d'inscription   Statut Membre Dernière intervention   2 060
     
    Dans ces lignes de code, je ne sais pas exactement ce qui ne va pas

    Sheets("Saisie").Select
    'Sélectionne la feuille "Saisie"
    Range("A2").Select
    'Sélectionne la cellule A2
    Application.CutCopyMode = False
    Selection.Copy
    'Copie la valeur
    Sheets("Archives").Select
    'Ouvre la feuille "Archives"
    Range("A65000").End(xlUp).Offset(1).Select
    'Offset = décalage
    Selection.PasteSpecial Paste:=xlPasteValues
    'Et la colle à la dernière ligne vide (dans ma feuille A6)
    End If
    Dim DernLigne As Long
    DernLigne = Sheets("Archives").Range("B" & Rows.Count).End(xlUp).Row
    For i = 1 To DernLigne
    'De la ligne 1 à la dernière ligne (je ne sais si j'ai bien traduit)
    If Sheets("Archives").Range("B" & i).Value <> "" Then
    'Si dans la feuille "Archives", la cellule Bx n'est pas vide, alors
    Range("b" & i) = Range("b" & i).Offset(0, 1)
    End If
    Next i


    Pour résumer, tout se copie comme il faut la plage qui doit être copiée et la cellule A2) mais la recopie (code en gras) ne donne rien!
    0
    1. Theo.R Messages postés 585 Statut Membre 31
       
      Je ne comprends pas pourquoi mais en testant j'arrive à un bon résultat si je rédige la fonction Offset comme suit :

      Range("B" & i) = Range("B" & i).Offset(rowOffset:=0, columnOffset:=1)

      Essaie de ton côté si ça marche aussi :)
      0