Я новичок в Excel VBA и не испытываю большого опыта. У меня есть два листа данных, которые я сравниваю, а затем, если значение соответствует мне, я копирую и вставляю его во второй рабочий лист. Я использую для циклов, чтобы сравнить каждую строку и задавался вопросом, есть ли лучший способ сделать это? В настоящее время я использую грубую силу и надеялся, что будет так, что моя программа не будет работать очень долго. (Я повторяю этот блок кода на разных листах 13 раз). По сути, этот код объединяет информацию, если она соответствует определенным условиям. Ниже мой код.Как циклы сравнения рефакторинга в моем коде excel vba для скорости?
Sub consolidate(z)
Sheets(z).Range("B1:AXH100").Delete '''deletes former values'''
For i = 1 To 30
For x = 1 To 500
If IsEmpty(Sheets("Sheet1").Cells(x, 13)) Then 'if cell value is empty skip it'
a = 1
Else:
If Sheets("Sheet1").Cells(x, 18) = Sheets(z).Cells(1, 1) Then 'check to see if value is same'
If Sheets("Sheet1").Cells(x, 13) = Sheets(z).Cells(i, 1) Then 'check to see if value is same'
Sheets("Sheet1").Cells(x, 15).Copy 'copy value'
Sheets(z).Select 'select second sheet'
Cells(i, 1).Select
ActiveSheet.Cells(ActiveCell.Row, Columns.Count).End(xlToLeft).Offset(0, 1).Select 'offsets cell to the
left'
Selection.PasteSpecial past:=xlPasteValues 'pastes'
End Sub
Где бы вы ни старались, вы должны стараться избегать использования ячеек, поскольку это приводит к обновлению экрана, что происходит медленно. Вы можете попробовать поставить Application.ScreenUpdating = False в начале, чтобы убедиться, что это улучшает его. Здесь альтернативы для выбора задаются как [link] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – Clusks
Код кажется неполным (отсутствует 'Next 's abd' End If's ') Вы также можете избежать использования' Copy' и просто ввести значения непосредственно, как в 'targetRange.Value = sourceRange.Value'. – arcadeprecinct