Vba ошибка 9
Ошибка выполнения 9 в скрипте VBA
Так что в принципе у меня, вероятно, есть неубедительный вопрос. Я использовал VBA уже около двух часов, и я просто пытаюсь сделать макрос,который бы создавал новый speadsheet и копировал данные из существующего.
Я имел дело с ошибками компиляции, которые были, но теперь, когда я пытаюсь скомпилировать проект, я получаю «Run-time Error 9: Subscript out of range». В приведенном ниже коде ошибка возникает в строке, где переменной Name присваивается ее значение.
Я посмотрел на другие потоки с той же проблемой, но с моим ограниченным знанием VBA я не мог понять, что не так и будет ли этот код работать вообще. Любая помощь будет Вам очень признательна! Спасибо всем!
Ошибка 9 приходит в этой строке Имя = Рабочие Книги (DataBook).Листы(DataSheet).Диапазон («A2»).Текст
UPDATE
Я понял, почему у меня была эта ошибка — Я имел в виду книгу и рабочий лист со строковым типом переменной, поэтому я изменил ошибочную строку следующим образом:
Нет, я не получаю ошибку 9 , но я получаю ошибку 13: введите несоответствие , если следующая строка:
Есть какие-нибудь подсказки о том, что здесь не так? Еще раз спасибо!
3 Ответа
NewBook уже является объектом рабочей книги, поэтому правильный способ выполнения этого задания — это Set NewSheet = NewBook.Sheets(«Sheet1»)
Конструкция Workbooks(_something_) принимает строковый аргумент в качестве имени рабочей книги. То, что вы передаете вместо строки, является объектом рабочей книги, который вызовет ошибку, поскольку это не ожидаемый тип данных.
Для ухмылок вы могли бы сделать:
Но это явно избыточно, и отчасти разрушает цель использования объектных переменных в вашем коде.
NOTE Name также является полу-зарезервированным словом, так как это тип объекта в Excel . Хотя это не может вызвать никаких ошибок для вас, это может привести к путанице, и лично я стараюсь избегать использования имен переменных, которые идентичны или очень похожи на объекты.
В ответ на комментарий, который вы поставили под ответом Дэвида.
является потенциально опасным в сочетании с этим:
Причина? Подумайте об этом на секунду. это должно работать нормально IF книга, в которую встроен код, является ALSO текущей книгой. Однако если какая-либо книга OTHER активна в момент выполнения кода, то переменная DataSheet будет принимать имя листа в книге THAT, а не в объекте «ThisWorkbook». Следовательно, вы можете попросить VBA найти имя листа, которое, безусловно, существует в книге ACTIVE в данный момент, но может не существовать в книге «ThisWorkbook»; то есть в книге, из которой выполняется код.
Это, в свою очередь, даст вам ошибку подстрочного индекса вне диапазона или, другими словами, «вы ищете лист, который не существует в этой книге». (И снова я подчеркиваю: «ThisWorkbook»-это книга, из которой выполняется код, NOT (обязательно) — активная рабочая книга в то время.)
Либо измените ссылку DataBook на активную книгу, либо активируйте ThisWorkbook (в зависимости от вашего намерения), чтобы убедиться, что лист находится в той же книге, на которую вы ссылаетесь.
Спасибо за помощь! Все решилось само собой, когда я использовал другой подход в обращении к рабочим книгам. Это выглядит странно но кажется работает нормально:
Я решил, что мне не нужно ссылаться на конкретный рабочий лист, если меня интересует только стандартный, и он отлично работает сейчас!
Похожие вопросы:
Когда я хочу скопировать значения ячеек с одного листа на anoter в 6 книгах, которые открыты (в моем случае от Sheet1 ячеек (B9:E111) до Sheet2), я стою перед ошибкой: Ошибка времени выполнения 9.
У меня есть ошибка в Visual Basic, когда я пытаюсь использовать эту функцию Workbooks(C:Documents and SettingsNegatest.xls).Activate Ошибка говорит о том, что: Ошибка 9 во время выполнения.
Добрый день, я довольно много нового в VBA, и у меня есть проблема с указанием пути, рассмотрим следующее: x = Workbooks(ThisWorkbook.Path & / & 06-17.xlsx).Worksheets(1).Cells(2, 1).Value С.
Я немного новичок в VBA и получаю ошибку времени выполнения, которую не могу решить. У меня есть следующий код Dim vRange As Range Sheets(Vert E).Cells.FormatConditions.Delete With Sheets(Vert E).
Недавно я узнал о vba. Я сделал форму с некоторыми полями, эта функция полей листа копия диапазона ассортимент пасты Private Sub CommandButton1_Click() Dim barisawal As String Dim sampaiawal As.
Я запускаю vba, чтобы извлечь url из столбца гиперссылок текстов: Sub RemoveHyperlinks() Dim Cell As Range Dim i As Long Dim k As Long k = 1 Set Cell =.
Я пытаюсь создать функцию, которая принимает некоторые входы выбранной позиции и дня, а затем, используя вход дня, сканирует соответствующий лист для данных. Однако, передавая строку в.
Dim LastRow As Long With Workbooks(SampleBook).Sheets(SampleSheet) LastRow = .Cells(.Rows.Count, A).End(xlUp).Row End With Я использую этот код уже больше месяца. У меня не было никаких проблем.
Я пытаюсь выполнить следующую инструкцию в Microsoft Access с помощью VBA: Dim SQLText As String SQLText = INERT INTO [Tabela] VALUES (1, ‘1’); DoCmd.RunSQL SQLText Но я получаю сообщение об ошибке.
Я новичок в VBA и у меня есть следующий код для функции : Function checktype(ByVal modele As String) Dim srchRange As Range Dim book1 As Workbook ‘Set some Workbook variables: Set book1 =.
Типы ошибок в VBA
При выполнении макросов Excel могут возникнуть ошибки, которые в VBA делят на три категории:
Далее мы поговорим о каждом из трёх типов ошибок VBA подробно.
Ошибки компиляции
Компилятор VBA рассматривает ошибки компиляции как недопустимые и выделяет их в коде ещё до того, как дело дойдёт до запуска макроса.
Если при написании кода допущена синтаксическая ошибка, то редактор VBA сигнализирует об этом немедленно: либо при помощи окна с сообщением, либо выделяя ошибку красным цветом, в зависимости от статуса режима Auto Syntax Check.
Примечание: При включённом режиме Auto Syntax Check каждый раз, при появлении в редакторе Visual Basic во введённом коде синтаксической ошибки, будет показано соответствующее сообщение. Если же этот режим выключен, то редактор VBA продолжит сообщать о синтаксических ошибках, просто выделяя их красным цветом. Опцию Auto Syntax Check можно включить/выключить в меню Tools > Options редактора Visual Basic.
В некоторых случаях ошибка компиляции может быть обнаружена при выполнении компиляции кода, непосредственно перед тем, как макрос будет выполнен. Обычно ошибку компиляции несложно обнаружить и исправить, потому что компилятор VBA даёт информацию о характере и причине ошибки.
Например, сообщение “Compile error: Variable not defined” при попытке запустить выполнение кода VBA говорит о том, что происходит попытка использовать или обратиться к переменной, которая не была объявлена для текущей области (такая ошибка может возникнуть только если используется Option Explicit).
Ошибки выполнения
Ошибки выполнения возникают в процессе выполнения кода и приводят к остановке выполнения программы. Этот тип ошибок VBA, как правило, также не сложно обнаружить и исправить, так как сообщается информация о характере ошибки и место в коде, где произошла остановка.
Примером такой ошибки может служить попытка выполнить деление на ноль. В результате будет показано сообщение “Run-time error ’11’: Division by zero“.
В зависимости от структуры проекта VBA, может быть предложено выполнить отладку кода (как показано на рисунке ниже). В этом случае при нажатии на кнопку Debug (в окне сообщения о необходимости отладки) будет выделена цветом строка кода, которая стала причиной ошибки VBA.
Получив такое сообщение и видя выделенную строку кода, как в приведённом выше примере, обнаружить причину ошибки будет совсем не сложно.
В случае если код сложнее, чем в нашем примере, то, чтобы получить больше информации о причине возникновения ошибки VBA, можно проверить значения используемых переменных. В редакторе VBA для этого достаточно навести указатель мыши на имя переменной, или можно открыть окно отслеживания локальных переменных (в меню редактора View > Locals Window).
Коды различных ошибок выполнения расшифрованы на сайте Microsoft Support (на английском). Наиболее часто встречающиеся ошибки VBA перечислены в этой таблице:
Microsoft visual basic runtime error 9
К элементам массива и коллекции можно обращаться только в пределах их допустимых диапазонов. Elements of arrays and members of collections can only be accessed within their defined ranges. Эта ошибка имеет следующие причины и решения: This error has the following causes and solutions:
Вы обратились к несуществующему элементу массива. You referenced a nonexistent array element. Возможно, заданный индекс выходит за пределы диапазона допустимых индексов или размеры массива не соответствуют параметрам, присвоенным на данном этапе приложения. The subscript may be larger or smaller than the range of possible subscripts, or the array may not have dimensions assigned at this point in the application. Проверьте верхнюю и нижнюю границы, заданные при объявлении массива. Check the declaration of the array to verify its upper and lower bounds. Используйте функции UBound и LBound для доступа к массиву условий при работе с массивами, которые переносятся по размерам. Use the UBound and LBound functions to condition array accesses if you are working with arrays that are redimensioned. Если индекс массива задан как переменная, проверьте, правильно ли указано ее имя. If the index is specified as a variable, check the spelling of the variable name.
Массив был объявлен без определения числа элементов. You declared an array but didn’t specify the number of elements. Например, ниже показано сообщение об ошибке, полученное при запуске такого кода: For example, the following code causes this error:
В Visual Basic неявным образом изменяются неопределенные диапазоны массива в виде 0-10. Visual Basic doesn’t implicitly dimension unspecified array ranges as 0 — 10. Воспользуйтесь операторами Dim или ReDim, чтобы явно задать число элементов массива. Instead, you must use Dim or ReDim to specify explicitly the number of elements in an array.
Вы обратились к несуществующему элементу коллекции. You referenced a nonexistent collection member. Вместо указания индексов попробуйте обработать элементы массива с помощью конструкции For Each. Next. Try using the For Each. Next construct instead of specifying index elements.
Вы использовали краткую форму подстрочного скрипта, который неявно задается недопустимым элементом. You used a shorthand form of subscript that implicitly specified an invalid element. Например, при использовании параметра ! For example, when you use the ! оператор с коллекцией ! operator with a collection, the ! неявным образом указывает ключ. implicitly specifies a key. Например, Object! keyName . For example, object!keyname. значение эквивалентно Object. value is equivalent to object. элемент (keyName). item (keyname). оно. value. В этом случае возникает ошибка, если параметр keyName представляет недопустимый ключ в коллекции. In this case, an error is generated if keyname represents an invalid key in the collection. Чтобы устранить эту ошибку, используйте допустимое имя ключа или индекс для коллекции. To fix the error, use a valid key name or index for the collection.
Для получения дополнительной информации выберите необходимый элемент и нажмите клавишу F1 (для Windows) или HELP (для Macintosh). For additional information, select the item in question and press F1 (in Windows) or HELP (on the Macintosh).
Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Interested in developing solutions that extend the Office experience across multiple platforms? Ознакомьтесь с новой моделью надстроек Office. Check out the new Office Add-ins model. У надстроек Office мало места по сравнению с надстройками и решениями VSTO, которые можно создавать с помощью практически любой технологии веб-программирования, например HTML5, JavaScript, CSS3 и XML. Office Add-ins have a small footprint compared to VSTO Add-ins and solutions, and you can build them by using almost any web programming technology, such as HTML5, JavaScript, CSS3, and XML.
Поддержка и обратная связь Support and feedback
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь. Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
I am new to VBA so I have a very basic understand of it and currently having an issue when running the following code:
An error pops up when I press run saying «Run-time error ‘9’: subscript out of range and the debug highlights CustName = custnames(num) . The goal of this code is to fill in a table with 30,000 records.