Не нужно отключать обновление экрана до тех пор, пока вы не запросите выбор диапазона, потому что при запуске макроса файл откроется, но экран не обновится, чтобы показать ячейки.
A несколько других указателей на ваш код:
- Вы используете переменные, которые вы не объявили (
sht
, srcData
). - Если вы используете переменную только один раз (например,
ans
из вашего MessageBox), просто подключите ее напрямую, вместо затемнения переменной и ее использования. Исключением будет использование константы, например числа. В этом случае всегда лучше использовать значимое имя переменной, чем жестко закодированное число без контекста. - Вы должны установить
Option Explicit
в верхней части вашего модуля, и вы будете предупреждены об этом с помощью необъявленных переменных. - Вы получаете
destinationSheet
и затем настраиваете sht
на то же самое. Почему бы просто не избавиться от sht
в целом? - Вместо того, чтобы смешивать соглашения об именах переменных (
src_data
и desiredSheetName
), просто выберите один и придерживайтесь его (я сам использую последний формат). - Выбор и активация вещей - обычно неправильный способ сделать это, если вы не делаете это, чтобы пользователь мог видеть что-то определенное c. Обычно вы должны просто выполнять операции над диапазонами и самими листами. Кроме того, вы должны четко указать используемый лист (потому что в противном случае по умолчанию используется ActiveSheet). Например:
Вместо:
Range("A:B,D:D").Select
Selection.Copy
dest.Activate
Range("F1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False
Do:
src_data.Range("A:B,D:D").Copy
dest.Range("F1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False
Это очень ясно показывает, откуда вы копируете и куда вы ' Это означает, что количество строк кода меньше, а также быстрее обрабатывается.
Итак, вот последний код с четко определенными переменными, без листов Select
, вырезанные неиспользуемые переменные .
Option Explicit
Sub LoadData()
Dim sourcePath As String
Dim sourceWorkbook As Workbook
Dim sourceWorksheet As Worksheet
Dim destinationWorksheet As Worksheet
Dim lastSourceRow As Long
Dim lastDestinationRow As Long
'Application.ScreenUpdating = False '==>Moved after InputBox
Application.DisplayAlerts = False
Set destinationWorksheet = ThisWorkbook.Worksheets("Destination")
If MsgBox("Choose the file to retrive the data?", vbYesNo, "Choose Source") = vbYes Then
sourcePath = Application.GetOpenFilename(, , "Browse for Workbook")
If sourcePath <> "False" Then
destinationWorksheet.Range("A2") = sourcePath
Set sourceWorkbook = Workbooks.Open(sourcePath)
On Error Resume Next
sourceWorksheet = Application.InputBox(prompt:="Select any cell inside the target sheet:", Type:=8).Worksheet
On Error GoTo 0
Application.ScreenUpdating = False
lastSourceRow = sourceWorksheet.Cells(Rows.Count, "C").End(xlUp).Row
lastDestinationRow = destinationWorksheet.Cells(destinationWorksheet.Rows.Count, "F").End(xlUp).Offset(0).Row
sourceWorksheet.Range("A:B,D:D").Copy
destinationWorksheet.Range("F1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, skipblanks:=False, Transpose:=False
sourceWorkbook.Close False
destinationWorksheet.Select
End If
Else
Exit Sub
End If
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub