用VBA直接获取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

我在一个文件夹中有多个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 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