Excel在工作表中列出名称范围并获取值

如何获取以特定string开头的特定工作表中存在的命名范围列表(例如,以总数开头的所有命名范围)并获取值? 我正在尝试按date计算小计和总住宿费用。 我将根据date组为每个小计分配一个唯一的名称。 然后,我有一个button,当它完成后,需要点击,以基于我已经唯一分配给每个小计的命名范围计算总计。

以下是我写给Grand Total的代码:

Sub btnTotal() Dim Total, LastRowNo As Long LastRowNo = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count Total = 0 For Each N In ActiveWorkbook.Names Total = Total + IntFlight.Range(N.Name).Value Next N IntFlight.Range("$P" & LastRowNo).Select Selection.NumberFormat = "$* #,##0.00;$* (#,##0.00);$* ""-""??;@" With Selection .Font.Bold = True End With ActiveCell.FormulaR1C1 = Total End Sub 

注意:“Total = Total + IntFlight.Range(N.Name).Value”中的IntFlight是我工作表的名称。

上面的代码唯一的问题,它将查找工作簿中存在的所有命名范围。 我只需要在一个特定的工作表中find命名范围,它以给定的string和行号(总数26:表示来自第26行的子总数)开始,然后抓取总和为总和的值。

任何想法如何做到这一点? 花了2天才find答案。

感谢提前堆。

编辑1(解决scheme由查尔斯威廉姆斯belisarius帮助):

这就是我使用Charles Williams的代码所做的:

 Option Explicit Option Compare Text Sub btnIntFlightsGrandTotal() Dim Total, LastRowNo As Long LastRowNo = FindLastRowNo("International Flights") Dim oNM As Name Dim oSht As Worksheet Dim strStartString As String strStartString = "IntFlightsTotal" Set oSht = Worksheets("International Flights") For Each oNM In ActiveWorkbook.Names If oNM.Name Like strStartString & "*" Then If IsNameRefertoSheet(oSht, oNM) Then Total = Total + Worksheets("International Flights").Range(oNM.Name).Value End If End If Next oNM IntFlights.Range("$P" & LastRowNo).Select Selection.NumberFormat = "$* #,##0.00;$* (#,##0.00);$* ""-""??;@" With Selection .Font.Bold = True End With ActiveCell.FormulaR1C1 = Total End Sub Function FindLastRowNo(SheetName As String) As Long Dim oSheet As Worksheet Set oSheet = Worksheets(SheetName) FindLastRowNo = oSheet.UsedRange.Row + oSheet.UsedRange.Rows.Count End Function 

感谢大家的帮助。 现在,我需要为这个脚本提供我自己的版本。

以下是一些代码,用于检查“定义的名称”是否以string开头,并引用给定工作表和工作簿的使用范围内的范围。

 Option Explicit Option Compare Text Sub FindNames() Dim oNM As Name Dim oSht As Worksheet Dim strStartString As String strStartString = "Total" Set oSht = Worksheets("TestSheet") For Each oNM In ActiveWorkbook.Names If oNM.Name Like strStartString & "*" Then If IsNameRefertoSheet(oSht, oNM) Then MsgBox oNM.Name End If End If Next oNM End Sub Function IsNameRefertoSheet(oSht As Worksheet, oNM As Name) As Boolean Dim oSheetRange As Range IsNameRefertoSheet = False On Error GoTo GoExit If Not oSht Is Nothing Then If Range(oNM.Name).Parent.Name = oSht.Name And _ Range(oNM.Name).Parent.Parent.Name = oSht.Parent.Name Then Set oSheetRange = oSht.Range("A1").Resize(oSht.UsedRange.Row + oSht.UsedRange.Rows.Count - 1, oSht.UsedRange.Column + oSht.UsedRange.Columns.Count - 1) If Not Intersect(Range(oNM.Name), oSheetRange) Is Nothing Then IsNameRefertoSheet = True Set oSheetRange = Nothing End If End If Exit Function GoExit: End Function 

以下函数将输出工作簿中的所有名称及其总数。

我认为这是你需要运行代码的基本块。

 Sub btnTotal() For Each N In ActiveWorkbook.Names MsgBox N.Name + " " + CStr(Application.WorksheetFunction.Sum(Range(N))) Next N End Sub 

编辑

回答你的评论:

用这种方式定义你的名字:

替代文字

然后(和只有然后)下面的代码工作:

 Sub btnTotal() For Each N In ActiveSheet.Names If (InStr(N.Name, "!Total") <> 0) Then MsgBox N.Name + " " + CStr(Application.WorksheetFunction.Sum(Range(N))) End If Next N End Sub 

如果您没有正确定义名称的范围,则需要在代码中进行大量的额外工作。

编辑由于您忘记提及您仍在使用Excel 2003,因此您将在此处find一个用于pipe理该版本中的命名范围的插件。 看下面的屏幕截图

替代文字

HTH