Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Ajustement automatique Nombre de lignes tableau

petrich

XLDnaute Nouveau
Bonjour à tous,

je sollicite votre aide pour mon sujet du moment.

Contexte

Dans le fichier joint (Analyse Dossier LPA.xls):

l'ensemble des données de l'onglet 'BS PBX' provient d'un import dont seul le critère 'nombre de ligne' peut varier, le formalisme du tableau étant toujours le même

les données de l'onglet 'Analyse BS PBX' sont:
- pour certaines colonnes, des données "liste de choix" émanant de l'onglet "Données" - et pour d'autres colonnes, le résultat d'une formule qui vient piocher la cellule correspondante dans l'onglet 'BS PBX'.
Là aussi, le formalisme du tableau étant toujours le même, seule le nombre de lignes varie.

Enfin, l'onglet MDE+MAJ est un bouton associé à une macro qui ne fait rien d'autre qu'une actualisation / MAJ de tout ce projet (servant à actualiser des TCD et graphiques qui n'aparaissent pas dans l'exemple en pj.

Mon sujet

Pour l'instant je dois manuellement ajuster le nombre de lignes ldu tableau de "Analyse BS PBX" afin de le faire correspondre exactement avec le nombre de lignes de l'onglet "BS PBX" ...
... soit en supprimant des lignes -> lorsque l'import de données dans BS PBX contient moins de lignes que le tableau de "Analyse BS PBX"
... soit en ajoutant des lignes (faisant un glisser du contenu des cellules B16:M16 vers le bas) -> lorsque l'import de données dans BS PBX contient plus de lignes que le tableau de "Analyse BS PBX"

Je souhaite donc que la macro de l'onglet "MDE+MAJ" fasse le job automatiquement.

J'ai regardé comment utiliser DECALER() mais je ne vois pas bien comment l'utiliser dans ce cas précis compte tenu du fait que j'ai des formules à conserver dans les colonnes du tableau "Analyse BS PBX"

Et je préferais nettement qu'une macro bien pensée fasse ce travail d'ajustement.

Précisions

J'utilise Win XP Pro SP3 et Excel 2007.

J'ai très peu de connsaissances en VBA.

Merci à vous pour vos conseils et le temps passé à analyser le sujet.

Bien excel-ement
 

Pièces jointes

  • Analyse Dossier LPA.xlsm
    31.8 KB · Affichages: 232

Gorfael

XLDnaute Barbatruc
Re : Ajustement automatique Nombre de lignes tableau

Salut petrich et le forum
N'étant ni utilisateur de ton fichier, ni télépathe, j'ai du mal à comprendre ce que tu veux !
Code:
Je souhaite donc que la macro de l'onglet "MDE+MAJ" fasse le job automatiquement.
Je suppose que c'est la macro de nom "Macro_MAJ" puisqu'il n'y en a pas d'autre dans le fichier. Mais alors pourquoi ne pas l'indiquer ???

Il y a plusieurs méthode pour savoir qu'elle est la dernière ligne non vide d'une colonne. Pour des formules le calcul de la dernière ligne utilisée en A sera de la forme :
Code:
NBVAL('BS PBX'!A:A)+5
qui dans l'exemple fourni nous donne 19.
L'avantage, c'est que tout changement sera réactualisé avec le calcul de la feuille.
L'inconvénient est que si la colonne A contient des lignes vides, entre les valeurs, le résultat sera faussé.

La "même" formule en VBA sera de la forme :
Code:
sheets("BS PBX").cells(Rows.count, "A").end(xlup).row
donnera le numéro de la ligne de la dernière cellule non vide en A.
Avantage : se fout du contenu en A
inconvénient : ne fonctionne que si on exécute le code.

Mais comme je ne sais pas ce que tu attends...
A+
 

Misange

XLDnaute Barbatruc
Re : Ajustement automatique Nombre de lignes tableau

Bonjour

comme tu as excel 2007, tu as une fonctionnalité intégrée parfaitement adaptée : les tables. Elles sont faites justement pour s'adapter automatiquement à ton nombre de lignes (et de colonnes)
Un peu de lecture
Ce lien n'existe plus
tu peux les manipuler facilement en VBA
Ce lien n'existe plus

avec deux petites lignes en fin d'import de tes données, tu ajustes la table nommée ici nom_table

Fin = Range("A1").End(xlDown).Row
nbcol 'à toi de le définir ou de le faire automatiquement par exemple avec end(xlright).column

ListObjects("nom_table").Resize Range(Cells(1, 1), Cells(Fin, NbCol))

faute de pouvoir voir le code de ta macro, à toi d'ajuster.
 

petrich

XLDnaute Nouveau
Re : Ajustement automatique Nombre de lignes tableau

Merci Gorfael, merci Misange pour vos inputs.

J'ai pu coder une macro qui répond à mes besoins et fait exactement ce que je lui demande à savoir, raccourcir ou rallonger la table en fonction de mon import.

Je suis intéressé par des avis expérimentés sur les 2 points suivants:

1. Optimisation du code
2. Amélioration possible par introduction d'un check de vérification de présence de la feuille car j'ai en fait ce même code reproduit 4 fois avec des noms de variables différents car j'ai 8 feuilles différentes dans mon tableur.

Vos avis sont donc les bienvenues ;-)

Merci en tout cas pour les pistes qui m'ont bien servies...

Voilà donc le code de ma macro:

Sub Macro_Sizing_Tables()
'
' Size les tables des onglets "Analyse Offre" en fonction des imports d'éligibilité
'
' Touche de raccourci du clavier: Ctrl+T
'

' Déclaration des variables
Dim NbligBSPBX, NbligAnalyseBSPBX As Integer
Dim FinalRangeBSPBX, NewRangeBSPBX As Range

' Calcul nombre lignes dans l'import

' Pour Offre BS PBX
NbligBSPBX = Sheets("BS PBX").Range("A6").End(xlDown).Row
NbligAnalyseBSPBX = (Range("Table_BSPBX").Rows.Count) + 5

' Sizing des tables et saisies automatiques dans les tables

' Pour Offre BS PBX
With Sheets("Analyse BS PBX")
If (NbligBSPBX < NbligAnalyseBSPBX) Then
' Si import strictement + court que table actuelle, Alors suppression des lignes en trop
.Activate
Range(Cells(NbligBSPBX + 1, "B"), Cells(NbligAnalyseBSPBX, "M")).Delete Shift:=xlShiftUp

ElseIf (NbligBSPBX > NbligAnalyseBSPBX) Then
' Sinon si import strictement + long que table actuelle, Alors ajout de lignes et recopie de données

Set FinalRangeBSPBX = .ListObjects("Table_BSPBX").ListRows(Range("Table_BSPBX").Rows.Count).Range
.ListObjects("Table_BSPBX").Resize Range("$B$5", Cells(NbligBSPBX, "M"))
Set NewRangeBSPBX = Range(FinalRangeBSPBX, FinalRangeBSPBX.End(xlDown))

.Activate
FinalRangeBSPBX.Select
FinalRangeBSPBX.AutoFill Destination:=NewRangeBSPBX, Type:=xlFillCopy

End If
End With

End Sub
 

petrich

XLDnaute Nouveau
Re : Ajustement automatique Nombre de lignes tableau

Re,

j'ai à priori trouver un moyen de ne pas générer d'erreur en cas d'absence de la feuille BS PBX en modifiant mon code ainsi:

Mais à nouveau preneur d'avis ;-)

Merci

Sub Macro_Sizing_Tables()
'
' Size les tables des onglets "Analyse Offre" en fonction des imports d'éligibilité
'
' Touche de raccourci du clavier: Ctrl+T
'

' Déclaration des variables
Dim NbligBSPBX, NbligAnalyseBSPBX As Integer
Dim FinalRangeBSPBX, NewRangeBSPBX As Range

' Calcul nombre lignes dans l'import

' Pour Offre BS PBX
On Error Resume Next
NbligBSPBX = Sheets("BS PBX").Range("A6").End(xlDown).Row
NbligAnalyseBSPBX = (Range("Table_BSPBX").Rows.Count) + 5
If Err = 9 Then Resume Next
Err.Clear: On Error GoTo 0


' Sizing des tables et saisies automatiques dans les tables

' Pour Offre BS PBX
On Error Resume Next
With Sheets("Analyse BS PBX")
If (NbligBSPBX < NbligAnalyseBSPBX) Then
' Si import strictement + court que table actuelle, Alors suppression des lignes en trop
.Activate
Range(Cells(NbligBSPBX + 1, "B"), Cells(NbligAnalyseBSPBX, "M")).Delete Shift:=xlShiftUp

ElseIf (NbligBSPBX > NbligAnalyseBSPBX) Then
' Sinon si import strictement + long que table actuelle, Alors ajout de lignes et recopie de données

Set FinalRangeBSPBX = .ListObjects("Table_BSPBX").ListRows(Range("Table_ BSPBX").Rows.Count).Range
.ListObjects("Table_BSPBX").Resize Range("$B$5", Cells(NbligBSPBX, "M"))
Set NewRangeBSPBX = Range(FinalRangeBSPBX, FinalRangeBSPBX.End(xlDown))

.Activate
FinalRangeBSPBX.Select
FinalRangeBSPBX.AutoFill Destination:=NewRangeBSPBX, Type:=xlFillCopy

End If
End With
If Err = 9 Then Resume Next
Err.Clear: On Error GoTo 0


End Sub
 

Discussions similaires

  • Question
Microsoft 365 Tableau
Réponses
24
Affichages
396
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…