如何获取以特定字符串开头的特定工作表中的命名范围列表(例如,以total开头的所有命名范围)并获取值?我正在尝试根据日期进行Sub Total和Grand Total住宿费用。我将根据日期组为每个子总计分配一个唯一的名称。然后,我有一个按钮,当它完成时需要点击以根据我为每个子总计唯一分配的命名范围来计算总计。
以下是我为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是我的工作表的名称。
上面代码的唯一问题是,它将查找工作簿中存在的所有命名范围。我只需要在一个特定的工作表中找到命名范围,它以给定的字符串和行号开头(total26:表示第26行的Sub Total),然后获取值作为总计的总和。
任何想法如何做到这一点?花了两天时间才找到答案。
提前谢谢你们。
这就是我对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
谢谢大家的帮助。现在,我需要为这个脚本提出我自己的版本。
答案 0 :(得分:4)
以下是一些代码,用于检查定义名称是否以字符串开头,并引用给定工作表和工作簿的已用范围内的范围。
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
答案 1 :(得分:0)
以下函数将输出工作簿中的所有名称及其总计。
我认为这是运行代码所需的基本功能块。
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,here,您将找到一个用于管理该版本中的名称范围的插件。见下面的屏幕截图
HTH