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 :

ouvrir macro sur plusieurs Excel.application


Sujet :

Macros et VBA Excel

  1. #21
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 32
    Par défaut
    Bon,
    Actuellement, je ne gagne que 6 mins de temps de calcul.
    J'ai une macro qui prend 45 mins de calculs, et en utilisant notre méthode, je suis à 36 mins. De coup ce n'est pas suffisant. Je m'attendais à diviser le temps par 2 en utilisant 2 processeurs. Mais ce n'est pas le cas.

    Mais, si on utilisait les threads? Fin, je veux dire, si on lance chaque macro dans un thread, ensuite, chaque thread dans une instance excel. à votre avie, ça changera quelque chose?

  2. #22
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Hum, si ton traitement prend 45 minutes à la base, je me permets de te proposer d'utiliser un autre langage dans ce cas là

    VBA n'est peut-être pas le langage le plus adéquat si tu as autant de manipulation à effectuer
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #23
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 32
    Par défaut
    J'y ai pensé. C'est facile à dire mais pour l'appliquer ce n'est pas le cas.

    L'utilisation du VBA est une routine dans l'entreprise où je suis. De coup ce n'est pas facile de changer de langage.

    2e chose, Je ne vais pas jeter à la poubelle un travaille qui a duré 4 mois. Car la macro m'a prit 4 mois à réaliser quand même!!!

  4. #24
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    il y a peut-être moyen d'optimiser la macro, tu peux montrer un bout pour voir ?

  5. #25
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 32
    Par défaut
    Mmmmh, Le problème n'est pas avec la macro. Elle est optimisée au max.
    Le problème c'est que j'ai une trés trés trés grande quantité de données à gérer.

    disons un peu près : 1050000 calculs à faire.

    pour l'instant, je m’arrête à 21000 calculs pour tester. ça me fait 45 mins de temps de calcul.

    En tout cas, je vais voir si je peux montrer un bout de cette macro.

  6. #26
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    45 minutes pour 21000 calculs cela me semble anormalement long...

  7. #27
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 32
    Par défaut
    Voici la macro.
    Alors, j'ai dû supprimer les formules utilisée pour des raisons de confidentialité.

    sinon, je fais appelle à une autre macro ( qui est strictement confidentielle) qui me fera des calculs durant le lancement de ma macro.

    Voici la macro:


    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    Option Explicit
     
        Dim inputFileName As String, inputFileNameLOADCASE As String, inputFileNamePATRAN As String, outputFileName As String
        Dim startText As String, endText As String
        Dim FSO, FSO1 As Object
        Dim textFile As Object
        Dim out_textFile As Object
        Dim strligne As String
        Dim p1 As Long, p2 As Long
        Dim flight_name As String
        Dim sub1, sub2 As String
        Dim data As String
        Dim ID1, ID2 As Double
        Dim oTxt As Scripting.TextStream
        Dim objFSO
        Dim strFolder
        Dim monfichier123 As Variant
        Dim k As Integer
        Dim directory123 As String
        Dim lastRow As Long
        Dim lastrow1 As Double
        Dim MonFichier As Variant
        Public Monclasseur As String
        Dim i, numligne As Long
        Dim duree As Date
        Dim book As Workbook
        Dim element As Integer
        Dim xl, xr, xml, xmr, xm, resultXML, resultXMR, h, epsi As Double
     
     
     
     
    Sub TestCalcul()
     
        Application.ScreenUpdating = True
        Application.Calculation = xlCalculationManual
        Application.EnableEvents = False
        ActiveSheet.DisplayPageBreaks = False
     
     
        Set book = ActiveWorkbook
        Cells.EntireColumn.Delete
     
        duree = Now
     
     
        Set FSO = CreateObject("Scripting.FileSystemObject")
        inputFileNameLOADCASE = Application.GetOpenFilename("Text Files (*.xls), *.xls", Title:="Selectionner un fichier Load Case")
        inputFileNamePATRAN = Application.GetOpenFilename("Text Files (*.rpt), *.rpt", Title:="Selectionner un fichier Patran")
        Set objFSO = CreateObject("Scripting.FileSystemObject")
     
     
     
     
     
        book.Activate
        Worksheets(1).Activate
     
     
    ' renommer les cellules
     
        With Worksheets(1)
        .Range("E1") = "Facteur_1"
        .Range("G1") = "Facteur_2"
        .Range("H1") = "LC"
        .Range("I1") = "LC_X"
        .Range("J1") = "LC_Y"
        .Range("K1") = "LC_Z"
        .Range("M1") = "Sigma_Patran_X"
        .Range("N1") = "Sigma_Patran_Y"
        .Range("O1") = "Sigma_Patran_XY"
        .Range("P1") = "LC_X_1g"
        .Range("Q1") = "LC_Y_1g"
        .Range("R1") = "LC_Z_1g"
        .Range("S1") = "LC_X_S"
        .Range("T1") = "LC_Y_S"
        .Range("U1") = "LC_Z_S"
        .Range("V1") = "LC_X"
        .Range("W1") = "LC_Y"
        .Range("X1") = "LC_Z"
        .Range("Y1") = "Sigma_X"
        .Range("Z1") = "Sigma_Y"
        .Range("AA1") = "Sigma_XY"
        .Range("AB1") = "Sigma_CC_Projetée"
        .Range("AC1") = "Sigma_CC_Projetée_RainFlow"
        .Range("AD1") = "alpha"
        .Range("AE1") = "Max_Sigma_RainFlow"
        .Range("AF1") = "Alpha_Max_Sigma_RainFlow"
        .Range("AG1") = "Max_Sigma_RainFlow ^ 4.5"
        .Range("AH1") = "Sigma_Equi_Projetée_1000_Vols"
        '.Range("AI1") = "Containte équi 1000 vol "
        End With
     
    ' ouvrir un fichier xls
     
     
     
        MonFichier = inputFileNameLOADCASE
     
        If MonFichier <> False Then
     
            Workbooks.OpenText Filename:=inputFileNameLOADCASE, DataType:=xlDelimited, ConsecutiveDelimiter:=True, Space:=True
     
            k = Range("J10").End(xlDown).Row
     
     
            book.Worksheets(1).Range("H2:H" & k - 8).Value = ActiveSheet.Range("J10:J" & k).Value
            book.Worksheets(1).Range("I2:I" & k - 8).Value = ActiveSheet.Range("AD10:AD" & k).Value
            book.Worksheets(1).Range("J2:J" & k - 8).Value = ActiveSheet.Range("AE10:AE" & k).Value
            book.Worksheets(1).Range("K2:K" & k - 8).Value = ActiveSheet.Range("AF10:AF" & k).Value
     
     
            Application.DisplayAlerts = False
     
            ActiveWorkbook.Close
     
            Application.DisplayAlerts = True
     
            MonFichier = vbNullString
            inputFileNameLOADCASE = vbNullString
     
     
        End If
     
     
    ' ouvrir un fichier text
     
     
     
        MonFichier = inputFileNamePATRAN
     
        If MonFichier <> False Then
     
            Workbooks.OpenText Filename:=inputFileNamePATRAN, DataType:=xlDelimited, ConsecutiveDelimiter:=True, Space:=True
     
     
     
             book.Worksheets(1).Range("M2").Value = ActiveSheet.Range("D21").Value
             book.Worksheets(1).Range("M3").Value = ActiveSheet.Range("D22").Value
             book.Worksheets(1).Range("N2").Value = ActiveSheet.Range("E21").Value
             book.Worksheets(1).Range("N3").Value = ActiveSheet.Range("E22").Value
             book.Worksheets(1).Range("O2").Value = ActiveSheet.Range("F21").Value
             book.Worksheets(1).Range("O3").Value = ActiveSheet.Range("F22").Value
     
     
     
            ID1 = ActiveSheet.Range("C21")
            ID2 = ActiveSheet.Range("C22")
     
     
     
            startText = "1     HORIZONTAL_"
            endText = "2     VERTICAL_"
     
            sub1 = "Entity ID"
     
     
     
            Set FSO = CreateObject("Scripting.FileSystemObject")
     
            Set textFile = FSO.OpenTextFile(inputFileNamePATRAN)
            data = textFile.ReadAll
            textFile.Close
     
     
            p1 = InStr(data, startText) + Len(startText)
     
            p2 = InStr(data, endText) + Len(endText)
     
            If p1 > 0 And p2 > 0 Then
     
                With book.Worksheets(1)
                .Range("L2") = Mid(data, p1, 3)
                .Range("L4") = Mid(data, p2, 3)
     
                .Range("L1") = "Horizontal force" & "   " & "ID" & " :  " & ID1
                .Range("L3") = "Vertical force" & "   " & "ID" & " :  " & ID2
     
                End With
            End If
     
     
     
            Application.DisplayAlerts = False
     
            ActiveWorkbook.Close
     
            Application.DisplayAlerts = True
     
     
        End If
     
            MonFichier = vbNullString
            inputFileNamePATRAN = vbNullString
            Set FSO = Nothing
     
            Set textFile = Nothing
            ID1 = vbNullChar
            ID2 = 0
            sub1 = vbNullString
            startText = vbNullString
            endText = vbNullString
            data = vbNullString
            p1 = 0
            p2 = 0
            ActiveSheet.Calculate
     
     
     
    ' ouvrir un fichier .fue
     
    Line1:
     
        Set objFSO = CreateObject("Scripting.FileSystemObject")
     
     
        directory123 = "C:\temp\Results_Mon_Results"
     
        If Not objFSO.FolderExists(directory123) Then
               objFSO.CreateFolder (directory123)
        End If
     
     
     
     
     
     
    line3:
     
     
     
        For k = 1 To 1000
     
     
     
     
            Application.StatusBar = k & "/" & "1000"
     
            MonFichier = "C:\Temp\OUT_VOL\" & k & ".txt"
     
            If MonFichier <> False Then
     
     
     
                Workbooks.OpenText Filename:=MonFichier, DataType:=xlDelimited, ConsecutiveDelimiter:=True, Space:=True
     
     
                ActiveSheet.Rows(1).Delete
     
                numligne = ActiveSheet.Range("B1").End(xlDown).Row
     
                book.Worksheets(1).Range("A1").Value = ActiveSheet.Range("A1").Value
                book.Worksheets(1).Range("B1:B" & numligne).Value = ActiveSheet.Range("B1:B" & numligne).Value
                book.Worksheets(1).Range("C1:C" & numligne).Value = ActiveSheet.Range("C1:C" & numligne).Value
                book.Worksheets(1).Range("D1:D" & numligne).Value = ActiveSheet.Range("D1:D" & numligne).Value
                book.Worksheets(1).Range("E1:E" & numligne).Value = ActiveSheet.Range("E1:E" & numligne).Value
                book.Worksheets(1).Range("F1:F" & numligne).Value = ActiveSheet.Range("F1:F" & numligne).Value
                book.Worksheets(1).Range("G1:G" & numligne).Value = ActiveSheet.Range("G1:G" & numligne).Value
     
     
                Application.DisplayAlerts = False
     
                ActiveWorkbook.Close
     
                Application.DisplayAlerts = True
     
     
            End If
     
            ActiveSheet.Calculate
     
            MonFichier = vbNullString
     
     
    ' rechercher les valeurs de 1g et S_A0
     
     
            book.Worksheets(1).Activate
     
     
            lastRow = Range("D2").End(xlDown).Row
     
            Range("P2:P" & lastRow) = Application.IfError(Application.VLookup(Range("D2:D" & lastRow), Range("$H$2:$K$2", Range("$H$2:$K$2").End(xlDown)), 2, False), 0)
     
            Range("Q2:Q" & lastRow) = Application.IfError(Application.VLookup(Range("D2:D" & lastRow), Range("$H$2:$K$2", Range("$H$2:$K$2").End(xlDown)), 3, False), 0)
     
            Range("R2:R" & lastRow) = Application.IfError(Application.VLookup(Range("D2:D" & lastRow), Range("$H$2:$K$2", Range("$H$2:$K$2").End(xlDown)), 4, False), 0)
     
            Range("S2:S" & lastRow) = Application.IfError(Application.VLookup(Range("F2:F" & lastRow), Range("$H$2:$K$2", Range("$H$2:$K$2").End(xlDown)), 2, False), 0)
     
            Range("T2:T" & lastRow) = Application.IfError(Application.VLookup(Range("F2:F" & lastRow), Range("$H$2:$K$2", Range("$H$2:$K$2").End(xlDown)), 3, False), 0)
     
            Range("U2:U" & lastRow) = Application.IfError(Application.VLookup(Range("F2:F" & lastRow), Range("$H$2:$K$2", Range("$H$2:$K$2").End(xlDown)), 4, False), 0)
     
            lastrow1 = Range("D1").Value + 1
     
            ActiveSheet.Calculate
     
     
    ' faire les calculs des load cases
     
     
            ''// ICI je mes des formules que je ne peux pas montrer pour des raisons de confidetialité
     
            ActiveSheet.Calculate
     
    'faire les calculs de sigma
     
     
              ''// ICI je mes des formules que je ne peux pas montrer pour des raisons de confidetialité
     
     
            ActiveSheet.Calculate
     
    ' Méthode Dichotomie ( optimisation)
     
     
            epsi = 1
            xr = 150
            xl = 0
     
            Do While (xr - xl) > epsi
     
            h = (xr - xl) / 3
     
            xml = xl + h
            xmr = xr - h
     
                'ici formule avec variable xml
     
                ActiveSheet.Calculate
     
                'appelle à une autre macro pour la variable xml
     
     
                ActiveSheet.Calculate
     
                ' ici formule avec variable xmr
     
                ActiveSheet.Calculate
     
                'appelle à une autre macro pour la variable xmr
     
             ActiveSheet.Calculate
     
                resultXML = Range("AC2").Value
                resultXMR = Range("AE2").Value
     
                If resultXML < resultXMR Then
     
                xl = xml
     
                Else
     
                xr = xmr
     
            End If
     
            Loop
     
            xm = (xr + xl) / 2
     
     
            'ici formule pour la variable xm
     
             ActiveSheet.Calculate
     
            'appelle à une macro pour la variable xm
     
            Range("AH" & k + 1) = xm
     
            ActiveSheet.Calculate
     
            Range("AI" & k + 1) = Range("AG" & k + 1) ^ 4.5
     
            ActiveSheet.Calculate
     
     
        DoEvents
        Next k
     
     
            Range("AJ" & k + 1).Formula = "=max(AH2:AH5000)"
     
     
     
        If objFSO.FileExists("C:\temp\Results_Mon_Results\SIGeq_projection_1000.txt") Then
     
            objFSO.DeleteFile ("C:\temp\Results_Mon_Results\SIGeq_projection_1000.txt")
     
        End If
     
        If Not objFSO.FileExists("C:\temp\Results_Mon_Results\SIGeq_projection_1000.txt") Then
            objFSO.CreateTextFile ("C:\temp\Results_Mon_Results\SIGeq_projection_1000.txt")
        End If
     
        ActiveSheet.Calculate
     
        ' ici une formule
     
        ActiveSheet.Calculate
     
        Set oTxt = objFSO.OpenTextFile("C:\temp\Results_Mon_Results\SIGeq_projection_1000.txt", ForAppending, TristateUseDefault)
     
        ActiveSheet.Calculate
     
        oTxt.WriteLine Range("AK").Value
     
     
        Set objFSO = Nothing
        Set oTxt = Nothing
        k = 0
     
     
     
     
        book.Worksheets(1).Activate
        Cells.EntireColumn.AutoFit
     
     
        duree = Now - duree
        MsgBox ("opération terminée" & vbCrLf & duree)
     
        Application.StatusBar = False
        Application.ScreenUpdating = True
        Application.Calculation = xlCalculationAutomatic
        Application.EnableEvents = True
        ActiveSheet.DisplayPageBreaks = True
     
     
     
    End Sub
    j'espère que vous allez pouvoir trouver une autre astuce pour accélérer les calculs.
    Fichiers attachés Fichiers attachés

  8. #28
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    salut,

    je n'ai pas tout analysé, mais l'utilisation récurrente de
    me semble être logiquement la source des ralentissements

    autre piste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    book.Worksheets(1).Range("B1:B" & numligne).Value = ActiveSheet.Range("B1:B" & numligne).Value
                book.Worksheets(1).Range("C1:C" & numligne).Value = ActiveSheet.Range("C1:C" & numligne).Value
                book.Worksheets(1).Range("D1:D" & numligne).Value = ActiveSheet.Range("D1:D" & numligne).Value
                book.Worksheets(1).Range("E1:E" & numligne).Value = ActiveSheet.Range("E1:E" & numligne).Value
                book.Worksheets(1).Range("F1:F" & numligne).Value = ActiveSheet.Range("F1:F" & numligne).Value
                book.Worksheets(1).Range("G1:G" & numligne).Value = ActiveSheet.Range("G1:G" & numligne).Value
    pouvant devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    book.Worksheets(1).Range("B1:G" & numligne).Value = ActiveSheet.Range("B1:G" & numligne).Value
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  9. #29
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 32
    Par défaut
    Pour le activesheet.calculate, tu as raison. mais Excel ne pourra pas continuer les calcul correctement si il n'a pas les valeures calculées dans les cllules d'avant. :s


    pour le : book.Worksheets(1).Range("B1:G" & numligne).Value = ActiveSheet.Range("B1:G" & numligne).Value

    Je pense que j'avais eu des problème, de coup j'étais obligé de faire ligne par ligne. Mais je vais le réessayer et je te dirai si c'est bon ou pas.

  10. #30
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 32
    Par défaut
    OK.

    Le : book.Worksheets(1).Range("B1:G" & numligne).Value = ActiveSheet.Range("B1:G" & numligne).Value

    ça marche.

    Autres propositions?

    Sinon, je pense que ce qui prend plus du temps c'est la boucle for k=0 to 1000
    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
     
    For k = 1 To 1000
     
     
     
     
            Application.StatusBar = k & "/" & "1000"
     
            MonFichier = "C:\Temp\OUT_VOL\" & k & ".txt"
     
            If MonFichier <> False Then
     
     
     
                Workbooks.OpenText Filename:=MonFichier, DataType:=xlDelimited, ConsecutiveDelimiter:=True, Space:=True
    ...etc.
    Vue que j'ai 1000 fichiers texte à analyser, je suis obligé de faire une boucle à 1000. à votre avis, il n'y a pas d'autre solution à envisager qui soit plus rapide?!!!

  11. #31
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Hello,

    vu la quantité de données, un passage par Access ne serait-il pas envisageable ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  12. #32
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 32
    Par défaut
    Tu pense?! mais que dois-je traiter avec Access exactement?

    OK, à rssayer mais, j'ai jamais utilisé Access.

    Il y aurai pas des tutoriaux pour ça?

  13. #33
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Difficile de faire du nettoyage dans le code sans reprendre tout depuis le début...

    Premier point, corrige la déclaration de tes variables, ceci n'est pas correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim xl, xr, xml, xmr, xm, resultXML, resultXMR, h, epsi As Double
    Chaque variable doit être typée sinon par défaut elles prennent le type Variant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim xl As Double, xr As Double, xml As Double, xmr As Double, xm As Double, resultXML As Double, resultXMR As Double, h As Double, epsi As Double
    Idem pour les autres lignes de déclaration.
    Après on peut alléger en supprimant toute une série de variables qui ne servent à rien mais on verra ça éventuellement plus tard.

    Second point, il me semble que pour cette partie
    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
    For k = 1 To 1000
        Application.StatusBar = k & "/" & "1000"
        MonFichier = "C:\Temp\OUT_VOL\" & k & ".txt"
        If MonFichier <> False Then
            Workbooks.OpenText Filename:=MonFichier, DataType:=xlDelimited, ConsecutiveDelimiter:=True, Space:=True
            ActiveSheet.Rows(1).Delete
            numligne = ActiveSheet.Range("B1").End(xlDown).Row
            book.Worksheets(1).Range("A1").Value = ActiveSheet.Range("A1").Value
            book.Worksheets(1).Range("B1:B" & numligne).Value = ActiveSheet.Range("B1:B" & numligne).Value
            book.Worksheets(1).Range("C1:C" & numligne).Value = ActiveSheet.Range("C1:C" & numligne).Value
            book.Worksheets(1).Range("D1:D" & numligne).Value = ActiveSheet.Range("D1:D" & numligne).Value
            book.Worksheets(1).Range("E1:E" & numligne).Value = ActiveSheet.Range("E1:E" & numligne).Value
            book.Worksheets(1).Range("F1:F" & numligne).Value = ActiveSheet.Range("F1:F" & numligne).Value
            book.Worksheets(1).Range("G1:G" & numligne).Value = ActiveSheet.Range("G1:G" & numligne).Value
            Application.DisplayAlerts = False
            ActiveWorkbook.Close
            Application.DisplayAlerts = True
        End If
    on pourrait faire quelque chose de ce style
    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
    For k = 1 To 1000
        Application.StatusBar = k & "/" & "1000"
        MonFichier = "C:\Temp\OUT_VOL\" & k & ".txt"
        With book.Sheets(2).QueryTables.Add(Connection:="TEXT;" & MonFichier, Destination:=Range("$A$1")) '<-- feuille 2 dans le classeur qui servirait de feuille tampon
            .TextFileStartRow = 2
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote '<-- adapter ce qui délimite les colonnes dans le fichier texte
            .TextFileSemicolonDelimiter = True
            .Refresh BackgroundQuery:=False
        End With
        With book
            numligne = .Sheets(2).Range("B1").End(xlDown).Row
            .Sheets(1).Range("A1") = .Sheets(2).Range("A1")
            .Sheets(1).Range("B1:G" & numligne) = .Sheets(2).Range("B1:G" & numligne)
            .Sheets(2).UsedRange.ClearContents
        End With

  14. #34
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 32
    Par défaut
    Merci fring, bien joué pour les variables, je ne savais pas.

    sinon, pour le QueryTable, je pense que ça ne changera pas grande chose au niveau du temps de calcul. à confirmer. Je suis en train de tester.

  15. #35
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 32
    Par défaut
    Non. finalement, la différence entre les deux méthodes est quasi nulle. ça met le même temps de calcul.

  16. #36
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Citation Envoyé par yalmallo Voir le message
    sinon, pour le QueryTable, je pense que ça ne changera pas grande chose au niveau du temps de calcul. à confirmer. Je suis en train de tester.
    Il me semble que cela devrait être légèrement plus rapide et sur 1000 fichier ça peut jouer. Je n'ai pas vraiment analyser le reste du code.

    Mais comme te le disait JP, pour traiter autant de données, Excel n'est probablement pas le meilleur outils.

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/08/2017, 16h55
  2. [XL-2007] Application d'une macro sur plusieurs feuilles
    Par cattivo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/01/2015, 10h24
  3. Réponses: 1
    Dernier message: 11/02/2011, 14h14
  4. Macros sur Plusieurs fichiers Excel
    Par Echizen1 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2006, 11h21
  5. Réponses: 2
    Dernier message: 18/11/2005, 21h40

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