【问题标题】:How do I get a range's address including the worksheet name, but not the workbook name, in Excel VBA?如何在 Excel VBA 中获取包含工作表名称但不包括工作簿名称的范围地址?
【发布时间】:2010-09-12 23:12:05
【问题描述】:

如果我有一个 Range 对象 - 例如,假设它引用名为 Book1 的工作表上的单元格 A1。所以我知道调用Address() 会给我一个简单的本地参考:$A$1。我知道它也可以称为Address(External:=True) 以获取包括工作簿名称和工作表名称的参考:[Book1]Sheet1!$A$1

我想要的是获得一个包含工作表名称的地址,但不包含书名。我真的不想打电话给Address(External:=True) 并尝试用字符串函数自己去掉工作簿名称。我可以在范围内拨打任何电话以获取Sheet1!$A$1吗?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    我能想到的唯一方法是将工作表名称与单元格引用连接起来,如下所示:

    Dim cell As Range
    Dim cellAddress As String
    Set cell = ThisWorkbook.Worksheets(1).Cells(1, 1)
    cellAddress = cell.Parent.Name & "!" & cell.Address(External:=False)
    

    编辑:

    将最后一行修改为:

    cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False) 
    

    如果您希望它在工作表名称中有空格或其他有趣字符的情况下也能正常工作。

    【讨论】:

    • 嗯,这适用于我需要做的事情。谢谢。我会将最后一行修改为: cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False) 这样即使工作表名称中有空格或其他有趣的字符也能正常工作。
    【解决方案2】:

    本是对的。我也想不出任何办法来做到这一点。我建议使用 Ben 推荐的方法或以下方法来去除 Workbook 名称。

    Dim cell As Range
    Dim address As String
    Set cell = Worksheets(1).Cells.Range("A1")
    address = cell.address(External:=True)
    address = Right(address, Len(address) - InStr(1, address, "]"))
    

    【讨论】:

      【解决方案3】:

      [编辑于 2009-04-21]

          正如 Micah 指出的那样,这仅在您命名时才有效
      特定范围(因此。命名任何人?)是的,哎呀!

      [/编辑]

      聚会有点晚了,我知道,但万一其他人在谷歌搜索中发现了这个(就像我刚刚做的那样),你也可以尝试以下方法:

      Dim cell as Range
      Dim address as String
      Set cell = Sheet1.Range("A1")
      address = cell.Name
      

      这应该返回完整的地址,例如“=Sheet1!$A$1”。

      假设您不想要等号,您可以使用 Replace 函数将其去掉:

      address = Replace(address, "=", "")
      

      【讨论】:

      • 当我尝试它时,这对我不起作用。当它击中 cell.Name 时出现错误。根据 VBA 帮助,Range 对象的 Name 属性返回一个 Name 对象,并且仅在对象引用命名范围时才有效。
      • 确认!你完全正确。不知何故,我只是碰巧在测试时命名了该范围。我会相应地更新我的回复:(
      【解决方案4】:

      为什么不直接返回工作表名称 地址 = cell.Worksheet.Name 然后你可以像这样连接地址 地址 = cell.Worksheet.Name & "!" & 单元格.地址

      【讨论】:

      • 我认为 Cell.Worksheet.Name 只会获得 ActiveSheet 名称,这不是 OP 想要的吗?它专门得到一个编号的工作表...
      【解决方案5】:

      Address() 工作表函数正是这样做的。由于无法通过Application.WorksheetFunction 获得,我想出了一个使用Evaluate() 方法的解决方案。

      这个解决方案让 Excel 处理工作表名称中的空格和其他有趣的字符,这比以前的答案有一个很好的优势。

      例子:

      Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _
          rng.Worksheet.Name & """)")
      

      准确返回“Sheet1!$A$1”,其中一个名为 rngRange 对象引用 Sheet1 工作表中的 A1 单元格。

      此解决方案仅返回范围的第一个单元格的地址,而不是整个范围的地址(“Sheet1!$A$1”与“Sheet1!$A$1:$B$2”)。所以我在自定义函数中使用它:

      Public Function AddressEx(rng As Range) As String
      
          Dim strTmp As String
      
          strTmp = Evaluate("ADDRESS(" & rng.Row & "," & _
              rng.Column & ",1,1,""" & rng.Worksheet.Name & """)")
      
          If (rng.Count > 1) Then
      
              strTmp = strTmp & ":" & rng.Cells(rng.Count) _
                  .Address(RowAbsolute:=True, ColumnAbsolute:=True)
      
          End If
      
          AddressEx = strTmp
      
      End Function
      

      Address() 工作表函数的完整文档可在 Office 网站上找到:https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

      【讨论】:

      • 需要注意Evaluate() 的参数必须少于 255 个字符。也许限制更高,但肯定有限制。如果工作表名称很长,这可能会意外失败。
      【解决方案6】:
      Dim rg As Range
      Set rg = Range("A1:E10")
      Dim i As Integer
      For i = 1 To rg.Rows.Count
      
          For j = 1 To rg.Columns.Count
          rg.Cells(i, j).Value = rg.Cells(i, j).Address(False, False)
      
          Next
      Next
      

      【讨论】:

      • 欢迎来到 Stack Overflow!而不是只发布一段代码,请解释为什么这段代码解决了所提出的问题。没有解释,这不是答案。
      【解决方案7】:
      Split(cell.address(External:=True), "]")(1)
      

      【讨论】:

      • 简洁明了的选项。 +1
      • 是的,我在概念上喜欢这个,但是当工作表名称有空格并因此需要单引号(即“我的工作表”)时,它就不能正常工作了(即“我的工作表”)
      • 在C#中使用这个string address = range.get_Address(true, true, XlReferenceStyle.xlA1, true).Replace(workbook.Name, "").Replace("[]", "");
      【解决方案8】:

      我发现以下内容在我创建的用户定义函数中对我有用。我将单元格区域引用和工作表名称连接为字符串,然后在 Evaluate 语句中使用(我在 Sumproduct 上使用 Evaluate)。

      例如:

      Function SumRange(RangeName as range)   
      
      Dim strCellRef, strSheetName, strRngName As String
      
      strCellRef = RangeName.Address                 
      strSheetName = RangeName.Worksheet.Name & "!" 
      strRngName = strSheetName & strCellRef        
      

      然后在其余代码中引用 strRngName。

      【讨论】:

        【解决方案9】:

        您可能需要编写处理具有多个区域的范围的代码,这样做:

        Public Function GetAddressWithSheetname(Range As Range, Optional blnBuildAddressForNamedRangeValue As Boolean = False) As String
        
            Const Seperator As String = ","
        
            Dim WorksheetName As String
            Dim TheAddress As String
            Dim Areas As Areas
            Dim Area As Range
        
            WorksheetName = "'" & Range.Worksheet.Name & "'"
        
            For Each Area In Range.Areas
        '           ='Sheet 1'!$H$8:$H$15,'Sheet 1'!$C$12:$J$12
                TheAddress = TheAddress & WorksheetName & "!" & Area.Address(External:=False) & Seperator
        
            Next Area
        
            GetAddressWithSheetname = Left(TheAddress, Len(TheAddress) - Len(Seperator))
        
            If blnBuildAddressForNamedRangeValue Then
                GetAddressWithSheetname = "=" & GetAddressWithSheetname
            End If
        
        End Function
        

        【讨论】:

          【解决方案10】:
          rngYourRange.Address(,,,TRUE)
          

          显示外部地址,完整地址

          【讨论】:

          • OP 明确表示他/她不想使用.Address 但您却提议使用它。有什么理由吗?否则,我建议您删除或编辑您的回复。
          • @ArnonK 这不是问题,因为在这种情况下你有工作簿作为回应
          【解决方案11】:

          给困惑的老我一个范围

          .Address(False, False, , True)

          似乎以 TheSheet!B4:K9 格式给出

          如果不符合条件.. 避免使用 Str 函数

          可能只需要不到一毫秒的时间并使用 153 个已使用的电子

          大约 0.3 微秒

          RaAdd=mid(RaAdd,instr(raadd,"]") +1)

          '大约 1.7 微秒

          RaAdd= split(radd,"]")(1)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-30
            • 1970-01-01
            • 2023-03-21
            • 2022-12-08
            • 1970-01-01
            • 2023-03-18
            • 1970-01-01
            相关资源
            最近更新 更多