Почему я получаю ошибку переполнения во время присваивания массива? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть программа, которая устанавливает некоторые глобальные массивы. Программа работала нормально, пока пару часов назад. Сегодня уже было несколько раз. Я ничего не изменил, кроме размера массива (от 99500 до 99900, 9), это проблема? Если это размер массива, есть ли способ хранить эти данные с другой структурой данных (коллекция, dict, определяемая пользователем)?

    Const PartMaterialsFilePath = "C:\Users\jayferreira\Desktop\"
    Const PartMaterialsFileName = "Part Materials.xlsm"

    Function getPPNWorksheet() As Worksheet
        If isWkbkOpen(PartMaterialsFileName) Then
            Set getPPNWorksheet = Workbooks(PartMaterialsFileName).Worksheets(2)
        Else
            Set getPPNWorksheet = Workbooks.Open(PartMaterialsFilePath + PartMaterialsFileName).Worksheets(2)
        End If
    End Function

    Global partDescriptions() As String
    Global partRevisions() As String * 5
    Global partRevisionDates() As String * 10
    Global partWeights() As Single
    Global partNumbers() As String * 6
    Global PartMaterials As Dictionary
    Global initialized As Boolean
    Function setGlobals()
        Application.ScreenUpdating = False
        Load loadingBar
        loadingBar.Show
        Dim rng As Range
        Dim dataArr() As Variant
        Dim mGPPN As Worksheet
        Dim multipleOf As Long
        Dim counter As Integer
        Dim lastRow As Long
        Dim i As Long
        loadingBar.Text.Caption = "Loading ppn.xlsx..."
        Set mGPPN = MCGBookFunctions.getPPNWorksheet
        lastRow = MCGBookFunctions.getLastRow(mGPPN, , 1, 1)
        loadingBar.Text.Caption = "Loading Data..."
        mGPPN.Activate
        dataArr = mGPPN.Range("A2", "I" & lastRow) ''this is where the overflow error occurs
        MCGBookFunctions.closePartMaterialsworkbook True ''closes mGPPN
        Set mGPPN = Nothing
        ReDim partDescriptions(lastRow)
        ReDim partRevisions(lastRow)
        ReDim partRevisionDates(lastRow)
        ReDim partWeights(lastRow)
        ReDim partNumbers(lastRow)
        multipleOf = lastRow / 100
        For i = 1 To UBound(dataArr, 1)
            partNumbers(i) = dataArr(i, 1)
            partDescriptions(i) = dataArr(i, 2)
            partRevisions(i) = dataArr(i, 3)
            partRevisionDates(i) = dataArr(i, 4)
            partWeights(i) = dataArr(i, 5) * 1000 
            If i Mod multipleOf = 0 Then
                counter = counter + 1
                loadingBar.Caption = "Storing Data..."
                loadingBar.Text.Caption = counter & "% Completed"
                loadingBar.Bar.Width = counter * 2
                DoEvents
            End If
        Next
        loadingBar.Caption = "Getting part materials from database..."
        Set PartMaterials = DataBase.GetMaterials()
        initialized = True
        Application.ScreenUpdating = True
        Unload loadingBar
    End Function

примечание: строка, которая выводит ошибку, составляет две строки до того, как массивы будут перенаправлены. 'dataArr = mGPPN.Range ("A2", "I" & lastRow) ", как это прокомментировано в коде.

примечание: я поигрался с размером диапазона и могу присвоить диапазон ("A2", "I7804") массиву, но не на ряд больше. Сегодня я присвоил массиву гораздо больший диапазон, вплоть до пары часов назад.

1 Ответ

0 голосов
/ 25 октября 2019

с использованием .Value2 в mGPPN.Range("A2", "I" & lastRow).Value2 решило мою проблему. Я предполагаю, что это как-то связано с форматированием ячеек, вызывая переполнение при попытке сохранить что-то вроде Date в виде строки, возможно?

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