Справка VBA — ошибка времени выполнения 5: недопустимый вызов процедуры или аргумент, только при первом запуске

#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