检测文本单元格中的网址(链接)

时间:2018-01-17 14:10:31

标签: excel vba excel-vba

我在excel中有一个由3列组成的表:

--------------
|ID|Name|Info|
--------------

在信息栏中,有一些文字包含引文和指向来源的链接。但是,不知何故,它们不被认为是超链接(即 - 不可点击)。链接始终保留格式:

(http://www. .....) or (https://www. ....) 

它们总是被大括号包围,并且在新行上。

如何自动将文本单元格中的这些链接转换为超链接?我尝试过使用autocorrection,但是没有用。即使我选择文本并进行右键单击 - 也没有超链接选项。

感谢任何帮助。即使解决方案是使用宏。

更新:单元格中文本的示例

The information in this cell is about Google (http://www.google.com) and taken from Wikipedia (http://en.wikipedia.org)

3 个答案:

答案 0 :(得分:1)

为了在他们自己的单元格中转换它们,你需要VBA - 简单,但这更简单: -

Info列旁边插入一个空白列。在第2行中输入此公式。将公式中对C列的引用调整为指向Info列。

=HYPERLINK(MID($C2,2,LEN($C2)-2))

根据需要复制公式。这应该在新列中创建超链接。选择所有这些,复制和粘贴>价值到位。删除原始列。完成。

答案 1 :(得分:1)

这应该更接近你想要达到的目标。无限数量的链接将转换为正常运行的超链接,写入Info列及其右侧(或C右侧的Info列数。请注意评论在代码中。

Sub ExtractLinks()
    ' 18 Jan 2018

    Const TargetClm As Long = 3                 ' 3 defines column C
    ' hyperlinks are written to TargetClm
    ' and to the columns to the right of TargetClm

    Dim Txt As String
    Dim R As Long, C As Long
    Dim n As Integer

    Application.ScreenUpdating = False
    With ActiveSheet
        ' Info is in column C, starting from row 2:
        For R = 2 To .Cells(.Rows.Count, TargetClm).End(xlUp).Row
            C = 0               ' set C = 1 to not over-write original cell value
                                ' and start writing to the right of TargetClm
            With .Cells(R, TargetClm)
                Txt = .Value
                Do
                    n = InStr(Txt, "(")
                    If n Then
                        Txt = Mid(Txt, n + 1)
                        n = InStr(Txt, ")")
                        If n Then
                            .Offset(0, C).Formula = "= HYPERLINK(""" & Left(Txt, n - 1) & """)"
                            C = C + 1
                            Txt = Mid(Txt, n + 1)
                        End If
                    End If
                Loop While n
            End With
        Next R
    End With
    Application.ScreenUpdating = True
End Sub

答案 2 :(得分:0)

要转换它们"就地",选择单元格并运行这个短宏:

#include<iostream>
using namespace std;
int main()
{
cout<<endl<<" S  M  T  W  T  F  S"<<endl<<endl;
int k=1;
for(int i=0;i<6;i++)
{
for(int j=0;j<7;j++)
{
    if(k>31){break;}
    if(k<10){cout<<" "<<k++<<" ";}
    else{cout<<k++<<" ";}
}cout<<endl;
}
return 0;
}