XL pour MAC lenteur du vba

tdenis

XLDnaute Nouveau
Bonsoir le forum,
voila j'ai un onglet devis avec des menus déroulants dans une colonne
ces intitulés vont déclencher dans une autre colonne un choix de matériaux ou de main d'oeuvre.
apres avoir choisi un matériaux j'aimerais que les valeurs des cellules correspondantes au matériaux se mettent dans les cellules adjacentes comme sur le code ci dessous.
mon soucis :
après le choix du matériau c est lent .... et si je rajoute une deuxieme ligne de valeur a ajouter ca beugue encore plus voire aucuns résultats.
Dois je mettre le code find pour éviter les if = valeur ?
merci pour votre aide.

VB:
Private Sub Worksheet_change(ByVal Target As Range)
    
Dim i As Integer

For i = 16 To 45
If Target.Address = Cells(i, 3) Then
Else
  If Cells(i, 3).Value = "Materiaux" Then

    Range(Cells(i, 4), Cells(i, 9)).Interior.ColorIndex = 34
    Cells(i + 1, 4).Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="='ressources materiaux'!$C$2:$C$100"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
        End With
      If Cells(i + 1, 4).Value = "Parquet flottant 1" Then
        Cells(i + 1, 6).Value = Worksheets("Ressources materiaux").Cells(2, 2).Value
       Else
        If Cells(i + 1, 4).Value = "Parquet flottant 2" Then
        Cells(i + 1, 6).Value = Worksheets("Ressources materiaux").Cells(3, 2).Value
        Else
         End If
         End If
        If Cells(i, 4).Value <> "" Then
      
        
          End If
    
         If Cells(i, 3).Value = "Main d'oeuvre" Then
         Range(Cells(i, 4), Cells(i, 9)).Interior.ColorIndex = 24
            Cells(i + 1, 4).Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="='Main d''oeuvre'!$B$2:$B$100"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
        End With
        Else
             If Cells(i, 3).Value = "Sous-Total" Then
             Range(Cells(i, 4), Cells(i, 8)).Interior.ColorIndex = 18
                Cells(i, 9).Interior.ColorIndex = "0"
        Else
             If Cells(i, 3).Value = "Total" Then
             Range(Cells(i, 4), Cells(i, 8)).Interior.ColorIndex = 24
                Cells(i, 9).Interior.ColorIndex = "0"
        Else
            If Cells(i, 3).Value = "Déplacement" Then
             Range(Cells(i, 4), Cells(i, 9)).Interior.ColorIndex = 44
        Else
            If Cells(i, 3).Value = "" Then
             Range(Cells(i, 2), Cells(i, 9)).Interior.ColorIndex = 2
        Else
            End If
            End If
            End If
            End If
        End If
    End If
End If
Next i
   End Sub
 
Solution
et voila, j'avais oublié de tester la copie en sélection multiples, d'où l'intérêt d'un fichier test même basique, on ne le répète jamais assez, voila le code modifié pour gérer le copier coller en sélection multiple.
Code:
Option Explicit
Private Sub Worksheet_change(ByVal Target As Range)
    Dim Ref_Val, Cellule_en_Cours As Range 'définition des variables, un variant, un range
    On Error GoTo Gere_Erreurs 'si erreur va à Gere_Erreurs
    If Not Intersect(Target, Range(Cells(16, 3), Cells(45, 3))) Is Nothing Then 'exécute le code si intersection target et C16:C45
        Application.EnableEvents = False 'désactivation des événements, changer des cellules ne relance pas la sub change
        For Each Cellule_en_Cours In...
Bonsoir Tdenis, le forum

J'ai essayé de nettoyer ton code mais sans fichier exemple, je ne comprends pas pourquoi tu boucles comme cela sur tes cellules. à chaque changement d'une cellule, tu appliques sur toutes les cellules concernées, de plus récursif car tu appliques des changements dans un événement change.
enfin voila ton code modifié mais non testé, cela devrait être plus rapide et éviter la récursivité avec Stop_Change (on peut aussi le faire avec application.enableevents = false en n'oubliant surtout pas de mettre application.enableevents = true après Gere_Erreurs: pour rétablir les événements en cas d'erreur.(voir deuxième proc)

VB:
Dim Stop_Change As Boolean

Private Sub Worksheet_change(ByVal Target As Range)
    If Stop_Change Then Exit Sub
    Dim i%, y%, z%
    y = 16: z = 45
    If Not Intersect(Target, Range(Cells(y, 3), Cells(z, 3))) Is Nothing Then
        On Error GoTo Gere_Erreurs
        Stop_Change = True
        For i = 16 To 45
            Select Case Cells(i, 3).Value
            Case Is = "Materiaux"
                Range(Cells(i, 4), Cells(i, 9)).Interior.ColorIndex = 34
                With Cells(i + 1, 4).Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                    xlBetween, Formula1:="='ressources materiaux'!$C$2:$C$100"
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .InputTitle = ""
                    .ErrorTitle = ""
                    .InputMessage = ""
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = True
                End With
                If Cells(i + 1, 4).Value = "Parquet flottant 1" Then
                    Cells(i + 1, 6).Value = Worksheets("Ressources materiaux").Cells(2, 2).Value
                Else
                    If Cells(i + 1, 4).Value = "Parquet flottant 2" Then
                        Cells(i + 1, 6).Value = Worksheets("Ressources materiaux").Cells(3, 2).Value
                    End If
                End If
            Case Is = "Main d'oeuvre"
                Range(Cells(i, 4), Cells(i, 9)).Interior.ColorIndex = 24
                With Cells(i + 1, 4).Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                    xlBetween, Formula1:="='Main d''oeuvre'!$B$2:$B$100"
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .InputTitle = ""
                    .ErrorTitle = ""
                    .InputMessage = ""
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = True
                End With
            Case Is = "Sous-Total"
                Range(Cells(i, 4), Cells(i, 8)).Interior.ColorIndex = 18
                Cells(i, 9).Interior.ColorIndex = "0"
            Case Is = "Total"
                Range(Cells(i, 4), Cells(i, 8)).Interior.ColorIndex = 24
                Cells(i, 9).Interior.ColorIndex = "0"
            Case Is = "Déplacement"
                Range(Cells(i, 4), Cells(i, 9)).Interior.ColorIndex = 44
            Case Is = ""
                Range(Cells(i, 2), Cells(i, 9)).Interior.ColorIndex = 2
            Case Else
            End Select
        Next i
End if
Gere_Erreurs:
    Stop_Change = False
End Sub
mais à mon avis, il peut être remplacé avantageusement par celui la, toujours non testé faute de fichier
Code:
Private Sub Worksheet_change(ByVal Target As Range)
     If Not Intersect(Target, Range(Cells(16, 3), Cells(45, 3))) Is Nothing Then
        On Error GoTo Gere_Erreurs
        Application.EnableEvents = False
        Select Case Target.Value
        Case Is = "Materiaux"
            Range(Target.Offset(0, 1), Target.Offset(0, 6)).Interior.ColorIndex = 34
            With Target.Offset(1, 1).Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:="='ressources materiaux'!$C$2:$C$100"
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = True
            End With
            If Target.Offset(1, 1).Value = "Parquet flottant 1" Then
                Target.Offset(1, 3).Value = Worksheets("Ressources materiaux").Cells(2, 2).Value
            Else
                If Target.Offset(1, 1).Value = "Parquet flottant 2" Then
                    Target.Offset(1, 3).Value = Worksheets("Ressources materiaux").Cells(3, 2).Value
                End If
            End If
        Case Is = "Main d'oeuvre"
            Range(Target.Offset(0, 1), Target.Offset(0, 6)).Interior.ColorIndex = 24
            With Target.Offset(1, 1).Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:="='Main d''oeuvre'!$B$2:$B$100"
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = True
            End With
        Case Is = "Sous-Total"
            Range(Target.Offset(0, 1), Target.Offset(0, 5)).Interior.ColorIndex = 18
            Target.Offset(0, 6).Interior.ColorIndex = "0"
        Case Is = "Total"
            Range(Target.Offset(0, 1), Target.Offset(0, 5)).Interior.ColorIndex = 24
            Target.Offset(0, 6).Interior.ColorIndex = "0"
        Case Is = "Déplacement"
            Range(Target.Offset(0, 1), Target.Offset(0, 6)).Interior.ColorIndex = 44
        Case Is = ""
            Range(Target.Offset(0, -1), Target.Offset(0, 6)).Interior.ColorIndex = 2
        Case Else
        End Select
End if
Gere_Erreurs:
    Application.EnableEvents = True
End Sub

Avec un fichier exemple, on pourrait sans aucun doute faire beaucoup plus et mieux !
Habituellement, je ne t'aurai pas répondu sans fichier mais j'étais de bonne humeur et confiné, mais je n'irai pas plus loin sans, c'est déjà pas mal vu ma signature !

Bien cordialement, @+
 
Dernière édition:

soan

XLDnaute Barbatruc
@Yeahou

oui, pour sûr ! mébon, entre nous, heureusement que tu ne me fais pas dire ce que je n'ai jamais dit ! et même, pour être complètement honnête avec toi, je ne l'ai même jamais pensé ! qui donc irai penser ça d'un de ses meilleurs copains ? pas vrai ? ;)

ajout : ne t'inquiètes pas du fait que t'es Accro et moi Barbatruc : je ne suis pas snob, et je ne m'attache pas aux différences de classes ; et puis, dans un peu moins de 800 posts, tu deviendras Barbatruc, toi aussi ! (ou peut-être Barbichat ? 😜)

soan
 
Dernière édition:

tdenis

XLDnaute Nouveau
Bonsoir à vous deux, ;)
Yeahou, vos codes ne fonctionnent pas sur les appels a parquet flottant 1, 2 pour renvoyer les valeurs de cellules.
En même temps je me pose la question si je ne dois pas faire une variante sur la correspondance.
au lieu de dire si la cellule est égale à parquet flottant 1 je revoie la valeur des cellules correspondantes , à la place je mets si la cellule est différente de "" je vais chercher la valeur exacte dans une plage dans l'onglet matériaux et faire correspondre les valeurs de cette recherche ..
qu'en pensez vous ?
Mon fichier est trop volumineux pour le mettre en pièce jointe...
merci pour aide ou au moins une orientation de code.
Thierry
 

soan

XLDnaute Barbatruc
Bonsoir Thierry, Yeahou,

recommandation expresse du pénitencier de l'Oklahoma : la construction de cellules est fortement déconseillée sur des parquets flottants : les Dalton peuvent creuser leur tunnel beaucoup trop facilement, et les télégrammes pour avertir Luky Luke de leur évasion commencent à ruiner les finances de l'État ! rassure-moi : tu veux quand même pas mettre Abraham Lincoln sur la paille ? 😜 🤪 😁

soan
 
@soan , tu sais, il y en a qui bossent ! (même si ils sont retraités)

@tdenis
Voila, je crois avoir compris (même une simple visu d'une feuille, ça aide), il faut séparer les événements change

VB:
Private Sub Worksheet_change(ByVal Target As Range)
    On Error GoTo Gere_Erreurs
    If Not Intersect(Target, Range(Cells(16, 3), Cells(45, 3))) Is Nothing Then
        Application.EnableEvents = False
        Select Case Target.Value
        Case Is = "Materiaux"
            Range(Target.Offset(0, 1), Target.Offset(0, 6)).Interior.ColorIndex = 34
            With Target.Offset(1, 1).Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:="='ressources materiaux'!$C$2:$C$100"
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = True
            End With
        Case Is = "Main d'oeuvre"
            Range(Target.Offset(0, 1), Target.Offset(0, 6)).Interior.ColorIndex = 24
            With Target.Offset(1, 1).Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                xlBetween, Formula1:="='Main d''oeuvre'!$B$2:$B$100"
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = True
            End With
        Case Is = "Sous-Total"
            Range(Target.Offset(0, 1), Target.Offset(0, 5)).Interior.ColorIndex = 18
            Target.Offset(0, 6).Interior.ColorIndex = "0"
        Case Is = "Total"
            Range(Target.Offset(0, 1), Target.Offset(0, 5)).Interior.ColorIndex = 24
            Target.Offset(0, 6).Interior.ColorIndex = "0"
        Case Is = "Déplacement"
            Range(Target.Offset(0, 1), Target.Offset(0, 6)).Interior.ColorIndex = 44
        Case Is = ""
            Range(Target.Offset(0, -1), Target.Offset(0, 6)).Interior.ColorIndex = 2
        Case Else
        End Select
    End If
    Application.EnableEvents = True
    If Not Intersect(Target, Range(Cells(16, 4), Cells(45, 4))) Is Nothing Then
        Select Case Target.Value
        Case Is = "Parquet flottant 1"
            Target.Offset(0, 1).Value = Worksheets("Ressources materiaux").Cells(2, 2).Value
        Case Is = "Parquet flottant 2"
            Target.Offset(0, 1).Value = Worksheets("Ressources materiaux").Cells(3, 2).Value
        Case Is = "Parquet flottant 2"
            Target.Offset(0, 1).Value = Worksheets("Ressources materiaux").Cells(4, 2).Value
        Case Is = "Parquet flottant 3"
            Target.Offset(0, 1).Value = Worksheets("Ressources materiaux").Cells(5, 2).Value
        Case Is = "Parquet flottant 4"
            Target.Offset(0, 1).Value = Worksheets("Ressources materiaux").Cells(6, 2).Value
        Case Is = "Parquet flottant 5"
            Target.Offset(0, 1).Value = Worksheets("Ressources materiaux").Cells(7, 2).Value
        Case Is = "Parquet flottant 6"
            Target.Offset(0, 1).Value = Worksheets("Ressources materiaux").Cells(8, 2).Value
        Case Is = "Parquet flottant 7"
            Target.Offset(0, 1).Value = Worksheets("Ressources materiaux").Cells(9, 2).Value
        Case Else
        End Select
    End If
    On Error GoTo 0
Gere_Erreurs:
    Application.EnableEvents = True
End Sub
 
Dernière édition:

Discussions similaires

Réponses
1
Affichages
130

Statistiques des forums

Discussions
290 922
Messages
1 911 412
Membres
177 160
dernier inscrit
rabinaud
Haut Bas