Excel VBA: ошибка 1004, определяемая приложением или объектная ошибка

У меня возникли проблемы с отладкой кода, который я написал. Он работает нормально до определенного момента, а затем останавливается и показывает: ошибка времени выполнения 1004, ошибка, определяемая приложением или объектом.

Я очень давно не писал VBA, поэтому мой код может быть беспорядочным =).

Кажется, проблема заключается в следующем: см. комментарий «Создать UID для текущего импа».

'Sheet Definitions
strSourceSheet = "MasterReport"
strComponentSheet = "UniqueIdComponents"

'defines row where data starts
intEntryCount = 2
intImpCount = 0

'determine maximum number of rows for both sheets
lngMaxRowSS = ThisWorkbook.Sheets(strSourceSheet).UsedRange.SpecialCells(xlCellTypeLastCell).Row
lngMaxRowCS = ThisWorkbook.Sheets(strComponentSheet).UsedRange.SpecialCells(xlCellTypeLastCell).Row

'Run until there are no more entries
For intEntryCount = 2 To lngMaxRowSS

   'Prevents to overwrite existing UIDs
   If ThisWorkbook.Sheets(strSourceSheet).Range("BP" & intEntryCount) = "" Then

    'Recieve next imperative on the Source List to find according UID Components
    strSourceImperative = ThisWorkbook.Sheets(strSourceSheet).Range("A" & intEntryCount)

        'Run until no new Imp UID is defind
        For intImpCount = 11 To lngMaxRowCS

            'Location of Imps on Component Sheet
            strComponentImperative = ThisWorkbook.Sheets(strComponentSheet).Range("C" & intImpCount)

            ' If the Source Imp = Component Imp then we create a UID for that Source IP
            If strSourceImperative = strComponentImperative Then

                'Assign Column to UID component in order to find the Column in the MasterReport
                strUIDComponent1 = ThisWorkbook.Sheets(strComponentSheet).Range("D" & intImpCount)
                strUIDComponent2 = ThisWorkbook.Sheets(strComponentSheet).Range("E" & intImpCount)
                strUIDComponent3 = ThisWorkbook.Sheets(strComponentSheet).Range("F" & intImpCount)
                strUIDComponent4 = ThisWorkbook.Sheets(strComponentSheet).Range("G" & intImpCount)
                strUIDComponent5 = ThisWorkbook.Sheets(strComponentSheet).Range("H" & intImpCount)
                strUIDComponent6 = ThisWorkbook.Sheets(strComponentSheet).Range("I" & intImpCount)
                strUIDComponent7 = ThisWorkbook.Sheets(strComponentSheet).Range("J" & intImpCount)

                'Generate UID for the Current Imp
                strUID = ThisWorkbook.Sheets(strSourceSheet).Range(strUIDComponent1 & intEntryCount) _
                        & ThisWorkbook.Sheets(strSourceSheet).Range(strUIDComponent2 & intEntryCount) _
                        & ThisWorkbook.Sheets(strSourceSheet).Range(strUIDComponent3 & intEntryCount) _
                        & ThisWorkbook.Sheets(strSourceSheet).Range(strUIDComponent4 & intEntryCount) _
                        & ThisWorkbook.Sheets(strSourceSheet).Range(strUIDComponent5 & intEntryCount) _
                        & ThisWorkbook.Sheets(strSourceSheet).Range(strUIDComponent6 & intEntryCount) _
                        & ThisWorkbook.Sheets(strSourceSheet).Range(strUIDComponent7 & intEntryCount)

                'Writes UID into MasterReport
                'ThisWorkbook.Sheets(strSourceSheet).Range("BP" & intEntryCount) = strUID

                'Test Writes
                ThisWorkbook.Sheets("Test").Range("A" & intEntryCount) = strUID

            'If the Source Imp = Component Imp then we created a UID for that Source IP
            End If

        'If the two Source Imp <> Component Imp, go to next row on Component sheet and compare again
        Next intImpCount

   'Prevented to overwrite existing UIDs
   End If

Next intEntryCount

В случае, когда я получаю ошибку, компоненты A, M, N, O, BK, "", "" и количество записей равно 5718. Он отлично написал 5718 записей, а затем показывает ошибку.

Любые идеи?

Заранее спасибо за помощь!!


person Ergo    schedule 13.01.2014    source источник
comment
Код, который вы разместили, не имеет никакого смысла. Возможно, вам следует опубликовать больше своего кода и описать, чего вы пытаетесь достичь с его помощью.   -  person Netloh    schedule 13.01.2014
comment
Вот что он делает: strUID — это уникальный идентификатор, состоящий из нескольких значений ячеек. Эти значения могут различаться в зависимости от того, сколько и какие компоненты (столбцы) выбирает пользователь. поскольку значения компонентов хранятся в ячейках, я использую strUIDComponent(s), чтобы сообщить мне, какой столбец и intEntryCount какую строку. Я создаю strUID, добавляя вместе несколько ячеек (см. код), а затем печатаю его на другом листе.   -  person Ergo    schedule 13.01.2014


Ответы (1)


Вынося ThisWorkbook.Sheets(strSourceSheet) в оператор With и подставляя значения, вы, кажется, говорите, что этот оператор эквивалентен:

With ThisWorkbook.Sheets(strSourceSheet)

  strUID = .Range("A" & 5718) & _
           .Range("M" & 5718) _
           .Range("N" & 5718) _
           .Range("O" & 5718) _
           .Range("BK" & 5718) _
           .Range("" & 5718) _
           .Range("" & 5718)

End With

Последние две записи не являются допустимыми диапазонами.

Я не могу протестировать этот код, но что-то вроде этого может соответствовать вашим требованиям:

  Dim WkShtComp As Worksheet
  Dim WkShtSrc As Worksheet
  Dim ColMast As String

  With ThisWorkbook
    Set WkShtComp = .Sheets(strComponentSheet)
    Set WkShtSrc = .Sheets(strSourceSheet)
  End With

  strUID = ""
  For Each ColMast in Array("D", "E", "F", "G", "H", "I", "J")
     strUIDComponent = WKShtComp.Range(ColMast & intImpCount).Value
     If strUIDComponent <> "" Then
       strUID = strUID & WkShtSrc.Range(strUIDComponent & intEntryCount).Value
     Endif
  Next
person Tony Dallimore    schedule 13.01.2014
comment
Ваш код таков, как он будет выглядеть, да. Я также думал, что это может быть проблемой, но до 5718 это работало, и у меня было много таких UID, в которых отсутствовали последние 2 компонента (это было бы ). и он написал их просто отлично. Но поскольку это неправильный код, я бы предпочел его исправить. Любые идеи, как я мог бы исключить 's без необходимости писать 7 отдельных операторов IF? Я не очень хорошо разбираюсь в VBA, так что это настолько креативно, насколько я могу, ха-ха - person Ergo; 13.01.2014
comment
Трудно делать предложения без лучшего понимания того, что вы делаете. Я бы подумал о том, чтобы сделать strUIDComponent массивом или сделать шаг и сделать strUID в цикле напрямую, без использования strUIDComponent в качестве посредников. - person Tony Dallimore; 13.01.2014