Объект 'ws1' создается отдельно и, хотя переменная является дочерним объектом 'wb1', сама переменная не является ее дочерним объектом, а только ссылкой на него. Допустимые стили ссылок:
ws1
wb1.Worksheets("Sheet1")
Кроме того, когда вы устанавливаете 'ws1', вы должны ссылаться на родительскую книгу в этой строке. Это изменит вашу строку 'ws1' следующим образом:
Set ws1 = wb1.Worksheets("Sheet1")
С этого момента вам нужно только ссылаться на 'ws1' в качестве объекта.
В качестве примечания при работе с другие рабочие книги, я рекомендую проверить, существует ли рабочая таблица или нет. Если вы жестко запрограммировали имя, а оно не существует, его изменили или вы допустили ошибку при вводе, это может привести к ошибке. Ниже приведена функция, которую вы можете использовать для проверки существования или отсутствия рабочего листа.
Function WorksheetExists( _
ByVal SheetName As String, _
Optional TargetBook As Workbook _
) As Boolean
If TargetBook Is Nothing Then
If ActiveWorkbook Is Nothing Then Exit Function
Set TargetBook = ActiveWorkbook
End If
On Error Resume Next
WorksheetExists = CBool(Len(TargetBook.Worksheets(SheetName).Name) <> 0)
On Error GoTo 0
End Function
Те же логики c применяются, если вы ищете книгу и вам необходимо знать, существует ли она, хотя функция для него будет немного другой, как показано в приведенном ниже коде.
Public Function ExistingFile( _
ByVal FilePath As String _
) As Boolean
Dim Attributes As Integer
On Error Resume Next
Attributes = GetAttr(FilePath)
ExistingFile = (Err.Number = 0) And (Attributes And vbDirectory) = 0
Err.Clear
End Function
Обратите внимание, что приведенная выше функция может вызвать ошибку, если имя файла слишком длинное.