Почему я получаю ошибку «несоответствие типов»? - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь скопировать диапазон из одной рабочей книги в таблицу в другой рабочей книге, чтобы получить производственные данные.Я могу скопировать правильный диапазон и открыть книгу с таблицей успешно.Однако, когда он пытается вставить информацию в следующую доступную строку в таблице, я получаю ошибку 13. Я довольно плохо знаком с vba и, похоже, не могу найти решение, любая помощь будет принята с благодарностью.

Dim wbTime As Workbook
   Set wbTime = ThisWorkbook

   Dim wbData As Workbook

   Dim N As Long
   N = Cells(Rows.Count, "A").End(xlUp).Row + 1

   Dim UsdRws As Long
   UsdRws = Cells.Find("*", After:=Range("A32"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

   wbTime.ActiveSheet.Range("A6:O" & UsdRws).Copy

   Set wbData = Workbooks.Open("S:\Lean Carrollton Initiative\Allen\Buffering Interrupters\1st Shift\B10\Data.xlsx")

   wbData.ActiveSheet.Paste Destination:=Worksheets(Sheet1).Range(N & "A")

   wbData.Close SaveChanges:=True
End Sub

Ответы [ 2 ]

0 голосов
/ 23 января 2019
Destination1:=Worksheets(Sheet1).Range(N & "A")

@ QHarr правильно идентифицировал проблему с Range(N & "A") и предложил исправление для ошибки несоответствия типов, которую вы получаете при Worksheets(Sheet1).

Я просто хотел объяснить, что происходит, более подробно, чем можно уместить в небольшом поле для комментариев.

Sheet1 - это неявно объявленная объектная переменная типа Worksheet, чей идентификатор времени компиляции определенпо свойству (Name) рабочего листа:

Sheet1 properties toolwindow showing the (Name) property

Если вы измените значение этого свойства, скажем, на SummarySheet, то Sheet1 больше не будет действительным идентификатором,и SummarySheet становится единым целым - и это является частью того, почему важно указывать Option Explicit в верхней части каждого модуля, потому что без него VBA будет успешно компилироваться и запускаться, за исключением того, что теперь Sheet1 является недопустимым, теперь оно не определеноVariant/Empty значение, которое может случайно передаваться случайно, что может усложнить отладку (то же самое относится к любой необъявленной переменной, а не только кодовым именам таблицы).

Итак Sheet1является Worksheet ссылкой на объект.Если бы Worksheet имел член по умолчанию , который возвратил значение его свойства Name, ваш код работал бы.

Но Worksheet не имеет члена по умолчанию, поэтому Worksheets(Sheet1) передает ссылку на объект Worksheet в качестве аргумента индексатору Worksheets.Item (неявно - поскольку Worksheets class имеет элемент по умолчанию, его Itemсвойство), которое ожидает Variant, содержащее либо имя листа (Variant/String), либо числовой индекс (Variant/Integer или Variant/Long).

Передача объекта Worksheet вWorksheets.Item - это то, что вызывает ошибку несоответствия типов .

Поэтому, если предположить, что лист Sheet1 является предполагаемым местом назначения, это исправит это (делая абстракцию ошибки параметра Rangeопределено ранее QHarr):

wbData.ActiveSheet.Paste Destination:=Sheet1.Range(...)

Нет необходимости извлекать рабочий лист, который существует во время компиляции в ThisWorkbook, из коллекции Worksheets.

Обратите внимание, чтов исходном коде:

Destination1:=Worksheets(Sheet1).Range(N & "A")

, поскольку Worksheets не квалифицированоWorkbook, к которому он принадлежит, неоднозначно: если этот код записан в ThisWorkbook, то Worksheets является вызовом члена против Me, то есть ThisWorkbook.Worksheets.В противном случае, это «удобно» неявно ссылается на независимо от того, какая книга активна в данный момент , и это часто является рискованным предположением для кода.

0 голосов
/ 23 января 2019

Ваш диапазон должен соответствовать правильному синтаксису

Range("A" & N)

Вы также можете использовать

Cells(N, "A")

, а sheet1 должно быть "Sheet1", т. Е. Worksheets("Sheet1").Sheet1 само по себе, без кавычек, будет рассматриваться как переменная.Если у вас нет строковой переменной с таким именем?Используйте Option Explicit вверху вашего модуля для проверки объявлений переменных.


Дополнительный комментарий от @MathieuGuidon:

Я добавлю, что Sheet1 является кодом по умолчаниюимя листа «Лист1» в новой книге;это идентификатор области проекта, который VBA создает бесплатно, давая вам ссылку во время компиляции на этот конкретный объект Worksheet - таким образом, получение этого объекта из коллекции Worksheets вообще избыточно: Sheet1.Range (...) будет предпочтительнее -и в идеале, свойство (Name) этого листа должно быть изменено на значимый идентификатор, например, SummarySheet, что делает SummarySheet.Range (...) легальным, без необходимости объявления какой-либо переменной SummarySheet

...