OVH Cloud OVH Cloud

décaler l'écriture d'une macro suite à un test

12 réponses
Avatar
ELDER
Bonjour à tous,

J'ai réalisé une macro qui reporte le vendredi soir tous les comptes réalisé
dans la semaine. En générale la semaine suivante les comptes sont remis à
zéro lorsque la production du produit se termine. Seulement il arrive
parfois que la commande soit importante et que l'on soit obligé de faire ce
" report" plus d'une semaine. Existe t'il un moyen de tester si la cellule
est déjà rempli et le cas échéant décaler sur la cellule suivante.

Exemple en A1: j'ai rien ou 0 affiché. la macro écrit
en A1 j'ai 1000 affiché, il faudrait que la macro écrive en A2 pour ne pas
effacer A1 !

Merci

10 réponses

1 2
Avatar
Papyty
Salut @ Tous,
ELDER a écrit:
Exemple en A1: j'ai rien ou 0 affiché. la macro écrit
en A1 j'ai 1000 affiché, il faudrait que la macro écrive en A2 pour ne
pas

effacer A1 !
Il faudrait plus de détail sur ta macro car le test est facile à faire sur

A1 mais le traitement dépend de toutes les cellules utilisées ensuite.
Si tu utilise seulement A1 dans ta macro, remplace dans ta macro tous les
Range("A1") par Cel: exemple Range("A1") = Range("A32") par Cel Range("A32")
le test:

Dim Cel As Range
If [A1] = 0 Or [A1] = "" Then
Set Cel = [A1]
Else
Set Cel = [A2]
End If
'LaMacro
Set Cel = Nothing
--
@+
Thierry

Avatar
ELDER
Bonjour, Papyty,

Pour faire simple j'ai fais un peu compliqué je t'ai mis la partie de la
macro qui s'occupe du report pour que tu vois le problème. Juste pour la
première cellule, la macro ( que j'ai enregistré avec l'enregistreur )
selectionne C32, copy en mémoire et reporte sur C32. Le but est de tester
avant d'écrire en C32 s'il n'y a pas déja un chiffre. S'il y a déjà un
chiffre il faut écrire en C33 pour ne pas écraser C32.

Voilà, si t'avais vu le problème comme ça je vais utiliser t'a macro.

Range("C31").Select
Selection.Copy
Range("C32").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("D31").Select
Application.CutCopyMode = False
Selection.Copy
Range("D32").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("E31").Select
Application.CutCopyMode = False
Selection.Copy
Range("E32").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("F31").Select
Application.CutCopyMode = False
Selection.Copy
Range("F32").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("G31").Select
Application.CutCopyMode = False
Selection.Copy
Range("G32").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("C39").Select
Application.CutCopyMode = False
Selection.Copy
Range("C42").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("D39").Select
Application.CutCopyMode = False
Selection.Copy
Range("D42").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("F39").Select
Application.CutCopyMode = False
Selection.Copy
Range("F42").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
ActiveWindow.SmallScroll Down:‡
Range("B124").Select
Application.CutCopyMode = False
Selection.Copy
Range("B125").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("C124").Select
Application.CutCopyMode = False
Selection.Copy
Range("C125").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("D124").Select
Application.CutCopyMode = False
Selection.Copy
Range("D125").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("E124").Select
Application.CutCopyMode = False
Selection.Copy
Range("E125").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("G124").Select
Application.CutCopyMode = False
Selection.Copy
Range("G125").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
ActiveWindow.SmallScroll Down:
Range("B133").Select
Application.CutCopyMode = False
Selection.Copy
Range("B134").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("C133").Select
Application.CutCopyMode = False
Selection.Copy
Range("C134").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("D133").Select
Application.CutCopyMode = False
Selection.Copy
Range("D134").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("E133").Select
Application.CutCopyMode = False
Selection.Copy
Range("E134").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("G133").Select
Application.CutCopyMode = False
Selection.Copy
Range("G134").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
ActiveWindow.SmallScroll Down:=9
Range("B142").Select
Application.CutCopyMode = False
Selection.Copy
Range("B143").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("C142").Select
Application.CutCopyMode = False
Selection.Copy
Range("C143").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("D142").Select
Application.CutCopyMode = False
Selection.Copy
Range("D143").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("E142").Select
Application.CutCopyMode = False
Selection.Copy
Range("E143").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("G142").Select
Application.CutCopyMode = False
Selection.Copy
Range("G143").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks: _
False, Transpose:úlse
Range("D5").Select
ActiveWindow.SmallScroll Down:=-126

"Papyty" a écrit dans le message de
news:
Salut @ Tous,
ELDER a écrit:
Exemple en A1: j'ai rien ou 0 affiché. la macro écrit
en A1 j'ai 1000 affiché, il faudrait que la macro écrive en A2 pour ne
pas

effacer A1 !
Il faudrait plus de détail sur ta macro car le test est facile à faire sur

A1 mais le traitement dépend de toutes les cellules utilisées ensuite.
Si tu utilise seulement A1 dans ta macro, remplace dans ta macro tous les
Range("A1") par Cel: exemple Range("A1") = Range("A32") par Cel > Range("A32")
le test:

Dim Cel As Range
If [A1] = 0 Or [A1] = "" Then
Set Cel = [A1]
Else
Set Cel = [A2]
End If
'LaMacro
Set Cel = Nothing
--
@+
Thierry



Avatar
Papyty
Salut @ Tous,
ELDER a écrit:
Pour faire simple j'ai fais un peu compliqué je t'ai mis la partie de la
macro qui s'occupe du report pour que tu vois le problème. Juste pour la
première cellule, la macro ( que j'ai enregistré avec l'enregistreur )
selectionne C32, copy en mémoire et reporte sur C32. Le but est de tester
avant d'écrire en C32 s'il n'y a pas déja un chiffre. S'il y a déjà un
chiffre il faut écrire en C33 pour ne pas écraser C32.


Si j'ai bien compris tu dois tester seulement si C31 est vide ou =0 sinon
il faut copier toutes les cellules comme tu l'as fait avant de faire le
traitement d'une autre macro?
--
@+
Thierry

Avatar
Papyty
Salut @ Tous, ELDER a écrit:
Pour faire simple j'ai fais un peu compliqué je t'ai mis la partie de la
macro qui s'occupe du report pour que tu vois le problème. Juste pour la
première cellule, la macro ( que j'ai enregistré avec l'enregistreur )


Bon j'ai fait comme si j'avais compris
donc on test la cellule C31 si elle n'est pas vide ou =0 on recopie les
cellules et ensuite tu inseres ta macro de remplissage à la fin
bien vérifié qu'il n'y à pas de gourrage dans les offsets!!!

Sub Test2()
If [C31] <> 0 And [C31] <> "" Then
Set Cel = [C31]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(11, 0) = Cel.Offset(8, 0)
Cel.Offset(11, 1) = Cel.Offset(8, 1)
Cel.Offset(11, 3) = Cel.Offset(8, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
'Ta macro
End Sub

--
@+
Thierry

Avatar
ELDER
Oui je dois tester si C31 est vide ou pas car si elle n'est pas vide toutes
les autres ne sont pas vide automatiquement. en fait je m'aperçois que moi
c'est très clair mais ça l'ets beaucoup moins pour les autres !!!

Pour ne pas faire d'erreur je vais t'expliquer plus en détail:

J'ai une feuille excel qui récupère les données d'un PDA sur un tableau. Sur
ce tableau il y a des séparation qui correspondent aux jours de la semaine.
Donc du lundi au vendredi.Chaque jour on récupère les comptes dans les cases
correspondantes. toutes les cases sont additionné dans des cellules
distincts:

A100
A200
A3 00
A4 00
A500

A6p00' le total A1:A5

En C31 on reporte le chiffre de A6 et l'on remet A1 à A5 à 0. Comme ça on
n'a plus le détail par jour mais le détail de la semaine.

C'est que qu'on appel le report. la semaine suivante les cellules s'ajoute
de nouveaux en comptant en plus C31. Il arrive que la commande dur plus
d'une semaine et dans ce cas on reporte une seconde fois.

C'est là que tu interveiens Papyty ;-) il faut tester la cellule pour éviter
que les donner de C31 soit ecrasé au cas ou il y aurait déjà eu un report.
Mon idée de départ était de créer 3 macros distinct et d'empecher
l'exécution de la macro si la cellule C31 est pleine. En fait tester le
contenu de la cellule avant de lancer pour éviter l'ecrasement.

Je sais pas si c'est assez explicite comme ça. Le fait de décaler d'une
cellule m'évite de faire 3 macros mais si tu as un code VBA pour bloquer la
macro renvoyant un message du style le report a déjà été fait lancer report
2 et de nouveaux teste C32 etc... voir encore mieux ( je m'excuse je trouve
la solution en essayant de t'expliquer !!!) lancer macro1 ----> test cellule
C31 ---------> si pas vide lancer macro 2------> test C32 ----> si C32 vide
ok sinon lancer macro 3 et dernier test sur C33 et là si C33 pas vide
message " vous ne pouvez plus faire report"

Je pense que c'est le mieux, comme ça j'ai qu'une macro ( certe plus
longue ) mis qui teste avant d'écrire

donc :

ton code:

Call macro 1 si ok
ou Call macro 2 si pas ok
ou call macro 3 si pas ok
et enfin si le report a été fait plus de3 fois
message pour dire impossible de faire le report !!!

Merci


"Papyty" a écrit dans le message de
news:p0rkdrhzohxb$.7wl3fxp807aa$
Salut @ Tous,
ELDER a écrit:
Pour faire simple j'ai fais un peu compliqué je t'ai mis la partie de la
macro qui s'occupe du report pour que tu vois le problème. Juste pour la
première cellule, la macro ( que j'ai enregistré avec l'enregistreur )
selectionne C32, copy en mémoire et reporte sur C32. Le but est de
tester


avant d'écrire en C32 s'il n'y a pas déja un chiffre. S'il y a déjà un
chiffre il faut écrire en C33 pour ne pas écraser C32.


Si j'ai bien compris tu dois tester seulement si C31 est vide ou =0 sinon
il faut copier toutes les cellules comme tu l'as fait avant de faire le
traitement d'une autre macro?
--
@+
Thierry



Avatar
Papyty
Salut @ Tous, ELDER a écrit:
la solution en essayant de t'expliquer !!!) lancer macro1 ----> test
cellule

C31 ---------> si pas vide lancer macro 2------> test C32 ----> si C32
vide

ok sinon lancer macro 3 et dernier test sur C33 et là si C33 pas vide
message " vous ne pouvez plus faire report"


A tester
Sub Test2()
If [C31] <> 0 And [C31] <> "" Then
If [C32] <> 0 And [C32] <> "" Then
If [C33] <> 0 And [C33] <> "" Then
MsgBox "Plus de report possible"
End If
Set Cel = [C32]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(11, 0) = Cel.Offset(8, 0)
Cel.Offset(11, 1) = Cel.Offset(8, 1)
Cel.Offset(11, 3) = Cel.Offset(8, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
Set Cel = [C31]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(11, 0) = Cel.Offset(8, 0)
Cel.Offset(11, 1) = Cel.Offset(8, 1)
Cel.Offset(11, 3) = Cel.Offset(8, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
'Ta macro de remplissage
End Sub
--
@+
Thierry

Avatar
Papyty
Salut @ Tous, Papyty a écrit:
message " vous ne pouvez plus faire report"



Correction

Sub Test2()
If [C31] <> 0 And [C31] <> "" Then
If [C32] <> 0 And [C32] <> "" Then
If [C33] <> 0 And [C33] <> "" Then
MsgBox "Plus de report possible"
End If
Set Cel = [C32]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(13, 0) = Cel.Offset(10, 0)
Cel.Offset(13, 1) = Cel.Offset(10, 1)
Cel.Offset(13, 3) = Cel.Offset(10, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
Set Cel = [C31]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(11, 0) = Cel.Offset(8, 0)
Cel.Offset(11, 1) = Cel.Offset(8, 1)
Cel.Offset(11, 3) = Cel.Offset(8, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
'Ta macro de remplissage
End Sub

--
@+
Thierry


Avatar
ELDER
Je reposte une seconde fois car le message n'est pas passé, desolési vous
l'avez deux fois !

Oui je dois tester si C31 est vide ou pas car si elle n'est pas vide toutes
les autres ne sont pas vide automatiquement. en fait je m'aperçois que moi
c'est très clair mais ça l'ets beaucoup moins pour les autres !!!

Pour ne pas faire d'erreur je vais t'expliquer plus en détail:

J'ai une feuille excel qui récupère les données d'un PDA sur un tableau. Sur
ce tableau il y a des séparation qui correspondent aux jours de la semaine.
Donc du lundi au vendredi.Chaque jour on récupère les comptes dans les cases
correspondantes. toutes les cases sont additionné dans des cellules
distincts:

A100
A200
A3 00
A4 00
A500

A6p00' le total A1:A5

En C31 on reporte le chiffre de A6 et l'on remet A1 à A5 à 0. Comme ça on
n'a plus le détail par jour mais le détail de la semaine.

C'est que qu'on appel le report. la semaine suivante les cellules s'ajoute
de nouveaux en comptant en plus C31. Il arrive que la commande dur plus
d'une semaine et dans ce cas on reporte une seconde fois.

C'est là que tu interveiens Papyty ;-) il faut tester la cellule pour éviter
que les donner de C31 soit ecrasé au cas ou il y aurait déjà eu un report.
Mon idée de départ était de créer 3 macros distinct et d'empecher
l'exécution de la macro si la cellule C31 est pleine. En fait tester le
contenu de la cellule avant de lancer pour éviter l'ecrasement.

Je sais pas si c'est assez explicite comme ça. Le fait de décaler d'une
cellule m'évite de faire 3 macros mais si tu as un code VBA pour bloquer la
macro renvoyant un message du style le report a déjà été fait lancer report
2 et de nouveaux teste C32 etc... voir encore mieux ( je m'excuse je trouve
la solution en essayant de t'expliquer !!!) lancer macro1 ----> test cellule
C31 ---------> si pas vide lancer macro 2------> test C32 ----> si C32 vide
ok sinon lancer macro 3 et dernier test sur C33 et là si C33 pas vide
message " vous ne pouvez plus faire report"

Je pense que c'est le mieux, comme ça j'ai qu'une macro ( certe plus
longue ) mis qui teste avant d'écrire

donc :

ton code:

Call macro 1 si ok
ou Call macro 2 si pas ok
ou call macro 3 si pas ok
et enfin si le report a été fait plus de3 fois
message pour dire impossible de faire le report !!!

Merci

"Papyty" a écrit dans le message de
news:id74e7adoai7$
Salut @ Tous, ELDER a écrit:
Pour faire simple j'ai fais un peu compliqué je t'ai mis la partie de la
macro qui s'occupe du report pour que tu vois le problème. Juste pour la
première cellule, la macro ( que j'ai enregistré avec l'enregistreur )


Bon j'ai fait comme si j'avais compris
donc on test la cellule C31 si elle n'est pas vide ou =0 on recopie les
cellules et ensuite tu inseres ta macro de remplissage à la fin
bien vérifié qu'il n'y à pas de gourrage dans les offsets!!!

Sub Test2()
If [C31] <> 0 And [C31] <> "" Then
Set Cel = [C31]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(11, 0) = Cel.Offset(8, 0)
Cel.Offset(11, 1) = Cel.Offset(8, 1)
Cel.Offset(11, 3) = Cel.Offset(8, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
'Ta macro
End Sub

--
@+
Thierry



Avatar
Papyty
Salut @ Tous,
ELDER a écrit:
Je pense que c'est le mieux, comme ça j'ai qu'une macro ( certe plus
longue ) mis qui teste avant d'écrire


Correction

Sub Test2()
If [C31] <> 0 And [C31] <> "" Then
If [C32] <> 0 And [C32] <> "" Then
If [C33] <> 0 And [C33] <> "" Then
MsgBox "Plus de report possible"
End If
Set Cel = [C32]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(13, 0) = Cel.Offset(10, 0)
Cel.Offset(13, 1) = Cel.Offset(10, 1)
Cel.Offset(13, 3) = Cel.Offset(10, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
Set Cel = [C31]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(11, 0) = Cel.Offset(8, 0)
Cel.Offset(11, 1) = Cel.Offset(8, 1)
Cel.Offset(11, 3) = Cel.Offset(8, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
'Ta macro de remplissage
End Sub

est ce que ça vas
--
@+
Thierry

Avatar
ELDER
Super,

Je test ça lundi soir et je te tiens au courant ( désolé je ne pourrais pas
avant ) merci de t'être donné autant de mal pour moi. J'espère que le
message va passer correctement car j'ai du mal à lire les news !!!
Mon fournisseur d'accès à des ratés !!!

J'ai copié la macro, si je peux je vais faire l'essai cette nuit ( si je
suis pas trop fatigué !!! )

Merci encore Papyty ( n plus je crois que c'est pas la première fois que tu
me dépanne. Je vais finir par être en dette !!! )


"Papyty" a écrit dans le message de
news:
Salut @ Tous,
ELDER a écrit:
Je pense que c'est le mieux, comme ça j'ai qu'une macro ( certe plus
longue ) mis qui teste avant d'écrire


Correction

Sub Test2()
If [C31] <> 0 And [C31] <> "" Then
If [C32] <> 0 And [C32] <> "" Then
If [C33] <> 0 And [C33] <> "" Then
MsgBox "Plus de report possible"
End If
Set Cel = [C32]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(13, 0) = Cel.Offset(10, 0)
Cel.Offset(13, 1) = Cel.Offset(10, 1)
Cel.Offset(13, 3) = Cel.Offset(10, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
Set Cel = [C31]
For i = 0 To 4
Cel.Offset(1, i) = Cel.Offset(0, i)
Next
Cel.Offset(11, 0) = Cel.Offset(8, 0)
Cel.Offset(11, 1) = Cel.Offset(8, 1)
Cel.Offset(11, 3) = Cel.Offset(8, 3)
For i = 93 To 111 Step 9
For j = -1 To 2
Cel.Offset(i + 1, j) = Cel.Offset(i, j)
Next j
Cel.Offset(i + 1, 4) = Cel.Offset(i, 4)
Next i
End If
'Ta macro de remplissage
End Sub

est ce que ça vas
--
@+
Thierry



1 2