Загрузка значений из закрытой книги в массив - PullRequest
0 голосов
/ 17 февраля 2020

Я давно не пользовался VBA, поэтому я немного заржавел. Ищу помощь.

Задача: Мне нужно вытащить все уникальные значения из заданного диапазона в закрытой рабочей книге в рабочую книгу моей подгруппы. Я думаю о вызове функции, которая возвращает массив моих уникальных непустых значений. потому что мне нужно знать количество уникальных значений, чтобы вставить нужное количество строк в основную рабочую книгу. Не могу просто скопировать и вставить значения. А также потому, что мне нужно удалить дубликаты.

Некоторые важные биты кода, которые нужно знать:

    Sub PullACParts()

    Dim FullFilePath As String
    Dim arrPartList() As String  

FullFilePath = "C:\Users\[...]file1.xlsx"
arrPartList() = GetValues(FullFilePath)

, и это вызывает:

Function GetValues(path as string) as Variant
    Dim arrValues() As String
    Dim arrUnikVals As String

    On Error GoTo ErrHandler
    Application.ScreenUpdating = False

    Dim src As Workbook

    ' OPEN THE SOURCE EXCEL WORKBOOK IN "READ ONLY MODE".
    Set src = Workbooks.Open(FullFilePath, True, True)

    ' GET THE TOTAL ROWS FROM THE SOURCE WORKBOOK.
    Dim iTotalRows As Integer
    TotalRows = src.Worksheets("Sheet1").Range("D1:D" & Cells(Rows.Count, "D").End(xlUp).Row).Rows.Count

    ' COPY NON-BLANK DATA FROM SOURCE FILE COLUMN-4 TO ARRAY.
    Dim iCnt As Integer         ' COUNTER.
    Dim ArrDim As Long: ArrDim = 0

    For iCnt = 4 To TotalRows

        If src.Worksheets("Sheet1").Range("D" & iCnt).Value <> "" Then
            arrValues(ArrDim) = src.Worksheets("Sheet1").Cells(4 & iCnt).Formula 'FAILS HERE
            ArrDim = ArrDim + 1
        End If

    Next iCnt

    ' CLOSE THE SOURCE FILE.
    src.Close False             ' FALSE - DON'T SAVE THE SOURCE FILE.
    Set src = Nothing

    ' Remove Duplicates
    arrUnikVals = RemoveDupesColl(arrValues)
    GetValues = arrUnikVals

ErrHandler:
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Function

Сбой, когда я попробуйте загрузить массив. Говорит "arrValues ​​(ArrDim) = Я пробовал несколько разных вещей, но просто не могу понять. Заранее спасибо за помощь !!

1 Ответ

0 голосов
/ 17 февраля 2020

Вам не нужно это oop. Сначала задайте типы переменных.

Dim arrValue as Variant, lr as long

Раз это вариант, вы можете просто получить массив из диапазона за один go, транспонировав его:

lr = src.Worksheets("Sheet1").range("D" & rows.count).end(xlup).row
Application.transpose(src.Worksheets("Sheet1").range("D4:D" & lr))

Если вам нужно к l oop значениям в массиве позже вы просто делаете что-то вроде этого:

Dim X as long
For X = lbound(arrValue) to ubound(arrValue)
    msgbox arrValue(X)
next

Я, однако, отмечаю, что в своем вопросе вы говорите, что хотите извлечь данные из ЗАКРЫТОЙ рабочей книги, но ваш код открывается книга. Существуют способы извлечения данных непосредственно из закрытой книги, но это будет сложно, поскольку вы не знаете, сколько строк будет без открытия книги. Если вам абсолютно необходимо оставить книгу закрытой, отправьте сообщение обратно.

Я также отмечаю, что вы используете ячейки (4 и iCnt) для заполнения массива, вы точно знаете, что это просто ячейка, считающая слева направо прямо тогда грести? другими словами, ячейки (2) - это В1, а ячейки (16386) - это В2. Вы должны использовать ячейки (Row, Column). Я думаю, что из того, что вы сказали, вы хотите увеличить строку, но если нет, то отправьте обратно, мы просто дважды транспонируем, если это столбцы, а не строки.

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