Копировать диапазон ячеек, определенных при исполнении, в массив - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь скопировать диапазон ячеек из ряда строк из двух рабочих книг. Эта информация используется для сравнения содержимого строк обеих книг по идентификатору.

Первое решение, которое я попробовал, включало сравнение «двоичных» двоичных элементов. Это работает для листов с несколькими строками:

For i = 2 To LastSheetRow
    Set FoundCell = Workbooks(WorkbookA).Sheets(SheetNameFromArray).Range("A:A").Find(What:=Workbooks(WorkbookB).Sheets(SheetNameFromArray).Cells(i, 1).Value)
    If Not FoundCell Is Nothing Then

        aCellValues(0) = 1
        Workbooks(UserWorkbook).Sheets(SheetNameFromArray).Cells(i, LastSheetColumn + 1).Value = FoundCell.Row
        For j = 2 To LastSheetColumn
            Select Case Workbooks(WorkbookB).Sheets(SheetNameFromArray).Cells(i, j).Value
            Case Is = Workbooks(WorkbookA).Sheets(SheetNameFromArray).Cells(FoundCell.Row, j).Value
                aCellValues(j - 1) = 1

            Case Else
                aCellValues(j - 1) = 0
            End Select
        Next j
    Else
    End If
Next i

Я бы хотел сохранить содержимое одной строки каждой из двух рабочих книг в одном массиве для сравнения, так как считаю, что это более быстрое решение.

После определения диапазона для сравнения я столкнулся со следующей ошибкой при копировании ячеек в массив:

Субиндекс вне интервала (ошибка 9)

Это приводит к ошибке:

Dim aWorkbookBInfo() As Variant, aWorkbookAInfo() As Variant, rngWorkbookBToCompare As Range, rngWorkbookAToCompare As Range
Dim SumToCheck As Integer, FoundCell As Range, aCellValues() As Integer   
ReDim aCellValues(LastSheetColumn - 1)
ReDim aWorkbookBInfo(LastSheetColumn - 1)
ReDim aWorkbookAInfo(LastSheetColumn - 1)
For i = 2 To LastSheetRow
    Set FoundCell = Workbooks(WorkbookA).Sheets(SheetNameFromArray).Range("A:A").Find(What:=Workbooks(WorkbookB).Sheets(SheetNameFromArray).Cells(i, 1).Value)
    If Not FoundCell Is Nothing Then        
        aCellValues(0) = 1
        Workbooks(WorkbookB).Sheets(SheetNameFromArray).Cells(i, LastSheetColumn + 1).Value = FoundCell.Row
        With Workbooks(WorkbookB).Sheets(SheetNameFromArray)
            Set rngWorkbookBToCompare = Range(Cells(i, 2), Cells(i, LastSheetColumn))
        End With
        With Workbooks(WorkbookA).Sheets(SheetNameFromArray)
            Set rngWorkbookAToCompare = Range(Cells(FoundCell.Row, 2), Cells(FoundCell.Row, LastSheetColumn))
        End With
        aWorkbookBInfo = rngWorkbookBToCompare
        aWorkbookAInfo = rngWorkbookAToCompare
        For j = 1 To LastSheetColumn - 1
            If aWorkbookBInfo(j).Value = aWorkbookAInfo(j).Value Then                
                aCellValues(j) = 1                
            Else
                aCellValues(j) = 0
            End If
        Next j
    Else
    End If
Next i

1 Ответ

0 голосов
/ 27 августа 2018

Полная редакция:

Назначение массива диапазона создает двумерный массив в этих строках:

aWorkbookBInfo = rngWorkbookBToCompare
aWorkbookAInfo = rngWorkbookAToCompare

Это происходит независимо от того, как вы определили и измерили их в начале кода. Поскольку они представляют собой двумерный массив, они должны быть адресованы как aWorkbookBInfo(a, b), где a - строка, а b - столбец.

В отличие от диапазонов, где можно ссылаться на первую ячейку в любом диапазоне, вы должны полностью обратиться к массиву, прежде чем пытаться ссылаться на элемент массива. Итак, пока rngWorkbookBToCompare(j).Value работает, aWorkbookBInfo(j).Value - нет. Кроме того, Значение не обязательно является свойством любого объекта, который Excel помещает в массив. Если вам нужна первая ячейка столбца j, попробуйте добавить строку и не указывать ссылку на свойство Value , как в: aWorkbookBInfo(1, j).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...