Problème Select en VBA

Compress

XLDnaute Occasionnel
Bonjour messieurs, j'ai un problème, j'ai une erreur 1004 sur une sélection multiple dans une de mes macros, je vous transmets :

Mon onglet s'appelle bien Analyse, j'avais procédé à un enregistreur de macro pour être sur de ma sélection et je ne comprend pas pourquoi il me génère directement une erreur.

Code:
Option Explicit
Option Base 0

Sub Secteur()

    'Variable pour la distribution
    Dim a 'les différents voyages distri qui vont être testés
    'Dim Stock(10) 'tableau stockant les voy non référencés
    Dim Plage_Distri As Range 'plage stockant les données des secteurs distri
    Dim Plage_Voy_Distri As Range 'plage contenant la liste des voy analysés
    Dim Plage_Recherche As Range 'case résultat en cas de correspondance entre 2 voy.
    Dim i As Integer 'compteur de voy non référencés

    'Variable pour l'expédition
    Dim b 'les différents voyages expé qui vont être testés
    Dim j 'le compteur du nombre de voyages expé non référencés
    Dim Plage_Expe As Range 'plage stockant la liste des voy a dispatcher
    Dim Plage_Voy_Expe As Range 'plage contenant la liste des voy analysés
    Dim Plage_Recherche_Ex As Range 'case résultat en cas de correspondance entre 2 voy.
    
    i = 0
    
    With ActiveWorkbook.Sheets("Analyse")
    
        [b].Range("C10:C28,G10:G28,K10:K28,O10:O28,S10:S28,W10:W28,AA10:AA28,AE10:AE28,C36:C51,G36:G51,K36:K51,O36:O51,S36:S51,W36:W51,AA36:AA51,AE36:AE51").Select[/b]
        'Nettoyage de toutes les cellules
        Selection.ClearContents
        
    End With
 
Dernière édition:

kjin

XLDnaute Barbatruc
Re : Problème Select en VBA

bonjour,
Encore une fois, en VBA il est rarement utile de selectionner un objet
Donc dans le cas présent, il faut sélectionner la feuille avant de sélectionner les cellules
Code:
With Sheets("Analyse")
    .Activate
    .Range("C10:C28,G10:G28,K10:K28,O10:O28,S10:S28,W10:W28,AA10:AA28,AE10:AE28,C36:C51,G36:G51,K36:K51,O36:O51,S36:S51,W36:W51,AA36:AA51,AE36:AE51").Select
    Selection.ClearContents
End With
Et donc sans sélection
Code:
With Sheets("Analyse")
    .Range("C10:C28,G10:G28,K10:K28,O10:O28,S10:S28,W10:W28,AA10:AA28,AE10:AE28,C36:C51,G36:G51,K36:K51,O36:O51,S36:S51,W36:W51,AA36:AA51,AE36:AE51").ClearContents
End With
A+
kjin
 
G

Guest

Guest
Re : Problème Select en VBA

Bonjour,

tu peux déjà écrire ta ligne comme ceci (sans select):


Code:
.Range("C10:C28,G10:G28,K10:K28,O10:O28,S10:S28,W10:W28,AA10:AA28,AE10:AE28,C36:C51,G36:G51,K36:K51,O36:O51,S36:S51,W36:W51,AA36:AA51,AE36:AE51").ClearContents
Une cellule ne peut pas être sélectionnée si sa feuille n'est pas tout d'abord activée
A+
 

Compress

XLDnaute Occasionnel
Re : Problème Select en VBA

Merci pour toute vos réponses, j'ai beau tout essayé, je ne comprends toujours la même erreur.
La feuille n'est pourtant pas protégée, les cellules non plus...

Je vous transmets la macro complète ainsi que l'onglet Analyse.

Code:
Option Explicit
Option Base 0

Sub Secteur()

    'Variable pour la distribution
    Dim a 'les différents voyages distri qui vont être testés
    'Dim Stock(10) 'tableau stockant les voy non référencés
    Dim Plage_Distri As Range 'plage stockant les données des secteurs distri
    Dim Plage_Voy_Distri As Range 'plage contenant la liste des voy analysés
    Dim Plage_Recherche As Range 'case résultat en cas de correspondance entre 2 voy.
    Dim i As Integer 'compteur de voy non référencés

    'Variable pour l'expédition
    Dim b 'les différents voyages expé qui vont être testés
    Dim j 'le compteur du nombre de voyages expé non référencés
    Dim Plage_Expe As Range 'plage stockant la liste des voy a dispatcher
    Dim Plage_Voy_Expe As Range 'plage contenant la liste des voy analysés
    Dim Plage_Recherche_Ex As Range 'case résultat en cas de correspondance entre 2 voy.
    
    i = 0
    
    With ActiveWorkbook.Sheets("Analyse")
        .Range("C10:C28,G10:G28,K10:K28,O10:O28,S10:S28,W10:W28,AA10:AA28,AE10:AE28,C36:C51,G36:G51,K36:K51,O36:O51,S36:S51,W36:W51,AA36:AA51,AE36:AE51").ClearContents
    End With
        
    'Traitement de la distribution
    With Sheets("Distribution")
    
        'Définition de la plage contenant le nom des voyages
        Set Plage_Voy_Distri = .Range("B9:B100")
    
    End With
    
    'On se place dans l'onglet Analyse
    With Sheets("Analyse")
        
        'plage d'import des tonnages distribution
        Set Plage_Distri = .Range("A10:AE51")
        
    End With
    
    'pour chaque voyage non nul dans la table des codes voyages
    For Each a In Plage_Voy_Distri
        'Si la cellule à gauche "-1" est non nulle alors
        If a.Value <> 0 Then
            'rechercher dans la plage de distri un voyage correspondant à a.Value
            Set Plage_Recherche = Plage_Distri.Find(What:=a.Value, LookIn:=xlValues, lookat:=xlPart)
            'si aucun voyage trouvé on incrément le compteur distri
            If Plage_Recherche Is Nothing Then
                'Stock(i) = "a.Value" 'stockage du voyage distri non référencé
                i = i + 1 'incrémentation de la variable
            Else
                'sinon on se place 2 cases après le voyage la valeur du tonnage
                Plage_Recherche.Offset(0, 2).Value = Plage_Recherche.Offset(0, 2).Value + a.Offset(0, 1).Value
            End If
        End If
    Next
    
    'on affiche un message contenant le nombre de voyages non trouvés
    MsgBox i & " Voyages de distribution non pas réussis à être placé dans un secteur de distribution, veuillez les paramétrer", vbInformation
    
    'Traitement de l'expédition
    With Sheets("Expédition")
    
        Set Plage_Voy_Expe = .Range("B9:B100")
    
    End With
    
    With Sheets("Analyse")
        
        Set Plage_Expe = .Range("A10:AE51")
        
    End With
    
    For Each b In Plage_Voy_Expe
        If b.Value <> 0 Then
            Set Plage_Recherche_Ex = Plage_Expe.Find(What:=b.Value, LookIn:=xlValues, lookat:=xlPart)
        
            If Plage_Recherche_Ex Is Nothing Then
                'Stock(i) = b.Value 'stockage du voyage non référencé
                j = j + 1 'incrémentation de la variable
            Else
               Plage_Recherche_Ex.Offset(0, 2).Value = Plage_Recherche_Ex.Offset(0, 2).Value + b.Offset(0, 1).Value
            End If
        End If
    Next
    
    MsgBox j & " Voyages d'expédition non pas réussis à être placé dans un secteur d'expédition, veuillez les paramétrer", vbInformation
    
    'For j = 0 To UBound(Stock)
        'MsgBox Stock(j) & " Voyage non référencé dans l'onglet analyse, veuillez le rajouter dans la bonne section", vbInformation
    'Next j
    
End Sub

Sub Compiler()

    'ouverture du fichier de synthèse par secteur
    Workbooks.Open "W:\TFE Lorraine\CGO\SUIVI TONNAGE 2010\Analyse_Secteur.xls"
       
    Dim c As Integer
    'permet de récupérer la dernière ligne vide
    c = Workbooks("Analyse_Secteur.xls").Sheets("Synthèse").Range("A65536").End(xlUp).Row + 1
    
    'pour travailler dans le bon onglet
    With Workbooks("Analyse_Secteur.xls").Sheets("Synthèse")
    
        'copie de la date
        .Cells(c, 1).Value = Workbooks("Tonnages 2J").Sheets("Distribution").Range("C3").Value
        'secteur Nancy
        .Cells(c, 2).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("C19").Value
        'secteur Lunéville
        .Cells(c, 3).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("G19").Value
        'secteur Troyes
        .Cells(c, 4).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("K19").Value
        'secteur Saint Dizier
        .Cells(c, 5).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("O19").Value
        'secteur BLD
        .Cells(c, 6).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("S19").Value
        'secteur Verdun
        .Cells(c, 7).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("W19").Value
        'secteur Vitry
        .Cells(c, 8).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("AA19").Value
    
        'secteur Est
        .Cells(c, 10).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("C39").Value
        'secteur BPL
        .Cells(c, 11).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("G39").Value
        'secteur Normandie
        .Cells(c, 12).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("K39").Value
        'Secteur Sud Ouest
        .Cells(c, 13).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("O39").Value
        'Secteur Rhones Alpes / Sud Est
        .Cells(c, 14).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("S39").Value
        'Secteur Nord
        .Cells(c, 15).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("W39").Value
        'Secteur Région Parisienne
        .Cells(c, 16).Value = Workbooks("Tonnages 2J").Sheets("Analyse").Range("AA39").Value
    
    End With

    Workbooks("Analyse_Secteur.xls").Save
    Workbooks("Analyse_Secteur.xls").Close False


End Sub
 

Pièces jointes

  • Analyse.xls
    47.5 KB · Affichages: 45
  • Analyse.xls
    47.5 KB · Affichages: 44
  • Analyse.xls
    47.5 KB · Affichages: 47

Compress

XLDnaute Occasionnel
Re : Problème Select en VBA

Ben écoutez, j'ai fermé tous mes documents, ouvert mon fichier et cette fois ma macro fonctionne cependant dans celle-ci j'ai une autre question.

Lorsqu'un code voyage ne correspond pas à ceux déjà référencés, j'aimerai le stocker dans le tableau Stock().

Puis à la fin de la macro affiché la liste des voyages non référencés afin que l'utilisateur actualise sa liste...

Cependant j'ai commenté ma ligne où j'incrémente mon tableau car

Code:
Stock(i) = a.Value

ne fonctionne pas. a.Value renvoie un code voyage type LDB300
 
G

Guest

Guest
Re : Problème Select en VBA

Bonjour,

Visiblement tu n'as pas lu correctement ma réponse puisque tu n'a pas modifier ta ligne d'instruction .clearContents, sans select.


Code:
   'On se place dans l'onglet Analyse
    With Sheets("Analyse")
        'Sélection des plages à vider
        [B][COLOR=red].Range("C6:C18,G6:G18,K6:K18,O6:O18,S6:S18,W6:W18,AA6:AA18").ClearContents
[/COLOR][/B]        
        'plage d'import des tonnages distribution
        Set Plage_Distri = .Range("A6:AA14")
        
    End With

Mais comme nous n'avons que la moitié des données, impossible de tester.

@Soussou, clearContents efface et formules et constantes.

A+
 

Compress

XLDnaute Occasionnel
Re : Problème Select en VBA

Pourtant j'ai pas du envoyer la version corrigée mais j'ai bien pris ta méthode sans le select.

Voici le code :
Code:
Option Explicit
Option Base 0


Sub Secteur()

    'Variable pour la distribution
    Dim a 'les différents voyages distri qui vont être testés
    [b]Dim Stock()[/b] 'tableau stockant les voy non référencés
    Dim Plage_Distri As Range 'plage stockant les données des secteurs distri
    Dim Plage_Voy_Distri As Range 'plage contenant la liste des voy analysés
    Dim Plage_Recherche As Range 'case résultat en cas de correspondance entre 2 voy.
    Dim i As Integer 'compteur de voy non référencés

    Dim k As Integer
    Dim l As Integer

    'Variable pour l'expédition
    Dim b 'les différents voyages expé qui vont être testés
    Dim j 'le compteur du nombre de voyages expé non référencés
    Dim Plage_Expe As Range 'plage stockant la liste des voy a dispatcher
    Dim Plage_Voy_Expe As Range 'plage contenant la liste des voy analysés
    Dim Plage_Recherche_Ex As Range 'case résultat en cas de correspondance entre 2 voy.
    
    i = 0
    
    With Sheets("Analyse")
        .Range("C10:C28,G10:G28,K10:K28,O10:O28,S10:S28,W10:W28,AA10:AA28,AE10:AE28,C36:C51,G36:G51,K36:K51,O36:O51,S36:S51,W36:W51,AA36:AA51,AE36:AE51").ClearContents
    End With
        
    'Traitement de la distribution
    With Sheets("Distribution")
    
        'Définition de la plage contenant le nom des voyages
        Set Plage_Voy_Distri = .Range("B9:B100")
    
    End With
    
    'On se place dans l'onglet Analyse
    With Sheets("Analyse")
        
        'plage d'import des tonnages distribution
        Set Plage_Distri = .Range("A10:AE51")
        
    End With
    
    'pour chaque voyage non nul dans la table des codes voyages
    For Each a In Plage_Voy_Distri
        'Si la cellule à gauche "-1" est non nulle alors
        If a.Value <> 0 Then
            'rechercher dans la plage de distri un voyage correspondant à a.Value
            Set Plage_Recherche = Plage_Distri.Find(What:=a.Value, LookIn:=xlValues, lookat:=xlPart)
            'si aucun voyage trouvé on incrément le compteur distri
            If Plage_Recherche Is Nothing Then
                [b]Stock(k) = a.Value[/b] 'stockage du voyage distri non référencé
                i = i + 1 'incrémentation de la variable
                k = k +1
            Else
                'sinon on se place 2 cases après le voyage la valeur du tonnage
                Plage_Recherche.Offset(0, 2).Value = Plage_Recherche.Offset(0, 2).Value + a.Offset(0, 1).Value
            End If
        End If
    Next
    
    'on affiche un message contenant le nombre de voyages non trouvés
    MsgBox i & " Voyages de distribution non pas réussis à être placé dans un secteur de distribution, veuillez les paramétrer", vbInformation
    
    'Traitement de l'expédition
    With Sheets("Expédition")
    
        Set Plage_Voy_Expe = .Range("B9:B100")
    
    End With
    
    With Sheets("Analyse")
        
        Set Plage_Expe = .Range("A10:AE51")
        
    End With
    
    For Each b In Plage_Voy_Expe
        If b.Value <> 0 Then
            Set Plage_Recherche_Ex = Plage_Expe.Find(What:=b.Value, LookIn:=xlValues, lookat:=xlPart)
        
            If Plage_Recherche_Ex Is Nothing Then
                [b]Stock(k) = b.Value[/b] 'stockage du voyage non référencé
                j = j + 1 'incrémentation de la variable
                k = k +1
            Else
               Plage_Recherche_Ex.Offset(0, 2).Value = Plage_Recherche_Ex.Offset(0, 2).Value + b.Offset(0, 1).Value
            End If
        End If
    Next
    
    MsgBox j & " Voyages d'expédition non pas réussis à être placé dans un secteur d'expédition, veuillez les paramétrer", vbInformation
    
    [b]For l = 0 To UBound(Stock)
        MsgBox Stock(l) & " Voyage non référencé dans l'onglet analyse, veuillez le rajouter dans la bonne section", vbInformation
    Next l[/b]
    
End Sub
Les données a.Value et b.Value renvoie uniquement des codes voyages du type LDB300, LD*Q00, LMA800, etc....

Mais j'ai une erreur sur mon tableau Erreur d'éxecution 9
L'indice n'appartient pas à la sélection sur la ligne Stock(k) = a.Value, je pense que j'aurai la même pour Stock(k) = b.Value
Mon tableau Stock est pourtant sans dimension fixe et j'attaque pour k = 0, là je suis perdu.

Merci par avance pour votre aide.
 
Dernière édition:
G

Guest

Guest
Re : Problème Select en VBA

Re,

Le problème du clearcontents a disparu?

Sinon

tu défini Stock() comme tableau mais jamais tu le dimmensionnes, alors Stock(k) ne peut pas exister.

Exemple dimmensionnement variable de tableau
Code:
[COLOR=BLUE]Sub[/COLOR] Tableau()
    [COLOR=BLUE]Dim[/COLOR] stock()
    [COLOR=BLUE]Dim[/COLOR] incr [COLOR=BLUE]As[/COLOR] [COLOR=BLUE]Integer[/COLOR]
    incr = incr + 1
    [COLOR=BLUE]ReDim[/COLOR] [COLOR=BLUE]Preserve[/COLOR] stock(0 To incr)
    stock(incr) = [i]"rrr"[/i]
[COLOR=BLUE]End[/COLOR] [COLOR=BLUE]Sub[/COLOR]

Ton code n'a rien à faire dans un module de feuille. Mets le comme te la dis Jean-Marce:)l dans un module général.

A+
 

Compress

XLDnaute Occasionnel
Re : Problème Select en VBA

Merci HASCO c'est super j'avais un peu zappé cette étape. Effectivement j'ai bien mis mon code dans un module séparé.

Voici le code qui fonctionne correctement, par contre as-tu une idée pour afficher tous les élèments qui seraient stockés dans mon tableau dans une seule MSGBOX ?

Option Explicit
Option Base 0

Code:
Sub Secteur()

    'Variable pour la distribution
    Dim a 'les différents voyages distri qui vont être testés
    Dim Stock() 'tableau stockant les voy non référencés
    Dim Plage_Distri As Range 'plage stockant les données des secteurs distri
    Dim Plage_Voy_Distri As Range 'plage contenant la liste des voy analysés
    Dim Plage_Recherche As Range 'case résultat en cas de correspondance entre 2 voy.
    Dim i As Integer 'compteur de voy non référencés

    Dim k, l As Integer

    'Variable pour l'expédition
    Dim b 'les différents voyages expé qui vont être testés
    Dim j 'le compteur du nombre de voyages expé non référencés
    Dim Plage_Expe As Range 'plage stockant la liste des voy a dispatcher
    Dim Plage_Voy_Expe As Range 'plage contenant la liste des voy analysés
    Dim Plage_Recherche_Ex As Range 'case résultat en cas de correspondance entre 2 voy.
    
    i = 0
    j = 0
    k = 1
    
    With Sheets("Analyse")
        .Range("C10:C28,G10:G28,K10:K28,O10:O28,S10:S28,W10:W28,AA10:AA28,AE10:AE28,C36:C51,G36:G51,K36:K51,O36:O51,S36:S51,W36:W51,AA36:AA51,AE36:AE51").ClearContents
    End With
        
    'Traitement de la distribution
    With Sheets("Distribution")
    
        'Définition de la plage contenant le nom des voyages
        Set Plage_Voy_Distri = .Range("B9:B100")
    
    End With
    
    'On se place dans l'onglet Analyse
    With Sheets("Analyse")
        
        'plage d'import des tonnages distribution
        Set Plage_Distri = .Range("A10:AE51")
        
    End With
    
    'pour chaque voyage non nul dans la table des codes voyages
    For Each a In Plage_Voy_Distri
        'Si la cellule à gauche "-1" est non nulle alors
        If a.Value <> 0 Then
            'rechercher dans la plage de distri un voyage correspondant à a.Value
            Set Plage_Recherche = Plage_Distri.Find(What:=a.Value, LookIn:=xlValues, lookat:=xlPart)
            'si aucun voyage trouvé on incrément le compteur distri
            If Plage_Recherche Is Nothing Then
                ReDim Preserve Stock(0 To k)
                Stock(k) = a.Value 'stockage du voyage distri non référencé
                i = i + 1 'incrémentation de la variable
                k = k + 1
            Else
                'sinon on se place 2 cases après le voyage la valeur du tonnage
                Plage_Recherche.Offset(0, 2).Value = Plage_Recherche.Offset(0, 2).Value + a.Offset(0, 1).Value
            End If
        End If
    Next
    
    'on affiche un message contenant le nombre de voyages non trouvés
    MsgBox i & " Voyages de distribution non pas réussis à être placé dans un secteur de distribution, veuillez les paramétrer", vbInformation
    
    'Traitement de l'expédition
    With Sheets("Expédition")
    
        Set Plage_Voy_Expe = .Range("B9:B100")
    
    End With
    
    With Sheets("Analyse")
        
        Set Plage_Expe = .Range("A10:AE51")
        
    End With
    
    For Each b In Plage_Voy_Expe
        If b.Value <> 0 Then
            Set Plage_Recherche_Ex = Plage_Expe.Find(What:=b.Value, LookIn:=xlValues, lookat:=xlPart)
        
            If Plage_Recherche_Ex Is Nothing Then
                ReDim Preserve Stock(0 To k)
                Stock(k) = b.Value 'stockage du voyage non référencé
                j = j + 1 'incrémentation de la variable
                k = k + 1
            Else
               Plage_Recherche_Ex.Offset(0, 2).Value = Plage_Recherche_Ex.Offset(0, 2).Value + b.Offset(0, 1).Value
            End If
        End If
    Next
    
    MsgBox j & " Voyages d'expédition non pas réussis à être placé dans un secteur d'expédition, veuillez les paramétrer", vbInformation
    
    If k <> 1 Then
    
        [b]For l = 0 To UBound(Stock)
            MsgBox Stock(l) & " Voyage non référencé dans l'onglet analyse, veuillez le rajouter dans la bonne section", vbInformation
        Next l[/b]
    End If
End Sub
 
G

Guest

Guest
Re : Problème Select en VBA

Re,

moi-même personnellement à dit:
Visiblement tu n'as pas lu correctement ma réponse puisque tu n'a pas modifier ta ligne d'instruction .clearContents, sans select.

Ni celle de Kjin, aurais-je du ajouter.
discret Kjin ou bête hasco qui ne l'avait même pas vu:eek:

Kjin que je salue grandement avec 1000 présentations d'excuses:)

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 451
Messages
2 088 519
Membres
103 876
dernier inscrit
Audrey82