将数组写入表 (ListObject) - 内存不足

Write an array into table (ListObject) - out of memory

提问人:olli8 提问时间:11/7/2023 最后编辑:olli8 更新时间:11/8/2023 访问量:85

问:

我在格式化为 ListObject 的表中输入数组时遇到问题。 我使用了以下代码,但这并不适用于所有情况。

有问题的函数嵌入在主 Sub 中,如下所示。

Dim SFH As New SheetFilterhandler

Set SFH.SetTable = loSourceList
SFH.SaveFilters
SFH.DisableFilters
Call UpdateListObject(loSourceList, loImportList)
SFH.EnableFilters

功能可以简化为:

Public Function UpdateListObject(loTarget As ListObject, loSource As ListObject) As Boolean

On Error GoTo CreateErr
Dim PreviousContent As Variant
Dim Export As Variant

Export = loSource.DataBodyRange.value
PreviousContent = loTarget.DataBodyRange.value

Dim CurrentContent As Variant
ReDim CurrentContent(UBound(PreviousContent) + UBound(Export), UBound(PreviousContent, 2))

For ExportIndex = 1 To UBound(Export)
    For PreviousContentIndex = 1 To UBound(PreviousContent)
        'Export and PreviousContent is compared and written into CurrentContent
    Next PreviousContentIndex
    'new items
    If ItemNotExisting Then
        NewContentCounter = NewContentCounter + 1
        loTarget.ListRows.Add
        For i = 1 To UBound(Export, 2)
            CurrentContent(UBound(PreviousContent) + NewContentCounter, i) = Export(ExportIndex, i)
        Next i
    End If
Next ExportIndex

loTarget.DataBodyRange.Value2 = CurrentContent 'problematic line
UpdateListObject = True
Exit Function
CreateErr:
    UpdateListObject = False
    GetErrMsg = Err.Description
    Debug.Print "UpdateListObject: " & GetErrMsg
    Debug.Print PreviousContentIndex & "," & ExportIndex
End Function

此代码适用于:

CurrentContent 变体/变体(1 至 1294、1 至 55); loTarget.DataBodyRange.Value2(1 到 647,1 到 55)

但对于以下情况,它不起作用:

CurrentContent 变体/变体(1 到 3071,1 到 20); loTarget.DataBodyRange.Value2(1 到 1543, 1 到 20)

大小不同,因为 ArrayName 只有大于最大行数的行的空条目,可以忽略。ListObject

在本例中,我使用 Debug.Print 来显示错误说明。

GetErrMsg = Err.Description
Debug.Print GetErrMsg

输出是可以翻译的。 如果有任何限制,我不明白,因为。 1294 x 55 = 71170 和 3071 x 20 = 61420Nicht genügend Speichernot enough memory

在没有桌子的情况下也看到了相同的行为。

With ActiveSheet
    .ListObjects(1).Unlist
    .UsedRange.Offset(1, 0).Clear
    .Range(.Cells(2, 1), Cells(UBound(CurrentContent) + 1, UBound(CurrentContent, 2))) = CurrentContent
End With

CurrentContent 示例数据

表达 价值 类型
当前内容 (1,1) 3709745 变体/双
当前内容 (1,2) “字符串 1” 变体/字符串
当前内容 (1,3) #11.11.2023 11:11:11# 变体/日期
当前内容 (1,4) #11.11.2023# 变体/日期
当前内容 (1,5) “字符串 2 [1234567]” 变体/字符串
当前内容 (1,6) “字符串 3” 变体/字符串
当前内容 (1,7) “字符串 4” 变体/字符串
当前内容 (1,8) “字符串 5” 变体/字符串
当前内容 (1,9) “字符串 6” 变体/字符串
当前内容 (1,10) “字符串 7” 变体/字符串
当前内容 (1,11) "" 变体/字符串
当前内容 (1,12) “XX” 变体/字符串
当前内容 (1,13) "" 变体/字符串
当前内容 (1,14) "" 变体/字符串
当前内容 (1,15) "1234567, 1234567" 变体/字符串
当前内容 (1,16) “字符串 8” 变体/字符串
当前内容 (1,17) “字符串 9” 变体/字符串
当前内容 (1,18) #11.11.2023 11:11:11# 变体/字符串
当前内容 (1,19) “马克斯·穆斯特曼 (1234567)” 变体/字符串
当前内容 (1,20) 变体/空
数组 Excel VBA 内存 ListObject

评论

0赞 Ike 11/7/2023
请向我们展示一些示例数据 - 否则很难为您提供帮助。
0赞 olli8 11/7/2023
您需要哪些 sampe 数据?数组的?这是一张主要由字符串组成的大桌子。或者您是否需要更多信息,了解如何在代码中填充表和数组?
0赞 Ike 11/7/2023
然后至少向我们展示一小部分数据。是的:有关代码的更多详细信息也会有所帮助。
0赞 olli8 11/7/2023
我添加了更多代码和数组的示例数据。
0赞 Tim Williams 11/8/2023
以前有过吗?ReDim CurrentContent(UBound(PreviousContent) + UBound(Export), UBound(PreviousContent, 2))PreviousContent = loTarget.DataBodyRange.value

答:

0赞 olli8 11/8/2023 #1

我有一列,其中所有单元格都有一个大字符串。删除此列后,不再有问题。

我想数组中可以写入的字符是有限制的。目前我不知道这个限制。Range