excel - 收集的数据在外部 excel 关闭时被删除 - excel vba
问题描述
我在一个 excel 中有一个 vba 代码,它从特定位置的许多其他 excel 中读取数据,但是数据在外部 excel 上消失了 close
下面给出了影响行后集合的代码
Workbooks(fileName).Save
Workbooks(fileName).Close
代码:
Sub filefindermacro()
Dim directory As String
Dim fileName As String
Dim sheet As Worksheet
Dim i As Integer
Dim j As Integer
Dim datecollection As New Collection
Dim majorcategory As New Collection
Dim projectname As New Collection
Dim partname As New Collection
Dim username As New Collection
Dim designerchecker As New Collection
Dim fpactualhours As New Collection
Dim ractualhours As New Collection
Dim currentstatus As New Collection
Dim softwareused As New Collection
Application.ScreenUpdating = False
directory = "D:\cam\UserExcel\"
fileName = Dir(directory & "*.xl??")
Set projectname = New Collection
Do While fileName <> ""
i = i + 1
j = 2
Workbooks.Open (directory & fileName)
For Each sheet In Workbooks(fileName).Worksheets
If sheet.Name = "HAI" Then
Dim counter
counter = sheet.UsedRange.Rows.Count
For i = 3 To counter
datecollection.Add (sheet.Cells(i, 1))
majorcategory.Add (sheet.Cells(i, 2))
projectname.Add (sheet.Cells(i, 3))
partname.Add (sheet.Cells(i, 4))
username.Add (sheet.Cells(i, 5))
designerchecker.Add (sheet.Cells(i, 6))
fpactualhours.Add (sheet.Cells(i, 7))
ractualhours.Add (sheet.Cells(i, 8))
currentstatus.Add (sheet.Cells(i, 9))
softwareused.Add (sheet.Cells(i, 10))
'MsgBox projectname(i - 2)
Next
End If
Next sheet
**Workbooks(fileName).Save
Workbooks(fileName).Close**
fileName = Dir()
Loop
Dim projectfile, projname
projectfile = Replace(ThisWorkbook.Name, ".xlsm", "")
j = 1
For i = 1 To projectname.Count
'MsgBox projectname.Count
**If projectname.Item(i) = projectfile Then**
Sheet1.Cells(j, 1) = datecollection(i)
Sheet1.Cells(j, 2) = majorcategory(i)
Sheet1.Cells(j, 3) = projectname(i)
Sheet1.Cells(j, 4) = partname(i)
Sheet1.Cells(j, 5) = username(i)
Sheet1.Cells(j, 6) = designerchecker(i)
Sheet1.Cells(j, 7) = fpactualhours(i)
Sheet1.Cells(j, 8) = ractualhours(i)
Sheet1.Cells(j, 9) = currentstatus(i)
Sheet1.Cells(j, 10) = softwareused(i)
j = j + 1
End If
Next
Application.ScreenUpdating = True
End Sub
解决方案
我之前错过了,但这是你的问题:
projectname.Add (sheet.Cells(i, 3))
执行此操作时,您实际上向projectname
集合添加了什么?
您可能希望它是单元格的值(因为这是 的默认属性Range
),但您实际上是在添加对单元格本身的引用,并且一旦您关闭了源工作簿,就无法再访问它。
这是修复:
projectname.Add sheet.Cells(i, 3).Value
永远不要编写使用默认属性而不明确包含它们的代码的另一个原因......
而且你不需要()
这里。
推荐阅读
- android - 尝试改造(一个 android api 库),遇到了一些问题
- css - Flexbox 和 SVG 内容
- python - Clone Kubernetes objects programmatically using the Python API
- android - 防止重定向触发应用/通用链接行为
- excel - EXCEL:根据今天()从一张表中提取数据并显示在另一张表上
- angular - 根据角度表单构建器/组中其他字段的值运行并设置一个字段的验证错误
- asp.net-mvc - 使用会话未过期,并且用户在空闲时间后未重定向到登录页面(MVC)
- excel - 如果日期校正VBA的条件
- css - Angular 8:将 Mat-form-field 中的高度更改为特定像素数
- php - ACF 中继器字段 [短代码] - 如果子字段为空,则不显示任何内容