Mise à jour via database - cherche solution pour optimiser/rendre + rapide

Bonjour à tous,
Nouveau sur le forum, je me suis déjà souvent aidé de réponses postées pour avancer dans mes travaux.

Je me décide à créer un post pour vous demander de l'aide pour optimiser un code qui me sert à mettre à jour des données dans un fichier de reporting, à l'ouverture de celui-ci.

Le code met à jour les données via une procédure ODBB et ajoute différentes colonnes de calcul.

L'exécution du code est trop lente, cela prend plus d'une minute.

Je ne suis pas un pro du VBA. J'arrive à mes fins en m'aidant sur Internet, mais ici je ne vois plus trop comment optimiser.

Voici le code en question :

Sub RequeteClasseurFermedb_prev()

    Sheets("db").Visible = True
    Sheets("db").ListObjects("Table10").Delete
    Sheets("db").Cells.ClearContents

    Set WBE = ActiveWorkbook

    Dim Cn As ADODB.Connection
    Dim Fichier As String
    Dim NomFeuille As String, texte_SQL As String
    Dim Rst As ADODB.Recordset

    'Définit le classeur fermé (vérifie s'il est déjà ouvert effectue une copie, sinon ne va pas) servant de base de données
    Dim fso As Object
    test = 0
    If IsFileOpen("\\WAVDSNTP001.BIO.CORPNET1.COM\_LIS\3000-Planif\3300-Planning\3320-Wavre\PLANNING QC.xlsb") Then
        Set fso = CreateObject("Scripting.FileSystemObject")
        fso.CopyFile "\\WAVDSNTP001.BIO.CORPNET1.COM\_LIS\3000-Planif\3300-Planning\3320-Wavre\PLANNING QC.xlsb", "\\WAVDSNTP001.BIO.CORPNET1.COM\_LIS\3000-Planif\3300-Planning\3320-Wavre\PLANNING QC_copy.xlsb"
        Fichier = "\\WAVDSNTP001.BIO.CORPNET1.COM\_LIS\3000-Planif\3300-Planning\3320-Wavre\PLANNING QC_copy.xlsb"
        test = 1
    Else
        Fichier = "\\WAVDSNTP001.BIO.CORPNET1.COM\_LIS\3000-Planif\3300-Planning\3320-Wavre\PLANNING QC.xlsb"
    End If
    'Nom de la feuille dans le classeur fermé
    NomFeuille = "QC"

    Set Cn = New ADODB.Connection

    '--- Connection ---
    With Cn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data Source=" & Fichier & ";Extended Properties=""Excel 12.0 Xml;HDR=no;IMEX=1;Readonly=Yes"""
        .Open
    End With
    '-----------------

    'Définit la requête.
    '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
    texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"

    Set Rst = New ADODB.Recordset
    Set Rst = Cn.Execute(texte_SQL)
    With WBE.Sheets("db")
        .Range("A1").CopyFromRecordset Rst
    End With

    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing

    If test = 1 Then
        Kill "\\WAVDSNTP001.BIO.CORPNET1.COM\_LIS\3000-Planif\3300-Planning\3320-Wavre\PLANNING QC_copy.xlsb"
    Else
    End If

    'ajuste le résultat de la requête dans les db
    With WBE.Sheets("db")
        .Activate
        .ListObjects.Add(xlSrcRange, Cells(1).CurrentRegion, , xlYes).Name = "Table10"
        lon = .Range("AS65555").End(xlUp).Row
        .Columns("N").NumberFormat = "dd/mm/yyyy"
        .Columns("N").TextToColumns Destination:=.Columns("N"), DataType:=xlDelimited _
        , TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
        .Columns("O").NumberFormat = "dd/mm/yyyy"
        .Columns("O").TextToColumns Destination:=.Columns("O"), DataType:=xlDelimited _
        , TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
        .Columns("P").NumberFormat = "dd/mm/yyyy"
        .Columns("P").TextToColumns Destination:=.Columns("P"), DataType:=xlDelimited _
        , TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
        .Columns("AG").NumberFormat = "dd/mm/yyyy"
        .Columns("AG").TextToColumns Destination:=.Columns("AG"), DataType:=xlDelimited _
        , TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
        .Columns("AI").NumberFormat = "dd/mm/yyyy"
        .Columns("AI").TextToColumns Destination:=.Columns("AI"), DataType:=xlDelimited _
        , TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
        .Columns("AN").NumberFormat = "dd/mm/yyyy"
        .Columns("AN").TextToColumns Destination:=.Columns("AN"), DataType:=xlDelimited _
        , TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
        .Columns("AO").NumberFormat = "dd/mm/yyyy"
        .Columns("AO").TextToColumns Destination:=.Columns("AO"), DataType:=xlDelimited _
        , TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
        .Columns("AA").NumberFormat = "dd/mm/yyyy"
        .Columns("AA").TextToColumns Destination:=.Columns("AA"), DataType:=xlDelimited _
        , TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
        .Columns("AB").NumberFormat = "dd/mm/yyyy"
        .Columns("AB").TextToColumns Destination:=.Columns("AB"), DataType:=xlDelimited _
        , TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 4), TrailingMinusNumbers:=True
        .Columns("AS").TextToColumns Destination:=.Columns("AS"), _
        DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
        :=False, Tab:=True, Semicolon:=False, Comma:=False, Space:=False, _
        Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
        .Columns("AC").TextToColumns Destination:=.Columns("AC"), DataType:=xlDelimited, TextQualifier _
        :=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
        False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1) _
        , TrailingMinusNumbers:=True
        'ajoute les colonnes de calcul des jours
        .Columns("AU").Insert Shift:=xlToLeft
        .Range("AU1") = "moiskpi"
        .Range("AU2").FormulaR1C1 = "=IF([@[Date réalisé]]<>"""",MONTH([@[Date réalisé]]),"""")"
        .Range("AU2:AU" & lon) = .Range("AU2:AU" & lon).Value
        .Columns("AV").Insert Shift:=xlToLeft
        .Range("AV1") = "PMEXCMEX"
        .Range("AV2").FormulaR1C1 = "=IF([@[Date TECO]]<>"""",NETWORKDAYS.INTL([@[Date TECO]],[@[Date de fin SAP]]),NETWORKDAYS.INTL(date,[@[Date de fin SAP]]))"
        .Range("AV2:AV" & lon) = .Range("AV2:AV" & lon).Value
        .Columns("AW").Insert Shift:=xlToLeft
        .Range("AW1") = "délaiTECO"
        .Range("AW2").FormulaR1C1 = "=IF([@Statut]=""terminé"",NETWORKDAYS.INTL([@[Date réalisé]],date)-1,0)"
        .Range("AW2:AW" & lon) = .Range("AW2:AW" & lon).Value
        .Columns("AX").Insert Shift:=xlToLeft
        .Range("AX1") = "moisdatefin"
        .Range("AX2").FormulaR1C1 = "=IF([@[Date de fin SAP]]<>"""",MONTH([@[Date de fin SAP]]),"""")"
        .Range("AX2:AX" & lon) = .Range("AX2:AX" & lon).Value
        .Columns("AY").Insert Shift:=xlToLeft
        .Range("AY1") = "délaiinterv"
        .Range("AY2").FormulaR1C1 = "=IF([@[Date réalisé]]<>"""",""terminé"",IFS(AND([@[Date planifiée]]<>"""",[@[Date planifiée]]-[@[Date de fin SAP]]>=-1),""risque élevé"",AND([@[Date planifiée]]<>"""",[@[Date planifiée]]-[@[Date de fin SAP]]>=-3),""risque moyen"",AND([@[Date planifiée]]<>"""",[@[Date planifiée]]-[@[Date de fin SAP]]>=-5),""risque faible"",AND([@[Date planifiée]]<>"""",[@[Date planif" & _
        "iée]]-[@[Date de fin SAP]]<-5),""risque nul"",[@[Date planifiée]]="""",""risque élevé""))" & _
        ""
        .Range("AY2:AY" & lon) = .Range("AY2:AY" & lon).Value
        .Range("AZ1") = "tri1"
        .Range("AZ2").FormulaR1C1 = "=IF(AND(COUNTIFS([SAP],RC[-51],[Date planifiée],RC[-38],[technicien  prévu],RC[-35],[Order type],""CM01"")+COUNTIFS([SAP],RC[-51],[Date planifiée],RC[-38],[technicien  prévu],RC[-35],[Order type],""PRWO"")=2,RC[-46]=""PRWO""),0,1)"
        .Range("AZ2:AZ" & lon) = .Range("AZ2:AZ" & lon).Value
        .Range("BA1") = "tri2"
        .Range("BA2").FormulaR1C1 = "=IFERROR(IF([Date planifiée]<=date-1,1,0),1)"
        .Range("BA2:BA" & lon) = .Range("BA2:BA" & lon).Value
        .Columns("BB").Insert Shift:=xlToLeft
        .Range("BB1") = "lastcomment"
        .Range("BB2").FormulaR1C1 = "=IFERROR(RIGHT(RC[-36],LEN(RC[-36])-FIND(""@"",SUBSTITUTE(RC[-36],"";"",""@"",LEN(RC[-36])-LEN(SUBSTITUTE(RC[-36],"";"",""""))),1)),"""")"
        .Range("BB2:BB" & lon) = .Range("BB2:BB" & lon).Value
        .Columns("BC").Insert Shift:=xlToLeft
        .Range("BC1") = "annéeKPI"
        .Range("BC2").FormulaR1C1 = "=IF([@[Date réalisé]]<>"""",year([@[Date réalisé]]),"""")"
        .Range("BC2:BC" & lon) = .Range("BC2:BC" & lon).Value
        .Columns("BD").Insert Shift:=xlToLeft
        .Range("BD1") = "temps théorique"
        .Range("BD2").FormulaR1C1 = "=SUMIFS(dbtemps!C6,dbtemps!C2,[@SAP],dbtemps!C[-51],[@[Type d''intervention]])"
        .Range("BD2:BD" & lon) = .Range("BD2:BD" & lon).Value
        'ajoute les colonnes de calcul des jours
        .Columns("BE").Insert Shift:=xlToLeft
        .Range("BE1") = "diag"
        .Range("BE2:BE" & Range("AS65555").End(xlUp).Row).FormulaR1C1 = _
        "=IF([@[Order type]]<>""cowo"","""",IF(IF(RC40<>0,NETWORKDAYS.INTL(RC35,RC40,,Absences),NETWORKDAYS.INTL(RC35,NOW(),,Absences))<=1,1,IF(RC40<>0,NETWORKDAYS.INTL(RC35,RC40,,Absences)-1,NETWORKDAYS.INTL(RC35,NOW(),,Absences)-1)))"
        .Range("BE2:BE" & lon) = .Range("BE2:BE" & lon).Value
        .Columns("BF").Insert Shift:=xlToLeft
        .Range("BF1") = "repair"
        .Range("BF2:BF" & Range("AS65555").End(xlUp).Row).FormulaR1C1 = _
        "=IF([@[Order type]]<>""cowo"","""",IF(IF(RC33<>0,NETWORKDAYS.INTL(RC35,RC33,,Absences),NETWORKDAYS.INTL(RC35,NOW(),,Absences))<=1,1,IF(RC33<>0,NETWORKDAYS.INTL(RC35,RC33,,Absences)-1,NETWORKDAYS.INTL(RC35,NOW(),,Absences)-1)))"
        .Range("BF2:BF" & lon) = .Range("BF2:BF" & lon).Value
        .Columns("BG").Insert Shift:=xlToLeft
        .Range("BG1") = "groupe diag"
        .Range("BG2:BG" & Range("AS65555").End(xlUp).Row).FormulaR1C1 = _
        "=IF([@[Order type]]<>""cowo"","""",IF(RC57=1,""1 jour"",IF(RC57<=3,""2 - 3 jours"",IF(RC57<=5,""3 - 4 jours"","">5 jours""))))"
        .Range("BG2:BG" & lon) = .Range("BG2:BG" & lon).Value
        .Columns("BH").Insert Shift:=xlToLeft
        .Range("BH1") = "groupe repair"
        .Range("BH2:BH" & Range("AS65555").End(xlUp).Row).FormulaR1C1 = _
        "=IF([@[Order type]]<>""cowo"","""",IF(RC58=1,""1 jour"",IF(RC58<=3,""2 - 3 jours"",IF(RC58<=5,""3 - 4 jours"","">5 jours""))))"
        .Range("BH2:BH" & lon) = .Range("BH2:BH" & lon).Value
        'converti en valeur et reformatte
        .Range("BE2:BE" & lon).Select
        Application.CutCopyMode = False
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
        Selection.TextToColumns Destination:=.Range("BE2:BE" & lon), _
            DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
            :=False, Tab:=True, Semicolon:=False, Comma:=False, Space:=False, _
            Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
        .Range("BF2:BF" & lon).Select
        Application.CutCopyMode = False
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
        Selection.TextToColumns Destination:=.Range("BF2:BF" & lon), _
            DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter _
            :=False, Tab:=True, Semicolon:=False, Comma:=False, Space:=False, _
            Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
    End With

    Sheets("db").Visible = False

End Sub

Function IsFileOpen(filename As String)
    Dim filenum As Integer, errnum As Integer

    On Error Resume Next   ' Turn error checking off.
    filenum = FreeFile()   ' Get a free file number.
    ' Attempt to open the file and lock it.
    Open filename For Input Lock Read As #filenum
    Close filenum          ' Close the file.
    errnum = Err           ' Save the error number that occurred.
    On Error GoTo 0        ' Turn error checking back on.

    ' Check to see which error occurred.
    Select Case errnum

        ' No error occurred.
        ' File is NOT already open by another user.
        Case 0
         IsFileOpen = False

        ' Error number for "Permission Denied."
        ' File is already opened by another user.
        Case 70
            IsFileOpen = True

        ' Another error occurred.
        Case Else
            Error errnum
    End Select

End Function

Merci d'avance pour vos idées.

personne n'a d'idée ?

Bonjour et bienvenue,
Regarde du côté de Power Query pour importer les données de ton fichier.
Cdlt.

Rechercher des sujets similaires à "mise jour via database cherche solution optimiser rendre rapide"