VBA-подзаголовок вне допустимого диапазона – ошибка 9

Может ли кто-нибудь помочь мне с этим кодом, я получаю сообщение об ошибке вне диапазона :

введите описание изображения здесь

Строка после «создания листов» выделена желтым цветом в отладчике

'Validation of year If TextBox_Year.Value = Format(TextBox_Year.Value, "0000") Then 'Creating Process 'Creation of new sheet Workbooks.Add ActiveWorkbook.SaveAs FileName:= _ "" & Workbooks("Temperature Charts Sheet Creator").Sheets("MENU").Cells(4, 12).Value & "Data Sheet - " & ComboBox_Month.Value & " " & TextBox_Year.Value & ".xls", FileFormat _ :=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _ False, CreateBackup:=False 'Creating of the sheets Windows("Data Sheet - " & ComboBox_Month.Value & " " & TextBox_Year.Value & ".xls").Activate Sheets("Sheet3").Select Sheets("Sheet3").Name = "31 " & ComboBox_Month.Value Sheets("Sheet2").Select Sheets("Sheet2").Name = "30 " & ComboBox_Month.Value Sheets("Sheet1").Select Sheets("Sheet1").Name = "29 " & ComboBox_Month.Value For i = 28 To 1 Step -1 Sheets.Add ActiveSheet.Name = i & " " & ComboBox_Month.Value Next 

Предложите следующее упрощение: запишите возвращаемое значение из Workbooks.Add вместо подписи Windows() после этого следующим образом:

 Set wkb = Workbooks.Add wkb.SaveAs ... wkb.Activate ' instead of Windows(expression).Activate 

Общая философия:

Избегайте использования встроенных модhive Excel: ActiveWorkbook, ActiveSheet и Selection: захватывайте возвращаемые значения и вместо этого предпочитайте квалифицированные выражения.

Используйте встроенные модули только один раз и только в самых внешних макросах (subs) и захвате при запуске макроса, например

 Set wkb = ActiveWorkbook Set wks = ActiveSheet Set sel = Selection 

Во время и внутри макросов не полагаются на эти встроенные имена, вместо этого берутся возвращаемые значения, например

 Set wkb = Workbooks.Add 'instead of Workbooks.Add without return value capture wkb.Activate 'instead of Activeworkbook.Activate 

Кроме того, попробуйте использовать квалифицированные выражения, например

 wkb.Sheets("Sheet3").Name = "foo" ' instead of Sheets("Sheet3").Name = "foo" 

или

 Set newWks = wkb.Sheets.Add newWks.Name = "bar" 'instead of ActiveSheet.Name = "bar" 

Используйте квалифицированные выражения, например

 newWks.Name = "bar" 'instead of `xyz.Select` followed by Selection.Name = "bar" 

Эти методы будут работать лучше в целом, дают менее запутанные результаты, будут более надежными при рефакторинге (например, перемещение строк кода внутри и между методами) и, лучше работать в версиях Excel. Выбор, например, изменяется по-разному во время выполнения макроса из одной версии Excel в другую.

Также обратите внимание, что вы, скорее всего, обнаружите, что вам не нужно. .Activate почти столько же, когда используете более квалифицированные выражения. (Это может означать, что для пользователя экран будет мерцать меньше.) Таким образом, вся строка Windows(expression).Activate может быть просто Windows(expression).Activate а не заменена на wkb.Activate .

(Также обратите внимание: я думаю, что отображаемые вами инструкции .Select не вносят вклад и могут быть опущены.)

(Я думаю, что макрорекордер Excel отвечает за продвижение этого более хрупкого стиля программирования с использованием ActiveSheet, ActiveWorkbook, Selection и Select so much, этот стиль оставляет много возможностей для улучшения.)

Ошибка индексирования вне диапазона возникает, когда вы пытаетесь ссылаться на индекс для недопустимой коллекции.

Скорее всего, индекс в Windows фактически не включает .xls. Индекс для windows должен быть таким же, как имя рабочей книги, отображаемой в строке заголовка Excel.

Как можно предположить, я бы попытался использовать это:

 Windows("Data Sheet - " & ComboBox_Month.Value & " " & TextBox_Year.Value).Activate 
 Option Explicit Private Sub CommandButton1_Click() Dim mode As String Dim RecordId As Integer Dim Resultid As Integer Dim sourcewb As Workbook Dim targetwb As Workbook Dim SourceRowCount As Long Dim TargetRowCount As Long Dim SrceFile As String Dim TrgtFile As String Dim TitleId As Integer Dim TestPassCount As Integer Dim TestFailCount As Integer Dim myWorkbook1 As Workbook Dim myWorkbook2 As Workbook TitleId = 4 Resultid = 0 Dim FileName1, FileName2 As String Dim Difference As Long 'TestPassCount = 0 'TestFailCount = 0 'Retrieve number of records in the TestData SpreadSheet Dim TestDataRowCount As Integer TestDataRowCount = Worksheets("TestData").UsedRange.Rows.Count If (TestDataRowCount <= 2) Then MsgBox "No records to validate.Please provide test data in Test Data SpreadSheet" Else For RecordId = 3 To TestDataRowCount RefreshResultSheet 'Source File row count SrceFile = Worksheets("TestData").Range("D" & RecordId).Value Set sourcewb = Workbooks.Open(SrceFile) With sourcewb.Worksheets(1) SourceRowCount = .Cells(.Rows.Count, "A").End(xlUp).row sourcewb.Close End With 'Target File row count TrgtFile = Worksheets("TestData").Range("E" & RecordId).Value Set targetwb = Workbooks.Open(TrgtFile) With targetwb.Worksheets(1) TargetRowCount = .Cells(.Rows.Count, "A").End(xlUp).row targetwb.Close End With ' Set Row Count Result Test data value TitleId = TitleId + 3 Worksheets("Result").Range("A" & TitleId).Value = Worksheets("TestData").Range("A" & RecordId).Value 'Compare Source and Target Row count Resultid = TitleId + 1 Worksheets("Result").Range("A" & Resultid).Value = "Source and Target record Count" If (SourceRowCount = TargetRowCount) Then Worksheets("Result").Range("B" & Resultid).Value = "Passed" Worksheets("Result").Range("C" & Resultid).Value = "Source Row Count: " & SourceRowCount & " & " & " Target Row Count: " & TargetRowCount TestPassCount = TestPassCount + 1 Else Worksheets("Result").Range("B" & Resultid).Value = "Failed" Worksheets("Result").Range("C" & Resultid).Value = "Source Row Count: " & SourceRowCount & " & " & " Target Row Count: " & TargetRowCount TestFailCount = TestFailCount + 1 End If 'For comparison of two files FileName1 = Worksheets("TestData").Range("D" & RecordId).Value FileName2 = Worksheets("TestData").Range("E" & RecordId).Value Set myWorkbook1 = Workbooks.Open(FileName1) Set myWorkbook2 = Workbooks.Open(FileName2) Difference = Compare2WorkSheets(myWorkbook1.Worksheets("Sheet1"), myWorkbook2.Worksheets("Sheet1")) myWorkbook1.Close myWorkbook2.Close 'MsgBox Difference 'Set Result of data validation in result sheet Resultid = Resultid + 1 Worksheets("Result").Activate Worksheets("Result").Range("A" & Resultid).Value = "Data validation of source and target File" If Difference > 0 Then Worksheets("Result").Range("B" & Resultid).Value = "Failed" Worksheets("Result").Range("C" & Resultid).Value = Difference & " cells contains different data!" TestFailCount = TestFailCount + 1 Else Worksheets("Result").Range("B" & Resultid).Value = "Passed" Worksheets("Result").Range("C" & Resultid).Value = Difference & " cells contains different data!" TestPassCount = TestPassCount + 1 End If Next RecordId End If UpdateTestExecData TestPassCount, TestFailCount End Sub Sub RefreshResultSheet() Worksheets("Result").Activate Worksheets("Result").Range("B1:B4").Select Selection.ClearContents Worksheets("Result").Range("D1:D4").Select Selection.ClearContents Worksheets("Result").Range("B1").Value = Worksheets("Instructions").Range("D3").Value Worksheets("Result").Range("B2").Value = Worksheets("Instructions").Range("D4").Value Worksheets("Result").Range("B3").Value = Worksheets("Instructions").Range("D6").Value Worksheets("Result").Range("B4").Value = Worksheets("Instructions").Range("D5").Value End Sub Sub UpdateTestExecData(TestPassCount As Integer, TestFailCount As Integer) Worksheets("Result").Range("D1").Value = TestPassCount + TestFailCount Worksheets("Result").Range("D2").Value = TestPassCount Worksheets("Result").Range("D3").Value = TestFailCount Worksheets("Result").Range("D4").Value = ((TestPassCount / (TestPassCount + TestFailCount))) End Sub 
  • Есть ли способ взломать пароль в проекте Excel VBA?
  • Как я могу автоматизировать диалоговое окно «Сохранить как» в IE11 с помощью VBA?
  • Способ запуска макросов Excel из командной строки или командного файла?
  • В чем разница между Dim, Global, Public и Private в качестве модификаторов модульного поля?
  • Попытка открыть книгу в отдельном экземпляре
  • Excel VBA Управление локальной локальной сетью IE
  • Изменить формат даты с помощью замены или замены
  • Функция IsDate возвращает неожиданные результаты
  • Объявлять и инициализировать строковый массив в VBA
  • Как узнать, содержит ли массив строку
  • Использование Excel VBA для запуска SQL-запроса
  • Interesting Posts

    Частота обновления Adblock Chrome – позволяет пропускать некоторые объявления через

    Как правильно использовать ключевое слово extern в C

    Ссылка на все строки заголовков «about» / «chrome» для Firefox и Chrome

    Как использовать VideoToolbox для распаковки видеоstreamа H.264

    Как продемонстрировать условия гонки вокруг ценностей, которые не опубликованы должным образом?

    Android – Получение звука для воспроизведения через динамик

    Что делает tf.nn.conv2d в тензорном streamе?

    Как настроить Linux на использование другого DNS-сервера для определенного домена?

    Почему вложенные веса плохо подходят для производительности? Альтернативы?

    Поиск статических задач инициализации C ++

    Хороший и универсальный способ преобразования списка элементов в дерево

    Как преобразовать DataTable в общий список?

    Среднее значение для каждой группы в файле data.frame

    Почему вместо конструктора преобразования вызывается конструктор копирования?

    Как определяется / измеряется размер структуры с битовыми полями?

    Давайте будем гением компьютера.