2017-10-05 4 views
1

J'ai du code dans VBA et avec un grand nombre de lignes, il utilise trop de mémoire - il peut prendre quelques Go et faire l'écraser. Code prendre numéro demander au serveur pour XLM trouver des données et les écrire que d'aller à un autre numéro. S'il y a plus de 500 lignes, il écrase. Pourriez-vous m'aider à optimiser le code pour gérer environ 10 000 lignes? Merci pour votre aide MarekOptimisation de code VBA

Sub ares() 
Application.Calculation = xlCalculationManual 
Application.ScreenUpdating = False 'potlačí obnovování obrazovky 
Application.DisplayAlerts = False 'potlačí varovné hlášky 
Application.DisplayStatusBar = False 
Application.EnableEvents = False 
ActiveSheet.DisplayPageBreaks = False 

Dim i As Integer 
Dim row As Integer 
Dim column As Integer 

For i = 2 To 15000 

    Sheets.Add(After:=Sheets(Sheets.Count)).Name = "ares" 
    Sheets("ares").Activate 

    On Error GoTo ErrorHandler 
    ActiveWorkbook.XmlImport URL:="http://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?ico=" & Worksheets("ico").Cells(i, 1).Value, ImportMap:=Nothing, Overwrite:=True, Destination:=Range("$A$1") 

    If Worksheets("ares").Cells(2, 10).Value = "" Then 

     Worksheets("ico").Cells(i, 2).Value = "OK" 


     row = 2 
     column = 3 
     Do While Worksheets("ares").Cells(row, 1).Value <> "" 
      If Worksheets("ares").Cells(row, 167).Value <> "" Then 
       Worksheets("ico").Cells(i, column).Value = Worksheets("ares").Cells(row, 167).Value 
       column = column + 1 
      End If 

     row = row + 1 
     Loop 
    Else 
     Worksheets("ico").Cells(i, 2).Value = Worksheets("ares").Cells(2, 10).Value 
    End If 
ErrorResume: 

    Sheets("ares").Delete 

Next i 

Application.ScreenUpdating = True 'zapne obnovování obrazovky 
Application.DisplayAlerts = FaTruelse 'obnoví varovné hlášky 
Application.Calculation = xlCalculationAutomatic 
Application.DisplayStatusBar = True 
Application.EnableEvents = True 
ActiveSheet.DisplayPageBreaks = True 


Exit Sub 
ErrorHandler: 
    Worksheets("ico").Cells(i, 2).Value = "Jiná chyba" 
Resume ErrorResume 

End Sub 
+0

'Application.DisplayAlerts = FaTruelse « obnoví varovné hlášky' - c'est un nouveau booléen :) – Vityata

+0

De toute façon, vous pouvez importer des données et de définir votre cellule ico sans ajouter et supprimer une feuille de temps. peut-être réutiliser une feuille? – MacroMarc

Répondre

0

Retirez Sheets("ares").Activate et changer Integer à Long. Cela devrait suffire.

Vous n'avez pas besoin d'activer la feuille de calcul, dans la mesure où vous faites référence à une feuille de calcul partout correctement.

En ce qui concerne le nombre entier, il vous donne une vitesse mineure up - Why Use Integer Instead of Long?

+0

Je l'ai fait et il pourrait être peu utile mais pas assez. Si je le fais tourner pour 1000 lignes, le fichier final est d'environ 60 000 Ko alors que le fichier normal avec les mêmes données est petit, mais je n'ai pas pu trouver pourquoi il est si grand. –