用VBA直接获取Excel单元格
我在一个文件夹中有多个Excel文件,所有这些文件都有固定的模板。我想从中提取单元格,然后放入新工作簿 我以文件夹中的2个Excel文件为例进行说明。我有一个名为用VBA直接获取Excel单元格,vba,excel,Vba,Excel,我在一个文件夹中有多个Excel文件,所有这些文件都有固定的模板。我想从中提取单元格,然后放入新工作簿 我以文件夹中的2个Excel文件为例进行说明。我有一个名为MyFolder的文件夹和两个Excel文件。(file1.xlsx和file2.xlsx) 我想要的是: 所以,我试着: Sub Merge_Files() Dim FSO As New FileSystemObject Dim xFolder As Folder Dim xFile As File Dim Main_WB As
MyFolder
的文件夹和两个Excel文件。(file1.xlsx
和file2.xlsx
)
我想要的是:
所以,我试着:
Sub Merge_Files()
Dim FSO As New FileSystemObject
Dim xFolder As Folder
Dim xFile As File
Dim Main_WB As Workbook, New_WB As Workbook
Dim X As Integer, Y As Integer
Set Main_WB = ActiveWorkbook
Set xFolder = FSO.GetFolder("C:\Desktop\MyFolder\")
Cells(1, "A").Value = "Company"
Cells(1, "B").Value = "CB"
Cells(1, "C").Value = "N/R"
Cells(1, "D").Value = "BB"
Cells(1, "E").Value = "Contact"
Cells(1, "F").Value = "BT"
Cells(1, "G").Value = "TypeAAAUnit"
Cells(1, "H").Value = "AAAJob1_Max"
Cells(1, "I").Value = "AAAJob1_Min"
Cells(1, "J").Value = "AAAJob1_BR50"
'I omit some parts here.
Cells(1, "V").Value = "Total P/per person"
For Each xFile In xFolder.Files
Set New_WB = Workbooks.Open(xFile.Path)
Main_WB.Sheets(1).Range("A" & X).Value = New_WB.Sheets(1).Range("C1").Value
Main_WB.Sheets(1).Range("B" & X).Value = New_WB.Sheets(1).Range("C2").Value
Main_WB.Sheets(1).Range("C" & X).Value = New_WB.Sheets(1).Range("C3").Value
Main_WB.Sheets(1).Range("D" & X).Value = New_WB.Sheets(1).Range("C4").Value
Main_WB.Sheets(1).Range("E" & X).Value = New_WB.Sheets(1).Range("C5").Value
Main_WB.Sheets(1).Range("F" & X).Value = New_WB.Sheets(1).Range("C6").Value
Main_WB.Sheets(1).Range("G" & X).Value = New_WB.Sheets(1).Range("B11").Value
Main_WB.Sheets(1).Range("H" & X).Value = New_WB.Sheets(1).Range("D11").Value
Main_WB.Sheets(1).Range("I" & X).Value = New_WB.Sheets(1).Range("E11").Value
Main_WB.Sheets(1).Range("J" & X).Value = New_WB.Sheets(1).Range("F11").Value
Main_WB.Sheets(1).Range("V" & X).Value = New_WB.Sheets(1).Range("O23").Value
New_WB.Close SaveChanges:=False
Next xFile
End Sub
但是,它不起作用,所以我修改了代码的一些部分。我删除了
Main\u WB.Sheets(1).Range(“A”和X).Value=新的WB.Sheets(1).Range(“C1”).Value
并将其更改为:
ActiveCell.Offset(xRow, 0) = xFolder.Sheets(1).Range("C1").Value
ActiveCell.Offset(xRow, 1) = xFolder.Sheets(1).Range("C2").Value
ActiveCell.Offset(xRow, 2) = xFolder.Sheets(1).Range("C3").Value
'repeat so omit...
xRow = xRow + 1
然而,它仍然不起作用。我想直接获取每个单元格,因为在这两个Excel文件中,有许多单元格,它们不按顺序排列。有解决方案吗?X需要递增。为了更好的可读性,我还使用With语句重构了代码
Sub Merge_Files()
Dim FSO As New FileSystemObject
Dim xFolder As Folder
Dim xFile As File
Dim Main_WB As Workbook, New_WB As Workbook
Dim X As Integer, Y As Integer
Set Main_WB = ActiveWorkbook
Set xFolder = FSO.GetFolder("C:\Desktop\MyFolder\")
X = 1
With Main_WB.Worksheets(1)
.Range("A" & X).Value = "Company"
.Range("B" & X).Value = "CB"
.Range("C" & X).Value = "N/R"
.Range("D" & X).Value = "BB"
.Range("E" & X).Value = "Contact"
.Range("F" & X).Value = "BT"
.Range("G" & X).Value = "TypeAAAUnit"
.Range("H" & X).Value = "AAAJob1_Max"
.Range("I" & X).Value = "AAAJob1_Min"
.Range("J" & X).Value = "AAAJob1_BR50"
.Range("V" & X).Value = "Total P/per person"
For Each xFile In xFolder.Files
X = X + 1
Set New_WB = Workbooks.Open(xFile.Path)
.Range("A" & X).Value = New_WB.Sheets(1).Range("C1").Value
.Range("B" & X).Value = New_WB.Sheets(1).Range("C2").Value
.Range("C" & X).Value = New_WB.Sheets(1).Range("C3").Value
.Range("D" & X).Value = New_WB.Sheets(1).Range("C4").Value
.Range("E" & X).Value = New_WB.Sheets(1).Range("C5").Value
.Range("F" & X).Value = New_WB.Sheets(1).Range("C6").Value
.Range("G" & X).Value = New_WB.Sheets(1).Range("B11").Value
.Range("H" & X).Value = New_WB.Sheets(1).Range("D11").Value
.Range("I" & X).Value = New_WB.Sheets(1).Range("E11").Value
.Range("J" & X).Value = New_WB.Sheets(1).Range("F11").Value
.Range("V" & X).Value = New_WB.Sheets(1).Range("O23").Value
New_WB.Close SaveChanges:=False
Next xFile
End With
End Sub
当
X
为0
(这将是因为您从未将其设置为任何其他值),则“A”&X
变为“A0”
。Excel没有第0行,因此Range(“A0”)
将崩溃。在第二段代码中,您尝试使用xFolder.Sheets(1)
,但xFolder
不是工作簿
对象-我想您是想使用New\u WB.Sheets(1).Range(“C1”).Value
,等等,正如您在第一段代码中所做的那样。您从未递增X
。(例如,X=X+1
)@YowE3K是的,你的右边。我认为第二次修改是完全错误的。第一个是正确的。但在你的评论中,我似乎遗漏了一些部分对于X=2到1000
…下一个X
就像您在第二位代码中递增xRow
一样,您需要在第一位代码中递增X
。(但您也不能在0
处启动X
,否则它将失败-看起来您想将其初始化为2
)