3

如何获取以特定字符串开头的特定工作表中存在的命名范围列表(例如所有以总计开头的命名范围)并获取值?我正在尝试根据日期计算住宿费用的小计和总计。我将根据日期组为每个小计分配一个唯一的名称。然后,我有一个按钮,当它完成时需要单击该按钮,以根据我唯一分配给每个小计的命名范围来计算总计。

以下是我为完成总计而编写的代码:

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 行的小计),然后获取要汇总为总计的值。

任何想法如何做到这一点?花了2天时间寻找答案。

提前致谢。

编辑 1(查尔斯·威廉姆斯在 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

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

4

2 回答 2

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
于 2010-10-27T10:38:05.827 回答
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,您将在此处找到一个插件来管理该版本中的名称范围。请参阅下面的屏幕截图

替代文字

高温高压

于 2010-10-27T05:03:14.430 回答