0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

1.セル内のURLを開く

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

2.セル内の複数のURLを一気に開く

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

2.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

プログラム編集ウインドウ(コードウインドウ)に以下の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ページが1つ開き、
A2セルをダブルクリックすると、A2セル内の2つのURLに対応するJ-platpatのWebページが2つ開きます。(セル内の2つのURLはセル内改行で区分されている)

2.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

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

5.png

3.最後に

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?