Erreur de compilation

Résolu
Bonjour,

Je pense que ce problème a déjà du être posté, mais je n'ai toujours rien trouvé de "compréhensible" pour mon niveau. J'ai une macro avec un problème de sub ou fonction non défini. Le voici:

Private Sub Worksheet_Activate()
   Application.EnableEvents = False
    Application.ScreenUpdating = False
    Dim avarSplit() As String
    Dim i As Integer
    Dim j As Integer
    
    Call FindLastRow
    j = 2
    
    For i = 4 To LastRow
    If Feuil1.Range("H" & i).Value = "BLS/AED" Then
    
    Feuil3.Range("A" & j).Value = Feuil1.Range("E" & i).Value
    Feuil3.Range("B" & j).Value = Feuil1.Range("F" & i).Value
    Feuil3.Range("C" & j).Value = Feuil1.Range("G" & i).Value
    Feuil3.Range("D" & j).Value = Feuil1.Range("N" & i).Value
    Feuil3.Range("E" & j).Value = Feuil1.Range("I" & i).Value
    Feuil3.Range("F" & j).Value = Feuil1.Range("J" & i).Value
    Feuil3.Range("G" & j).Value = Feuil1.Range("K" & i).Value
    Feuil3.Range("H" & j).Value = Feuil1.Range("L" & i).Value
    
    
    Select Case UBound(avarSplit)
    Case 1
    Feuil3.Range("G" & j).Value = avarSplit(1)
    Case 2
    Feuil3.Range("G" & j).Value = avarSplit(1)
    Feuil3.Range("H" & j).Value = avarSplit(2)
    End Select
    
    j = j + 1
    
    End If
    Next
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub


Le problème se trouve, d'après moi, soit au début soit au "Call FindLastRow". Merci de votre aide.

3 réponses

  1. Bonjour,

    ton problème vient de ces lignes :

    Call FindLastRow
    j = 2

    For i = 4 To LastRow

    écris comme ca lastrow = rien donc il peut pas faire tourner la macro. il faut que tu fasses une déclaration de variable de manière àpouvoir la passer de findlastrow à worksheet_ activate.

    Pour cela deux possibilités :
    - soit tu déclares la variable en public
    - soit tu la fais passer de l'une à lautre

    Pour le résoudre, tu as deux solutions, soit tu écris comme ca :

    public lastrow as variant
    
    Sub FindLastRow 
    'ton code
    end sub
    
    Private Sub Worksheet_Activate() 
    
    'ton code
    end sub
    
    


    Soit tu écris comme ca :

    
    sub FindLastRow (lastrow)
    'ton code
    end sub
    
    
    Private Sub Worksheet_Activate() 
    Application.EnableEvents = False 
    Application.ScreenUpdating = False 
    Dim avarSplit() As String 
    Dim i As Integer 
    Dim j As Integer 
    
    Call FindLastRow (lastrow)
    
    'la suite de ton code
    
    end sub
    
    1. Merci pour cette réponse rapide. Alors j'ai essayé la première façon de faire et j'ai une nouvelle erreur "Erreur d'exécution 28" : Espace pile insuffisant.

      Je n'ai pas compris la deuxième manière de faire, la différence entre 'ton code et 'la suite de ton code.
      1. Mets le code de la macro find lastrow ici et je te fais tes modifs
      2. Alors c'est ce que j'ai posté dans le premier message. Excuse j'avais encore ça:

        Public LastRow As Long
        Public LastRowD As Long
        Public LastRowI As Long

        Public Sub FindLastRow()
        LastRow = Feuil1.Cells(Rows.Count, "E").End(xlUp).Row
        LastRowD = Feuil3.Cells(Rows.Count, "B").End(xlUp).Row
        LastRowI = Feuil3.Cells(Rows.Count, "K").End(xlUp).Row
        End Sub
    2. Bonjour,

      Alors je vois ou est ton problème :

      Ta macro :Private Sub Worksheet_Activate()

      ne doit travailler que sur la feuille qui est modifiée.

      Autrement dit, si c'est la feuille 1, toutes tes actions ne doivent être que la feuille 1. or, ta macro, find lastrow agis sur 3 feuilles donc ca ne peut pas coller.

      Faut que tu modifies findlastrow comme suit :

      Public LastRow As Long
      Public LastRowD As Long
      Public LastRowI As Long
      
      Public Sub FindLastRow()
      
      if activesheet.name = "Feuil1" then
          LastRow = Feuil1.Cells(Rows.Count, "E").End(xlUp).Row
      else
          LastRowD = Feuil3.Cells(Rows.Count, "B").End(xlUp).Row
          LastRowI = Feuil3.Cells(Rows.Count, "K").End(xlUp).Row
      end if
      End Sub
      
      1. Alors le code s'éxecute sans erreur, mais il ne se passe rien dans ma feuille.
      2. On va faire plus simple, envoies ton fichier.
        Mets le sur cjoint.com et mets le lien ici.