excel - 如何确定我的临时文件夹是否超载?(对长度表示歉意)
问题描述
我有一个引发以下错误的宏,并且我有一个理论原因,但是找不到任何文献来支持它。我发现的页面通常是人们发布错误变量类型的愚蠢错误。
我不认为代码有什么问题,我只是认为任务的性质需要太长时间,因此会重载临时文件夹。根据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
解决方案
这将为每个文件打开一个新实例,然后将其关闭。试一试(我无法测试)。这包括我在聊天中提出的所有建议。
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
推荐阅读
- python - 在 AWS lambda 函数中获取日志两次
- angular - 从 Angular 应用程序中的 HttpErrorResponse 获取错误消息
- javascript - React 16.4 允许从状态更改中调用 getDerivedStateFromProps。如何应对?
- couchbase - Couchbase 系统日志启用配置
- python - 在 skimage 中使用标签和 regionprops 时出错,
- android - Android - 如何定义备份内容规则以仅包含共享首选项
- performance - 实施密集型简单报告的最佳解决方案
- ios - Xamarin iOS 设置 NavigationController.NavigationBar.Translucent = true; 将滚动视图内容向上移动
- javascript - MAGENTO 2 Prototype.js 每个
- javascript - 量角器,无法从会话存储中获取正确的数据