VBA: 獲取單元格內超連結文件的絕對路徑

2022-01-14 數據處理與編程實踐

收錄於話題 #VBA編程基礎 8個

        文章背景:在工作中,有時為了內容跳轉的方便,會在單元格內設置超連結,通過Hyperlinks(1).Address,得到的是超連結文件的相對路徑。有時為了VBA代碼的編寫方便,需要使用的是連結文件的絕對路徑。下面通過編寫VBA函數,獲取單元格內超連結文件的絕對路徑。

1 絕對路徑和相對路徑

有兩種方法指定一個文件路徑。

絕對路徑,總是從根文件夾開始。

相對路徑,它相對於程序的當前工作目錄。

       對於點(.)和點點(..)文件夾,它們不是真正的文件夾,而是可以在路徑中使用的特殊名稱。單個的句點(「點」)用作文件夾目錄名稱時,是「這個目錄」的縮寫。兩個句點(「點點」)的意思是父文件夾。

下圖是一些文件和文件夾的例子。如果當前工作目錄設置為C:\bacon,這些文件夾和文件的相對目錄,就表示為下圖所示的樣子。

相對路徑開始處的.\是可選的。例如,.\spam.txt和spam.txt指的是同一個文件。

回到VBA,通過ThisWorkbook.Path,可以獲取當前工作簿所在工作目錄的路徑;通過Hyperlinks(1).Address,得到的是基於ThisWorkbook.Path的相對路徑;通過ThisWorkbook.Path拼接相對路徑,可以得到目標文件的絕對路徑。

2 函數編寫

針對單元格內的超連結,本文暫不考慮共享文件夾的情況,連結的文件可以分為以下三種情況:

在同一工作目錄內;

在同一個公共盤,不在同一工作目錄內;

不在同一公共盤。

 如果單元格連結的是本工作簿內的單元格,則Hyperlinks(1).Address得到的是空字符串。

相對路徑轉化為絕對路徑的函數代碼如下所示:

Function getAbsolutePath(target As Range) As String

   Dim relativepath As String, arr_thisbook() As String, arr_relative() As String
   Dim ii As Integer, num_thisbook As Integer, initial_relative As Integer, num_relative As Integer
   Dim new_thisbook() As String, new_relative() As String

   If target.Hyperlinks.Count = 0 Then
   
       getAbsolutePath = "無連結"
       
   ElseIf target.Hyperlinks.Count = 1 Then
   
       '獲取相對路徑
       relativepath = target.Hyperlinks(1).Address
       
       '連結在本工作簿內
       If relativepath = "" Then
       
           getAbsolutePath = "本工作簿內"
           
       '連結其他盤
       ElseIf Left(relativepath, 3) Like "?:\" Then
       
           '完整路徑
           getAbsolutePath = relativepath
       
       '連結在同一個盤,不在同一工作目錄內
       ElseIf Left(relativepath, 3) Like "..\" Then
       
           arr_thisbook = Split(ThisWorkbook.Path, "\")
           num_thisbook = UBound(arr_thisbook)
           
           arr_relative = Split(relativepath, "\")
           initial_relative = 0
           num_relative = UBound(arr_relative)
           
           For ii = 0 To UBound(arr_relative)
           
               If arr_relative(ii) = ".." Then
               
                   num_thisbook = num_thisbook - 1
                   
                   initial_relative = initial_relative + 1
                   num_relative = num_relative - 1
               
               End If
           
           Next
           
           ReDim new_thisbook(0 To num_thisbook)
           ReDim new_relative(0 To num_relative)
           
           For ii = 0 To num_thisbook
           
               new_thisbook(ii) = arr_thisbook(ii)
           
           Next
           
           For ii = 0 To num_relative
           
               new_relative(ii) = arr_relative(initial_relative + ii)
           
           Next
           
           getAbsolutePath = Join(new_thisbook, "\") & "\" & Join(new_relative, "\")
           
           
       '連結在同一工作目錄內
       Else
       
           getAbsolutePath = ThisWorkbook.Path & "\" & relativepath
       
       End If
   
   End If

End Function

示例:

參考資料:

[1] VBA中的相對路徑(https://www.jianshu.com/p/8c51c723d1d6)

[2] Python編程快速上手: 讓繁瑣工作自動化(https://github.com/Ibuki-Suika/Books-3/blob/master/Python/Python%E7%BC%96%E7%A8%8B%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%20%E8%AE%A9%E7%B9%81%E7%90%90%E5%B7%A5%E4%BD%9C%E8%87%AA%E5%8A%A8%E5%8C%96.pdf)

[3] READING AND WRITING FILES(https://automatetheboringstuff.com/2e/chapter9/)

[4] Excel Hyperlink Object Address Property only shows relative path(https://www.tek-tips.com/viewthread.cfm?qid=1107468)

[5] excelvba打開文件夾路徑(http://www.officexr.com/c/56602.html)

[6] Join function(https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/join-function)

相關焦點

  • Excel公式中使用文件相對路徑引用另一個Excel文件中單元格數據方法
    有時需要在一個Excel文件裡引用另一個Excel文件的單元格數據。A1 (註:文件全名用「 []」標記,工作表名後用「!」連單元格。)>時會發現上述公式中數據文件t1.xlsx路徑仍然是原先保存文件時的絕對路徑故而無法更新數據(尤其是Excel2013)。
  • Excel vba獲取當前當前單元格的行號和列號
    Excel vba獲取當前當前單元格的行號和列號在Excel單元格中,我們在編寫語句代碼的時候需要獲取指定單元格的行號和列號如圖,將指定單元格的行號和列號分別填入表中>在vbe窗口中,添加以下代碼Sub 單元格行列號() Selection.Offset(1, 0) = Selection.Row Selection.Offset(1, 2) = Selection.Column End Sub
  • VBA代碼大全010:用vba遍歷文件夾及其子文件夾內的文件
    vba老手都知道,vba寫多了,其實都是在做循環。循環處理多個單元格的內容,循環處理多個工作表的內容,循環處理多個工作簿的內容。
  • Excel批量插入圖片,並設置圖片超連結
    問題描述:超連結跳轉:涉及知識點:批量插入圖片為圖片設置超連結,並將圖片的大小設置成和單元格一致。填滿整個單元格區域。 ActiveSheet.Hyperlinks.Add Anchor:=pic, Address:="http://item.taobao.com/item.htm?
  • 超連結查看太麻煩,Excel怎麼快速提取單元格內的超連結地址?
    今天我們一起來學習一下怎麼批量提取Microsoft Excel單元格內的超連結地址,操作非常簡單便捷。Microsoft Excel怎麼插入網頁超連結?1、首先右鍵單擊【A1】單元格,然後左鍵單擊右鍵菜單中的【超連結(I)】,在彈出的【插入超連結】對話框的【地址(E)】欄中鍵入網頁超連結的地址後,然後左鍵單擊【確定】按鈕,完成超連結的插入。2、按以上操作步驟,依次設置【A2】和【A3】單元格的超連結。
  • VBA學習筆記 1-1
    重命名表格:sheets("sheet1).name="mysheet"將屬性值變為絕對引用msgboxrange("A1").address(rowabsolute:=true,columnabsolute:=true)rowabsolute(絕對行)columnabsolute(絕對列)
  • 超連結函數hyperlink的用法
    它是一個超連結函數,可以打開指定的路徑文件或跳轉到指定文件的具體位置,非常的有用。函數說明hyperlink創建一個快捷方式或連結,以便打開儲存在硬碟,網絡伺服器或internet上的文檔。語法如下,有2個參數:HYPERLINK(link_location, [friendly_name])第1參數link_location:要打開的文件路徑和文件名。它可以指向文件中更為具體的位置,比如工作簿中特定的單元格。路徑可以是本地硬碟、UNC路徑或URL路徑。第2參數friendly_name:單元格中顯示的跳轉文本或數值。
  • Excel-VBA應用(1):批量提取單元格中的超連結URL
    工作中,有時需要從網頁上複製到EXCEL的內容中,提取URL地址,用VBA對單元格的Hyperlink對象進行操作,即可實現。下面用視頻進行演示:核心代碼獲取單元格的URL地址:Cells(intI, 1).Hyperlinks(1).Address如需視頻中的文件,請關注公眾號:OFFICE之門,發送」獲取URL「即可。
  • excel如何取消多個單元格中的超連結
    Excel如何取消多個單元格中的超連結>在輸入郵箱時excel總會自動轉化為超連結,但是怎麼把郵箱地址轉化為純文格式?第一步:複製一個空白單元格(最好是沒有輸入任何內容,單元格格式為默認狀態下的單元格第二步:選中具有超連結所在的單元格區域
  • 【VBA自定義函數】315個自定義函數
    74、刪除單元格自定義名稱75、從文件路徑中取得文件名76、取得一個文件的擴展名77、取得一個文件的路徑78、取得一個文件的路徑279、取得一個文件的路徑380、十進位轉二進位81、檢查一個數組是否為空82、字母欄名轉數字欄名83、數字欄名轉文字欄名84、判斷一件活頁夾中是否還有子目錄85、判斷一個文件是否在使用中86、列出檔案詳細摘要信息87、獲取菜單ID編號及名稱列表88、狀態列動態顯示文字89
  • Excel小技巧-竟然可以為單元格設置超連結?還不怕單元格位置變動
    我們在辦公中經常會查看表格信息,有時反映出來的信息非常多,但我們想要知道的只是幾個重要的信息,如果直接點擊單元格就能跳轉到我們需要的位置,將大大的方便我們的查看工作。小編在之前為大家介紹過在PPT中使用超連結的功能,那麼在Excel中是否也能夠實現點擊一個單元格,跳轉到連結的另一個單元格呢? 今天小編就和大家一起探究一下單元格的超連結~選中需要添加超連結的單元格,單擊【插入】選項卡,在【連結】組中點擊【超連結】按鈕,彈出【插入超連結】對話框,選擇【本文當中的位置】,此時【請鍵入引用單元格】輸入C21。
  • Excel工作表中的20個信息函數,獲取文件路徑,單元格格式等!
    Excel工作表中的信息函數主要用於返回某些指定單元格或區域的信息,例如獲取文件路徑,單元格格式信息或作業系統信息等等。功能:返回引用中第一個單元格的格式、位置或內容的有關信息。語法結構:=Cell(返回類型,[單元格區域])。(一)返回「月薪」列每個單元格的地址。
  • VBA統計單元格圖片數量
    而且,我還幫他想到了不規範的情況,比如:圖片邊界超出單元格區域,單元格中摻雜非圖片等其他shape對象。,最大行號可以手動輸入        t = Range("a" & r).Top '獲取單元格的頂部坐標,就是該單元格以上行高的累加
  • 函數|十大案例搞懂HYPERLINK超連結函數
    (可以是網址、文件路徑或者單元格等)2、friendly_name-超連結顯示的文字(可不寫,默認第一參數顯示)通過十大案例,我們一起來總結一下HYPERLINK的用法!>如果和超連結文件在同一個文件下路徑可以不寫,直接寫成如下格式=HYPERLINK("毒雞湯de.txt","打開毒雞湯")案例3 | 當前工作表中的連結公式:=HYPERLINK("#B2:C2","B2:C2區域")
  • vba編程常用英文單詞100個
    vba編程常用英文單詞100個大家好,部分朋友在公眾號留言,建議把vba
  • 文件太多找不到咋整?用excel製作文件管理器,所有版本皆可使用
    >宏表函數是早期低版本excel的產物,它是vba的前身,現在已經被vba完全取代了,但是我們仍然可以使用它,只不過需要通過定義名稱來使用。T(RAND())點擊確定簡單的跟大家介紹下這個函數,在這裡我們定義的函數分為兩個部分第一步:FILES("F:\文件\*.*"),這個宏表函數的作用是獲取文件的路徑,在這裡後面的星點星,是通配符,前面的一個星代表文件名稱,後面的星代表文件的擴展名第二步:T(RAND()),這個函數的作用是使宏表函數能夠自動的刷新數據
  • Excel超連結函數HYPERLINK用法大全!
    hyperlink超連結函數第一個參數連結地址常用解釋
  • excel函數應用技巧:超連結函數HYPERLINK
    為了快速訪問某一個文件或網頁上的相關信息,可以在EXCEL工作表單元格中插入超連結,還可以在特定的圖表元素或圖像中插入超連結。另外,通過更改超連結的單元格樣式,還可以更改當前工作簿中所有超連結文本的外觀。
  • 收藏 | 37個Excel vba實例匯總(附贈VBA教程)
    這裡把這些實例再分類整理一下,方便以後的查詢和使用,大致分類如下:單元格操作實例(1)- 批量製作工資表頭實例(5)- 快速合併n多個相同值的單元格實例(9)- 批量插入、刪除表格中的空行實例(11)- 拆分單元格並自動填充實例(12)- 如何合併多個單元格而不丟失單元格的數據?
  • excel中的超連結函數
    但是工作中我們用的比較多的還是前兩種:——手工設置——超連結函數手工設置方法:這種方式相對來說比較簡單,容易掌握,只需要點擊滑鼠選擇連結文件就可以了。要顯示的文字——指的是之後將會在單元格中顯示的帶超連結的文本。地址——代表的是連結到的目標文件。