超过Excel中的最大字符数限制

时间:2010-10-08 19:04:27

标签: excel function

如何在Excel的CONCATENATE函数中使用超过255个字符?我实际上也在EXCEL的HYPERLINK函数中使用CONCATENATE函数。一个例子如下:

=HYPERLINK(CONCATENATE("http://www.google/com/morethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255charsmorethan255chars","morethan255chars morethan255charsmorethan255charsmorethan255charsmorethan25"),"link");

更新:这不是CONCATENATE函数的问题,而是HYPERLINK函数的第一个参数的问题。直接/间接使用长度超过255个字符的字符串(例如:= HYPERLINK(K204,“link”),其中K204包含256个字符的长度链接)HYPERLINK函数失败

我意识到我可以使用URL缩短器,但我正在为大量链接做这个,这需要很多人手动使用URL缩短器。

12 个答案:

答案 0 :(得分:4)

更新:由于Karls的评论,我重新审视了我的答案,Excel 2007似乎不再允许用户定义函数设置超链接(非常合理,请参阅我自己在代码中的注释)。所以原始代码(在行下面)在最新版本的Excel中不起作用(我没有测试Excel 2010,但我假设结果是相同的)。由于历史原因,我不删除旧代码(编辑可能会认为不同 - 随意编辑/删除)。

剩下的就是以编程方式设置长超链接,例如

Sub insertVeryLongHyperlink()

    Dim curCell As Range
    Dim longHyperlink As String

    Set curCell = Range("A1")   ' or use any cell-reference
    longHyperlink = "http://www.veryLongURL.com/abcde"  ' Or a Cell reference like [C1]

    curCell.Hyperlinks.Add Anchor:=curCell, _
                    Address:=longHyperlink, _
                    SubAddress:="", _
                    ScreenTip:=" - Click here to follow the hyperlink", _
                    TextToDisplay:="Long Hyperlink"

End Sub

以下内容在Excel 2010中不起作用;看我上面的评论

“从Word复制超链接并粘贴到Excel”让我思考。显然,限制是在内置的HYPERLINK函数和对话框窗口的“编辑超链接”中。另一方面,它应该 - 实际上 - 可以通过VBA设置更长的超链接。

此代码不再适用于Excel 2010

Function myHyperlink(cell As Range, _
                        hyperlinkAddress As String, _
                        Optional TextToDisplay As Variant, _
                        Optional ScreenTip As Variant)

    ' Inserts a Hyperlink
    '   at the position     cell (this should be the position where the UDF is used,
    '                       since the return value of the UDF is = TextToDisplay)
    '   with the            hyperlinkAddress
    '   optional            TextToDisplay
    '   optional            ScreenTip

    ' #######################################
    ' Warning Warning Warning Warning Warning
    ' #######################################

    ' 1) Since it is really bad practice to have a function perform procedural
    '    tasks, you should not do this.
    ' 2) You have no garantee, the link is updated when the value hyperlinkAddress changes

    ' USE AT YOUR ONE RISK AND ONLY IN CASE OF EMERGENCIES :-)


    ' If more than one cell is selected as target range,
    ' use the top left cell
    Set cell = cell.Resize(1, 1)

    If IsMissing(TextToDisplay) Then
        TextToDisplay = hyperlinkAddress
    End If

    If IsMissing(ScreenTip) Then
        ScreenTip = hyperlinkAddress & " - Click here to follow the hyperlink"
    End If

    cell.Hyperlinks.Add Anchor:=ActiveCell, _
                        Address:=hyperlinkAddress, _
                        SubAddress:="", _
                        ScreenTip:=ScreenTip, _
                        TextToDisplay:=TextToDisplay

    ' There doesn't seem to be another way to set TextToDisplay
    myHyperlink = TextToDisplay

End Function

用作普通的Excel函数,但一定要将当前单元格添加为第一个参数(即在单元格A1中插入以下公式)

=myHyperlink(A1,B1)
=myHyperlink(A1,B1,"TextToDisplay", "ScreenTip")

您既不能拉下公式也不能将其复制到另一个单元格。如果你这样做,你必须重新计算公式(ALT-CTRL-F9和ALT-CTRL-SHIFT-F9都没有重新计算似乎有效)所以进入每个单元格,按F2激活它并完成返回。

我希望我不会帮你搞砸过多的Excel工作簿。

编写一个显式启动的VBA可能更安全,它可以遍历列表并写入超链接。这样他们就可以重复使用而且没有任何功能。

此致 安德烈亚斯

答案 1 :(得分:1)

我有Excel 2007,我尝试在A1中创建一个包含300个字符的单元格,在B1中创建另外一个包含300个不同字符的单元格。

然后我做了C1 = CONCATENATE(A1, B1)

我可以看到两个细胞中的所有角色。没有遗漏或截断,也没有收到任何错误。这对我来说很好。

是什么让你认为连接失败了?您是否在查看结果时遇到问题?如果您的单元格包含1,024个以上的字符,则单元格中仅显示前1,024个字符。但是它们仍然存在,如果您复制并粘贴它们,则将复制所有字符。

修改 既然您已经编辑了问题,我就会发现问题出在HYPERLINK而不是CONCATENATE

在Excel中绕过HYPERLINK公式的255个字符限制的唯一方法是从Word复制超链接并将其粘贴到Excel中的单元格中。然后它可以超长。我知道如果你有很多链接这是一个不合理的手动过程,但它似乎是将它放入Excel电子表格的唯一方法,但它仍然是一个超链接,你可以点击并重定向。如果您不需要它像超链接那样,那么我建议重写您的查询以将超链接作为自己的文本字段返回,然后就可以了。

答案 2 :(得分:1)

你可能运气不好。似乎Excel中超链接的字符限制为256 here。如果你自己测试一下(我也有Excel 2007),=HYPERLINK(REPT("a",255))可以正常工作而=HYPERLINK(REPT("a",256))没有,并且会抛出 #VALUE!错误。

答案 3 :(得分:1)

以下是一些使用bitly.com来缩短网址的VBA。它基于bitly API documentation

  1. bitly上创建一个免费帐户。
  2. bitly的有效电子邮件地址。
  3. bitly获取访问令牌。
  4. 将下面的VBA代码中的访问令牌替换为MY_TOKEN。
  5. 将代码复制并粘贴到Excel的VBA中。
  6. 在单元格中,写下以下'=超链接(GetURL(“一些非常长的URL”))''没有单引号'标记。注意:不是将字符串传递给GetURL(),而是将引用传递给其中包含URL的单元格作为文本。
  7. Public Function GetURL(longUrl As String) As String
      Dim xml As Object
    
      longUrl = URLEncode(longUrl)
      Set xml = CreateObject("MSXML2.XMLHTTP.6.0")
    
      xml.Open "GET", "https://api-ssl.bitly.com/v3/shorten?format=xml&access_token=MY_TOKEN=" & longUrl, False
      xml.Send
    
      GetURL = xml.responsetext
    
      head = InStr(GetURL, "<url>") + 5
      tail = InStr(GetURL, "</url>")
    
      GetURL = Mid(GetURL, head, tail - head)
    
    End Function
    
    Function URLEncode(ByVal Text As String) As String
      Dim i As Integer
      Dim acode As Integer
      Dim char As String
      URLEncode = Text
      For i = Len(URLEncode) To 1 Step -1
        acode = Asc(Mid$(URLEncode, i, 1))
        Select Case acode
          Case 48 To 57, 65 To 90, 97 To 122
            ' don't touch alphanumeric chars
          Case 32
            ' replace space with "+"
            Mid$(URLEncode, i, 1) = "+"
          Case Else
            ' replace punctuation chars with "%hex"
            URLEncode = Left$(URLEncode, i - 1) & "%" & Hex$(acode) & Mid$(URLEncode, i + 1)
        End Select
      Next
    End Function
    

答案 4 :(得分:1)

Dunno如果我的答案仍然有用,但几天前我遇到了同样的问题,那么做一个超过255个字符限制的可行超链接的最佳方法和证明方法是先用CONCATENATE()拆分它,并使用 CONCATENATE() 中具有VBA功能的单元格。

对我来说,它看起来像:

A1 = LinkPart1
A2 = LinkPart2
A3 = LinkPart3

A5 = CONCATENATE( A1; A2; A3 )

VBA您需要与 A5 链接的代码:

Sub insertVeryLongHyperlink()

    Dim curCell As Range
    Dim longHyperlink As String

    Set curCell = Range("A7")   ' or use any cell-reference
    longHyperlink = [A5]

    curCell.Hyperlinks.Add Anchor:=curCell, _
                    Address:=longHyperlink, _
                    SubAddress:="", _
                    ScreenTip:=" - Click here to follow the hyperlink", _
                    TextToDisplay:="Click Here"

    End Sub

答案 5 :(得分:0)

而不是写

=CONCATENATE("Toto";"Tata")

Toto放在单元格Z1中(例如)和单元格Z2中的Tata并写入

=CONCATENATE(Z1;Z2)

答案 6 :(得分:0)

伙计我认为URL缩短VBA会对你有所帮助。这是我今天发现的一个。它就像一个魅力: http://www.jpsoftwaretech.com/shorten-urls-with-bit-ly-web-api-and-vba/

答案 7 :(得分:0)

超链接功能有一个难以超出的硬限制。我有一个类似的问题,我只是将Excel表格导入Open Office Calc并且瞧 - 一切都立即工作,而且以​​前很久的超链接现在只要我想要它就可以了。

答案 8 :(得分:0)

您可以使用VBA Shell()例程来执行浏览器,并在通过Shell()调用传递的命令行上将URL传递给它。因此,URL可以是shell机制支持的任何长度。

此外,您可以通过让用户双击该单元格从任何单元格值获取此URL。可以通过单个CONCATENATE()函数调用从许多单元格构造此值!没错:只需一个电话。 CONCATENATE()将获取大量参数,并将创建一个大于255个字符的字符串。您不需要费力地加入许多单独的连接或使用负载的#34; builder&#34;细胞。一个会做!

当您右键单击工作表底部的选项卡时,需要通过打开VIEW CODE选项来创建宏。然后写下以下非常简短,简单且无痛的代码:

private typealias CCHmac = @convention(c) (
    _ algorithm:  CUnsignedInt,
    _ key:        UnsafePointer<CUnsignedChar>,
    _ keyLength:  CUnsignedLong,
    _ data:       UnsafePointer<CUnsignedChar>,
    _ dataLength: CUnsignedLong,
    _ macOut:     UnsafeMutablePointer<CUnsignedChar>
) -> Void

请注意&#34;浏览器&#34;是一个命名单元格,应包含浏览器的未加引号的路径,即IE,Opera,Mozilla或Chrome。您必须自己命名单元格,或更改宏以具有类似&#34; A2&#34;的硬单元格引用。当然,该单元格值必须是有效的浏览器路径!

完成所有这些后,您可以双击任何具有以文本&#34; HTTP://&#34;开头的值的单元格。和Excel将打开具有该完整值的浏览器,无论它有多长。您需要的只是在该单元格中构建您的字符串,并且可能将其格式化为颜色/字体,以明确它是要双击的超链接单元格。附近的文字提示也可能是有序的!

顺便提一下,宏中Shell()行的替代方法是:

Option Explicit             
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)               
   If Selection.Count = 1 Then              
      If Left(Target.Value, 7) = "HTTP://" Then             
         Cancel = True              
         Shell ("""" + Range("Browser").Value + """" + " " + """" + Target.Value + """")                
      End If                
   End If               
End Sub     

虽然这也会处理大于255个字符的网址,但我发现此FollowHyperlink()函数会导致URL被发送为TWICE。一旦通过Excel函数本身(可能是为了测试它),然后再由Excel打开的默认浏览器!这可能并不可取(在我的情况下也不是这样)。这就是我最终使用Shell()函数的原因。

答案 9 :(得分:0)

您可以在Microsoft Word中创建超链接,然后将其复制到Excel。 由于某些原因,这些超链接元素不受255个字符的限制,但是您将无法使用HYPERLINK()函数。

Source

答案 10 :(得分:0)

假设您没有很多> 255个字符的超链接URL,只需使用链接功能。链接功能可从右键菜单中获得。无需转到Word或任何其他MSOffice应用程序。 我知道此方法有效,因为我有一个281个字符长的URL,并且一个有效。 我的工作表中只有两个非常长的URL,所以当/如果它们需要更新时,我要指出,它们必须在目标单元格而不是我的超链接地址表中完成。

答案 11 :(得分:0)

除去 Andreas J's answer,您可以使用以下 VBA 代码片段从一列纯文本 URI 生成一列超链接。假设 A 列包含纯文本 URI,B 列包含所需的链接文本,以下代码循环遍历 Range("A:C") 中的每一行并在 C 列中生成超链接:

Sub createLink(a As Range, b As Range, c As Range)
    Dim curCell As Range
    Dim longHyperlink As String
    Dim linkText As String

    Set curCell = a
    longHyperlink = b
    linkText = c

    curCell.Hyperlinks.Add Anchor:=curCell, _
                    Address:=longHyperlink, _
                    SubAddress:="", _
                    ScreenTip:="", _
                    TextToDisplay:=linkText
End Sub

Sub insertLinks()
    Dim a As Range, b As Range
    Set a = Range("A:C")
    
    For Each b In a.Rows
        Dim curCell As Range, longHyperlink As Range, linkText As Range
        Set curCell = b.Cells().Item(1, 3)
        Set longHyperlink = b.Cells().Item(1, 1)
        Set linkText = b.Cells().Item(1, 2)
        
        If longHyperlink = "" Then
            Exit For
        End If
        createLink curCell, longHyperlink, linkText
    Next
End Sub