в жестком коде
в жестком коде?Это означает, что используются кодовые имена листов, поэтому вы просто пишете, например, Sheet1.Name, Sheet2.Rows.Count и т. Д. Вы можете найти кодовое имя в VBE (F11).Когда вы щелкаете лист, в первой строке окна свойств отображается свойство (name) , где вы также можете изменить его.Но интересная часть заключается в том, что вы можете переименовать свои листы через вкладку листа, и код все равно будет работать.
Вы должны всегда использовать Option Explicit перед любым кодом в модуле, потому что онукажет, есть ли ошибка в коде.
Используйте константы в начале процедуры (Sub или Function) для чисел и строк, так что вы будетелегко найти их, и если вы хотите изменить их, вам нужно будет сделать это только один раз .Представьте, что вы больше не будете получать данные из столбца 15, а только данные из столбца 12. Вам придется многократно изменять их в своем коде, но с помощью констант вы меняете его только один раз .
Поскольку я не знаю, что находится в столбцах, я использовал общие имена переменных, но вы всегда должны использовать более описательных таких, как intSource, lngData, objWbSource,objWsTarget, rngValues, intCount и т. д.
Используйте оператор With ... End With , особенно для рабочих листов, не только для того, чтобы не вводить их имя много раз, но чтобы сделать код более для чтения для других или для себя, например, через месяцы или годы.
В этом коде использовался другой способ (с использованием метода поиска) определения последней использованной строки ,единственное отличие заключается в предпочтительном способе, например .Cells (Rows.Count, 1) .End (xlUp) .Row, что он не будет пропускать последнюю строку, если у вас есть данные.
Option Explicit
Sub CopyBasedonSheet1()
' Columns in Sheet1
Const cInt1_1 As Integer = 15 ' O
Const cInt1_2 As Integer = 23 ' W
Const cInt1_3 As Integer = 24 ' X
Const cInt1_4 As Integer = 25 ' Y
Const cInt1_5 As Integer = 26 ' Z
Const cInt1_6 As Integer = 27 ' AA
Const cInt1_7 As Integer = 28 ' AB
' Columns in Sheet2
Const cInt2_1 As Integer = 2 ' B
Const cInt2_2 As Integer = 7 ' G
Const cInt2_3 As Integer = 8 ' H
Const cInt2_4 As Integer = 15 ' O
Const cStrSearch1 As String = "IRA"
Const cStrSearch2 As String = "TPSD"
Const cStrSearch3 As String = "CA"
Dim lngLR1 As Long ' Sheet1 Last Used Row
Dim lngLR2 As Long ' Sheet2 Last Used Row
Dim lng1 As Long ' Sheet1 Row Counter
Dim lng2 As Long ' Sheet2 Row Counter
' Sheet2
With Sheet2
' Last Row Sheet2
lngLR2 = .Range(.Cells(1, cInt2_1), .Cells(Rows.Count, cInt2_1)) _
.Find(What:="*", After:=.Cells(1, cInt2_1), _
LookIn:=xlFormulas, Lookat:=xlWhole, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Row
End With
' Sheet1
With Sheet1
' Last Row Sheet1
lngLR1 = .Range(.Cells(1, cInt1_1), .Cells(Rows.Count, cInt1_1)) _
.Find(What:="*", After:=.Cells(1, cInt1_1), _
LookIn:=xlFormulas, Lookat:=xlWhole, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Row
For lng1 = 1 To lngLR1
For lng2 = 1 To lngLR2
' Check if Engagement # from Sheet1 matches Sheet2
If .Cells(lng1, cInt1_1).Value = Sheet2.Cells(lng2, cInt2_1).Value _
Then
Select Case Sheet2.Cells(lng2, cInt2_2).Value
Case cStrSearch1
.Cells(lng1, cInt1_2).Value = Sheet2.Cells(lng2, cInt2_3).Value
.Cells(lng1, cInt1_3).Value = Sheet2.Cells(lng2, cInt2_4).Value
Case cStrSearch2
.Cells(lng1, cInt1_4).Value = Sheet2.Cells(lng2, cInt2_3).Value
.Cells(lng1, cInt1_5).Value = Sheet2.Cells(lng2, cInt2_4).Value
Case cStrSearch3
.Cells(lng1, cInt1_6).Value = Sheet2.Cells(lng2, cInt2_3).Value
.Cells(lng1, cInt1_7).Value = Sheet2.Cells(lng2, cInt2_4).Value
Case Else
End Select
Else
End If
Next
Next
End With
End Sub