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

tyranausor Messages postés 3545 Date d'inscription   Statut Membre Dernière intervention   -  
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   -
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


4 réponses

Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   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
tyranausor Messages postés 3545 Date d'inscription   Statut Membre Dernière intervention   2 039
 
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
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   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
tyranausor Messages postés 3545 Date d'inscription   Statut Membre Dernière intervention   2 039
 
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
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   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
tyranausor Messages postés 3545 Date d'inscription   Statut Membre Dernière intervention   2 039
 
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
Theo.R Messages postés 575 Date d'inscription   Statut Membre Dernière intervention   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