VBA - Impossible d'exécuter deux codes similaires (Err Exec. 9) [RESOLU]

dodoritfort

XLDnaute Nouveau
Bonjour à toute la communauté !


Objectif

Voici ce que matérialise les données de l'onglet "Extrait-SAP" :

Chaque ligne matérialise une barre en fer identifiées par :
- Un numéro de châssis
- Un type de barre
- Une longueur

Véhicule :
-- Pièce : G (barre principale gauche)
------ Pièce L (barre secondaire gauche)
-- Pièce : D (barre principale droite)
------ Pièce R (barre secondaire droite)

Donc un véhicule peut comporter soit 1G + 1D soit 1G + 1D + 1L + 1R.

Les barres G et D ont toujours la même taille.

La taille des barres L et R est toujours inférieur à celles auxquelles elles sont rattachés, soit respectivement la longueur des barres G et D.

Mon Objectif est de :
- Si les barres G et D sont inférieur ou égale à 6800 --> Noter les lignes (GD ou GDLR) dans l'onglet "Inf"
- Si les barres G et D sont supérieur à 6800 --> Noter les lignes (GD ou GDLR) dans l'onglet "Sup"


Ou j'en suis

J'ai réussi à faire ce que je voulais pour ce qui concerne les longueurs inférieurs ou égales à 6800.


Problème

En utilisant le même code, mais en remplaçant quelques données... Je n'arrive pas traiter les longueurs de plus de 6800 !

J'obtiens une "Erreur d'execution 9 : L'indice n'appartient pas à la sélection" pointant sur la ligne

Code:
ElseIf tTab(lined, 10) = "L" And tTab(lined, 3) = tTab(lined - 1, 3) And tTab(lined - 1, 15) > 6800 Then

Je vois qu'il n'aime pas le test suivant

Code:
tTab(lined, 3) = tTab(lined - 1, 3)

Je me doute que le "lined - 1" bloque... En revanche je ne comprends pas du tout pourquoi il bloque ici puisque dans la première partie je n'ai aucuns messages d'erreurs.



Pouvez-vous m'éclairer s'il vous plait ? :eek:
 

Pièces jointes

  • ExFichier_Dodoritfort.xlsm
    32 KB · Affichages: 53
Dernière édition:
G

Guest

Guest
Re : VBA - Impossible d'exécuter deux codes similaires (Err Exec. 9)

Bonjour,

Si j'ai bien compris, il faut parcourir le tableau soit de 2 lignes si DG seulement et 4 lignes si DGLR puis de comparer la longueur pour déterminer la feuille de destination..

Dans le code ci-dessous, toute la ligne est copiée. Il faut une valeur en A1 de Sup et Inf. Ce n'est qu'un exemple de parcours.

Code:
 Sub Dispatcher()
    Dim i As Long    ' Compteur : Nombre de lignes du tableau (les lignes excel sont de type Long)
    Dim sh As Worksheet
   
    ' Placer les données de l'Extrait-SAP dans un tableau
    With Sheets("Extrait-SAP")
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            'Si la 3ème ligne après la ligne en cours = "L" en colonne 10 j=4 sinon 2
            j = Array(2, 4)(Abs(.Cells(i + 2, 12) = "L"))
            'Si la Qi >6800 alors la feuille sera la feuille Sup sinon Inf
            If .Cells(i, 17) > 6800 Then Set sh = Sheets("Sup") Else Set sh = Sheets("Inf")
            'Transfert des données adapter suivant besoin
            sh.Cells(Rows.Count, 1).End(xlUp)(2).Resize(j, 19).Value = .Cells(i, 1).Resize(j, 19).Value
            i = i + j - 1
        Next
    End With
End Sub

[Edit] Petite correction dans le calcul de J apportée à 13:36.

A+
 
Dernière modification par un modérateur:

dodoritfort

XLDnaute Nouveau
Re : VBA - Impossible d'exécuter deux codes similaires (Err Exec. 9)

Merci beaucoup pour le temps passé à comprendre mon problème Hasco !

Effectivement ton code fonctionne à merveille, et ce en peu de ligne. Cela me montre combien j'ai encore à apprendre pour me faciliter la tâche ! :)

Je ne comprends pas encore tous le code mais je l'analyse afin de tout maîtriser.



Pour transférer des données, en exemple, tu utilises :

Code:
' Transfert des données adapter suivant besoin
sh.Cells(Rows.Count, 1).End(xlUp)(2).Resize(j, 19).Value = .Cells(i, 1).Resize(j, 19).Value

J'arrive à comprendre le code même si je ne le maîtrise pas encore :
- Dans l'onglet "sh", depuis la ligne 2 et la colonne 1
- Depuis la cellule (i,1) nous collons notre lot de ligne (2 ou 4, les 19 colonnes)


Mais comment gérer l'ajout des données dans les deux onglets de manière indépendantes ?

J'entends par là ne pas traiter toutes les données par bloc mais individuellement. Car J n'a pour valeur que 2 ou 4 pour former le bloc GD ou GDLR.

Je suis un peu dépassé à vrai dire... :eek:
 
G

Guest

Guest
Re : VBA - Impossible d'exécuter deux codes similaires (Err Exec. 9)

Bonjour,
Car J n'a pour valeur que 2 ou 4 pour former le bloc GD ou GDLR.
pour le coup c'est moi qui ne comprend pas.

Dans ton tableau tu as bien, soit un bloc de deux lignes GD (ex. cellules "L2:L3") ou 4 lignes GDLR (ex. cellules L4:L7 ou L14:L17).

Les longueurs à comparer sont celles des lignes G, à savoir la longueur de la première ligne de chaque bloc? Me trompe-je?

Pourquoi veux-tu les traiter individuellement? L'exemple joint n'en montre pas la necessité.

A+
 
Dernière modification par un modérateur:

dodoritfort

XLDnaute Nouveau
Re : VBA - Impossible d'exécuter deux codes similaires (Err Exec. 9)

Tu as bien compris Hasco !


La raison pour laquelle je veux les traiter individuellement :
- Sur les 18 colonnes du tableau de l'Extrait-SAP, 11 m'intéressent (les autres me servent à diagnostiquer si problème il y a par la suite).
- L'une des colonnes se répète deux fois (Lot & Code Bar) ou Code Bar s'écrit : *Lot*
- Les colonnes de bases peuvent ne pas être dans le même ordre que le tableau final.
- Et 4 colonnes seront mise à jour à l'aide d'une formule.

Voilà pourquoi il me serait très intéressant de gérer l'écriture individuellement.


Bon après je peux adapter le façon de faire pour pouvoir le traiter par lot de 2 ou 4. Mais de voir le code que j'ai fait pour arriver à ce quelque chose, et le code que tu m'a montré beaucoup plus court et très performant...

Je me demandais si il existait un moyen simple d'écrire les informations individuellement après les avoir traité par ligne.


Comprends-tu ce que je veux dire ?


Je te remercie encore pour le temps passer à m'aider !
 
G

Guest

Guest
Re : VBA - Impossible d'exécuter deux codes similaires (Err Exec. 9)

bonjour,

voici un modèle de ce que tu peux faire, sachant que .Cells(i, 1).Resize(j, 19) de la feuille Extrait-SAP nous donne la source des informations et que Sh (ci-dessous devenue shDestination) nous donne la feuille destination des informations.

J'ai mis la répartition sur la feuille destination dans une macro à part pour plus de clarté. Deplus cela permet de séparer les blocs de codes et de mieux localiser les sources d'erreur. Mais tu peux tout à fait le faire à l'intérieur de la macro Dispatcher.

Bien sûr j'ai choisi des colonnes aléatoirement, à toi d'adapter.
Code:
Sub Dispatcher()
    Dim i As Long    ' Compteur : Nombre de lignes du tableau (les lignes excel sont de type Long)
    Dim shDestination As Worksheet
    Dim Source As Range
   
    ' Placer les données de l'Extrait-SAP dans un tableau
    With Sheets("Extrait-SAP")
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            'Si la 3ème ligne après la ligne en cours = "L" en colonne 10 j=4 sinon 2
            j = Array(2, 4)(Abs(.Cells(i + 2, 12) = "L"))
            'Si la Qi >68000 alors la feuille sera la feuille Sup sinon Inf
            If .Cells(i, 17) > 6800 Then Set shDestination = Sheets("Sup") Else Set shDestination = Sheets("Inf")
            Set Source = .Cells(i, 1).Resize(j, 19)
            Répartir Source, shDestination
            i = i + j - 1
        Next
    End With
End Sub

Private Sub Répartir(rngSource As Range, shDestination As Worksheet)
    Dim numLigne As Long
    Dim r As Range
    For Each r In rngSource.Rows 'Parcours des lignes source
            With shDestination
    numLigne = shDestination.Cells(Rows.Count, 1).End(xlUp)(2).Row
                    .Cells(numLigne, 1) = r.Cells(1, 5)
                .Cells(numLigne, 2) = r.Cells(1, 15)
                .Cells(numLigne, 3) = r.Cells(1, 17)
                .Cells(numLigne, 4) = r.Cells(1, 8)
            End With
    Next
End Sub

A+
 
Dernière modification par un modérateur:

dodoritfort

XLDnaute Nouveau
Re : VBA - Impossible d'exécuter deux codes similaires (Err Exec. 9)

Je suis en train de regarder à cela. J'analyse un peu la façon de faire pour bien comprendre le mécanisme.

Cela fonctionne parfaitement maintenant ! :)

Merci beaucoup pour cette aide très précieuse. Cela m'a aussi permis d'améliorer ma connaissance d'Excel et de VBA.
 

dodoritfort

XLDnaute Nouveau
Re : VBA - Impossible d'exécuter deux codes similaires (Err Exec. 9) [RESOLU]

Je souhaiterai en parallèle isoler les "L" et "R" pour les placer sur une feuille bien à part...

J'ai essayé d'adapté le code à cela... Cependant je n'arrive pas à isoler les L et R, mais tous (GDLR) s'affiche. Pourriez-vous m'expliquer pourquoi ? Ou est mon erreur ?

Code:
Private Sub Dispatcher()

    Dim i As Long    ' Compteur : Nombre de lignes du tableau (les lignes excel sont de type Long)
    Dim shDestination As Worksheet
    Dim Source As Range
    Dim Source2 As Range
   
    ' Placer les données de l'Extrait-SAP dans un tableau
    With Sheets("Extrait-SAP")
    
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
        
            'Si la 3ème ligne après la ligne en cours = "L" en colonne 10 j=4 sinon 2
            j = Array(2, 4)(Abs(.Cells(i + 2, 12) = "L"))
            
            ' Si la Qi >6800 alors la feuille sera la feuille Sup sinon Inf
            If .Cells(i, 17) > 6800 Then
                Set shDestination = Sheets("Sup")
            Else
                Set shDestination = Sheets("Inf")
            End If
            
            Set Source = .Cells(i, 1).Resize(j, 18)
            Répartir Source, shDestination
            
            ' Renforts
            
           If .Cells(i, 12) = "L" Then
            
                k = Array(0, 2)(Abs(.Cells(i + 1, 12) = "R"))
                
            End If
            
            Set Source2 = .Cells(i, 1).Resize(j, 18)
            Répartir Source2, Sheets("Renf")
            
            i = i + j - 1
            
        Next i
        
    End With

End Sub
 
G

Guest

Guest
Re : VBA - Impossible d'exécuter deux codes similaires (Err Exec. 9) [RESOLU]

Bonjour,

Une indication:

Lorsque j = 4 cela veut dire qu'on a une séquence de lignes GDLR donc Source aura ces 4 lignes. les lignes LR seront les 2 dernières. LignesLR= Source.Rows("3:4")

Sinon avec une macro d'extraction spécial au moyen des filtres avancés:
Lance la macro ExtraireLR, elle créera une feuille "LR" (fonction Getworksheet) et y mettra les lignes "LR"
Code:
Sub ExtraireLR()
    Dim shDestination As Worksheet
    Set shDestination = GetWorkSheet(SheetName:="LR")
    With shDestination
        .Rows.Delete
        .Range("A1:A3") = Application.Transpose(Array("Page", "L", "R"))
    
        Sheets("Extrait-SAP").Range("A1:R27").AdvancedFilter _
                Action:=xlFilterCopy, _
                CriteriaRange:=.Range("A1:A3"), _
                CopyToRange:=.Range("A5"), _
                Unique:=False
                
        'supprimer la plage de critères
        .Rows("1:4").EntireRow.Delete
    End With
End Sub
Function GetWorkSheet(SheetName As String, Optional Wkb As Workbook = Nothing, Optional CreateIfNotExists As Boolean = True) As Worksheet
'-----------------------------------------------------------------------------------------------------------
' Author    : hasco 10/05/2002
' Objet     : Renvoyer une feuille en la créant si nécessaire
' SheetName : Obligatoire, Nom de la feuille à chercher et/ou créer
' Wkb       : Facultatif, Classeur dans lequel effectuer la recherche et/ou création
'                         si non renseigné, le classeur sera le classeur Actif
'CreateIfNotExists : optionel booleen indique s'il faut créer ou non la feuille (oui par défaut)
'-----------------------------------------------------------------------------------------------------------
'
   If Wkb Is Nothing Then Set Wkb = ActiveWorkbook
    On Error Resume Next
    Set GetWorkSheet = Wkb.Sheets(SheetName)
    If GetWorkSheet Is Nothing And CreateIfNotExists Then
        Set GetWorkSheet = Wkb.Sheets.Add
        GetWorkSheet.Name = SheetName
    End If
End Function

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 110
Membres
103 121
dernier inscrit
SophieS