【LibreOffice Basic】セルの中身でブラウザ検索するコード例【Calc】

スポンサーリンク

セルを選んでポチッと検索したい!

選択中のセルを取得して、LibreOffice(リブレオフィス)から直接ウェブブラウザ(Firefox, Chrome)を呼び出す方法です。

LibreOffice Basic(リブレオフィスベーシック)のマクロで作りました。

ざっくり説明すると、セルのテキストからウェブサイトのURLを作って、それをブラウザに渡す感じです。そのコード例と解説です。

銘柄リストのチェックを効率化したい!

そのために、LibreOfficeでマクロ開発を考えていらっしゃる方の参考になれば幸いです。

Excel(エクセル)版も作りました

【複数セル】対応バージョンも作りました (LibreOffice)

マクロのコード例ってどんな感じ?

こんな感じです!ここで作った『SearchTwitter()』を、リブレオフィスのツールバーに追加して使います。

ウェブブラウザの実行ファイルパスだけ変更すれば、たぶん動くと思います。

コードのポイントは3つだけ。

  • セルの値はどうやって取得するのか?
  • どうやって日本語URLの文字化けを防ぐのか?
  • どうやってブラウザを起動するのか?

以下のコード例は、セルのテキストでツイッターを検索する例です。

検索用のURLを変更すれば、Google検索するマクロなども作れます。

REM  *****  BASIC  *****

'サーチツイッター関数
Sub SearchTwitter()
	'ウェブブラウザの実行ファイルパスを定義
	Dim browser_exe As String
	'browser_exe = "F:\apps\FirefoxPortable\FirefoxPortable.exe"
	browser_exe = "F:\apps\IronPortable64\IronPortable.exe"
	'(※ ファイルパスは、ご自身の環境に合わせて変更してください。)

	'ウェブブラウザの引数(ひきすう)を定義
	Dim browser_param As String
	browser_param = "" '今回は使わないので空(から)文字列を設定

	'ウェブサイトのURL文字列を定義
	'検索キーワードの前に来る部分と後ろに来る部分で、
	'2つに分けて定義しておきます。
	Dim url_1 As String
	Dim url_2 As String
	url_1 = "https://twitter.com/search?q="
	url_2 = "" '今回は使わないので空(から)文字列を設定

	'ウェブブラウザで開く
	OpenBrowser(browser_exe, browser_param, url_1, url_2)
End Sub


'オープンブラウザ関数
Sub OpenBrowser( _
	browser_exe As String, _
	browser_param As String, _
	url_1 As String, _
	url_2 As String _
	)
	'■ OpenBrowser()が受け取った変数は何か?
	'browser_exe: ブラウザの実行ファイルパス
	'browser_param: ブラウザに渡す引数
	'url_1: 検索キーワードの前に来るURL
	'url_2: 検索キーワードのうしろに来るURL

	'■ OpenBrowser()がすることは?
	'選択中のセルからテキストを取得して、ウェブブラウザに渡す。

	'■ どうやってやるの?
	' 1. 選択中の『セル』を取得 .Selection
	' 2. 複数選択してたら即終了 Exit Sub
	' 3. 選択セルから『テキスト』を取得 .String
	' 4. テキストが文字化けしないようにエンコード ConvertToUrl()
	' 5. 必要な文字列だけ取り出す Mid() Len()
	' 6. URLを組み立てる 文字列連結
	' 7. shell()の第3引数を組み立てる 文字列連結
	' 8. ブラウザを起動 Shell()


	' 1. 選択中の『セル』を取得
	Dim o_selection As Object
	o_selection = ThisComponent.CurrentController.Selection

	' 2. 複数選択してたら即終了
	'セルを1つだけ選択している場合だけ対応。複数セルは即終了。
	'(こうすることで、プログラムが簡単になります)
	'(『"ScCellObj"』はセル1つの意味です)
	If o_selection.ImplementationName <> "ScCellObj" Then
		Exit Sub
	End If

	' 3. 選択セルから『テキスト』を取得
	'(このテキストが検索キーワードになります)
	Dim t As String
	t = o_selection.String
	If t = "" Then
		Exit Sub
	End If

	' 4. テキストが文字化けしないようにエンコード
	'(UnicodeのUTF-8エンコーディングの16進数に変換)
	'(たとえば、『あ』は『%E3%81%82』になります)
	'(半角スペースなら『%20』)
	t = ConvertToUrl(t)

	' 5. 必要な文字列だけ取り出す
	'※ ConvertToUrl()は先頭に8文字の
	'『file:///』をくっつけちゃうので、
	'それを取り除きます。
	t = Mid(t, 9, Len(t))
	'9: Len("file:///") + 1

	' 6. URLを組み立てる
	'(検索キーワードの後ろが空(から)文字列なら省略)
	'(4つの連続ダブルクオーテーション『""""』は、
	'1つのダブルクオーテーションを出すためのものです)
	Dim site_url As String
	If url_2 = "" Then
		'検索キーワードの後ろを省略
		site_url = """" & url_1 & t & """"
	Else
		site_url = """" & url_1 & t & url_2 & """"
	End If

	' 7. shell()の第3引数を組み立てる
	'(半角スペースで区切って連結しています)
	Dim p As String
	If browser_param = "" Then
		p = site_url
	Else
		p = site_url & " " & browser_param
	End If

	' 8. ブラウザを起動
	'(『ブラウザの実行ファイルパス』に半角空白があっても動いた)
	Shell(browser_exe, 1, p, False)

	'(参考) シェル関数の引数
	'Shell(Pathname As String[, Windowstyle As Integer][, Param As String][, bSync])

	'(参考) 第1引数はダブルクオーテーションでくくっても動いた
	'Shell("""" & browser_exe & """", 1, p, False)

	'(参考) Shell()のエラー処理を作りこむなら、
	'『On Error』や『Resume』などの機能を使います。

	'(参考) 引数をメッセージボックスに表示
	'MsgBox(browser_exe)
	'MsgBox(p)
End Sub

LibreOffice Basicの場所はどこ?

コード例を貼り付けようにも、肝心のBasic(ベーシック)はどこから開くのか?

説明が難しいのでスクリーンショットを撮りました。

まず、メニューの深い深い階層から呼び出します。

ひだり側の『マクロの記録先』で、Standard以下のモジュール名を選択すると、みぎ側に『編集(B)』が現れます。それを押します。

※ もし、『編集(B)』が無ければ、『新規作成(N)』のボタンがあるはずです。それを押して、新しいモジュールを作ります。

モジュールは『LibreOffice のマクロ』に作るのがお勧めです。『マイマクロ』だとほかのodsを開いたときにもマクロが出てきて、混乱します。

『LibreOffice のマクロ』の下の『.ods』のファイルの下に作るのがお勧めです。

私はモジュール名『Module1』を適当に『u』として作りました。

あとは、『編集(B)』を押せば、LibreOffice Basicが開きます。

モジュール名の下の『SearchTwitter』や『OpenBrowser』は、マクロを貼り付ければ自動で出てきます。

マクロを貼り付けて、ブラウザのファイルパスを変更したら、次はツールバーです。

どうやってツールバーに追加するの?

説明が難しいのでスクリーンショットを撮りました。

まず、メニューから『カスタマイズ(C)…』を開きます。

そして、ひだり側にある『カテゴリー(Y)』でマクロを選びます。

(このとき、『JREが必要』って出る場合がありますが、別になくても大丈夫です。OKボタンで閉じます。)

もし、『JREが必要』と出ても、OKボタンで閉じれば大丈夫。

いよいよマクロの登録です。新しいツールバーを作って、そこに登録するのがお勧めです。

まず、みぎの『対象(T)』の横の『歯車のボタン』を押してから、『追加(A)…』を押します。

(以下の画像は、ツールバーを追加して、マクロの登録まで終わったところです。)

『ツールバー名』は何でもいいです。『保存先(S)』は『.ods』のファイル名がお勧めです。こうすることで、そのodsファイルを開いた時にだけ、作ったツールバーが出てきます。ほかのファイルでは出てきません。

もし、『LibreOffice Calc』を保存先にすると、全然関係ないodsを開いたときにもツールバーが出てきてしまいます。今回はマクロをodsファイルに保存していますので、ツールバーもodsファイルに入れて置くのがいいでしょう。

適当に『macro_bar』という名前でツールバーを作ったら、中央の『みぎ矢印ボタン→』でマクロを右に追加します。

これで、マクロが使えるようになりました。

(1)セルを選択して(2)ツールバーの『SearchTwitter』を押せば、ブラウザが開いて『財務分析』をTwitterで検索してくれます。

以上です。

なぜこのマクロを作ったの?

セルを選んでポチッと直接検索できたら便利だなって思ったので、作りました。

コード例はTwitter検索ですが、実際は、4ケタの証券コードから各種情報サイトを直接開くために開発しました。

そして、ExcelVBAで作ったものを、LibreOffice Basicに移植した流れです。

今はさらに派生して、複数のセルをまとめて選んで、まとめて開くマクロも作って使っています。エクセル⇔ブラウザ間をコピペで行き来する手間が減って、手元の銘柄リストのチェックがとても楽になりました。

ツールバーからマクロを消す方法は?

マクロをツールバーから消すときは、中央の『ひだり矢印ボタン←』で消せます。

この『ひだり矢印ボタン←』が、削除ボタンの代わりです。

ツールバーの文字列をアイコンにする方法は?

『SearchTwitter』の文字列をアイコンにするには、右下の『変更(M)』で変更できます。

まず、『変更(M)』を押して『アイコンの変更(B)…』を選びます。

アイコンリストが出てくるので、そこから選んでOKボタンを押せば、ツールバーでアイコン表示になります。

LibreOfficeのバージョンは?

LibreOffice 6.1.0.3 (x64) です。このバージョンで動作確認しました。

ブラウザに渡した引数が効いてないよ?

ウェブブラウザは、コマンドライン引数(ひきすう)使うと、プライベートモード(シークレットモード)で起動したりできます。

たとえば、以下の引数です。

  • InternetExplorer の『-private
  • Firefox の『-private-window
  • Chrome (SRware Iron) の『--incognito

これらは単独では効くんですが、URLと一緒に渡すと、途端に機能しなくなります。

指定しても効かないか、効いてもいろいろな面で意図した動作にならなかったです。

引数は組み合わせると動かない

ユーザーエージェント(User-Agent)を変更する引数とか、ブラウザのコマンドライン引数には様々な機能があります。

ですが、組み合わせると動かないというのがたくさんあります。

引数に続けて『not working』とか検索すると、苦労したのが自分だけじゃないって分かって、妙に安心できました。

結局、『URL指定とプライベートモード』とか、『URL指定とUser Agent変更』などは難しいようです。ですが、次善の策(じぜんのさく)はあります。

引数が効かないときの次善の策

プライベートモードに関しては、ポータブル版で履歴を一切保存しない設定にした専用のブラウザを用意するのが簡単です。それをExcelVBAやLibreOffice Basicで呼び出せばいいでしょう。

User Agentの変更などは、これもポータブル版で専用ブラウザを用意して、それに拡張機能(アドオン、WebExtension)を入れるのが簡単です。それをExcelVBAやLibreOffice Basicで呼び出せばいいでしょう。

自分もポータブル版で情報分析専用のブラウザを用意して、それをマクロから呼び出して使っています。

(追記)コード例のコメント無しバージョン

見やすくするために、コメント部分を削除したものを作りました。実際のコード量は結構少ないです。

'サーチツイッター関数
Sub SearchTwitter()
	Dim browser_exe As String
	'browser_exe = "F:\apps\FirefoxPortable\FirefoxPortable.exe"
	browser_exe = "F:\apps\IronPortable64\IronPortable.exe"

	Dim browser_param As String
	browser_param = ""

	Dim url_1 As String
	Dim url_2 As String
	url_1 = "https://twitter.com/search?q="
	url_2 = ""

	OpenBrowser(browser_exe, browser_param, url_1, url_2)
End Sub


'オープンブラウザ関数
Sub OpenBrowser( _
	browser_exe As String, _
	browser_param As String, _
	url_1 As String, _
	url_2 As String _
	)
	Dim o_selection As Object
	o_selection = ThisComponent.CurrentController.Selection

	If o_selection.ImplementationName <> "ScCellObj" Then
		Exit Sub
	End If

	Dim t As String
	t = o_selection.String
	If t = "" Then
		Exit Sub
	End If

	t = ConvertToUrl(t)
	t = Mid(t, 9, Len(t))

	Dim site_url As String
	If url_2 = "" Then
		site_url = """" & url_1 & t & """"
	Else
		site_url = """" & url_1 & t & url_2 & """"
	End If

	Dim p As String
	If browser_param = "" Then
		p = site_url
	Else
		p = site_url & " " & browser_param
	End If

	Shell(browser_exe, 1, p, False)
End Sub
タイトルとURLをコピーしました