Проблема памяти с макросом в Excel: как мне решить эту проблему? - PullRequest
0 голосов
/ 15 ноября 2018

У меня проблема с макросом в Excel.Здесь код.На самом деле есть довольно много подводных лодок, о которых я не сообщаю по вопросу космоса.Тем не менее, самый важный из них прилагается.

Sub randomdata_generator()
Application.ScreenUpdating = False
Application.DisplayAlerts = False


Dim FromProducts As Integer
Dim ToProducts As Integer
Dim StepProducts As Integer
Dim FromStations As Integer
Dim ToStations As Integer
Dim StepStations As Integer

FromProducts = Range("G1").Value
ToProducts = Range("I1").Value
StepProducts = Range("K1").Value
FromStations = Range("G2").Value
ToStations = Range("I2").Value
StepStations = Range("K2").Value

For h1 = FromProducts To ToProducts Step StepProducts
    For h2 = FromStations To ToStations Step StepStations
        Index = 0
        For xx1 = 1 To 17 Step 1 'NC
            x1 = h1
            x2 = h2
            Range("B1").Value = x1
            D = Application.WorksheetFunction.Round(x1 * 0.1, 0)
            E = Application.WorksheetFunction.Round(x1 * 0.2, 0)
            BAEG = Application.WorksheetFunction.Round(x1 * 0.35, 0)

            For xx2 = 1 To 5 Step 1
            If x2 >= x1 Then GoTo prossimo
                Range("B2").Value = x2
                Range("B4").Value = 20 * x2   'D

                For x3 = 1 To 5 'NI
                    Range("B3").Value = x3
                    If x3 > 1 Then
                        q = 3
                    Else
                        q = 1
                    End If
                    For g = 1 To q
                        x5 = 1
                        Range("B5").Value = x5                         

                        s = E
                        For i = 0 To s - 1
                            Range("A25").Offset(0, D + i).Value = 0.3
                            Range("A28").Offset(0, D + i).Value = 0.2
                            Range("A46").Offset(0, D + i).Value = 0.009 
                        Next

                    Next
               Next
            Next
        Next
    Next
Next

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Это часть кода, которая сохраняет новый созданный файл.

Sub salvanuovo()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
    Dim wbkCurrent As Workbook

    Index = Index + 1
    If Index Mod 200 = 0 Then
        newHour = Hour(Now())
        newMinute = Minute(Now()) + 1
        newSecond = Second(Now()) + 30
        waitTime = TimeSerial(newHour, newMinute, newSecond)
        Application.Wait waitTime
        DoEvents
    End If
    ActiveWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & "\Data\Dati(" & (x1 / 10) & "_" & (x2) & "_" & Index & ").xlsm" 'example: "C:\Users\lucag\Desktop\randomdata_generator_alternativa\Dati(" & Index & ").xlsm"
    Workbooks.Open Filename:=ThisWorkbook.Path & "\Data\Dati(" & (x1 / 10) & "_" & (x2) & "_" & Index & ").xlsm"
    Workbooks("Dati(" & (x1 / 10) & "_" & (x2) & "_" & Index & ").xlsm").Activate


    Sheets("Foglio1").Select                                                                                 
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\Data\Dati(" & (x1 / 10) & "_" & (x2) & "_" & Index & ").xlsx", _
    FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    Workbooks("Dati(" & (x1 / 10) & "_" & (x2) & "_" & Index & ").xlsx").Close
    Kill (ThisWorkbook.Path & "\Data\Dati(" & (x1 / 10) & "_" & (x2) & "_" & Index & ").xlsm")
    Set wbkCurrent = ActiveWorkbook
    wbkCurrent.Activate
    Set wbkCurrent = Nothing
End Sub

На следующем рисунке показана проблема.Память продолжает загружаться, пока Excel не падает.Любой намек на то, как решить эту проблему. введите описание изображения здесь

Нет. Копировать или. Вставить только некоторые. Значение присвоено

Selection.ClearContents
Range("A12").Select

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Проблема была связана с версией Excel.Как только я перешел на 64-разрядную версию Office 365, а не на 32-разрядную версию, которая была у меня раньше, все было решено.

0 голосов
/ 15 ноября 2018

Это не исчерпывающий ответ, это всего лишь начало.

Во-первых, Excel VBA обрабатывает Integer типы как Long внутри. Этот ответ показывает больше об этом.Поэтому я бы рекомендовал использовать Long, если это не относится к обратной совместимости для более старых версий Excel.

Далее я вижу, что вы используете функции рабочего листа.Вам не нужно

D = Application.WorksheetFunction.Round(x1 * 0.1, 0)

, поскольку его можно уменьшить до

D = Round(x1 * 0.1, 0)

Кроме того, вы получаете доступ крабочий лист безумное количество раз через вложенные циклы.На мой взгляд, было бы лучше ограничить время, в течение которого VBA должен взаимодействовать с диапазонами или рабочими таблицами, до минимального количества раз, например сохранять значения в массиве и выгружать полный массив в ячейки.

Кроме того, вы можете посмотреть этот ответ о проблемах с памятью, поскольку здесь можно найти несколько советов.

И в качестве общего примечания я бы рекомендовал использовать более значимыеимена переменных, особенно при представлении в SO, чтобы помочь людям определить, что происходит.

...