Intégration d'un code dans une macro

Ewigefrost

XLDnaute Junior
Salut bisàmme,

j'ai un petit soucis concernant l'intégration d'un bout de code dans ma macro déjà existante que voici :

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    wshSheets = [{"TCD ACIER", "TCD ALU"}]
        
        If Not IsError(Application.Match(Sh.Name, wshSheets, 1)) Then

            With Sheets("TCD ALU")
                ActiveWindow.Zoom = 120
                .Range("O2:X38").CopyPicture xlScreen, xlBitmap
                    With .ChartObjects.Add(0, 0, 2400, 1429).Chart
                        .Paste
                        .Export ThisWorkbook.Path & "\test1.gif", "gif"
                    End With
                .ChartObjects(Sheets("TCD ALU").ChartObjects.Count).Delete
            End With
            
            ActiveWorkbook.Save
        End If
End Sub

Cette macro me sert à exporter automatiquement une image d'une plage de cellules (actuellement "O2:X38" sur la feuille "TCD ALU") dès qu'il y a une changement sur un des cellules des feuilles "TCD ALU" et "TCD ACIER".

Le problème est que cette plage de cellules est variable, mais l'utilisation d'un EndxlUp ne marche pas puisque toutes les lignes de la feuille contiennent des formules.

J'ai donc trouvé un code qui permet de trouver la dernière ligne du tableau que je souhaite exporter (en recherchant le mot "Total général" qui correspond à la dernière ligne de celui-ci). Il fonctionne parfaitement lorsque je le place dans la feuille "TCD ALU" et que je l'exécute manuellement :

Code:
Sub test()
 With Worksheets("TCD ALU").Range("a1:a40")
 Dim NLigneDescription As Long
 Dim Dligne As Long
 Cells.Find(What:="Total général", After:=Range("A1"), LookIn:=xlValues, LookAt _
 :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
 False, SearchFormat:=False).Activate
 NLigneDescription = ActiveCell.Row
 Range("A200").Value = NLigneDescription
 Dligne = NLigneDescription + 10
 Range("A201").Value = Dligne
 End With
End Sub

Seulement, il faudrait qu'il s'exécute automatiquement dès qu'il y a un changement sur la feuille, comme pour l'exportation automatique, mais avant celle-ci bien sûr.

Le problème c'est que je ne sais pas comment remplacer le .Range("O2:X38") par quelque chose qui prendrait en compte le Dligne. J'ai testé ça : .Range("$O$2:$X$ & Dligne") en plaçant ça après le Then

Code:
With Worksheets("TCD ALU").Range("a1:a40")
 Dim NLigneDescription As Long
 Dim Dligne As Long
 Cells.Find(What:="Total général", After:=Range("A1"), LookIn:=xlValues, LookAt _
 :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
 False, SearchFormat:=False).Activate
 NLigneDescription = ActiveCell.Row
 Range("A200").Value = NLigneDescription
 Dligne = NLigneDescription + 10
 Range("A201").Value = Dligne
 End With

mais Excel plante lorsque je modifie une cellule dans TCD ALU ou TCD ACIER.

Comment je pourrais faire ça svp ?

Merci énormément d'avance, vous m'avez déjà permis d'avancer pas mal dans d'autres topics ;)
 

herve62

XLDnaute Barbatruc
Supporter XLD
Re : Intégration d'un code dans une macro

Bonjour
Pas tout compris l'ensemble mais je vais te répondre sur :
Le problème est que cette plage de cellules est variable, mais l'utilisation d'un EndxlUp ne marche pas puisque toutes les lignes de la feuille contiennent des formules.

Code:
Function GetDerLigneTexte() As Long
' cette fonction permet de detecter la Dernière REELLE ligne non-vide car lorsque l'on met
' une formule avec "=B$6" par exemple et quil ny a rien alors on a 0
' donc ici on ne tient pas compte de cela ; exemple si 50 lignes avec un "=..." et que
' 10 ont une REELLE valeur , la  fonction retournera 10 et non 50 comme avec la commande
' End(XLUp) cela raccourci bien les boucles au lieu de tourner dans le vide
Dim plg As Range
On Error Resume Next
Set plg = Worksheets("Formations par personne").Range("b16:b1000").SpecialCells(xlCellTypeFormulas, xlTextValues) ' VALABLE ICI Pour Colonne B
If Not plg Is Nothing Then                                                  ' Changer si recherche dans autre colonne
    With plg.Areas(plg.Areas.Count)
        GetDerLigneTexte = .Cells(.Cells.Count).Row
    
    End With
End If
End Function

Puis : lastlig=GetDerLigneTexte ( adapte le Set plg à ton cas)
Je ne sais pas si cela te facilitera la suite , mais au moins un Pt de réglé SUR !
 

Ewigefrost

XLDnaute Junior
Re : Intégration d'un code dans une macro

Bonjour herve62 et merci pour ta réponse,

en fait le code fait la même chose que

Sub test()
With Worksheets("TCD ALU").Range("a1:a40")
Dim NLigneDescription As Long
Dim Dligne As Long
Cells.Find(What:="Total général", After:=Range("A1"), LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
NLigneDescription = ActiveCell.Row
Range("A200").Value = NLigneDescription
Dligne = NLigneDescription + 10
Range("A201").Value = Dligne
End With
End Sub

Non ?

Parce que mon soucis c'est surtout au niveau de cette ligne :

.Range("O2:X38").CopyPicture xlScreen, xlBitmap

Comment intégrer mon lastlig (ou Dligne dans le code que j'ai proposé dans mon message) dans cette ligne pour lui dire d'aller de O2 à cette dernière ligne en X ?
 

Ewigefrost

XLDnaute Junior
Re : Intégration d'un code dans une macro

Bah en fait quand j'écris ce code :

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     wshSheets = [{"TCD ACIER", "TCD ALU"}]
         
         If Not IsError(Application.Match(Sh.Name, wshSheets, 1)) Then

                         With Sheets("TCD ALU")
                Worksheets("TCD ALU").Activate
                ActiveWindow.Zoom = 120
                Dim NLigneDescription As Long
                Dim Dligne As Long
                Cells.Find(What:="Total général", After:=Range("A1"), LookIn:=xlValues, LookAt _
                :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
                False, SearchFormat:=False).Activate
                NLigneDescription = ActiveCell.Row
                Range("A200").Value = NLigneDescription
                Dligne = NLigneDescription + 10
                Range("A201").Value = Dligne
                .Range("O2:X" & Dligne).CopyPicture xlScreen, xlBitmap
                    With .ChartObjects.Add(0, 0, 2400, 1429).Chart
                        .Paste
                        .Export ThisWorkbook.Path & "\test1.gif", "gif"
                    End With
                .ChartObjects(Sheets("TCD ALU").ChartObjects.Count).Delete
            End With             
             ActiveWorkbook.Save
         End If
 End Sub

Je vois que ça calcule mais comme s'il était dans une boucle infinie (la barre de progression se complète puis s'efface puis se recomplète etc, avec marqué "Calcul 2 processeurs") jusqu'à ce que Excel plante.

Et merci encore de te pencher sur mon problème ;)
 

Ewigefrost

XLDnaute Junior
Re : Intégration d'un code dans une macro

Rebonjour,

je viens de remarquer que lorsque j'arrête l'exécution de la macro pendant qu'elle tourne (et avant qu'Excel plante), il y a une boite de dialogue avec écrit

Erreur d'exécution 91 : variable objet ou variable de bloc with non définie

et ça me surligne la ligne cells.find

Cells.Find(What:="Total général", After:=Range("A1"), LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate

J'ai vu que ça vient d'une variable non définie, mais je ne vois pas ce que je n'ai pas défini ici. Quelqu'un aurait une idée svp ?

PS: le terme "Total général" existe bien tout le temps, donc il n'y a pas de raison que ça bug à cause de ça !
 
Dernière édition:

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87