OVH Cloud OVH Cloud

Sous totaux, mise en forme et impression

8 réponses
Avatar
JacquesH
Bonjour à toutes et à tous,

Je souhaite automatiser l'impression d'une feuille Excel (Excel
97 - Windows 95) qui a les caractéristiques suivantes :

- Des groupes de lignes (de 1 à 3-4) séparés par une ligne
vide qui correspondent à x clients qui sont livrés lors d'une même
tournée..
- Des sous totaux au dessous de chaque groupe.
- A la fin du document, entre le dernier sous total et le
total général, j'ai un nombre aléatoire de lignes vides.

Pour améliorer mon "truc", j'ai deux soucis :
- Comment, lors de l'impression, toujours terminer une page
par un sous total et éviter de couper un groupe au milieu ?
- Comment laisser systématiquement 2 lignes vides entre le
dernier sous total et le total général (effacer les autres) ? Attention,
je ne souhaite pas effacer toutes les autres lignes vides du tableau.
Je sais rechercher la dernière ligne d'un tableau, mais je ne sais
pas s'il existe du code pour retrouver l'avant dernière qui contient des
données ?

Malgré de nombreuses recherches dans l'historique du forum et
dans les sites des "pros", je ne vois pas véritablement comment faire.

Quelqu'un a-t-il une idée ?

Merci par avance.

Jacques.

8 réponses

Avatar
AV
Je sais rechercher la dernière ligne d'un tableau, mais je ne sais
pas s'il existe du code pour retrouver l'avant dernière qui contient des
données ?


S'il n'y a pas de discontinuité dans les données (lignes vides) et pour la plage
nommée "tablo"
Rows([tablo].Find("*", , , , , xlPrevious).Row - 1).Select

Pour le reste de la question, comme je sens pas très bien le truc, je
m'abstiendrais...
AV

Avatar
AV
Le plus simple (pour les événetuels répondeurs) serait que tu mettes un fichier
exemple consultable là (http://cjoint.com) avec ton tableau (ou un extrait) et
que tu reprécises le résultat attendu

AV
Avatar
JacquesH
Merci Alain pour la réponse, mais cela ne convient pas car il y a effectivement des
lignes vides.

En fait, dans le cadre de ma seconde question, je voulais réaliser la chose
suivante (peut-être trop compliqué ?) :
- Retrouver la dernière ligne du tableau (je sais faire).
- Retrouver également l'avant dernière ligne contenant des données (ce n'est
donc pas l'avant dernière ligne du tableau)..
- Sélectionner la plage entre les deux.
- Supprimer les lignes de cette plage.
- Recréer 2 lignes vides.

Jacques


Je sais rechercher la dernière ligne d'un tableau, mais je ne sais
pas s'il existe du code pour retrouver l'avant dernière qui contient des
données ?


S'il n'y a pas de discontinuité dans les données (lignes vides) et pour la plage
nommée "tablo"
Rows([tablo].Find("*", , , , , xlPrevious).Row - 1).Select

Pour le reste de la question, comme je sens pas très bien le truc, je
m'abstiendrais...
AV



Avatar
poy-poy
Bonjour Jacques,

pourquoi ne pas faire 2 recherches de dernières lignes en utilisant la
première pour lancer la seconde de la ligne du dessus ?

Donc tu te fait une première recherche lrow1 = [A65536].end(xlup).row
puis une seconde Lrow2 = cells(lrow1 - 1,1).end(xlup).row

pour finir un petit,
if lrow2 > lrow1 + 2 then
rows(evaluate(lrow2+3) & ":" & evaluate(lrow1-1) ).delete
elseif lrow2 = lrow1+2 then
exit sub
elseif lrow2=lrow1+1 then
cells(lrow2+1,1).entirerow.insert shift:=xldown
else:
range(cells(lrow2+1,1),cells(lrow2+2,1)).entirerow.insert shift:=xldwon
end if

je pense que cela dervrait correspondre en adaptant à ton cas.

Cordialement
Benjamin



Merci Alain pour la réponse, mais cela ne convient pas car il y a effectivement des
lignes vides.

En fait, dans le cadre de ma seconde question, je voulais réaliser la chose
suivante (peut-être trop compliqué ?) :
- Retrouver la dernière ligne du tableau (je sais faire).
- Retrouver également l'avant dernière ligne contenant des données (ce n'est
donc pas l'avant dernière ligne du tableau)..
- Sélectionner la plage entre les deux.
- Supprimer les lignes de cette plage.
- Recréer 2 lignes vides.

Jacques


Je sais rechercher la dernière ligne d'un tableau, mais je ne sais
pas s'il existe du code pour retrouver l'avant dernière qui contient des
données ?


S'il n'y a pas de discontinuité dans les données (lignes vides) et pour la plage
nommée "tablo"
Rows([tablo].Find("*", , , , , xlPrevious).Row - 1).Select

Pour le reste de la question, comme je sens pas très bien le truc, je
m'abstiendrais...
AV







Avatar
poy-poy
Bonjour Jacques,

désolé, j'avais fait quelques erreus dans le code (excel tourné déjà donc je
n'avais pas testé :-)

En vrac, j'avais inversé lrow1 et lrow2, j'avais mis +2 au lieu de +3 pour
la première condition, je n'avais pas testé que l'avant dernière ligne
n'était pas juste audessus de la dernière... bref, c'etait un coup d'essai lol

Celui-ci devrait mieux marcher, enfin je l'espere

Crodialement
Benjamin

Sub essai()

lrow1 = [A65536].End(xlUp).Row
If Cells(lrow1 - 1, 1) <> "" Then
Range(Cells(lrow1, 1), Cells(lrow1 + 1, 1)).EntireRow.Insert
shift:=xlDown
Exit Sub
End If

lrow2 = Cells(lrow1 - 1, 1).End(xlUp).Row

If lrow1 > lrow2 + 3 Then
Rows(Evaluate(lrow2 + 3) & ":" & Evaluate(lrow1 - 1)).Delete
ElseIf lrow1 = lrow2 + 3 Then
Exit Sub
Else:
Cells(lrow2 + 1, 1).EntireRow.Insert shift:=xlDown
End If
End Sub


Bonjour Benjamin,

Merci de ta réponse.

Même si je ne comprends pas tout, l'idée de base me paraît excellente. En revanche j'ai
quelques soucis avec la macro.
Voici ton code que j'ai recopié :


Sub supprimer_Ligne()
lrow1 = [A65536].End(xlUp).Row
lrow2 = Cells(lrow1 - 1, 1).End(xlUp).Row

If lrow2 > lrow1 + 2 Then
Rows(Evaluate(lrow2 + 3) & ":" & Evaluate(lrow1 - 1)).Delete
ElseIf lrow2 = lrow1 + 2 Then
Exit Sub
ElseIf lrow2 = lrow1 + 1 Then
Cells(lrow2 + 1, 1).EntireRow.Insert shift:=xlDown
Else:
Range(Cells(lrow2 + 1, 1), Cells(lrow2 + 2, 1)).EntireRow.Insert shift:=xlDown
End If
End Sub

En fait la macro fonctionne, mais elle ajoute 2 lignes alors que j'en ai déjà 10.

Ce que je souhaite, c'est partir des 10 lignes vides entre l'avant dernière et la
dernière et passer à 2 lignes vides.

Pour ce faire, j'ai considéré que la ligne de l'avant dernière est inférieure à celle de
la dernière donc j'ai changé la ligne suivante :
If lrow2 > lrow1 + 2 Then par If lrow2 < lrow1 + 2 Then pour faire réagir la
première condition : effacement d'un certain nombre de lignes.

A ce moment là, la macro bloque sur la ligne 4 "Row(Evaluate...." avec le commentaire
suivant : "propriété ou méthode non gérée par cet objet". Est ce que tu vois une erreur sur
cette ligne ? Je n'ai jamais utilisée ce genre de formule.

Merci d'avance.

Jacques.


Bonjour Jacques,

pourquoi ne pas faire 2 recherches de dernières lignes en utilisant la
première pour lancer la seconde de la ligne du dessus ?

Donc tu te fait une première recherche lrow1 = [A65536].end(xlup).row
puis une seconde Lrow2 = cells(lrow1 - 1,1).end(xlup).row

pour finir un petit,
if lrow2 > lrow1 + 2 then
rows(evaluate(lrow2+3) & ":" & evaluate(lrow1-1) ).delete
elseif lrow2 = lrow1+2 then
exit sub
elseif lrow2=lrow1+1 then
cells(lrow2+1,1).entirerow.insert shift:=xldown
else:
range(cells(lrow2+1,1),cells(lrow2+2,1)).entirerow.insert shift:=xldwon
end if

je pense que cela dervrait correspondre en adaptant à ton cas.

Cordialement
Benjamin


Merci Alain pour la réponse, mais cela ne convient pas car il y a effectivement des
lignes vides.

En fait, dans le cadre de ma seconde question, je voulais réaliser la chose
suivante (peut-être trop compliqué ?) :
- Retrouver la dernière ligne du tableau (je sais faire).
- Retrouver également l'avant dernière ligne contenant des données (ce n'est
donc pas l'avant dernière ligne du tableau)..
- Sélectionner la plage entre les deux.
- Supprimer les lignes de cette plage.
- Recréer 2 lignes vides.

Jacques


Je sais rechercher la dernière ligne d'un tableau, mais je ne sais
pas s'il existe du code pour retrouver l'avant dernière qui contient des
données ?


S'il n'y a pas de discontinuité dans les données (lignes vides) et pour la plage
nommée "tablo"
Rows([tablo].Find("*", , , , , xlPrevious).Row - 1).Select

Pour le reste de la question, comme je sens pas très bien le truc, je
m'abstiendrais...
AV













Avatar
JacquesH
Bonjour Benjamin,

Merci de ta réponse.

Même si je ne comprends pas tout, l'idée de base me paraît excellente. En revanche j'ai
quelques soucis avec la macro.
Voici ton code que j'ai recopié :


Sub supprimer_Ligne()
lrow1 = [A65536].End(xlUp).Row
lrow2 = Cells(lrow1 - 1, 1).End(xlUp).Row

If lrow2 > lrow1 + 2 Then
Rows(Evaluate(lrow2 + 3) & ":" & Evaluate(lrow1 - 1)).Delete
ElseIf lrow2 = lrow1 + 2 Then
Exit Sub
ElseIf lrow2 = lrow1 + 1 Then
Cells(lrow2 + 1, 1).EntireRow.Insert shift:=xlDown
Else:
Range(Cells(lrow2 + 1, 1), Cells(lrow2 + 2, 1)).EntireRow.Insert shift:=xlDown
End If
End Sub

En fait la macro fonctionne, mais elle ajoute 2 lignes alors que j'en ai déjà 10.

Ce que je souhaite, c'est partir des 10 lignes vides entre l'avant dernière et la
dernière et passer à 2 lignes vides.

Pour ce faire, j'ai considéré que la ligne de l'avant dernière est inférieure à celle de
la dernière donc j'ai changé la ligne suivante :
If lrow2 > lrow1 + 2 Then par If lrow2 < lrow1 + 2 Then pour faire réagir la
première condition : effacement d'un certain nombre de lignes.

A ce moment là, la macro bloque sur la ligne 4 "Row(Evaluate...." avec le commentaire
suivant : "propriété ou méthode non gérée par cet objet". Est ce que tu vois une erreur sur
cette ligne ? Je n'ai jamais utilisée ce genre de formule.

Merci d'avance.

Jacques.


Bonjour Jacques,

pourquoi ne pas faire 2 recherches de dernières lignes en utilisant la
première pour lancer la seconde de la ligne du dessus ?

Donc tu te fait une première recherche lrow1 = [A65536].end(xlup).row
puis une seconde Lrow2 = cells(lrow1 - 1,1).end(xlup).row

pour finir un petit,
if lrow2 > lrow1 + 2 then
rows(evaluate(lrow2+3) & ":" & evaluate(lrow1-1) ).delete
elseif lrow2 = lrow1+2 then
exit sub
elseif lrow2=lrow1+1 then
cells(lrow2+1,1).entirerow.insert shift:=xldown
else:
range(cells(lrow2+1,1),cells(lrow2+2,1)).entirerow.insert shift:=xldwon
end if

je pense que cela dervrait correspondre en adaptant à ton cas.

Cordialement
Benjamin


Merci Alain pour la réponse, mais cela ne convient pas car il y a effectivement des
lignes vides.

En fait, dans le cadre de ma seconde question, je voulais réaliser la chose
suivante (peut-être trop compliqué ?) :
- Retrouver la dernière ligne du tableau (je sais faire).
- Retrouver également l'avant dernière ligne contenant des données (ce n'est
donc pas l'avant dernière ligne du tableau)..
- Sélectionner la plage entre les deux.
- Supprimer les lignes de cette plage.
- Recréer 2 lignes vides.

Jacques


Je sais rechercher la dernière ligne d'un tableau, mais je ne sais
pas s'il existe du code pour retrouver l'avant dernière qui contient des
données ?


S'il n'y a pas de discontinuité dans les données (lignes vides) et pour la plage
nommée "tablo"
Rows([tablo].Find("*", , , , , xlPrevious).Row - 1).Select

Pour le reste de la question, comme je sens pas très bien le truc, je
m'abstiendrais...
AV









Avatar
poy-poy
Arf j'ai oublié de te dire,
c'est rowsssssssssss et non row ! c'est pourquoi ta ligne ne passe pas. la
fonction rows permet de travailler sur des lignes et se présente ainsi
rows("1:10")
ici comme on cherche les lignes on met juste des variables a la place des
nombre.

A plus
benjamin


Bonjour Benjamin,

Merci de ta réponse.

Même si je ne comprends pas tout, l'idée de base me paraît excellente. En revanche j'ai
quelques soucis avec la macro.
Voici ton code que j'ai recopié :


Sub supprimer_Ligne()
lrow1 = [A65536].End(xlUp).Row
lrow2 = Cells(lrow1 - 1, 1).End(xlUp).Row

If lrow2 > lrow1 + 2 Then
Rows(Evaluate(lrow2 + 3) & ":" & Evaluate(lrow1 - 1)).Delete
ElseIf lrow2 = lrow1 + 2 Then
Exit Sub
ElseIf lrow2 = lrow1 + 1 Then
Cells(lrow2 + 1, 1).EntireRow.Insert shift:=xlDown
Else:
Range(Cells(lrow2 + 1, 1), Cells(lrow2 + 2, 1)).EntireRow.Insert shift:=xlDown
End If
End Sub

En fait la macro fonctionne, mais elle ajoute 2 lignes alors que j'en ai déjà 10.

Ce que je souhaite, c'est partir des 10 lignes vides entre l'avant dernière et la
dernière et passer à 2 lignes vides.

Pour ce faire, j'ai considéré que la ligne de l'avant dernière est inférieure à celle de
la dernière donc j'ai changé la ligne suivante :
If lrow2 > lrow1 + 2 Then par If lrow2 < lrow1 + 2 Then pour faire réagir la
première condition : effacement d'un certain nombre de lignes.

A ce moment là, la macro bloque sur la ligne 4 "Row(Evaluate...." avec le commentaire
suivant : "propriété ou méthode non gérée par cet objet". Est ce que tu vois une erreur sur
cette ligne ? Je n'ai jamais utilisée ce genre de formule.

Merci d'avance.

Jacques.


Bonjour Jacques,

pourquoi ne pas faire 2 recherches de dernières lignes en utilisant la
première pour lancer la seconde de la ligne du dessus ?

Donc tu te fait une première recherche lrow1 = [A65536].end(xlup).row
puis une seconde Lrow2 = cells(lrow1 - 1,1).end(xlup).row

pour finir un petit,
if lrow2 > lrow1 + 2 then
rows(evaluate(lrow2+3) & ":" & evaluate(lrow1-1) ).delete
elseif lrow2 = lrow1+2 then
exit sub
elseif lrow2=lrow1+1 then
cells(lrow2+1,1).entirerow.insert shift:=xldown
else:
range(cells(lrow2+1,1),cells(lrow2+2,1)).entirerow.insert shift:=xldwon
end if

je pense que cela dervrait correspondre en adaptant à ton cas.

Cordialement
Benjamin


Merci Alain pour la réponse, mais cela ne convient pas car il y a effectivement des
lignes vides.

En fait, dans le cadre de ma seconde question, je voulais réaliser la chose
suivante (peut-être trop compliqué ?) :
- Retrouver la dernière ligne du tableau (je sais faire).
- Retrouver également l'avant dernière ligne contenant des données (ce n'est
donc pas l'avant dernière ligne du tableau)..
- Sélectionner la plage entre les deux.
- Supprimer les lignes de cette plage.
- Recréer 2 lignes vides.

Jacques


Je sais rechercher la dernière ligne d'un tableau, mais je ne sais
pas s'il existe du code pour retrouver l'avant dernière qui contient des
données ?


S'il n'y a pas de discontinuité dans les données (lignes vides) et pour la plage
nommée "tablo"
Rows([tablo].Find("*", , , , , xlPrevious).Row - 1).Select

Pour le reste de la question, comme je sens pas très bien le truc, je
m'abstiendrais...
AV













Avatar
JacquesH
Désolé de te déranger encore mais cela ne fonctionne pas.

Avant ton dernier message, j'ai recopié ton code et j'ai bloqué sur la même ligne :
Rows(Evaluate(...
avec le message suivant "Erreur 438 - Cet objet ne gère pas cette propriété ou méthode".
J'avais noté sur mon premier message (EXCEL97 - Windows 95)

Après ton message, j'ai testé un certain nombre de choses autour des "s" et des différents "Row". Rien
ne fonctionne.

Merci d'avance.

Jacques


Arf j'ai oublié de te dire,
c'est rowsssssssssss et non row ! c'est pourquoi ta ligne ne passe pas. la
fonction rows permet de travailler sur des lignes et se présente ainsi
rows("1:10")
ici comme on cherche les lignes on met juste des variables a la place des
nombre.

A plus
benjamin


Bonjour Benjamin,

Merci de ta réponse.

Même si je ne comprends pas tout, l'idée de base me paraît excellente. En revanche j'ai
quelques soucis avec la macro.
Voici ton code que j'ai recopié :


Sub supprimer_Ligne()
lrow1 = [A65536].End(xlUp).Row
lrow2 = Cells(lrow1 - 1, 1).End(xlUp).Row

If lrow2 > lrow1 + 2 Then
Rows(Evaluate(lrow2 + 3) & ":" & Evaluate(lrow1 - 1)).Delete
ElseIf lrow2 = lrow1 + 2 Then
Exit Sub
ElseIf lrow2 = lrow1 + 1 Then
Cells(lrow2 + 1, 1).EntireRow.Insert shift:=xlDown
Else:
Range(Cells(lrow2 + 1, 1), Cells(lrow2 + 2, 1)).EntireRow.Insert shift:=xlDown
End If
End Sub

En fait la macro fonctionne, mais elle ajoute 2 lignes alors que j'en ai déjà 10.

Ce que je souhaite, c'est partir des 10 lignes vides entre l'avant dernière et la
dernière et passer à 2 lignes vides.

Pour ce faire, j'ai considéré que la ligne de l'avant dernière est inférieure à celle de
la dernière donc j'ai changé la ligne suivante :
If lrow2 > lrow1 + 2 Then par If lrow2 < lrow1 + 2 Then pour faire réagir la
première condition : effacement d'un certain nombre de lignes.

A ce moment là , la macro bloque sur la ligne 4 "Row(Evaluate...." avec le commentaire
suivant : "propriété ou méthode non gérée par cet objet". Est ce que tu vois une erreur sur
cette ligne ? Je n'ai jamais utilisée ce genre de formule.

Merci d'avance.

Jacques.


Bonjour Jacques,

pourquoi ne pas faire 2 recherches de dernières lignes en utilisant la
première pour lancer la seconde de la ligne du dessus ?

Donc tu te fait une première recherche lrow1 = [A65536].end(xlup).row
puis une seconde Lrow2 = cells(lrow1 - 1,1).end(xlup).row

pour finir un petit,
if lrow2 > lrow1 + 2 then
rows(evaluate(lrow2+3) & ":" & evaluate(lrow1-1) ).delete
elseif lrow2 = lrow1+2 then
exit sub
elseif lrow2=lrow1+1 then
cells(lrow2+1,1).entirerow.insert shift:=xldown
else:
range(cells(lrow2+1,1),cells(lrow2+2,1)).entirerow.insert shift:=xldwon
end if

je pense que cela dervrait correspondre en adaptant à ton cas.

Cordialement
Benjamin


Merci Alain pour la réponse, mais cela ne convient pas car il y a effectivement des
lignes vides.

En fait, dans le cadre de ma seconde question, je voulais réaliser la chose
suivante (peut-être trop compliqué ?) :
- Retrouver la dernière ligne du tableau (je sais faire).
- Retrouver également l'avant dernière ligne contenant des données (ce n'est
donc pas l'avant dernière ligne du tableau)..
- Sélectionner la plage entre les deux.
- Supprimer les lignes de cette plage.
- Recréer 2 lignes vides.

Jacques


Je sais rechercher la dernière ligne d'un tableau, mais je ne sais
pas s'il existe du code pour retrouver l'avant dernière qui contient des
données ?


S'il n'y a pas de discontinuité dans les données (lignes vides) et pour la plage
nommée "tablo"
Rows([tablo].Find("*", , , , , xlPrevious).Row - 1).Select

Pour le reste de la question, comme je sens pas très bien le truc, je
m'abstiendrais...
AV