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

Fermé
tyranausor Messages postés 3545 Date d'inscription jeudi 6 août 2009 Statut Membre Dernière intervention 1 avril 2022 - 15 janv. 2015 à 20:08
Theo.R Messages postés 575 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 - 19 janv. 2015 à 09:42
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 vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
16 janv. 2015 à 09:53
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 jeudi 6 août 2009 Statut Membre Dernière intervention 1 avril 2022 2 031
16 janv. 2015 à 17:59
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 vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
16 janv. 2015 à 18:01
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 jeudi 6 août 2009 Statut Membre Dernière intervention 1 avril 2022 2 031
16 janv. 2015 à 18:20
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 vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
16 janv. 2015 à 18:23
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 jeudi 6 août 2009 Statut Membre Dernière intervention 1 avril 2022 2 031
Modifié par tyranausor le 16/01/2015 à 19:22
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 vendredi 11 juillet 2014 Statut Membre Dernière intervention 30 mars 2016 31
19 janv. 2015 à 09:42
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