Использование памяти (ОЗУ) в Excel остается очень высоким после выполнения макроса - PullRequest
0 голосов
/ 25 марта 2019

Эта тема не нова в Интернете, но в действительности не документирована.

У меня есть документ Excel с 2 событиями (макросами), которые после выполнения продолжают замедлять работу моего Excel, увеличивая объем до 7 ГБ.или ОЗУ (из 16).Это безумие.Пока что единственное решение, которое я нашел для сброса памяти, - это повторно открыть документ (~ 150 МБ памяти при запуске).

Вот видео 1 мин , показывающее странное поведение памятииспользование в моем диспетчере задач после первого события (подробности см. ниже).Когда я запускаю 2-й макрос (около 30 с на видео), память почти сбрасывается, но сразу после завершения макроса память становится все выше и выше, даже если в книге ничего не выполняется.

• Первым событием является ручное обновление всех.В моем документе 36 только подключение запросов с 7 преобразовательными шагами (каждый запрос связан с таблицей), и последний запрос объединяет их все в исходной таблице, которая связана с сводной таблицей и диаграммами.Он работает без сбоев, но увеличивает объем оперативной памяти от 150 МБ до 4 ГБ, хотя обновление занимает всего 2 секунды.

• Второй запрос - импорт csv и копирование / вставка некоторых данных в одну таблицу.Это увеличивает оперативную память еще выше (6 / 7ГБ), хотя макрос запускается за 2 секунды.Каждый раз, когда я перезапускаю этот макрос, ОЗУ сбрасывается до 600 МБ, а затем возвращается к 7 ГБ, хотя больше ничего не происходит.

Код этого макроса удаляет запрос и лист, на который импортируется csv в конце процесса, плюс я также попробовал «Application.CutCopyMode = False» в случае, если мой буфер обмена был ответственным.Но нет, это намного больше.

Вот код второго макроса (имейте в виду, я новичок в VBA):

Sub importcsvdata()
Dim ActWks As Worksheet
Set ActWks = ActiveSheet
sPath = Application.GetOpenFilename()
On Error Resume Next
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    With ThisWorkbook
        .Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = "tempo-csv"
    End With
    Application.ScreenUpdating = False
    ActiveWorkbook.Queries.Add Name:="tempo-csv", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Source = Csv.Document(File.Contents(""" & sPath & """),[Delimiter="","", Columns=68, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & "    #""Promoted Headers"" = Table.PromoteHeaders(Source)," & Chr(13) & "" & Chr(10) & "    #""Changed Type"" = Table.TransformColumnTypes(#""Promoted Headers"",{{""Name"", type text}, {""Email""" & _
        ", type text}, {""Financial Status"", type text}, {""Paid at"", type datetimezone}, {""Fulfillment Status"", type text}, {""Fulfilled at"", type datetimezone}, {""Accepts Marketing"", type text}, {""Currency"", type text}, {""Subtotal"", type text}, {""Shipping"", type text}, {""Taxes"", type text}, {""Total"", type text}, {""Discount Code"", type text}, {""Discount " & _
        "Amount"", type text}, {""Shipping Method"", type text}, {""Created at"", type datetimezone}, {""Lineitem quantity"", Int64.Type}, {""Lineitem name"", type text}, {""Lineitem price"", type text}, {""Lineitem compare at price"", type text}, {""Lineitem sku"", type text}, {""Lineitem requires shipping"", type logical}, {""Lineitem taxable"", type logical}, {""Lineitem " & _
        "fulfillment status"", type text}, {""Billing Name"", type text}, {""Billing Street"", type text}, {""Billing Address1"", type text}, {""Billing Address2"", type text}, {""Billing Company"", type text}, {""Billing City"", type text}, {""Billing Zip"", type text}, {""Billing Province"", type text}, {""Billing Country"", type text}, {""Billing Phone"", Int64.Type}, {""" & _
        "Shipping Name"", type text}, {""Shipping Street"", type text}, {""Shipping Address1"", type text}, {""Shipping Address2"", type text}, {""Shipping Company"", type text}, {""Shipping City"", type text}, {""Shipping Zip"", type text}, {""Shipping Province"", type text}, {""Shipping Country"", type text}, {""Shipping Phone"", Int64.Type}, {""Notes"", type text}, {""Not" & _
        "e Attributes"", type text}, {""Cancelled at"", type text}, {""Payment Method"", type text}, {""Payment Reference"", type text}, {""Refunded Amount"", type text}, {""Vendor"", type text}, {""Id"", Int64.Type}, {""Tags"", type text}, {""Risk Level"", type text}, {""Source"", type text}, {""Lineitem discount"", type text}, {""Tax 1 Name"", type text}, {""Tax 1 Value""," & _
        " type text}, {""Tax 2 Name"", type text}, {""Tax 2 Value"", type text}, {""Tax 3 Name"", type text}, {""Tax 3 Value"", type text}, {""Tax 4 Name"", type text}, {""Tax 4 Value"", type text}, {""Tax 5 Name"", type text}, {""Tax 5 Value"", type text}, {""Phone"", Int64.Type}, {""Receipt Number"", type text}})," & Chr(13) & "" & Chr(10) & "    #""Extracted Date"" = Table.TransformColumns(#""Change" & _
        "d Type"",{{""Paid at"", DateTime.Date}})," & Chr(13) & "" & Chr(10) & "    #""Sorted Rows"" = Table.Sort(#""Extracted Date"",{{""Paid at"", Order.Ascending}})," & Chr(13) & "" & Chr(10) & "    #""Replaced Value"" = Table.ReplaceValue(#""Sorted Rows"",""."","","",Replacer.ReplaceText,{""Total""})," & Chr(13) & "" & Chr(10) & "    #""Changed Type1"" = Table.TransformColumnTypes(#""Replaced Value"",{{""Total"", Currency.Type}})," & Chr(13) & "" & Chr(10) & "    #""Added Conditio" & _
        "nal Column"" = Table.AddColumn(#""Changed Type1"", ""Custom"", each if Text.Contains([Payment Method], ""PayPal"") then ""PayPal"" else if Text.Contains([Payment Method], ""Stripe"") then ""Stripe"" else null )" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Added Conditional Column"""
    Application.ScreenUpdating = False
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""tempo-csv""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [tempo-csv]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = False
        .ListObject.DisplayName = "tempo_table"
        .Refresh BackgroundQuery:=False
    End With
    ActWks.Activate
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    If ActiveSheet.Name = "Janvier" Then
        ActiveSheet.ListObjects("Recettes_janvier").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("janvier").Range("Recettes_janvier[Date de commande]").End(Excel.xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("janvier").Range("Recettes_janvier[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("janvier").Range("Recettes_janvier[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("janvier").Range("Recettes_janvier[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("janvier").Range("Recettes_janvier[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("janvier").Range("Recettes_janvier[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Février" Then
        ActiveSheet.ListObjects("Recettes_février").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("février").Range("Recettes_février[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("février").Range("Recettes_février[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("février").Range("Recettes_février[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("février").Range("Recettes_février[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("février").Range("Recettes_février[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("février").Range("Recettes_février[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Mars" Then
        ActiveSheet.ListObjects("Recettes_mars").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("mars").Range("B14:B1500").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("mars").Range("C14:C1500").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("mars").Range("D14:D1500").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("mars").Range("E14:E1500").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("mars").Range("F14:F1500").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("mars").Range("G14:G1500").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Avril" Then
        ActiveSheet.ListObjects("Recettes_avril").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("avril").Range("Recettes_avril[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("avril").Range("Recettes_avril[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("avril").Range("Recettes_avril[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("avril").Range("Recettes_avril[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("avril").Range("Recettes_avril[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("avril").Range("Recettes_avril[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Mai" Then
        ActiveSheet.ListObjects("Recettes_mai").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("mai").Range("Recettes_mai[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("mai").Range("Recettes_mai[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("mai").Range("Recettes_mai[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("mai").Range("Recettes_mai[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("mai").Range("Recettes_mai[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("mai").Range("Recettes_mai[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Juin" Then
        ActiveSheet.ListObjects("Recettes_juin").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("juin").Range("Recettes_juin[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("juin").Range("Recettes_juin[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("juin").Range("Recettes_juin[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("juin").Range("Recettes_juin[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("juin").Range("Recettes_juin[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("juin").Range("Recettes_juin[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Juillet" Then
        ActiveSheet.ListObjects("Recettes_juillet").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("juillet").Range("Recettes_juillet[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("juillet").Range("Recettes_juillet[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("juillet").Range("Recettes_juillet[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("juillet").Range("Recettes_juillet[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("juillet").Range("Recettes_juillet[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("juillet").Range("Recettes_juillet[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Août" Then
        ActiveSheet.ListObjects("Recettes_août").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("août").Range("Recettes_août[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("août").Range("Recettes_août[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("août").Range("Recettes_août[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("août").Range("Recettes_août[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("août").Range("Recettes_août[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("août").Range("Recettes_août[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Septembre" Then
        ActiveSheet.ListObjects("Recettes_septembre").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("septembre").Range("Recettes_septembre[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("septembre").Range("Recettes_septembre[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("septembre").Range("Recettes_septembre[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("septembre").Range("Recettes_septembre[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("septembre").Range("Recettes_septembre[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("septembre").Range("Recettes_septembre[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Octobre" Then
        ActiveSheet.ListObjects("Recettes_octobre").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("octobre").Range("Recettes_octobre[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("octobre").Range("Recettes_octobre[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("octobre").Range("Recettes_octobre[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("octobre").Range("Recettes_octobre[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("octobre").Range("Recettes_octobre[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("octobre").Range("Recettes_octobre[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Novembre" Then
        ActiveSheet.ListObjects("Recettes_novembre").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("novembre").Range("Recettes_novembre[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("novembre").Range("Recettes_novembre[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("novembre").Range("Recettes_novembre[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("novembre").Range("Recettes_novembre[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("novembre").Range("Recettes_novembre[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("novembre").Range("Recettes_novembre[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    ElseIf ActiveSheet.Name = "Décembre" Then
        ActiveSheet.ListObjects("Recettes_décembre").ListRows.Add alwaysinsert:=True
        Worksheets("tempo-csv").Range("tempo_table[Paid at]").Copy
        Worksheets("décembre").Range("Recettes_décembre[Date de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Name]").Copy
        Worksheets("décembre").Range("Recettes_décembre[N° de commande]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Billing Name]").Copy
        Worksheets("décembre").Range("Recettes_décembre[Client]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Vendor]").Copy
        Worksheets("décembre").Range("Recettes_décembre[Type]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Total]").Copy
        Worksheets("décembre").Range("Recettes_décembre[Montant]").Find("").PasteSpecial Paste:=xlPasteValues
        Worksheets("tempo-csv").Range("tempo_table[Custom]").Copy
        Worksheets("décembre").Range("Recettes_décembre[Paiement]").Find("").PasteSpecial Paste:=xlPasteValues
    Else:
    End If
    Sheets("tempo-csv").Delete
    ActiveWorkbook.Queries("tempo-csv").Delete
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    Application.CutCopyMode = False
    Application.EnableEvents = True
End Sub

Что может помочь решить эту памятьвопрос?Я не нашел способа сбросить использование памяти.Кроме того, я даже не уверен, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...