Optimisation simple VBA

Bonjour,

J'ai fait un VBA pour ajouter une colonne dans un tableau structuré, y ajouter un titre et une formule.

Mais j'ai souvent lu ici que le ".Select" n'était pas recommandé.

Qu'auriez-vous suggéré dans un cas comme celui ci?

'Ajout colonne dans le tableau déjà existant
    Columns("Q:Q").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("Q1").Select
    ActiveCell.FormulaR1C1 = "Contrôle Long/Lat"
    Range("Q2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF([@Latitude]="""",""KO"",(IF([@Longitude]="""",""KO"",""ok"")))"
Merci pour vos avis

Bonjour,

Si le code est exécuté depuis la feuille qui contient le tableau et que la colonne à insérer doit être la 17è :

with activesheet.listobjects("nomtableau").listcolumns.add(position:=17)
    .name = "Contrôle Long/Lat"
    .databodyrange.Formula = "=IF([@Latitude]="""",""KO"",(IF([@Longitude]="""",""KO"",""ok"")))"
end with

Il faudra adapter le nom du tableau.

Cdlt,

Merci.
Mais comment puis-je l'introduire?

Ca bloque comme cela (O. = ma variable pour déclarer l'onglet)

O.Select
'Ajout colonne dans le tableau déjà existant
With ActiveSheet.ListObjects("nomtableau").ListColumns.Add(Position:=17)
    .Name = "Contrôle Long/Lat"
    .DataBodyRange.Formula = "=IF([@Latitude]="""",""KO"",(IF([@Longitude]="""",""KO"",""ok"")))"
End With

Voici un essai de variabilisation avec prise en compte de votre problème :

Sub Inserer()
dim lo as listobject
sFormule$ = "=IF(OR([@Latitude]="""",[@Longitude]=""""), ""KO"",""ok"")"
set lo = sheets("FeuilleContenante").listobjects("nomtableau")
'ou set lo = O.listobjects("nomtableau") si O bien déclarée et affectée !
InsertLoColumn ListObject:=lo, Position:=17, ColumnName:="VerifLongLat", Formula:=sFormule
end sub

Sub InsertLoColumn(ListObject As ListObject, Position As Long, ColumnName As String, Optional Formula As String)
With ListObject.ListColumns.Add(Position)
    .Name = ColumnName
    .DataBodyRange.Formula = Formula
End With
End Sub

Attention, le nom du tableau est à adapter dans le code, il faut remplacer "nomtableau" par le vrai nom du tableau !

Cdlt,

Ok merci. Je vais tester.

Mais c'est sûr que c'est plus "optimal" que mon VBA initial?

Car c'est plus long à rédiger du coup :)

Bonjour,

pour répondre à ta question, il est inutile (99 fois/100) de faire un .Select suivi de l'utilisation de Selection.
Dans ce cas il faut tout écrire sur la même ligne :

Columns("Q:Q").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
C'est uniquement quand cette ligne est refusée à l'exécution qu'il faut passer par un .Select

Quant à la syntaxe pour un tableau structuré, elle est plus lourde mais tant qu'à faire autant rester dans la logique des tableaux structurés.
eric

Bonjour à tous,

Et le code semble plus long parce que j'ai ensuite transformé le bout de code initial en macro paramétrée pour qu'elle soit plus simple à utiliser et modifier.

Ca permet notamment d'appeler à plusieurs endroits cette macro secondaire et de limiter la taille des macros principales, qui souvent sont un peu longues.

De toute façon, ce n'est pas la taille qui compte^^

Cdlt,

Bonjour …

Ce que je fais habituellement connaissant le nom du tableau structuré (TB dans l’exemple) sans me préoccuper de la position de celui-ci dans le classeur donc de la fenêtre des codes où écrire la macro et avec le mode With … End With permettant de cibler indépendamment de l’onglet

Sub Inserer()
    If [TB].Item(0, 17) = "L ou l" Then Exit Sub                                     '1
   With [TB].Columns(16): .ListObject.ListColumns.Add 17: End With                   '2
   With [TB].Columns(17)
      .Rows(0) = "L ou l"                                                            '3
     .Rows(1).Formula = "=IF(OR([@Latitude]="""",[@Longitude]=""""), ""KO"",""ok"")" '4
     .ColumnWidth = 12: .HorizontalAlignment = xlCenter                              '5
  End With
End Sub

«De toute façon, ce n'est pas la taille qui compte^^» : oh que oui 3GB !

Pour alléger la macro :

1 pour éviter une répétition néfaste

2 avec le N° de la colonne du tableau

3 nom simple du titre (avec le 0)

4 formule de l'item 1 qui se propagera automatiquement

5 formatage de la nouvelle colonne (largeur 12 à adapter)

Rechercher des sujets similaires à "optimisation simple vba"