我有一个文件夹,每个员工都有一个excel工作簿(工作簿中只有一个工作表)。我想打开每个员工工作簿并以$ A $ 1读取单元格,然后写入另一个工作表。最终,我将有一个工作表,其中包含每个工作簿的所有$ A $ 1单元格。我写了下面的代码,但我指出的那条线由于某种原因不起作用。你能建议怎么做吗?感谢
Private Sub CommandButton1_Click()
Const FOLDER As String = "c:\Junk\Employee Files\"
On Error GoTo ErrorHandler
Dim i As Integer
i = 0
Dim fileName As String
fileName = Dir(FOLDER, vbDirectory)
Do While Len(fileName) > 0
If Right$(fileName, 4) = "xlsx" Then
i = i + 1
Dim currentWkbk As Excel.Workbook
Set currentWkbk = Excel.Workbooks.Open(FOLDER & fileName)
Cells(i, 1) = "Employee " & 1
'The line above works perfectly
Cells(i, 2) = currentWkbk.Range("A1").Value
'The line doesn't work. above works perfectly
End If
fileName = Dir
Loop
ProgramExit:
Exit Sub
ErrorHandler:
MsgBox Err.Number & " - " & Err.Description
Resume ProgramExit
End Sub
答案 0 :(得分:2)
Brad确实有一点意见,但我认为你的错误更可能是由于缺少指定的工作表 - 尝试使用它:
Cells(i, 2) = currentWkbk.worksheets(1).Range("A1").Value
而不是
Cells(i, 2) = currentWkbk.Range("A1").Value
但是,您也应该考虑使用Brads建议;)
有些人可能会建议使用动态解决方案来选择工作表。我没有使用过,因为你明确说过,只会有一个工作表。但无论如何,您当然可以将其设置为动态或使用工作表的实际名称而不是1
- 无论您的需求是什么。
答案 1 :(得分:0)
您需要完全限定范围参考。由于您引用了两个工作簿,因此无法使用cells(i,2)
之类的术语,因为它默认引用通常不是您想要的活动工作簿,在这种情况下尤其是当您使用{{1}打开新文件时它变成了活跃的工作簿。
在日常工作开始时尝试这样的事情
Set currentWkbk = Excel.Workbooks.Open(FOLDER & fileName)
然后像
一样使用它Dim destWorksheet as Worksheet
Set destWorksheet = Thisworkbook.Sheets("Name of sheet")
答案 2 :(得分:0)
我遇到了一个新挑战,我们收到了100个excel文件,在单元格A3:A3中的文件中有文件名的请求者。 因此,我只需要为特定的请求者加载数据,数据就从单元格A35中的文件开始。
我现在为该循环中的每个循环创建了一个,我将文件名和工作表名称保存到变量中,并在从变量中读取数据时使用该变量。 现在,我创建了另一个变量,并在表达式中使用了语法:“ SELECT” +“ [” + @ [User :: SheetName] +“ A3:A3]” +“。F1” +“ AS COL1 FROM” +“ [“ + @ [User :: SheetName] +” A3:A3]“
现在设置ResultSet = Single Row并将结果集分配给另一个变量P_id。 现在在优先约束中,我们将变量等同于变量,如果值匹配,它将通过流程,否则我们可以根据以下条件移动或删除该文件: