2016-09-05 3 views
0

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

Я написал их на своем компьютере без проблем.

Option Explicit 

Sub MoveDataOtherSheets() 

With Excel.ThisWorkbook.Sheets("Sheet3") 
    Dim cell 
    For Each cell In .Range(.Cells(2, 1), Cells(.Rows.Count, 1).End(Excel.xlUp)) 

     If cell(1, 1) = "PERSONAL" Then 
      With Excel.ThisWorkbook.Sheets("Sheet4") 
       cell.EntireRow.Copy .Cells(.Rows.Count, 1).End(Excel.xlUp)(2, 1) 
      End With 
     End If 

     If cell(1, 1) = "COMPANY" Then 
      With Excel.ThisWorkbook.Sheets("Sheet5") 
       cell.EntireRow.Copy .Cells(.Rows.Count, 1).End(Excel.xlUp)(2, 1) 
      End With 
     End If 
    Next 

End With 

End Sub 
+1

где у вас есть ошибка? –

+0

Кажется, что я дважды вставил один и тот же код –

+1

проверить книгу, в которой находится макрос, на самом деле есть листы с именем «Лист1», «Лист2», «Лист3», «Лист4», «Лист5» и «Лист6». Кроме того, вам не хватает точки до появления второго «Ячейки» как в «Для каждой ячейки In .Range (.Cells (2, 1), Cells (.Rows.Count, 1) .End (Excel.xlUp))' Заявления – user3598756

ответ

0

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

  • любого из имен рабочих таблиц, которые вы используете не является допустимым для фактической книги бегущая макросу (что это ThisWorkbook точно)

  • недостающая точка в 2 возникновения Cells в For Each cell In .Range(.Cells(2, 1), Cells(.Rows.Count, 1).End(Excel.xlUp)) заявления

    таким образом, хотя все остальные ссылки (.Range и. Cells) являются основатели к object после последнего With ключевого слова, простогоCells(.Rows.Count, 1) на самом деле относится к текущему активной колонке листа 1 последней строке

, но я в основном писал этот ответ, чтобы предложить вам некоторый рефакторинг коды :

Option Explicit 

Sub MoveDataOtherSheets() 
    Dim cell As Range, dataRng As Range 
    Dim shtName As String 

    With Excel.ThisWorkbook 
     Set dataRng = SetDataRng(.Worksheets("Sheet3"), 1) 

     For Each cell In dataRng 
      shtName = GetSheetName(cell) 
      If shtName <> "" Then CopyRow cell, .Sheets(shtName) 
     Next cell 
    End With 
End Sub 

Sub CopyRow(cell As Range, sht As Worksheet) 
    With sht 
     cell.EntireRow.Copy .Cells(.Rows.Count, 1).End(Excel.xlUp)(2, 1) 
    End With 
End Sub 

Function SetDataRng(sht As Worksheet, colIndex As Long) As Range 
    With sht 
     Set SetDataRng = .Range(.Cells(2, colIndex), .Cells(.Rows.Count, colIndex).End(Excel.xlUp)) 
    End With 
End Function 

Function GetSheetName(cell As Range) As String 
    Select Case cell 
     Case "PERSONAL" 
      GetSheetName = "Sheet4" 

     Case "COMPANY" 
      GetSheetName = "Sheet5" 

     Case Else 
      GetSheetName = "" 
    End Select 
End Function 

который берет ход из следующих соображений:

  • это предпочтительно не гнездо With блоки, относящиеся не корреляты Объекты

    в

    With Excel.ThisWorkbook.Sheets("Sheet3") 
        ... 
         With Excel.ThisWorkbook.Sheets("Sheet4") 
    

    вы гнездятся два не-основателями With объектов, тем самым нарушая вменяемыйWith «цепь», как может быть следующим:

    With Excel.ThisWorkbook 
        With .Sheets("Sheet3") 
        ... 
        End With 
    
        With .Sheets("Sheet4") 
        ... 
        End With 
    End With 
    

    Я не являюсь т говорю вам, почему именно это нарушение «цепь» является безумным, так как я узнал его довольно давно, но не могу вспомнить сейчас (!), но он должен делать с управлением памятью

  • избежать сдачи в With блоки кода, который не использует объект ссылки

    подобное Dim cell был

  • If эти два блока явно взаимоисключающими: значение ячейки не может равняться «PERSONAL» и «КОМПАНИЯ» в то же время !

    так правильно If блока будет:

    If cell(1, 1) = "PERSONAL" Then 
        .... 
    ElseIf cell(1, 1) = "COMPANY" Then 
        ... 
    End If 
    

    , но на данный момент я хотел бы предложить вам перейти на Select Case блоке конструкт, который больше подходит для дальнейшего кода ветвления (если больше по сравнению возникает значение) и более читаемый

  • это хорошая привычка кодирования требовать конкретных задач специальных функций/Subs

    это справедливо, даже если эти задачи до сих пор простой и короткий закодированы, так как код будет всегда расти и быстро забиваются, и вряд ли внятные и maintanable

обе причины рефакторинга и переработан закодированы являются вкладом шахты и много вероятно, будет улучшено

, но они могут быть хорошей отправной точкой

+0

Большое спасибо за предложения по кодированию. Новый код отлично работает на моем личном ноутбуке. Но на моем рабочем компьютере он генерирует ошибку несоответствия типа. Это связано с настройками программы выполнения, потому что это неправильно. Процедура Sub, которую вы написали с помощью этой функции, создается на 100% справа. –

+0

Какая строка выдает ошибку несоответствия типа? – user3598756

+0

Проблема, которую я получаю, является несоответствием, когда я получаю функцию GetSheetName. Я признаю, что единственное, что работает на моем рабочем ноутбуке, - это когда я использую модули, которые ссылаются на имена листов, используя целые числа. Он не может распознавать имена листов по их имени на основе свойств («Sheet1») и т. Д. Я использую Excel в течение очень долгого времени, и это первый случай, когда компьютер компании был настроен не в состоянии выполнить эту процедуру. –

Смежные вопросы