Un peu de philosophie, retour d'expérience sur quelques projets récents

Bonjour à tous, J'ai récemment finalisé une petite série de projets (retraitement de fichiers texte, récupération et compréhension d'une base de gestion d'un atelier textile, etc.).

Je voudrais partager certaines "règles" de bon sens pour ces projets. Celles-ci viennent compléter ou repréciser celles que j'avais émises ici et .

  • Ne jamais utiliser une formule =LIGNE() pour créer une clef dans une table de données. En effet, à la moindre suppression de ligne ou bien lors d'un tri, vous perdrez la correspondance de cette clef, surtout si elle a été utilisé ailleurs ou comme lien.
  • Ne jamais utiliser plusieurs formules de structures différentes dans une même colonne.
    • Tout d'abord, suivant la loi de Murphy, un utilisateur va forcément recopier la formule sur toute la colonne et flinguer les autres formules.
    • De plus, lors de l'ajout de nouvelles lignes, vous allez devoir choisir quelle formule utiliser, ce qui entraine un risque d'erreur encore plus important.
    • La solution consiste donc à repenser la structure des tables pour éviter ces situations. On peut aussi - jusque dans une certaine mesure - complexifier les formules pour prendre en compte les différents cas.
  • Lorsqu'on crée une colonne avec des dates, ne rien mettre d'autre que des dates, cela permet de créer très rapidement d'excellents tableaux croisés dynamiques.
  • Archiver régulièrement ses fichiers.
  • Éviter au maximum les liaisons entre fichiers. Mon expérience est que cela génère toujours des problèmes : pas d'actualisation, cassage des liens, transfert de fichiers, complexité des structures, etc.
  • Toujours bien réfléchir avant de choisir Excel pour s'assurer que c'est l'outil le plus adéquat... nombre d'utilisateurs simultanés, taille et complexité de la base, communication des données à l'extérieur, etc.
    Souvent Excel n'est pas l'outil idéal, mais il reste un très bon outil de prototypage avant de migrer vers une solution plus "classique" de type base de données relationnelles (Access, Oracle, etc.) ou progiciel.

En espérant que ces petits conseils vous soient utiles.

A bientôt.

Gaëtan Mourmant

 

Dernier jour pour devenir un guru du VBA

Le VBA est le langage de programmation d'Excel qui permet d'automatiser vos tâches courantes sur Excel.

Vous pouvez par exemple :
- incrémenter automatiquement des numéros de factures
- ajouter des formulaires de saisie ou de consultation
- effectuer des tâches courantes là où il fallait des dizaines, voire des centaines de clics

Dans cette formation, en plus d'un support de cours écrit, je viens tout juste d'ajouter 3h30 de vidéos explicatives.
Ces vidéos sont en fait la synthèse que je donne aux étudiants après une semaine intensive de cours sur VBA.

Ne perdez plus de temps et profitez du dernier jour à -25% pour investir dans votre formation VBA !

En savoir plus ici :
https://www.xlerateur.com/formation-au-vba/

Excel VBA - ActiveSheet.ShowAllData, La 1004 : "La méthode ShowAllData de la classe Worksheet a échoué"

Bonjour à tous,

Si vous avez déjà eu à utiliser ShowAllData en VBA, vous avez certainement rencontré ceci !

ShowAllData-Excel-VBA-1004

Voici un petit résumé de ce qui se passe...Du moins, de ce que j'ai pu en comprendre jusqu'à présent !
Voici le lien vers le fichier

Le code utilisé est celui-ci :
ActiveSheet.ShowAllData ou encore Feuil1.ShowAllData
qui à la lecture pourrait vouloir dire : afficher les données de la feuille active ou de la feuil1.
Mais en fait, il vaudrait mieux lire : afficher les données du filtre de la cellule active.

En effet, soit un tableau filtré comme ceci :
Table-ShowAllData-Excel-VBA-1004

Le code suivant ne fonctionnera pas, car la cellule active n'est pas sur le tableau.
Sub SubShowAllData_fonctionne_pas()
Range("H1").Select
Feuil1.ShowAllData
End Sub

De fait, celui-ci fonctionnera mieux, mais je ne le comprends pas, car ca fonctionnera même si on se trouve sur une autre feuille !
Sub SubShowAllData_fonctionne_parfois()
Range("A1").Select
Feuil1.ShowAllData
End Sub

Mais malheureusement, il ne fonctionnera qu'une seule fois.
En effet, une fois que l'on aura tout ré-affiché, le code va afficher la même erreur, car toutes les données seront affichées.
D'où un test qui permet de savoir si le filtre est activé :
Sub ShowAllData_fonctionne_a_priori_toujours()
Feuil1.Select
Range("A1").Select
If Feuil1.FilterMode Then
Feuil1.ShowAllData
End If
End Sub

Et une solution alternative basée sur une idée de Dominique.
Celle-ci supprime et remet le filtre automatique.
Cette fonctionnalité ne fonctionne cependant pas avec des filtres avancés.
Sub Supprime_filtre_alternative()
Feuil1.Select
Range("A1").Select
If Feuil1.FilterMode Then
Feuil1.UsedRange.AutoFilter
Feuil1.UsedRange.AutoFilter
End If
End Sub

A bientôt

Gaëtan