IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Correction code VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Mars 2024
    Messages : 2
    Par défaut Correction code VBA
    Bonjour à tous,
    j'ai écrit ce code VBA (avec plusieurs aides et tutos) mais il bloque à la ligne (TAT = RechercherTAT(Tableclient, client, entite, typeOffre) avec comme erreur l'erreur 438 (propriété non prise en charge).
    J'aimerais savoir si quelqu'un peut m'aider et si il y auraient d'autres erreurs plus loin dans le code.
    Si il y a besoin je peux expliquer en détail ce que je veux que le code exécute (un peu compliqué mais ça le fait).
    Merci d'avance de votre aide et bonne journée !

    Sub PredireDateCommande()
    Dim wsSuivi As Worksheet
    Dim wsTAT As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim client As String
    Dim entite As String
    Dim typeOffre As String
    Dim dateEnvoi As Date
    Dim TAT As Long
    Dim dateCommande As Date
    Dim currentDate As Date
    Dim dateFinValidite As Date
    Dim dateCommandeEstimeeCol As String



    Dim Suivitable As ListObject
    Set Suivitable = ThisWorkbook.Sheets("Tableausuivi").ListObjects("SuiviTable")
    Dim Tableclient As ListObject
    Set Tableclient = ThisWorkbook.Sheets("TAT MOYEN CLIENT").ListObjects("TableClient")


    ' Trouver les colonnes avec les noms de données
    Dim clientCol As String
    Dim entiteCol As String
    Dim typeOffreCol As String
    Dim dateEnvoiCol As String

    clientCol = FindColumn(Suivitable, "Client / DO")
    entiteCol = FindColumn(Suivitable, "Entité")
    typeOffreCol = FindColumn(Suivitable, "Type offre")
    dateEnvoiCol = FindColumn(Suivitable, "Dt envoi Offre")
    dateCommandeEstimeeCol = FindColumn(Suivitable, "Date commande estimé sur REX")


    ' Trouver la dernière ligne avec des données dans Suivitable
    lastRow = Suivitable.DataBodyRange.Rows.Count

    ' Boucler à travers les lignes de Suivitable
    For i = 2 To lastRow ' Commencer à la deuxième ligne si les en-têtes sont en première ligne
    ' Lire les données de Suivitable
    client = Suivitable.DataBodyRange.Cells(i, clientCol).Value
    entite = Suivitable.DataBodyRange.Cells(i, entiteCol).Value
    typeOffre = Suivitable.DataBodyRange.Cells(i, typeOffreCol).Value
    dateEnvoi = Suivitable.DataBodyRange.Cells(i, dateEnvoiCol).Value
    dateCommande = Suivitable.DataBodyRange.Cells(i, dateCommandeEstimeeCol).Value ' Lecture de la colonne existante

    currentDate = Date
    dateFinValidite = Suivitable.Cells(i, FindColumn(Suivitable, "Date fin validité")).Value

    ' Recherche du TAT correspondant dans la feuille TAT
    TAT = RechercherTAT(Tableclient, client, entite, typeOffre)


    Do While dateEnvoi + TAT <= currentDate And dateEnvoi + TAT <= dateFinValidite
    TAT = RechercherTAT(Tableclient, client, entite, typeOffre)
    dateEnvoi = dateEnvoi + TAT
    Loop


    ' Mettre à jour la date de commande estimée dans Suivitable
    Suivitable.Cells(i, dateCommandeEstimeeCol).Value = dateEnvoi ' Écriture dans la colonne existante
    Next i
    End Sub

    Function FindColumn(ws As ListObject, columnName As String) As String
    Dim headerCell As Range
    For Each headerCell In ws.HeaderRowRange.Cells
    If headerCell.Value = columnName Then
    FindColumn = Split(headerCell.Address, "$")(1)
    Exit Function
    End If
    Next headerCell
    FindColumn = ""
    End Function


    Function RechercherTAT(wsTAT As ListObject, client As String, entite As String, typeOffre As String) As Integer
    Dim lastRow As Long
    Dim i As Long

    ' Trouver la dernière ligne avec des données dans TAT
    lastRow = wsTAT.Cells(wsTAT.Rows.Count, "A").End(xlUp).Row

    ' Boucler à travers les lignes de TAT
    For i = 2 To lastRow ' Commencer à la deuxième ligne si les en-têtes sont en première ligne
    ' Vérifier les conditions
    If wsTAT.Cells(i, "A").Value = client And wsTAT.Cells(i, "B").Value = entite And wsTAT.Cells(i, "C").Value = typeOffre Then
    RechercherTAT = wsTAT.Cells(i, "G").Value
    Exit Function
    End If
    Next i

    ' Retourner 0 si aucune correspondance n'est trouvée
    RechercherTAT = 0
    End Function

  2. #2
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 486
    Par défaut
    Bonjour,
    Il serait bon que vous nous fassiez parvenir le code de la Fonction RechercherTAT.

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Mars 2024
    Messages : 2
    Par défaut
    Re,

    le code est présent, c'est la dernière fonction :

    Function RechercherTAT(wsTAT As ListObject, client As String, entite As String, typeOffre As String) As Integer
    Dim lastRow As Long
    Dim i As Long

    ' Trouver la dernière ligne avec des données dans TAT
    lastRow = wsTAT.Cells(wsTAT.Rows.Count, "A").End(xlUp).Row

    ' Boucler à travers les lignes de TAT
    For i = 2 To lastRow ' Commencer à la deuxième ligne si les en-têtes sont en première ligne
    ' Vérifier les conditions
    If wsTAT.Cells(i, "A").Value = client And wsTAT.Cells(i, "B").Value = entite And wsTAT.Cells(i, "C").Value = typeOffre Then
    RechercherTAT = wsTAT.Cells(i, "G").Value
    Exit Function
    End If
    Next i

    ' Retourner 0 si aucune correspondance n'est trouvée
    RechercherTAT = 0
    End Function

    Merci d'avance !

  4. #4
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 486
    Par défaut
    Re,
    Ha oui pas vu , pour les suivants il serait bon de faire une édition du premier post et de mettre le code entre balise code

  5. #5
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 486
    Par défaut
    Bon,
    La fonction es déclarée de type Integer, TAT lui est déclaré de type Long, changes cela déjà.

    Sachez qu'au vu des nouveaux processeurs il vaut mieux tout déclarer en type Long.

  6. #6
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 486
    Par défaut
    Petits retours sur le code,
    Je vois ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        'Trouver les colonnes avec les noms de données
        Dim clientCol As String
        clientCol = FindColumn(Suivitable, "Client / DO")
    Et cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Dim client As String
            client = Suivitable.DataBodyRange.Cells(i, clientCol).Value
    Si au lieu de boucler avec i sur les lignes du tableau vous bouclez sur les ListRows du tableau cela simplifie le code ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        '...
        '...
        Dim itemRow As Excel.ListRow
        For Each itemRow In Suivitable.ListRows
            With itemRow
                Dim Client As String
                Client = .Range(.Parent.ListColumns("Client / DO").Index).Value
                '...
                '...
                Dim TAT As Long
                TAT = RechercherTAT(Tableclient, Client, entite, typeOffre)
                '...
                '...
            End With
        Next itemRow

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 466
    Par défaut
    Salut,

    Quitte a travailler avec des tableaux structurés, autant le faire jusqu'au bout.
    Inutile de calculer le nombre de lignes, puisque le tableau connait son nombre de lignes, et on peut boucler sur ces dernières.
    Ensuite, utilise les noms de colonne, on y gagnera en lisibilité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Function RechercherTAT(wsTAT As Excel.ListObject, client As String, entite As String, typeOffre As String) As Integer
        Dim Row As Excel.ListRow
        With wsTAT
            For Each Row In .ListRows
                Dim ReadenClient As String
                ReadenClient = Row.Range(.ListColumns("ColonneClient").index).Value
     
                Dim ReadenEntite As String
                ReadenEntite = Row.Range(.ListColumns("ColonneEntite").index).Value
     
                Dim ReadenTypeOffre As String
                ReadenTypeOffre = Row.Range(.ListColumns("ColonneTypeOffre").index).Value
     
                If ((client = ReadenClient) And (entite = ReadenEntite) And (typeOffre = ReadenTypeOffre )) Then
                    RechercherTAT = CInt(Row.Range(.ListColumn("ColonneResultat").index).Value)
                    Exit For
                End If
            Next
        End With
    End Function
    Remplace ColonneClient, ColonneEntite, ColonneTypeOffre et ColonneResultat par les noms de colonne de ton tableau.

    PS: Prend l'habitude de préfixer tes variables objet avec le nom de la bibliothèque concernée, ca évitera les conflits potentiels.

Discussions similaires

  1. [XL-2010] Aide correction code vba conditions sur cellules "vides"
    Par fb62840 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/01/2018, 14h18
  2. Correction code vba
    Par Commandeur dans le forum VBA Access
    Réponses: 5
    Dernier message: 15/09/2016, 07h50
  3. [XL-2007] Correction code VBA
    Par bigokou dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 25/09/2012, 15h12
  4. Correction de mon code vba svp
    Par njinkeu.mbakob dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/04/2008, 12h21
  5. [VBA-E] Correction code opérations sur cellules
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/03/2007, 21h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo