Microsoft 365 Problème code VBA qui ne fonctionne pas

Cherrylie

XLDnaute Junior
Bonjour à tous,

J'ai un problème avec le code VBA de mon fichier : j'ai un message d'erreur qui s'affiche me disant qu'il n'y a pas de cellules correspondantes.

Je suis totalement débutante en VBA (ce code a été fait par job75) mais je cherche à progresser donc je vous serai extrêmement reconnaissante de bien vouloir m'aider.

Merci d'avance et bon week-end à tous !

Cherrylie
 

Pièces jointes

  • Plan d'actions DU.xlsm
    36.7 KB · Affichages: 6
Solution
Bon, finalement j'ai fait les 2 solutions d'affichage sur option.
Et j'ai mis l'Unité en 1er. Mais tu peux déplacer la colonne où tu veux (avantages des tableaux structurés).

Edit: Fichier supprimé. Voir ci-dessous.

Dudu2

XLDnaute Barbatruc
Bonjour,
VB:
For Each c In .Range("F16:U" & .Rows.Count).SpecialCells(xlCellTypeConstants, 1)
Il n'y a aucune cellule qui contient une valeur (et encore moins de valeur numérique demandée par l'argument ",1") dans le Range F16:U1048576 et donc le .SpecialCells(xlCellTypeConstants plante.
 

Dudu2

XLDnaute Barbatruc
Je ne sais pas trop ce que tu veux faire mais pour protéger cette séquence il faudrait écrire:
Code:
    Dim Rng As Range
    On Error Resume Next
    Set Rng = .Range("F16:U" & .Rows.Count).SpecialCells(xlCellTypeConstants, 1)
    On Error GoTo 0
    
    If Not Rng Is Nothing Then
        For Each c In Rng
            i = c.Row: j = c.Column
            x = .Cells(i, 3) & .Cells(i, 2) & .Cells(9, j) & c
            If d.exists(x) Then
                d.Remove x 'retire de la liste
            ElseIf c > limite Then
                resu(n, 0) = .Cells(i, 3): resu(n, 1) = .Cells(i, 2)
                resu(n, 2) = .Cells(9, j): resu(n, 3) = c
                n = n + 1
            End If
        Next c
    End If
 

Cherrylie

XLDnaute Junior
Bonjour,
VB:
For Each c In .Range("F16:U" & .Rows.Count).SpecialCells(xlCellTypeConstants, 1)
Il n'y a aucune cellule qui contient une valeur (et encore moins de valeur numérique demandée par l'argument ",1") dans le Range F16:U1048576 et donc le .SpecialCells(xlCellTypeConstants plante.
Bonjour Dudu2,

Tout d'abord, merci pour ta réponse !

Si je comprends bien, le code plante parce que ce sont des formules qui sont sur cette plage de données et non des valeurs numériques, c'est bien ça ?

Merci encore !
 

Dudu2

XLDnaute Barbatruc
Et pour terminer, je te signale que ton fichier possède une liaison avec un autre fichier.
1653725200251.png

Si ce n'est pas volontaire, il vaudrait mieux supprimer cette liaison (Onglet Données / Modifier les liaisons)
 

Dudu2

XLDnaute Barbatruc
Si je comprends bien, le code plante parce que ce sont des formules qui sont sur cette plage de données et non des valeurs numériques, c'est bien ça ?
En effet. Qu'il n'y ait rien ou des formules, SpecialCells(xlCellTypeConstants, 1) recherche des constantes (des valeurs non issues de formules) et numériques qui plus est avec ce ",1".

Que veux-tu faire au juste dans cette boucle ?
 

Cherrylie

XLDnaute Junior
Et pour terminer, je te signale que ton fichier possède une liaison avec un autre fichier.
Regarde la pièce jointe 1140685
Si ce n'est pas volontaire, il vaudrait mieux supprimer cette liaison (Onglet Données / Modifier les liaisons)
Oui, c'est volontaire, étant donné que je travaille sur un fichier confidentiel, j'ai dû faire une extraction de ces deux onglets pour poster sur ce forum.
Pour répondre à ton message en #3, j'essaye de faire un plan d'actions automatique pour tout les risques supérieurs à la cellule D6. Je viens d'essayer ton code et il fonctionne, merci beaucoup. Le seul hic, c'est qu'il ne rajoute pas les lignes dans le tableau comme j'aimerai qu'il fasse. Je vais essayer de modifier le code vba pour que ça fonctionne. Si je fais un mélange de ton code et de l'ancien, ça pourrait fonctionner ?

Merci pour ton aide précieuse.
 

Dudu2

XLDnaute Barbatruc
Si c'est le cas, et ça semble l'être au vu du résultat qui s'affiche, la séquence serait:
VB:
        Dim RngConstants As Range
        Dim RngFormulas As Range
        Dim Rng As Range
     
        On Error Resume Next
        Set RngConstants = .Range("F16:U" & .Rows.Count).SpecialCells(xlCellTypeConstants, 1)
        Set RngFormulas = .Range("F16:U" & .Rows.Count).SpecialCells(xlCellTypeFormulas, 1)
        On Error GoTo 0
     
        Select Case True
            Case RngConstants Is Nothing And RngFormulas Is Nothing
                Set Rng = Nothing
             
            Case RngConstants Is Nothing
                Set Rng = RngFormulas
         
            Case RngFormulas Is Nothing
                Set Rng = RngConstants
         
            Case Else
                Set Rng = Union(RngConstants, RngFormulas)
        End Select
     
        If Not Rng Is Nothing Then
            For Each c In Rng.Cells
                i = c.Row: j = c.Column
                x = .Cells(i, 3) & .Cells(i, 2) & .Cells(9, j) & c
                If d.exists(x) Then
                    d.Remove x 'retire de la liste
                ElseIf c > limite Then
                    resu(n, 0) = .Cells(i, 3): resu(n, 1) = .Cells(i, 2)
                    resu(n, 2) = .Cells(9, j): resu(n, 3) = c
                    n = n + 1
                End If
            Next c
        End If

1653727972286.png
 

Cherrylie

XLDnaute Junior
Si c'est le cas, et ça semble l'être au vu du résultat qui s'affiche, la séquence serait:
VB:
        Dim RngConstants As Range
        Dim RngFormulas As Range
        Dim Rng As Range
    
        On Error Resume Next
        Set RngConstants = .Range("F16:U" & .Rows.Count).SpecialCells(xlCellTypeConstants, 1)
        Set RngFormulas = .Range("F16:U" & .Rows.Count).SpecialCells(xlCellTypeFormulas, 1)
        On Error GoTo 0
    
        Select Case True
            Case RngConstants Is Nothing And RngFormulas Is Nothing
                Set Rng = Nothing
            
            Case RngConstants Is Nothing
                Set Rng = RngFormulas
        
            Case RngFormulas Is Nothing
                Set Rng = RngConstants
        
            Case Else
                Set Rng = Union(RngConstants, RngFormulas)
        End Select
    
        If Not Rng Is Nothing Then
            For Each c In Rng.Cells
                i = c.Row: j = c.Column
                x = .Cells(i, 3) & .Cells(i, 2) & .Cells(9, j) & c
                If d.exists(x) Then
                    d.Remove x 'retire de la liste
                ElseIf c > limite Then
                    resu(n, 0) = .Cells(i, 3): resu(n, 1) = .Cells(i, 2)
                    resu(n, 2) = .Cells(9, j): resu(n, 3) = c
                    n = n + 1
                End If
            Next c
        End If

Regarde la pièce jointe 1140688
 

Cherrylie

XLDnaute Junior
Par contre je ne comprends pas trop ton tableau qui semble s'incrémenter sans jamais repartir à zéro.
Il semble manquer des initialisations et un effacement. Mais bon, peut-être que c'est voulu.
Merci pour ton aide ! Dans le fichier initial, il s'incrémente selon les informations rentrées dans les autres onglets. Si rien n'est saisi ou si je supprime les données, le tableau sera vide. Je pense qu'il y a plus simple comme méthode mais pour le moment, c'est la seule solution que j'ai trouvée...

Ton nouveau code fonctionne parfaitement !

Merci infiniment, comment as-tu fait pour être aussi calé en vba ? J'aimerai beaucoup progresser mais ce n'est pas facile.

Bon week-end !
 

Discussions similaires

Réponses
9
Affichages
150

Statistiques des forums

Discussions
312 103
Messages
2 085 313
Membres
102 860
dernier inscrit
fredo67