У меня есть 2 файла. Первый файл, который уже будет открыт, когда пользователь запустит макрос, имеет 5 рабочих листов. Каждый рабочий лист содержит столбец «Элемент заказа» в другом месте. Пример рабочего листа будет выглядеть примерно так
-Date Time Order-item Order-Quanity
-1020 9:30 item533333 (blank)
-1020 7:30 item733333 (blank)
-1020 2:30 item333332 (blank)
-1020 6:30 item121242 (blank)
После запуска макроса пользователь выберет файл для открытия, который выглядит следующим образом:
-Order-item Order-Quantity
-item121242 183
-item333332 515
-item533333 27
-item333332 761
Затем макрос проходит через каждый рабочий лист из исходного файла. На каждом листе он находит, где находится столбец элемента заказа, а затем просматривает каждый элемент в столбце. Он ищет в выбранном пользователем файле элемент заказа (обычно столбец A) и ищет количество (всегда рядом со столбцом элемента заказа, в данном случае столбец B).
После запуска исходный рабочий лист должен выглядеть так:
-Date Time Order-item Order-Quanity
-1020 9:30 item533333 27
-1020 7:30 item733333 515
-1020 2:30 item333332 761
-1020 6:30 item121242 183
Я создал макрос, который делает это, но поскольку оба файла довольно большие (исходный файл содержит около 10 000 строк, а открытый пользователем файл содержит до 50 000 строк), мой макрос требует некоторого времени для выполнения. Я понимаю, что могу просто выполнить Vlookup, заполнить, а затем вставить значения, и это будет намного быстрее; однако это часть более крупного макроса автоматизации, и это невозможно. Есть ли какие-либо улучшения, которые кто-нибудь мог бы предложить, чтобы мой код работал более эффективно или быстрее? Если это так, дайте мне знать. Спасибо!
Public Sub OpenFile()
Dim FilePath As Variant
Dim FileName As String
Dim CurrentWorkbook As String
Dim thisWB As Workbook
Dim openWB As Workbook
Dim sh As Worksheet
Dim lastRow As Long
Dim myRange As Range
Dim FoundCell As Range
Dim counter1 As Long
Dim counter2 As Long
Dim orderColumn As Long
Set thisWB = Application.ActiveWorkbook
CurrentWorkbook = Application.ActiveWorkbook.Name
FilePath = Application.GetOpenFilename(FileFilter:= _
"Excel Workbook Files(*.xl*),*.xl*", MultiSelect:=False, Title:="Select File")
If Not FilePath = False Then
FileName = FilePath
Set openWB = Application.Workbooks.Open(FileName)
FileName = Mid(FileName, InStrRev(FileName, "\") + 1, Len(FileName)) 'extracts filename from path+filename
Else
MsgBox ("File not selected or selected file not valid")
Exit Sub
End If
Application.Workbooks(FileName).Activate
'--------------------------------------------------------------------------------------------------
'--------------gets table range from input box. Defailt is Row A,B--------------------------------
'--------------------------------------------------------------------------------------------------
Set myRange = Application.InputBox( _
"Select Table Range. First Column should be Order-item, Second Column should be Order Grade", _
"Select Range", "$A:$B", , , , , 8)
On Error GoTo 0
'for every worksheet in currentworkbook, find how many rows there are.and find location of _
order-item. then go through each row in the order-item column and compare to column A(order-item) _
on the user selected workbook. if match is found, place column B into order-item column+1
Application.ScreenUpdating = False
For Each sh In thisWB.Worksheets
lastRow = LastRowUsed(sh)
'Find Order Column
Set FoundCell = sh.Rows(1).Find(what:="Order-Item", LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not FoundCell Is Nothing Then
orderColumn = FoundCell.Column
Else
MsgBox ("Couldn't find ""Order-Item"" in Header, exiting macro")
Exit Sub
End If
For counter1 = lastRow To 1 Step -1
For counter2 = myRange.Rows.Count To 1 Step -1
If sh.Cells(counter1, orderColumn) = myRange.Cells(counter2, 1).Value Then
sh.Cells(counter1, orderColumn + 1) = myRange.Cells(counter2, 2)
Exit For
End If
Next
Next
Next
Application.ScreenUpdating = True
End Sub