Bonjour,

J'ai un tableau de comparaison d'offre, ce dernier peut posséder un nombre variable de prestataires à comparer.
J'ai voulu créer un bouton permettant d'ajouter des colonnes "ST XX" vierge à la suite des colonnes existantes afin d'éviter les problèmes liées aux modifications de formules, mauvais nettoyage et faire gagner du temps à l'utilisateur.

Une colonne ST XX est composée de 7 colonnes, ce nombre et fixe et ne doit pas varier, le nombre de ligne lui est totalement dépendant de l'utilisateur.

Pour effectuer mon code, j'ai pris la première colonne "ST XX" de mon fichier, en sélectionnant les 7 colonnes qui la compose et j'ai nommée la plage "NEWSTX".

J’obtiens le code suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Sub NEWST() ' macro pour ajouter un ST
 
'Diminue les changements de fenêtre
 Application.ScreenUpdating = False
 
Dim nb_ligne As Integer
Dim nb_colonne As Integer
Dim i As Integer
 
 
    ' nombre de ligne à remettre à 0
    nb_ligne = Range("C" & Rows.Count).End(xlUp).Row - 1
    ' Numéro de la dernière colonne remplie
    nb_colonne = Cells(10, Cells.Columns.Count).End(xlToLeft).Column
    ' Selection du ST 6 et copier
    Range("NEWSTX").Copy
 
    ' sélection la dernière colonne, se décale de 1 et colle un tableau (même si il est rempli)
    Columns(nb_colonne).Offset(0, 1).Insert Shift:=xlToRight
 
 
    SendKeys "{Escape}"
 
Dim NomDuST As Integer
' regarde après création ou est le nom de ST
NomDuST = Sheets("Tableau comparatif").Cells(4, Cells.Columns.Count).End(xlToLeft).Column
 
With Sheets("Tableau comparatif")
    ' change le nom du ST pour un nom générique à modifier par l'acheteur
    .Cells(4, NomDuST).Value = "ST XX"
    .Cells(5, NomDuST + 2).Value = ""
    .Cells(6, NomDuST + 2).Value = ""
    .Cells(7, NomDuST + 2).Value = ""
    .Cells(8, NomDuST + 2).Value = ""
 
    For i = 12 To nb_ligne
        ' vide les cellules Qté, Unité et PU pour avoir un tableau propre
        .Cells(i, NomDuST).Value = ""
        .Cells(i, NomDuST + 1).Value = 0
        .Cells(i, NomDuST + 2).Value = 0
        .Cells(i, NomDuST + 5).Value = ""
    Next
End With
 
'Diminue les changements de fenêtre
 Application.ScreenUpdating = True
 
SendKeys "{Escape}"
 
End Sub
Mes problèmes sont les suivants :

Lorsque j'ouvre le ficher et que j'utilise ce code pas de problème il s'effectue autant que je veux, mais
- si je supprime les colonnes que j'ai créé via le bouton, le code bug et m'affiche des erreurs
- idem si j'écris après la dernière colonne, (comme si j’écrivais un mémo, ou si je faisais un calcul), or c'est tous l’intérêt de la fonction insert car avec la fonction copy/paste j'ai aucun problème.
- si la plage nommée est masquée ça bug aussi


La première erreur est la suivante :

erreur d'exécution '-2147417848 (80010108)':
Erreur Automation
L'objet invoqué s'est déconnecté de ses clients.

Si je fais un débogage il va me surligner la ligne :
Columns(nb_colonne).Offset(0, 1).Insert Shift:=xlToRight

lorsque je relance la macro sans rien changer il me met l'erreur :

erreur d'exécution '1004':
La méthode Insert de la classe Range a échoué

et si j’arrête la macro puis la relance

cette fois c'est l’erreur d'exécution '1004':
La méthode Copy de la classe Range à échoué. Et il me surligne la ligne
Range("NEWSTX").copy

si je change le code comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
   Range("NEWSTX").Copy
 
    ' sélection la dernière colonne, se décale de 1 et colle un tableau (même si il est rempli)
    Columns(nb_colonne).Offset(0, 1).activate
Activesheet.paste
j'ai aucun problème mais j'écrase toutes les éventuelles notes mises à la suite des colonnes.
J'ai également essayer en changeant le Range("NEWSTX") par les lettres des colonnes : Range("Z:AF"), mais j'ai le même problème.
Lors des erreurs l'ensemble des variables prennent les bonnes valeurs donc je comprend pas pourquoi j'ai ces erreurs, j'aurai besoin d'un coup de main soit pour trouver une autre méthode, soit me dire ce qui ne va pas.

Pour le cas ou la plage est masquée, la macro ne fait tout simplement : rien

J'espère avoir été suffisamment clair, si vous avez besoin de plus précisions j’essayerai d'en apporter.

Ps : je m'excuse encore pour le doublon avec la section excel sans VBA