#vba #copy #runtime-error
#vba #Копировать #ошибка времени выполнения
Вопрос:
В строке 37 «sh_DP_old» сообщается «Ошибка времени выполнения ‘5’: недопустимый вызов процедуры или аргумент».Копировать после:=sh_new» только при первом запуске. После нажатия «debug» и ничего не делая, кроме повторного запуска кода, он работает хорошо. Ниже приведен код. Мы будем очень признательны за любую помощь.
Option Explicit
Public Function SheetFromCodeName(aName As String, wb As Workbook) As Worksheet
Dim sh As Worksheet
For Each sh In wb.Worksheets
If sh.CodeName = aName Then
Set SheetFromCodeName = sh
Exit For
End If
Next sh
End Function
Sub Note_Transfer()
Dim lastrow As Long
Dim MatchRow As Long
Dim firstopenrow As Long
Dim i As Long
Dim sh_old As Worksheet
Dim sh_new As Worksheet
Dim sh_DP_old As Worksheet
Dim sh_DP_new As Worksheet
Dim wb_old As Workbook
Dim wb_new As Workbook
Set wb_old = Workbooks(Workbooks.Count - 1)
Set wb_new = Workbooks(Workbooks.Count)
Set sh_old = SheetFromCodeName("Sheet1", wb_old)
Set sh_new = SheetFromCodeName("Sheet1", wb_new)
' transfer note if record matches
Set sh_DP_old = wb_old.Sheets("Discharged Patient")
sh_DP_old.Copy After:=sh_new
Set sh_DP_new = wb_new.Sheets("Discharged Patient")
lastrow = sh_old.Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastrow
If sh_old.Cells(i, 25) <> "Discharged patient" Then
MatchRow = Application.WorksheetFunction.Match(sh_old.Cells(i, 23).Value, sh_new.Range("W:W"), 0)
sh_new.Cells(MatchRow, 26).Resize(, 7).Value = sh_old.Cells(i, 26).Resize(, 7).Value
Else
firstopenrow = sh_DP_new.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Row
sh_DP_new.Cells(firstopenrow, 1).Resize(, 32).Value = sh_old.Cells(i, 1).Resize(, 32).Value
End If
Next
sh_new.Select
End Sub
Комментарии:
1. Ваш
SheetFromCodeName
возвращаетNothing
, если он не может найти лист, и вы не проверяетеNothing
перед передачей результата вAfter:=
.2. Установите точку останова на sh_DP_old. Копировать после:=sh_new . Выполнить. Проверьте sh_DP_old. Допустимо ли это? и т.д…
3. sh_DP_old допустим. Однако при проверке сообщается «Ошибка времени выполнения ’91’: переменная объекта или с переменной блока не установлена»?sh_new.Name.
4. Проблема решена. Сначала щелкните Доверенный доступ к объектной модели проекта VBA через настройки макроса Excel. Во-вторых, замените ‘Set sh_old = SheetFromCodeName(«Sheet1», wb_old) Set sh_new = SheetFromCodeName(«Sheet1», wb_new)’ на ‘With wb_old Set sh_old = .Worksheets(CStr(.VBProject. VB components(«Sheet1»). Свойства (7))) Завершите с помощью wb_new Set sh_new = .Worksheets(CStr(.VBProject. VB components(«Sheet1»). Свойства (7))) Завершается ‘. И благодарность @John_Cunningham от Udemy.
Ответ №1:
Сначала щелкните Доверенный доступ к объектной модели проекта VBA через настройки макроса Excel. Во-вторых, заменить
Set sh_old = SheetFromCodeName("Sheet1", wb_old)
Set sh_new = SheetFromCodeName("Sheet1", wb_new)
с
With wb_old
Set sh_old = .Worksheets(CStr(.VBProject.VBComponents("Sheet1").Properties(7)))
End With
With wb_new
Set sh_new= .Worksheets(CStr(.VBProject.VBComponents("Sheet1").Properties(7)))
End With
И благодарность @John_Cunningham от Udemy.
Ниже вставлен весь измененный код.
Option Explicit
Private Function SheetFromCodeName(aName As String, wb As Workbook) As Excel.Worksheet
Dim sh As Worksheet
For Each sh In wb.Worksheets
If sh.CodeName = aName Then
Set SheetFromCodeName = sh
Exit For
End If
Next sh
End Function
Sub Note_Transfer()
Dim lastrow As Long
Dim MatchRow As Long
Dim firstopenrow As Long
Dim i As Long
Dim sh_old As Worksheet
Dim sh_new As Worksheet
Dim sh_DP_old As Worksheet
Dim sh_DP_new As Worksheet
Dim wb_old As Workbook
Dim wb_new As Workbook
Set wb_old = Workbooks(Workbooks.Count - 1)
Set wb_new = Workbooks(Workbooks.Count)
With wb_old
Set sh_old = .Worksheets(CStr(.VBProject.VBComponents("Sheet1").Properties(7)))
End With
With wb_new
Set sh_new = .Worksheets(CStr(.VBProject.VBComponents("Sheet1").Properties(7)))
End With
' transfer note if record matches
Set sh_DP_old = wb_old.Sheets("Discharged Patient")
sh_DP_old.Copy After:=sh_new
Set sh_DP_new = wb_new.Sheets("Discharged Patient")
lastrow = sh_old.Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastrow
If sh_old.Cells(i, 25) <> "Discharged patient" Then
MatchRow = Application.WorksheetFunction.Match(sh_old.Cells(i, 23).Value, sh_new.Range("W:W"), 0)
sh_new.Cells(MatchRow, 26).Resize(, 7).Value = sh_old.Cells(i, 26).Resize(, 7).Value
Else
firstopenrow = sh_DP_new.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Row
sh_DP_new.Cells(firstopenrow, 1).Resize(, 32).Value = sh_old.Cells(i, 1).Resize(, 32).Value
End If
Next
sh_new.Select
End Sub