LoginSignup
0
0

Excel今日のトリビア エクセルのセルからハイパーリンクを削除すると、文字数以上のバイト数が減少する

Posted at

環境

Excel 365 Windos 11 pro

実験方法

  1. エクセルにURLを入れる
  2. どうかするとハイパーリンクになる
  3. 保存してファイルサイズを確認する
  4. 右クリックでハイパーリンクの削除
  5. 上書き保存
  6. ファイルサイズを確認
  7. Len LenBで文字数を確認。今回は純粋に英語のみのURL

今実際のサイズの下3桁が963
ディスク上のサイズが656
Len、LenBの結果が30
というURLがセルにあり、ハイパーリンクを削除して上書きします。

すると
931
656
とディスク上のサイズは変わりませんが、ファイルサイズは減少します。
しかし$963-30=933$ですがこの場合2Byte余計に減少しています。
この余計に減少するバイト数はランダムです。
36のURLが2つあり、同時にハイパーリンクを削除すると、17バイトだけ余計に減少します。

結論

余計なバイト数について

余計なバイト数はセルの書式か、データ型がハイパーリンクであることのフラグではないかと思います。
これはなぜか奇数になることがあるため、複数の要素があると考えられるためです。

ディスク上のサイズが変わらなくてもファイルサイズは確実に減少する

Disk上のサイズは変わらなくても、ファイルサイズは減少するので、不要なハイパーリンクは削除しておいたほうが良いという結論が導かれました。これは4000くらいあると200KBは減少します。

サンプルVBA

一応アクティブなシートのハイパーリンクを削除するマクロを示しておきます。
しかし、これはワークシート単位なので、記録しながら削除するようにしています。
テキストファイルはタブ区切りで、Unicode(UTF-16のはずです)。

空白が記録されることがある

しかし、よくわからない空白セルが記録される場合があります。
もしかすると、HyperLinkのフラグ?だけ残っているのでしょうか。Hyperlinkを貼ったり削除したりした場合、空白セルでもそのフラグが残るのかもしれません。

考察

コピー&ペーストを繰り返すシートではあらかじめClearAllしてから貼り付けていると、このような空白セルは記録されませんでした。
なので、コピー&ペーストはすべてクリアをしてから行ったほうが良いようです。

Sub Delete_WorksheetHyperLink()
' For Excel
' 今アクティブにしているワークシートのすべてのハイパーリンクを削除
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = ActiveSheet
Dim xHyper As Hyperlink, xHypers As Excel.Hyperlinks
Dim FSO As Object: Set FSO = CreateObject("Scripting.FilesystemObject")
Dim fsor As New Scripting.FileSystemObject
Dim TS
Dim R As Range, URng As Range
Set TS = FSO.OpenTextFile(FSO.BuildPath(wb.Path, fsor.GetTempName) & "_" & ws.Name & "_DeleteHyplerlink.txt", 2, True, TristateTrue)
TS.WriteLine "DateTime:" & Now
TS.WriteLine "WorkSheet:" & ws.Name
TS.WriteLine "WorkSheetName" & vbTab & "Address" & vbTab & "CellValue" & vbTab & "hyperlinkName" & vbTab & "HyperlinkDisplay"
Set URng = ws.UsedRange
For Each R In URng
 If R.Hyperlinks.Count > 0 Then
   Set xHypers = R.Hyperlinks
     For Each xHyper In xHypers
     TS.WriteLine ws.Name & vbTab & R.Address & vbTab & R.Value & vbTab & xHyper.Name & vbTab & xHyper.TextToDisplay
       xHyper.Delete
     Next
'     If R.Value = "" And R.Formula = "" Then R.ClearContents
  End If
Next
TS.Close
End Sub
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0