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

XL 2016 Insertion de lignes [Résolu]

Sly le globe trotter

XLDnaute Occasionnel
Bonsoir à tous,

Une conversation ayant quasiment le même titre existe actuellement mais en parcourant la discussion, je constate que le sujet n'est pas le même. Je suis à la recherche comme vous vous en doutez d'un peu d'aide pour un souci étonnant.
J'ai récupéré dans ma boîte un code VBA Excel qui fonctionne très bien depuis plusieurs années. Sauf que depuis quelques jours, cela déraille sur plusieurs postes, avec toujours les mêmes symptômes !

Voici le code que j'ai allégé, il est beaucoup plus long... Je partage ici la boucle où se passe l'erreur.
Code:
'Ecriture des données
    i = 1
    While Not rst.EOF
      
        'teste le lay-up courant: si nouveau, on copie un nouveau lay-up modèle qu'on va remplir ensuite
        If strLayUpCur <> Trim(rst.Fields(LAYUP).Value) Or strLayUpCur = vbNullString Then
      
            'si layup déjà inséré, on finit sa mise en forme avant d'en insérer un autre
            If i > nbLignesAvantRaq Then
                'on supprime la dernière ligne raquette vide (ligne courante)
                Rows(i).Delete
                'affichage des bordures des lignes raquette
                With Range(Cells(i - 1, nbColVidesDebut + 1), Cells(i - 1, nbColVidesDebut + nbColModele))
                    .Borders(xlEdgeBottom).LineStyle = xlContinuous
                    .Borders(xlEdgeBottom).ColorIndex = 0
                    .Borders(xlEdgeBottom).TintAndShade = 0
                    .Borders(xlEdgeBottom).Weight = xlMedium
                End With

                'on se positionne après le layup
                i = i + nbLignesStat
            End If
      
            'ajout d'un nouveau layup modèle sur la feuille courante
            Workbooks(strNomFichierCourant).Sheets(strNomFeuilleModele).Rows("1:" & CStr(nbLignesModele)).Copy
            Workbooks(strNomFichier).Sheets(strNomFeuille).Rows(i).Insert Shift:=xlDown
          
            'incrémentation des lignes due à l'insertion du nouveau modèle
            'on se positionne à la première ligne raquette du layup
            i = i + nbLignesAvantRaq
          
            'sauvegarde du lay-up courant
            If rst.Fields(LAYUP).Value <> "" Then
                strLayUpCur = Trim(rst.Fields(LAYUP).Value)
            Else
                strLayUpCur = ""
            End If         
 
            'on cache les lignes de seuil du lay-up
            Rows(i + nbLignesVidesRaq - 1 + ligStatsSeuil1).EntireRow.Hidden = True
            Rows(i + nbLignesVidesRaq - 1 + ligStatsSeuil2).EntireRow.Hidden = True
          
        Else
            'insertion d'une ligne avant la derniere ligne raquette
          
            ' XXXXXXXXXXXXXXXle problème vient de la ligne suivante XXXXXXXXXXXXXXXXXXXXXXX
            Rows(i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
          
        End If   
      
        'position sur la dernière raquette du layup
        i = i + 1
      
        'raquette suivante
        rst.MoveNext
          
    Wend

Lors du premier passage dans cette boucle, la condition
Code:
If strLayUpCur <> Trim(rst.Fields(LAYUP).Value) Or strLayUpCur = vbNullString Then
est vraie et je créée un tableau vide par l'intermédiaire des 2 lignes de codes suivantes
Code:
'ajout d'un nouveau layup modèle sur la feuille courante
Workbooks(strNomFichierCourant).Sheets(strNomFeuilleModele).Rows("1:" & CStr(nbLignesModele)).Copy
            Workbooks(strNomFichier).Sheets(strNomFeuille).Rows(i).Insert Shift:=xlDown

Lors du second passage, la condition précédente est fausse et je cherche juste à insérer une ligne dans le tableau précédemment créé avec le code suivant
Code:
'insertion d'une ligne avant la derniere ligne raquette
Rows(i).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Le hic c'est qu'à présent au lieu d'insérer une ligne, est inséré à nouveau le tableau initial... Comme si Excel avait gardé en mémoire les données copiées précédemment.

Difficile de joindre un fichier exemple tant le fichier est complexe et pointant sur des bases de données externes. J'espère cependant que vous aurez des pistes pour m'aider à faire évoluer ce code, qui a fonctionné pendant plusieurs années, pour différents utilisateurs, sur différents postes...

D'avance merci,
Sly
 

Sly le globe trotter

XLDnaute Occasionnel
Bonsoir à tous,

Après quelques recherches, j'ai trouvé une solution. Elle est moche et contourne le problème mais je n'ai pas mieux à ce jour...
La solution trouvée consiste à vider le presse papier avant d'effectuer l'insertion de ligne... Le presse papier étant alors vide au moment de l'insertion, une ligne est insérée, plutôt que les données du presse papier.

pour info, un des moyens de le faire est détaillé dans cette page
https://vb.developpez.com/faqvba/?page=2#emptyclipboard

Preneur d'une vraie solution toute fois si vous en avez ;-)

Merci,
Sly
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…