首页 > 解决方案 > 如何确定我的临时文件夹是否超载?(对长度表示歉意)

问题描述

我有一个引发以下错误的宏,并且我有一个理论原因,但是找不到任何文献来支持它。我发现的页面通常是人们发布错误变量类型的愚蠢错误。

运行时错误“6”截图

我不认为代码有什么问题,我只是认为任务的性质需要太长时间,因此会重载临时文件夹。根据TechWalla强调我的):

运行时错误 6 出现在 Visual Basic 程序中。这是一个溢出问题,当 Visual Basic 程序试图在临时文件夹区域中存储太多数据时,就会发生这种问题。运行时文件帮助 Windows 将程序的语言翻译成 Windows 语言,从而使程序运行得更快。出于多种原因,您可能会收到运行时错误 6 消息。一个原因是您在其中一个计算中使用了反斜杠而不是正斜杠。其他原因包括临时文件夹过载、软件过时或注册表错误。

警告:我在其他地方没有看到这个解释,也不能保证 Techwalla 的可靠性。我不知道我是否没有使用正确的关键字进行搜索,但就像我说的那样,我没有找到太多除了特定于代码的论坛帖子之外的任何内容。)

有没有办法确定是否是这种情况?我在下面概述了为什么我认为这是导致错误的原因,这可能会有所帮助,但不会改变问题。如果是这种情况,有没有办法找出来?如果是这样,有没有办法阻止它?

(我今晚将再次运行它,因为我使用了一个找到 1GB 的注册表清理程序,虽然我不知道 Excel 中有多少。作为参考,我的 C: 驱动器有 180GB 可用空间......)

编辑:删除代码,因为我不是在问这个问题,而是临时文件夹重载是否真的会导致这种情况。

EDIT2:被人左右后,我正在重新添加代码。我知道,它没有效率。谢谢你的建议。

EDIT3(最后一个,我发誓):虽然我意识到上面的描述特别提到了 Visual Basic,它不是 VBA,但我将它保留在其中,因为我知道 Excel 使用/创建临时文件,并且有内存限制,这最终是什么我很好奇。

Sub getCBU()

Dim rowCount As Long, newRow(1 To 17) As Variant, compareRow(1 To 17) As Variant, nextFile As String, s As Long
Dim location As String, lastRow As Long, match As Boolean, startTime As Double, secondsElapsed As String


location = "C:\Users\swallin\Documents\CBU History\"
nextFile = Dir(location & "CBU*")
rowCount = 2

startTime = Timer

Do While nextFile <> ""

    Workbooks.Open (location & nextFile)
    lastRow = Workbooks(nextFile).Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row

    For s = 18 To lastRow

        match = True

        For x = 1 To 17
            newRow(x) = Workbooks(nextFile).Worksheets(1).Cells(s, x)
        Next x

        For y = 2 To rowCount

            If Val(newRow(11)) = Val(ThisWorkbook.Worksheets(1).Cells(y, 11)) Then

                For j = 1 To 17
                    compareRow(j) = ThisWorkbook.Worksheets(1).Cells(y, j).Value
                Next j

                For v = 1 To 17
                    If Val(compareRow(v)) <> Val(newRow(v)) Then
                        match = False
                        Exit For
                    Else
                        match = True
                    End If
                Next v

                If match = True Then
                    Exit For
                End If

            Else
                match = False
            End If

        Next y

        y = 2

        If match = False Then
            rowCount = rowCount + 1
            For t = 1 To 17
                ThisWorkbook.Worksheets(1).Cells(rowCount, t) = newRow(t)
            Next t
        End If

    Next s




    s = 18

    Workbooks(nextFile).Close

    nextFile = Dir()

Loop

secondsElapsed = Format((Timer - startTime) / 86400, "hh:mm:ss")
ThisWorkbook.Worksheets(2).Cells(1, 1) = secondsElapsed

End Sub

标签: excelvbatheory

解决方案


这将为每个文件打开一个新实例,然后将其关闭。试一试(我无法测试)。这包括我在聊天中提出的所有建议。

Option Explicit

Sub getCBU()
    Dim location As String
    location = "C:\Users\swallin\Documents\CBU History\"

    Dim nextFile As String
    nextFile = Dir(location & "CBU*")

    Dim rowCount As Long
    rowCount = 2

    Dim startTime As Double
    startTime = Timer


    Dim newRow(1 To 17) As Variant, compareRow(1 To 17) As Variant
    Dim lastRow As Long, match As Boolean

    Dim s As Long, x As Long, y As Long, j As Long, v As Long, t As Long

    Dim objExcel As Object, ActWb As Workbook


    Do While nextFile <> ""
        Set objExcel = CreateObject("Excel.Application") 'new excel instance
        Set ActWb = objExcel.Workbooks.Open(Filename:=location & nextFile, ReadOnly:=True)

        lastRow = ActWb.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row

        For s = 18 To lastRow
            match = True

            For x = 1 To 17
                newRow(x) = ActWb.Worksheets(1).Cells(s, x)
            Next x

            For y = 2 To rowCount
                If Val(newRow(11)) = Val(ThisWorkbook.Worksheets(1).Cells(y, 11)) Then
                    For j = 1 To 17
                        compareRow(j) = ThisWorkbook.Worksheets(1).Cells(y, j).Value
                    Next j

                    For v = 1 To 17
                        If Val(compareRow(v)) <> Val(newRow(v)) Then
                            match = False
                            Exit For
                        Else
                            match = True
                        End If
                    Next v

                    If match = True Then
                        Exit For
                    End If
                Else
                    match = False
                End If
            Next y

            y = 2

            If match = False Then
                rowCount = rowCount + 1
                For t = 1 To 17
                    ThisWorkbook.Worksheets(1).Cells(rowCount, t) = newRow(t)
                Next t
            End If
        Next s

        s = 18

        ActWb.Close SaveChanges:=False
        objExcel.Quit 'close excel instance
        Set objExcel = Nothing 'free variable

        nextFile = Dir()
    Loop

    Dim secondsElapsed As String
    secondsElapsed = Format$((Timer - startTime) / 86400, "hh:mm:ss")
    ThisWorkbook.Worksheets(2).Cells(1, 1) = secondsElapsed
End Sub

推荐阅读