VBA代码中的内存不足错误

时间:2016-08-05 14:49:42

标签: vba excel-vba out-of-memory excel

下午好,

接收代码中的内存不足错误,是否有任何更改为代码的建议?

来自A列的输入被转移到2个不同的单元格。

输出1:将每个单元格值之间插入逗号的A列中的所有数据连接起来 输出2:连接来自A列的所有数据,插入逗号和引号 - 对于每个单元格值

由于

Sub Inserting_Commas()
' Macro to insert commas at the end of end cell value & to convert values from rows to single column

Range("A2").Select

Dim lastRow As Long
Dim outputStr As String
Dim outputStr2 As String
Dim rownumber As Long

Sheets("Sheet1").Select
lastRow = Range("A" & Rows.Count).End(xlUp).Row

' Seperate the column A by Commas
outputStr = Range("A2")

For rownumber = 3 To lastRow
    outputStr = outputStr & "," & Range("A" & rownumber)
Next

Range("D2") = outputStr

' Seperate the Column with Quotes and Commas
Range("A2").Select

For rownumber = 2 To lastRow
    Range("B" & rownumber).Value = "''" & Range("A" & rownumber) & "'"
Next

' --------------------------------------

outputStr2 = "'" & Range("B2")

For rownumber = 3 To lastRow
    outputStr2 = outputStr2 & "," & Range("B" & rownumber)
Next

Range("D20") = outputStr2

End Sub

3 个答案:

答案 0 :(得分:1)

正如共产国际所说,一个单元格只能容纳33,000个字符,当你的连接试图将更多的字符放入一个单元格时,你就会得到错误。

下面的代码与你所写的内容类似(尽管有些奇怪的单引号对我来说不合适,所以我删除了它们)但是在较少的代码行中,它也输出到单元格每当结果输出超过31000时,不超过单元格大小限制。

Sub Sample()
Dim WkSht           As Worksheet
Dim Cl              As Range
Dim StrOutput       As String
Dim StrOutput2      As String
Dim LngRow          As Long

Set WkSht = ThisWorkbook.Worksheets("Sheet1")
    LngRow = 2
    For Each Cl In WkSht.Range("A2:A" & WkSht.Range("A" & Rows.Count).End(xlUp).Row)

        StrOutput = StrOutput & IIf(StrOutput = "", "", ",") & Cl
        StrOutput2 = StrOutput2 & IIf(StrOutput2 = "", "", ",") & "'" & Cl & "'"

        If Len(StrOutput) > 31000 Then
            WkSht.Range("D" & LngRow) = StrOutput
            WkSht.Range("E" & LngRow) = StrOutput2
            StrOutput = ""
            StrOutput2 = ""
            LngRow = LngRow + 1
        End If

        DoEvents
    Next
Set WkSht = Nothing

MsgBox "Done!"

End Sub

然后,您可以在SQL查询中运行每个输出单元格,但我怀疑您可以从查看整个过程中受益。这将是一个非常繁重的文本查询,根据使用的方法,您可能根本无法运行它。虽然 它们会出现,但它们会有不同的问题。

答案 1 :(得分:1)

根据您在@George's answer下的评论......

  

这段代码只是一个部分步骤。我正在使用输出数据和   从仪表板(类似于SQL的内部系统)中提取信息。   仪表板的工作方式类似于搜索引擎。如果我复制并粘贴   将单元格输出到仪表板 - 我可以分离所需的数据集。

...没有理由尝试将完整输出存储在Excel中的单元格中。 Excel单元格只能存储32,767 characters,因此无论构建字符串是否耗尽内存,您的输出都将被截断。

由于您似乎需要 Excel中的结果,只需将其写入文本文件:

Sub Inserting_Commas()
    Dim fso As Object, outFile As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set outFile = fso.CreateTextFile("C:\Foo\bar.txt", True) 'Replace with your own path.

    With Sheets("Sheet1")
        Dim lastRow As Long, rownumber As Long
        lastRow = .Range("A" & .Rows.Count).End(xlUp).Row
        For rownumber = 2 To lastRow
            outFile.Write "'" & .Cells(rownumber, 1).Value & "'"
            If rownumber <> lastRow Then outFile.Write ","
        Next
    End With
End Sub

答案 2 :(得分:0)

您的列表中有多少行?

罪魁祸首可能是那部分:

For rownumber = 3 To lastRow
    outputStr = outputStr & "," & Range("A" & rownumber)
Next

在这里你连接字符串并使它变得越来越大。

如果你有很多行,那么你的内存就会耗尽。