XL 2013 Erreur définie par l'application ou par l'objet

louloubru

XLDnaute Junior
Bonjour,

j'ai cette erreur lors de l’exécution de ma procédure, je n'arrive pas à en trouver l'origine car j'utilise la ligne à l'origine de l'erreur dans une autre procédure sans soucis ...

Je vous mets le code ci-dessous, l'objectif est de copier dans un autre classeur toutes les lignes de mon classeur (comportant plusieurs feuilles) répondant à une condition : 1 doit être présent dans ne colonne de la ligne. Cette colonne est choisie par l'utilisateur via un user_form.


VB:
Private Sub OK_liste_Click()
'Créé un nouveau classeur contenant les participants à l'évènement sélectionné

    'Trouver la colonne correspondant à l'évènement
    Sheets("Evènements").Activate
    Dim ev As String
    Dim Col As Long
    ev = Me.Evenement.Text
    Col = Range(RefCell(ev)).Column
    
    'Récupérer le nom du classeur de base (Date Grande liste RMT)
    Dim Base
    Base = ThisWorkbook.Name
    
    'Copier coller les lignes des participants concernés par l'évènement : donc les lignes où la case de la colonne Col contient 1
    'Initialisation des variables
    Dim Lig As Long
    Dim NbrLig As Long
    Dim NumLig As Long
    Dim i As Integer
    Dim Celldep As String
    NumLig = 0
    Celldep = "A" & NumLig
    InitialiseNoms_feuilles 'Créé un nouveau classeur
    Workbooks.Add 'Créé un nouveau classeur dans lequel seront copéis les lignes correspondant aux participants de l'évènement.
    ActiveWorkbook.Sheets("Feuil1").Activate ' feuille de destination

    For i = 0 To 13
        With Workbooks(Base).Sheets(Noms_feuilles(i)) ' feuille source
        NbrLig = .Cells(65536, Col).End(xlUp).Row
            For Lig = 1 To NbrLig
                If .Cells(Lig, Col).Value = 1 Then
                [COLOR=rgb(184, 49, 47)][U].Rows(.Cells(Lig, Col).Row).Copy Cells(NumLig, 1)[/U][/COLOR]
                NumLig = NumLig + 1
                End If
            Next
        End With
    Next i

'Uniformiser la mise en forme des cellules (sans bordure Arial 10)
With Sheets("Liste_Bulletin_veille").Range(Celldep)
    .Borders.Value = 0
    .Font.Size = 10
    .Font.Name = "Arial"
    .WrapText = False
    .HorizontalAlignment = xlLeft
    .VerticalAlignment = xlCenter
End With

  Call Unload(Me)

End Sub

Remarque : l'erreur n'est pas due à ma colonne : la fonction RefCell renvoyant l'adresse de la cellule fonctionne (code ci-dessous). Et surtout lorsque j’exécute la procédure en remplaçant col par une colonne existante ("V" par exemple), cela ne fonctionne pas non plus.

J'ai souligné la ligne qui pose problème en rouge.

En vous remerciant !
 

Dranreb

XLDnaute Barbatruc
En débogage mettez des espions sur les indices.

Attendez, vous avez dit sur la même ligne ???
Un Redim Preserve ne peut changer que la limite de la dernière dimension, donc le nombre de colonnes. Pour le nombre de ligne il faut préciser le même qu’auparavant, ou pour être sûr de ne pas se tromper Redim Preserve TabS(1 To UBound(TabS, 1), 1 To UBound(TabE, 2))
Notez que vous pouvez simplifier ça si vous conaissez le nombre de colonnes. Moi je ne le conaissais pas quand j'ai commencé à écrire ça.
 
Dernière édition:

louloubru

XLDnaute Junior
Le nombre de colonnes dans les différentes feuilles va changer. Je ne peux pas le fixer.
Mes données sous sous format tableau d'excel, ce qui a m'a déjà posé quelques soucis... Ca pourrait peut-être être ça.

Je pense que je vais retourner à la méthode initiale avec mes range et cells en cherchant comment enlever la validation...
Parce que là je me décourage :(
 

Dranreb

XLDnaute Barbatruc
Ben oui, ça en pose. Ce n'est pas qu'une mise en forme, loin s'en faut. Ça donne lieu à la création d'un ListObject qui est ajouté à la collection ListObjects de la feuille. S'il n'y a pas de tableau cette collection est vide et n'a donc pas d'élément 1.
 

louloubru

XLDnaute Junior
Ben oui, ça en pose. Ce n'est pas qu'une mise en forme, loin s'en faut. Ça donne lieu à la création d'un ListObject qui est ajouté à la collection ListObjects de la feuille. S'il n'y a pas de tableau cette collection est vide et n'a donc pas d'élément 1.
Bonjour,

ça fonctionne !!!!
J'ai tout mis sous forme de tableau et cela fonctionne parfaitement.

Merci beaucoup !
Bon le problème c'est que je ne suis pas du tout certaine de pouvoir m'en resservir car je ne comprends pas bien le code .
Ce sont les redimensionnement que je ne comprends pas bien : on créé deux tableau et on en redimensionne un ?
Serait-il possible de commenter le code ?

Je le remets en dessous.
Excusez-moi de vous embêter encore mais ce serait pour moins vous elbêter par la suite pour pouvoir le faire toute seule ...
En vous remerciant,
(je n'ai mis que la fin de la procédure)

VB:
    'Création d'un tableau contenant mes lignes
    Dim TabE(), LE&, TabS(), LS&, C&, i&
    ReDim TabS(1 To 50000, 1 To 10)
    For i = LBound(Noms_feuilles) To UBound(Noms_feuilles)
        TabE = Sheets(Noms_feuilles(i)).ListObjects(1).DataBodyRange.Value
        If UBound(TabS, 2) < UBound(TabE, 2) Then ReDim Preserve TabS(1 To UBound(TabS, 1), 1 To UBound(TabE, 2))
            For LE = 1 To UBound(TabE, 1)
                If TabE(LE, Col) = 1 Then
                    LS = LS + 1
                        For C = 1 To UBound(TabE, 2)
                        TabS(LS, C) = TabE(LE, C)
                        Next C
                End If
            Next LE
    Next i
  
   'Création d'un nouveau classeur et "collage" du tableau contenat les lignes dans ce classeur
   Workbooks.Add
   ActiveSheet.[A2].Resize(LS, UBound(TabS, 2)).Value = TabS
  Call Unload(Me)

End Sub
 

louloubru

XLDnaute Junior
Bonjour.
Ben oui, c'est ça, qu'est-ce que vous voulez savoir de plus ?
Pour pouvoir se servir d'un tableau dynamique il faut soit un Redim soit lui affecter une expression tableau telle que la propriété Value d'un Range représentant une plage de plusieurs cellules.
Euh et bien je ne comprend pas pourquoi on fait ça ... un commentaire sur ce que fait chaque ligne de code me serait bien utile ...
 

Dranreb

XLDnaute Barbatruc
Parce qui si on tente d'accéder à un élément d'un tableau dynamique non dimensionné, ça plante parce qu'il n'a pas d'espace mémoire alloué.
Vous voulez avoir des commentaires à comprendre en plus des instructions ? C'est dans votre tête que vous devez vous les mettre les commentaires !
 

Discussions similaires

Statistiques des forums

Discussions
311 740
Messages
2 082 049
Membres
101 882
dernier inscrit
XaK_