知財のあれこれをVBAで何とかする

### １．セル内のURLを開く
特定の特許の詳細をJ-platpatで参照しようとしたとき、所定の形式でURL化することでWebページが開けます。たとえば特開2023-123456のページは
[https://www.j-platpat.inpit.go.jp/c1801/PU/JP-2023-123456/11/ja](https://www.j-platpat.inpit.go.jp/c1801/PU/JP-2023-123456/11/ja")
で開けます。URLをExcelのセルにハイパーリンクとして埋め込んでワンクリックで開くこともできます。

### ２．セル内の複数のURLを一気に開く
しかしながら以下のように、1つのセルに複数のURLを記入した場合はハイパーリンクが動作しません。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/41a359f6-52a3-a2f9-8628-0745f3f817b5.png)
今回やろうとしていることは「複数のJ-platpatのURLを1つのセルに記入して、ワンクリックで複数のWebページを一気に開く」処理です。

サンプルデータとしてURLリストをtxt形式で貼りつけました。メモ帳にコピペしてエンコード「ANSI」で保存、拡張子(txt)をcsvにするとExcelで開けます。
```:sample.txt
https://www.j-platpat.inpit.go.jp/c1801/PU/JP-2018-012345/19/ja
"https://www.j-platpat.inpit.go.jp/c1801/PU/JP-2021-012345/10/ja
https://www.j-platpat.inpit.go.jp/c1801/PU/JP-2023-123456/11/ja"
```

上記サンプルをExcelで開き、マクロ有効のファイル形式（sample.xlsm)で保存、VBEを開いて、プロジェクトウインドウのSheet1をダブルクリックします。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/928179de-c1dd-683e-418f-d83ee1245280.png)

プログラム編集ウインドウ(コードウインドウ)に以下のVBAコードを貼付けます。

```vba:Program1
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'ダブルクリックで起動
Dim arr() As String
Dim a As String
Dim item As Variant

    If Target.Column = 1 Then  '任意のキー入力検知対象の列番号を設定
        a = Cells(Target.Row, Target.Column).Value 'ダブルクリックしたセルの値を変数aに代入
        a = Replace(a, vbCrLf, vbLf) '改行コードをLFに統一する
        arr = Split(a, vbLf) '改行コードで文字列を分割する
        For Each item In arr
            CreateObject("WScript.Shell").Run ("chrome.exe -url " & item) 'chromeでURLを開く
            Application.Wait Now() + TimeValue("00:00:01") '1秒待機
        Next item
    End If
End Sub

```
Sheet1を開いて、
A1セルをダブルクリックするとA1セルのURLに対応するJ-platpatのWebページが１つ開き、
A2セルをダブルクリックすると、A2セル内の２つのURLに対応するJ-platpatのWebページが２つ開きます。（セル内の２つのURLはセル内改行で区分されている)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/460dd31a-a30e-611e-cc9c-dc7dff03c29e.png)

ただA1セルのようにURLが1つの場合だと副作用があります(後で説明)

### プログラムのポイント

```
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
```
 →セルをダブルクリックしたときにVBAが起動します

```
If Target.Column = 1 Then 
```
 →1列目(A列)のセルがダブルクリックされたら、それ以降の処理を実行します。

今回の処理のポイントとなる部分は、改行コードで文字列を分割(split)し文字列ごとにループ処理（For Each item In arr）してブラウザを開くコマンドにURLを渡す以下の処理になります。
```
arr = Split(a, vbLf) '改行コードで文字列を分割する
        For Each item In arr
            CreateObject("WScript.Shell").Run ("chrome.exe -url " & item) 'chromeでURLを開く
```

サンプルデータのようなテキストデータにおける改行コード(CRLF)とExcelのセル内でalt+Enterで改行する場合の改行コード（LF）は違うので、CRLFをLFに変換（replace）しておき、その後の処理ではすべてLFとして処理するようにしました。

### (注意事項)
A1セルのようなURLが1つの場合だと、1回ダブルクリックするとオートコンプリートで勝手にハイパーリンクになってしまうことがあります。いったんこうなると次回から同じURLについてハイパーリンクとVBAの2つの処理が実行され、同じWebページが2つ開いてしまいます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/63cecf47-f7a7-c38d-8a01-fe852f25b787.png)

オートコンプリートを防止するには一般的には①Excelのオートコンプリートの設定をオフにする　②セル内文字列の先頭に「’」をつける　
などの方法がありますが、一番簡単なのはURLが入っているセルをB列にしてA列はB列を参照するセルにしてしまいそれをダブルクリックする方法かと思います。単なる参照セルなので勝手にハイパーリンクになったりしません。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/d43618fb-185d-034d-2069-d36616790bcf.png)

### ３．最後に
1つのセルに複数の情報を詰め込むのは原則あまり推奨されないようですが、実務上どうしてもこのように使いたい場合もあり、VBAの優れた文字列処理機能のおかげで今回実現できました。
今回の記事が何らかの助けになれば幸いです。