在工作簿的名称条件下将工作表定义为变量

时间:2018-10-23 13:32:32

标签: vba excel-vba loops sum worksheet

我的目标:我有一个文件(F),其中包含多个工作簿,每个工作簿具有相同的格式。我正在列条件下对每个工作簿进行条件求和,并希望将输出放到另一个工作簿中,该工作簿每个循环的工作簿包含一个工作表(包含在F中)。

问题:我找不到在循环工作簿名称功能中更改工作表名称的好策略。 似乎将工作表定义为变量不太适合VBA。

Set Output_tot_n = Workbooks("Final_Output").Sheet_name.Range("B7")

此后代码停止,出现错误438“对象不支持此属性或方法”

下面的完整代码:

Sub Proceed_Data()

Dim FileSystemObj As Object
Dim FolderObj As Object
Dim fileobj As Object
Dim Sheet_name As Worksheet
Dim i, j, k  As Integer
Dim wb As Workbook

Set FileSystemObj = CreateObject("Scripting.FileSystemObject")
Set FolderObj = FileSystemObj.GetFolder("C:\...\")

For Each fileobj In FolderObj.Files
Set wb = Workbooks.Open(fileobj.Path)

Set Output_tot_n = Workbooks("Final_Output").Sheet_name.Range("B7")

If wb.Name = "AAA_SEPT_2018" Then
Sheet_name = Worksheets("AAA")
End If
If wb.Name = "BBB_SEPT_2018" Then
Sheet_name = Worksheets("BBB")
End If
If wb.Name = "CCC_SEPT_2018" Then
Sheet_name = Worksheets("CCC")
End If

' conditional sum

With wb.Sheets("REPORT")
For i = 2 To .Cells(Rows.Count, 14).End(xlUp).Row
If .Cells(i, "O").Value = "sept" Then
k = .Cells(i, "M").Value
End If
j = j + k
k = 0
Next i
End With
Output_tot_n = j
j = 0

wb.Save
wb.Close

Next fileobj
End Sub

您知道什么地方会出问题,如果我应该使用其他策略?

非常感谢!

3 个答案:

答案 0 :(得分:1)

Workbookscollection(实际Application对象的一部分)。 VBA中的集合可以通过索引号(索引从1开始)或名称进行访问。打开的工作簿的名称是包含扩展名的名称,在您的情况下,可能是Final_Output.xlsxFinal_Output.xlsm

SheetsWorksheetsWorkbook中的集合,可以再次通过索引或名称进行访问(不同之处在于Worksheets包含“真实”电子表格,而{{1} }还可以包含其他工作表类型,例如图表。

因此,您要访问特定工作簿的特定工作表的Sheets。工作簿具有固定名称,而工作表名称存储在变量中。您可以编写例如

Range

或全部放在一起(取决于您的需求)

dim sheetName as string, sheet as Worksheet, Output_tot_n as Range
sheetName = "AAA"  ' (put your logic here)
set sheet = Workbooks("Final_Output.xlsm").Worksheets(Sheet_name)
set Output_tot_n = sheet.Range("B7")

答案 1 :(得分:0)

非常感谢。

您实际上是打算这样做吗?

Set Output_tot_n = Workbooks("Final_Output.xlsm").Worksheets(Sheet_name).Range("B7")

If wb.Name = "AAA_SEPT_2018" Then
Sheet_name = "AAA"
End If
If wb.Name = "BBB_SEPT_2018" Then
Sheet_name = "BBB"
End If
If wb.Name = "CCC_SEPT_2018" Then
Sheet_name = "CCC"
End If

答案 2 :(得分:0)

不,它实际上有效。再次感谢您的回答。

问题很重要,要放入“ AAA_SEPT_2018.xlsx”