这里的第一次海报(和一个新手编码器!),所以我希望我能够很好地解释自己,因为我在网上搜索时一直在努力寻找答案。
我的公司目前有一个非常简单的时间表系统,使用Excel,每个人都在本周末发送预定义的工作簿,其中列出了他们已经完成的任务,分为半天(所以可以说周五上午 - 管理员,周五下午 - 分析,例如)。为了让那些必须将所有这些数据用于项目成本的人简化生活,我在人们使用的时间表中创建了一个命名区域,名为 DataRange ,然后可以在VBA中调用。
我制作了一个工作簿,允许她点击一个按钮,并指定一个目录,指出她要导入的所有时间表的位置,并在选择所有这些后,它遍历每一个,找到 DataRange 并将其粘贴到新工作簿中,将A strong列中的 Timesheet_ 名称 和B列中的日期粘贴在一起。
我的下一步是允许使用此数据创建新表。在循环中,创建一个新的命名范围,其中包含从时间表工作簿中粘贴的所有数据,并为其指定A列中的任何内容的名称(因此,如果循环中的第一个时间表被粘贴,则名称将为Timesheet_JohnSmith,该范围将涵盖时间表工作簿中的所有数据。)
这一切都很好,但是,我遇到的问题是,当创建这些新的命名范围时,它们被设置为他们所处的工作表的范围,而不是整个工作簿。这意味着如果您想在其他工作表中使用它们(这是我将来的意图,以便将它们创建到新表中),您必须将它们称为(例如,如果它们位于工作簿中的工作表1上)Sheet1 !Timesheet_JohnSmith而不仅仅是Timesheet_JohnSmith。
我的代码如下所示: SummarySheet.Names.Add Name:= setUserName,RefersTo:= DestRange ,其中设置了新的命名范围。我想知道的是为什么它将它设置到它所在的工作表的范围内,以及是否有一种简单的方法将其更改为整个工作簿的范围。谢谢!
Sub MergeSelectedWorkbooks()
Dim SummarySheet As Worksheet
Dim FolderPath As String
Dim SelectedFiles() As Variant
Dim NRow As Long
Dim FileName As String
Dim getUserFileName() As String
Dim setUserName As String
Dim NFile As Long
Dim WorkBk As Workbook
Dim SourceRange As Range
Dim DestRange As Range
' Create a new workbook and set a variable to the first sheet.
Set SummarySheet = Workbooks.Add(x1WBATWorksheet).Worksheets(1)
SummarySheet.SaveAs ("SummaryTest")
Workbooks("SummaryTest.xlsx").Activate
ActiveWorkbook.Sheets.Add
' Modify this folder path to point to the files you want to use.
FolderPath = Worksheets("Summary").Range("FilePath")
' Set the current directory to the the folder path.
ChDrive FolderPath
ChDir FolderPath
' Open the file dialog box and filter on Excel files, allowing multiple files
' to be selected.
SelectedFiles = Application.GetOpenFilename( _
filefilter:="Excel Files (*.xl*), *.xl*", MultiSelect:=True)
' NRow keeps track of where to insert new rows in the destination workbook.
NRow = 1
' Loop through the list of returned file names
For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
' Set FileName to be the current workbook file name to open.
FileName = SelectedFiles(NFile)
' Open the current workbook.
Set WorkBk = Workbooks.Open(FileName)
' Get the file name to be used for column A, removing the path and file extension
getUserFileName = Split(FileName, "\")
setUserName = getUserFileName(UBound(getUserFileName))
setUserName = Replace(setUserName, ".xlsx", "")
' Set the cell in column A to be the file name.
SummarySheet.Range("A" & NRow).Value = setUserName
SummarySheet.Range("B" & NRow).Value = Date
' Set the source range to be A9 through C9.
' Modify this range for your workbooks. It can span multiple rows.
Set SourceRange = WorkBk.Worksheets(1).Range("DataRange")
' Set the destination range to start at column B and be the same size as the source range.
Set DestRange = SummarySheet.Range("C" & NRow)
Set DestRange = DestRange.Resize(SourceRange.Rows.Count, _
SourceRange.Columns.Count)
' Copy over the values from the source to the destination.
DestRange.Value = SourceRange.Value
'Create the name range in the new workbook to be used for future calculations
SummarySheet.Activate
SummarySheet.Names.Add Name:=setUserName, RefersTo:=DestRange
' Increase NRow so that we know where to copy data next.
NRow = NRow + DestRange.Rows.Count
' Close the source workbook without saving changes.
WorkBk.Close savechanges:=False
Next NFile
' Call AutoFit on the destination sheet so that all data is readable.
SummarySheet.Columns.AutoFit
End Sub
答案 0 :(得分:1)
它正在做你告诉它的事情 - 这是将名称添加到工作表而不是工作簿。你可以使用:
DestRange.Name = setUserName