XL 2016 Indice n'appartient pas à la sélection : HELP !!!!

halecs93

XLDnaute Impliqué
Bonjour à toutes et à à tous,

Je m'arrache les cheveux et ne comprend pas pourquoi mon fichier Excel (réalisé avec l'aide précieuse des membres du forum) plante. Le code Vba associé à la feuille "planning" semble s’exécuter normalement, mais à partir de la cellule F119, plus rien ne va.

Help, help, help !

Private Sub Worksheet_Change(ByVal Target As Range)
Dim plan As Worksheet, auxil As Worksheet, coll As New Collection
Dim xrgValid As Range, n&, x, i&, k&
Dim cellsBtoN As Range
Dim cell As Range
Dim cellQ As Range

Application.ScreenUpdating = False
Set plan = Worksheets("PLANNING")
On Error Resume Next: Application.DisplayAlerts = False
Application.Worksheets("Auxilxxx").Delete
Application.DisplayAlerts = True: On Error GoTo 0
With Application.Worksheets.Add: .Name = "Auxilxxx": End With
Set auxil = Worksheets("Auxilxxx")

' Code existant pour la mise en forme conditionnelle
plan.Range("B3:N" & Rows.count).Font.Color = vbBlack
plan.Range("B3:N" & Rows.count).Font.Bold = False
Set xrgValid = plan.[B5].SpecialCells(xlCellTypeSameValidation)
ReDim t(1 To 3 * plan.UsedRange.Rows.count / 3, 1 To 6)
auxil.Cells.Delete
For Each x In xrgValid.Cells
If x.Value <> "" Then
If x.Offset(-1) <> "" Then
n = n + 1
t(n, 1) = x.Column
t(n, 2) = x.Value
t(n, 3) = TimeValue(Split(x.Offset(-1), "-")(0))
t(n, 4) = TimeValue(Split(x.Offset(-1), "-")(1))
t(n, 5) = x.Row
t(n, 6) = Format(t(n, 1), "0000") & String(50 - Len(t(n, 2)), " ") & t(n, 2) & Format(t(n, 3), "hhmm") & Format(t(n, 4), "hhmm")
End If
End If
Next x
auxil.[A1].Resize(n, 6) = t
auxil.[A1].Resize(n, 6).Sort key1:=auxil.[F1], order1:=xlAscending, MatchCase:=False, Header:=xlNo
t = auxil.[A1].Resize(n, 5).Value
On Error Resume Next: Application.DisplayAlerts = False
auxil.Delete
Application.DisplayAlerts = True: On Error GoTo 0
For i = 2 To UBound(t)
If t(i, 1) = t(i - 1, 1) And t(i, 2) = t(i - 1, 2) And t(i, 3) < t(i - 1, 4) Then
plan.Cells(t(i, 5), t(i, 1)).Font.Color = vbRed
plan.Cells(t(i, 5), t(i, 1)).Font.Bold = True
plan.Cells(t(i - 1, 5), t(i - 1, 1)).Font.Color = vbRed
plan.Cells(t(i - 1, 5), t(i - 1, 1)).Font.Bold = True
On Error Resume Next
coll.Add "", t(i, 5) & "/" & t(i, 1)
coll.Add "", t(i - 1, 5) & "/" & t(i - 1, 1)
On Error GoTo 0
End If
Next i

' Nouveau code pour la mise en forme conditionnelle basée sur la liste déroulante
Set cellsBtoN = plan.Range("B:N")
If Not Intersect(Target, cellsBtoN) Is Nothing Then
For Each cell In Intersect(Target, cellsBtoN)
Set cellQ = plan.Columns("Q:Q").Find(What:=cell.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Not cellQ Is Nothing Then
cell.Interior.Color = cellQ.Interior.Color
End If
Next cell
End If

Application.ScreenUpdating = True
End Sub

1705150771110.png


Excel m'indique une erreur à la ligne t(n, 1) = x.Column

Un grand merci
 

Pièces jointes

  • halecs93- chevauchement- v1(1).xlsm
    217.7 KB · Affichages: 6

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Halec,
Utilisez la balise </> pour le code, c'est beaucoup plus lisible. ( icone à droite de l'icone GIF )

Je n'ai pas tout compris, mais dans l'état le tableau xrgValid s'arrête à la ligne 119.
C'est dû à cette ligne :
VB:
Set xrgValid = plan.[B5].SpecialCells(xlCellTypeSameValidation)
Comme la dernière ligne où la colonne B est renseignée, alors il s'arrête à cette ligne.

Comme preuve, effacez "Alexandra B" en B119, et relancer la macro, il s'arrêtera à la ligne 116 sur Carine B.
Par contre je n'ai pas de solution car je ne comprends pas ce que vous voulez analyser.
Le "Set xrgValid" donne exactement ce que vous lui demandez. Si c'est faux alors il vous faut reprendre sa définition. :)

NB: Pour voir où s'arrête cette plage j'ai fait :
Code:
    For Each x In xrgValid.Cells
        Dim ad         ' ad donne l'adresse de la cellule analysée
        If x.Value <> "" Then
            ' Votre code'
        End If
        ad = x.Address ' Enregistre l'adresse de la cellule analysée
    Next x
Un point d'arrêt sur la ligne après le Next vous donnera la dernière cellule analysée, donc la ligne d'arrêt.
 

Oneida

XLDnaute Impliqué
Bonjour a vous deux

Le probleme vient du calcul de la dimension du tableau t

VB:
    '----------calcul nombre de cellules non vide de la plage------
    Dim Nbcb, Nbcv
    Nbcv = xrgValid.count                                                      'nombre de cellule Validation de la plage
    Nbcb = xrgValid.SpecialCells(xlCellTypeBlanks).count       'nombre de cellules Validation vide de la plage
    '-----------------------------------------------------------------
    ReDim t(1 To Nbcv - Nbcb, 1 To 6)
 

halecs93

XLDnaute Impliqué
Bonjour Halec,
Utilisez la balise </> pour le code, c'est beaucoup plus lisible. ( icone à droite de l'icone GIF )

Je n'ai pas tout compris, mais dans l'état le tableau xrgValid s'arrête à la ligne 119.
C'est dû à cette ligne :
VB:
Set xrgValid = plan.[B5].SpecialCells(xlCellTypeSameValidation)
Comme la dernière ligne où la colonne B est renseignée, alors il s'arrête à cette ligne.

Comme preuve, effacez "Alexandra B" en B119, et relancer la macro, il s'arrêtera à la ligne 116 sur Carine B.
Par contre je n'ai pas de solution car je ne comprends pas ce que vous voulez analyser.
Le "Set xrgValid" donne exactement ce que vous lui demandez. Si c'est faux alors il vous faut reprendre sa définition. :)

NB: Pour voir où s'arrête cette plage j'ai fait :
Code:
    For Each x In xrgValid.Cells
        Dim ad         ' ad donne l'adresse de la cellule analysée
        If x.Value <> "" Then
            ' Votre code'
        End If
        ad = x.Address ' Enregistre l'adresse de la cellule analysée
    Next x
Un point d'arrêt sur la ligne après le Next vous donnera la dernière cellule analysée, donc la ligne d'arrêt.
Bonjour et merci.

Justement, je souhaiterai que le tableau le tableau xrgValid ne s'arrête pas à la ligne 119. Mai sje ne m'en sors pas :( :( :( Argh
 

halecs93

XLDnaute Impliqué
Bonjour a vous deux

Le probleme vient du calcul de la dimension du tableau t

VB:
    '----------calcul nombre de cellules non vide de la plage------
    Dim Nbcb, Nbcv
    Nbcv = xrgValid.count                                                      'nombre de cellule Validation de la plage
    Nbcb = xrgValid.SpecialCells(xlCellTypeBlanks).count       'nombre de cellules Validation vide de la plage
    '-----------------------------------------------------------------
    ReDim t(1 To Nbcv - Nbcb, 1 To 6)
Bonjour et merci. J'avoue que là, je ne saisi plus trop.... ;)
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Justement, je souhaiterai que le tableau le tableau xrgValid ne s'arrête pas à la ligne 119.
Où doit il s'arrêter ?
Si c'est sur la dernière ligne et que vous voulez analyser le tableau de B à N alors testez :
VB:
    Dim DL% ' Dernière ligne de la colonne A'
    DL = plan.Cells(Cells.Rows.count, "A").End(xlUp).Row
    Set xrgValid = plan.Range("B5:N" & DL)
 

Oneida

XLDnaute Impliqué
Re,

halecs93

Dans votre calcul d'origine, t a toujours cette dimension: t(146,6), ca ne change jamais
Vous definissez une plage de cellule avec Validation: xrgValid
Je pars du nombre de cellule avec validation et du nombre de ces cellules vides de cette plage
Donc: t(1 to nombre de cellule avec validation - nombre de ces cellules vides,1,6)
 

halecs93

XLDnaute Impliqué
Re,

halecs93

Dans votre calcul d'origine, t a toujours cette dimension: t(146,6), ca ne change jamais
Vous definissez une plage de cellule avec Validation: xrgValid
Je pars du nombre de cellule avec validation et du nombre de ces cellules vides de cette plage
Donc: t(1 to nombre de cellule avec validation - nombre de ces cellules vides,1,6
Bonjour et merci.

Est-ce dû au fait que j'ai ajouté des lignes sur l'onglet PLANNING après la création originale du classeur ?
 

halecs93

XLDnaute Impliqué
Re,

Où doit il s'arrêter ?
Si c'est sur la dernière ligne et que vous voulez analyser le tableau de B à N alors testez :
VB:
    Dim DL% ' Dernière ligne de la colonne A'
    DL = plan.Cells(Cells.Rows.count, "A").End(xlUp).Row
    Set xrgValid = plan.Range("B5:N" & DL)
J'ai testé, mais je rencontre toujours la même erreur... à moins de n'avoir pas bien saisi à quel endroit ajouter votre proposition.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
L'idée était de remplacer :
VB:
Set xrgValid = plan.[B5].SpecialCells(xlCellTypeSameValidation)
par :
Code:
Dim DL% ' Dernière ligne de la colonne A'
DL = plan.Cells(Cells.Rows.count, "A").End(xlUp).Row
Set xrgValid = plan.Range("B5:N" & DL)
Comme l'array "t" va bien jusqu'à 146, ça devrait marcher. Sauf évidemment si je n'ai rien compris. :)
 

halecs93

XLDnaute Impliqué
Re,
L'idée était de remplacer :
VB:
Set xrgValid = plan.[B5].SpecialCells(xlCellTypeSameValidation)
par :
Code:
Dim DL% ' Dernière ligne de la colonne A'
DL = plan.Cells(Cells.Rows.count, "A").End(xlUp).Row
Set xrgValid = plan.Range("B5:N" & DL)
Comme l'array "t" va bien jusqu'à 146, ça devrait marcher. Sauf évidemment si je n'ai rien compris. :)
Me v'là avec une incompatibilité de type

1705165943682.png



à la ligne : t(n, 3) = TimeValue(Split(x.Offset(-1), "-")(0))


Argh !!!
 

Pièces jointes

  • halecs93- chevauchement- v1(1) (correction sylvanu).xlsm
    219 KB · Affichages: 1

Discussions similaires

Statistiques des forums

Discussions
312 860
Messages
2 092 956
Membres
105 570
dernier inscrit
aitj