Когда я запускаю этот код, мой ноутбук зависает и не выполняет никаких задач, как я могу это исправить? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть книга Excel, в которой я архивирую данные. Я беру данные с основного листа и архивирую их на другом листе.

Это код, который я выполняю для этого, но когда я его запускаю, он замораживает мой ноутбук и ничего не выполняет:

Sub trasnfer()

Dim i  As Long, j As Long, lastrow1 As Long, lastrow2 As Long
Dim SSL As String
Dim Baureihe As String
Dim Produktionsjahr As String
Dim Garantiejahr As String
Dim RateEA1 As String
Dim RateEa2 As String

Application.screenupdating = false
lastrow1 = Sheets("Transponieren").Range("A" & Rows.Count).End(xlUp).Row

For i = 2 To lastrow1

    SSL = Sheets("Transponieren").Cells(i, "A").Value
    Baureihe = Sheets("Transponieren").Cells(i, "B").Value
    Produktionsjahr = Sheets("Transponieren").Cells(i, "C").Value
    Garantiejahr = Sheets("Transponieren").Cells(i, "D").Value
    RateEA1 = Sheets("Transponieren").Cells(i, "E").Value

    Sheets("Absatzmenge").Activate
    lastrow2 = Sheets("Absatzmenge").Range("A" & Rows.Count).End(xlUp).Row

    For j = 2 To lastrow2

        If Sheets("Absatzmenge").Cells(j, "A").Value = Baureihe Then
            If Sheets("Absatzmenge").Cells(j, "B").Value = Produktionsjahr Then
            'If Sheets("Absatzmange").Cells(j, "C").Value = Produktionsjahr Then
            'If Sheets("Absatzmenge").Cells(j, "D").Value = Garantiejahr Then
            'If Sheets ("Absatzmenge").Cells(j, "E").Value = RateEA1 then

                Sheets("Transponieren").Activate
                Sheets("Transponieren").Range(Cells(i, "A").Cells(i, "E")).Copy
                Sheets("Absatzmenge").Activate
                Sheets("Absatzmenge").Range(Cells(j, "E").Cells(j, "H")).Select
                ActiveSheet.Paste
            End If
        End If

    Next j
    Application.CutCopyMode = False
Next i

Application.screenupdating = True
Sheets("Transponieren").Activate
Sheets("Transponieren").Range("A1").Select

End Sub

Я пробовал на очень мощном ПК, но он делает то же самое. Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Поскольку ваши две рабочие таблицы кажутся табличными по структуре со столбцами в первой строке и данными, начинающимися со второй, и вы по существу обогащаете строки во второй таблице информацией из совпадающих строк первой таблицы, рассмотрите возможность объединения SQL двумя таблицами иэкспортировать нужные столбцы.

Если вы используете Excel для Windows, вы можете подключиться к самой книге с помощью JET / ACE SQL Engine для запросов к различным диапазонам / таблицам.

SQL (объединение влево для сохранения всех строк целевого листа и получения «обогащающих» столбцов)

ПРИМЕЧАНИЕ. Обязательно замените столбцы фактическими заголовками первой строки. Ниже встроен VBA.

SELECT t.ColumnA, t.ColumnB, t.ColumnC, t.ColumnD, t.ColumnE
FROM [Absatzmenge$] a
LEFT JOIN [Transponieren$] t 
   ON t.[ColumnB] = a.[ColumnA] AND t.[ColumnC] = a.[ColumnB]

VBA (без циклов, без массивов, без копирования / вставки, без выбора / активации)

Sub RunSQL()
On Error GoTo ErrHandle
    Dim conn As Object, rst As Object
    Dim sql as String

    ' INITIALIZE ADO OBJECTS
    Set conn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")

    sql = "SELECT t.ColumnA, t.ColumnB, t.ColumnC, t.ColumnD, t.ColumnE" _
           & " FROM [Absatzmenge$] a " _
           & " LEFT JOIN [Transponieren$] t " _
           & "   ON t.[ColumnB] = a.[ColumnA] AND t.[ColumnC] = a.[ColumnB]"

    ' OPEN RECORDSET
    conn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
                  & "Dbq=" & ThisWorkbook.FullName & ";"
    rst.Open, conn

    ' EXPORT RESULTS STARTING IN E2 CELL
    ThisWorkbook.Worksheets("Absatzmenge").Range("E2").CopyFromRecordset rst

    ' CLOSE AND RELEASE OBJECTS
    rst.Close: conn.Close

ExitHandle:
    Set rst = Nothing: Set conn = Nothing
    Exit Sub

ErrHandle:
    MsgBox Err.Number & " - " & Err.Description, vbCritical, "RUNTIME ERROR"
    Resume ExitHandle
End Sub
0 голосов
/ 07 октября 2019

Я сделал некоторые улучшения эффективности (пожалуйста, обратитесь к комментариям для объяснения некоторых из них). Самые большие улучшения появятся в результате отказа от .Select и деактивации ScreenUpdating. Во втором цикле For вы также должны рассмотреть возможность добавления Exit For, в зависимости от того, сколько совпадений вы ищете для каждой точки данных. Вам также не нужно искать lastrow2 для каждого i, достаточно одного раза.

Sub trasnfer()

Application.ScreenUpdating = False

Dim i  As Long, j As Long, lastrow1 As Long, lastrow2 As Long
Dim SSL As String
Dim Baureihe As String
Dim Produktionsjahr As String
Dim Garantiejahr As String
Dim RateEA1 As String
Dim RateEa2 As String


lastrow1 = Sheets("Transponieren").Range("A" & Rows.Count).End(xlUp).Row
lastrow2 = Sheets("Absatzmenge").Range("A" & Rows.Count).End(xlUp).Row

For i = 2 To lastrow1

    SSL = Sheets("Transponieren").Cells(i, "A").Value
    Baureihe = Sheets("Transponieren").Cells(i, "B").Value
    Produktionsjahr = Sheets("Transponieren").Cells(i, "C").Value
    Garantiejahr = Sheets("Transponieren").Cells(i, "D").Value
    RateEA1 = Sheets("Transponieren").Cells(i, "E").Value

    For j = 2 To lastrow2

        If Sheets("Absatzmenge").Cells(j, "A").Value = Baureihe And _
        Sheets("Absatzmenge").Cells(j, "B").Value = Produktionsjahr Then
        'If Sheets("Absatzmange").Cells(j, "C").Value = Produktionsjahr Then
        'If Sheets("Absatzmenge").Cells(j, "D").Value = Garantiejahr Then
        'If Sheets ("Absatzmenge").Cells(j, "E").Value = RateEA1 then

            Sheets("Transponieren").Range("A" & i & ":E" & i).Copy _
            Destination:=Sheets("Absatzmenge").Range("E" & j)
            Application.CutCopyMode = False
            'If you are only looking for one match per data point you should add "Exit For" here
            'to continnue with the next line in the sheet "Transponieren"
        End If

    Next j
Next i

Sheets("Transponieren").Activate
Sheets("Transponieren").Range("A1").Select

Application.ScreenUpdating = True

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