Собранные данные в коллекции стираются на внешнем Excel Close - Excel VBA - PullRequest
0 голосов
/ 27 марта 2019

У меня есть код VBA в одном Excel, который считывает данные из многих других Excel в определенном месте, но данные исчезают при закрытии внешнего Excel

ниже дает код, который влияет на сбор после строки

Workbooks(fileName).Save
Workbooks(fileName).Close

Код:

Sub filefindermacro()
    Dim directory As String
    Dim fileName As String
    Dim sheet As Worksheet
    Dim i As Integer
    Dim j As Integer
    Dim datecollection As New Collection
    Dim majorcategory As New Collection
    Dim projectname As New Collection
    Dim partname As New Collection
    Dim username As New Collection
    Dim designerchecker As New Collection
    Dim fpactualhours As New Collection
    Dim ractualhours As New Collection
    Dim currentstatus As New Collection
    Dim softwareused As New Collection
    Application.ScreenUpdating = False
    directory = "D:\cam\UserExcel\"
    fileName = Dir(directory & "*.xl??")

    Set projectname = New Collection

    Do While fileName <> ""
        i = i + 1
        j = 2
        Workbooks.Open (directory & fileName)
        For Each sheet In Workbooks(fileName).Worksheets
            If sheet.Name = "HAI" Then
                Dim counter
                counter = sheet.UsedRange.Rows.Count
                For i = 3 To counter
                    datecollection.Add (sheet.Cells(i, 1))
                    majorcategory.Add (sheet.Cells(i, 2))
                    projectname.Add (sheet.Cells(i, 3))
                    partname.Add (sheet.Cells(i, 4))
                    username.Add (sheet.Cells(i, 5))
                    designerchecker.Add (sheet.Cells(i, 6))
                    fpactualhours.Add (sheet.Cells(i, 7))
                    ractualhours.Add (sheet.Cells(i, 8))
                    currentstatus.Add (sheet.Cells(i, 9))
                    softwareused.Add (sheet.Cells(i, 10))
                    'MsgBox projectname(i - 2)
                Next
            End If
        Next sheet
        **Workbooks(fileName).Save
        Workbooks(fileName).Close**
        fileName = Dir()
    Loop
    Dim projectfile, projname
    projectfile = Replace(ThisWorkbook.Name, ".xlsm", "")
    j = 1

    For i = 1 To projectname.Count
        'MsgBox projectname.Count
        **If projectname.Item(i) = projectfile Then**
            Sheet1.Cells(j, 1) = datecollection(i)
            Sheet1.Cells(j, 2) = majorcategory(i)
            Sheet1.Cells(j, 3) = projectname(i)
            Sheet1.Cells(j, 4) = partname(i)
            Sheet1.Cells(j, 5) = username(i)
            Sheet1.Cells(j, 6) = designerchecker(i)
            Sheet1.Cells(j, 7) = fpactualhours(i)
            Sheet1.Cells(j, 8) = ractualhours(i)
            Sheet1.Cells(j, 9) = currentstatus(i)
            Sheet1.Cells(j, 10) = softwareused(i)
            j = j + 1
        End If
    Next
    Application.ScreenUpdating = True
End Sub

1 Ответ

0 голосов
/ 28 марта 2019

Я пропустил это раньше, но вот ваша проблема:

projectname.Add (sheet.Cells(i, 3))

Что вы фактически добавляете в коллекцию projectname, когда делаете это?

Вы можете ожидать, что это будет значение ячейки (поскольку это свойство по умолчанию Range), но вы фактически добавляете ссылку на саму ячейку , и как только вы закрыли Книга источника, вы больше не можете получить к ней доступ.

Вот исправление:

 projectname.Add sheet.Cells(i, 3).Value

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

И вам не нужно () здесь.

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