Wikipediaのサーチボックスにキーワードを入力すると、入力したキーワードと似ている予測キーワードがリスト表示されます(ここではこの機能をオートコンプリートと呼ぶことにします)。
今回はこの予測キーワード一覧を配列として取得するマクロを考えてみました。
Option Explicit
Public Sub Sample()
Dim v As Variant
Dim i As Long
Debug.Print "- Wikipedia(日本語版)"
v = GetWikipediaAutocomplete("テスト")
If IsEmpty(v) = False Then
For i = LBound(v) To UBound(v)
Debug.Print v(i)
Next
End If
Debug.Print ""
Debug.Print "- Wikipedia(英語版)"
v = GetWikipediaAutocomplete("abc", "en")
If IsEmpty(v) = False Then
For i = LBound(v) To UBound(v)
Debug.Print v(i)
Next
End If
Debug.Print ""
Debug.Print "- Wikipedia(マケドニア語版)"
v = GetWikipediaAutocomplete("ab", "mk")
If IsEmpty(v) = False Then
For i = LBound(v) To UBound(v)
Debug.Print v(i)
Next
End If
End Sub
Private Function GetWikipediaAutocomplete(ByVal key_word As String, _
Optional ByVal language As String = "ja") As Variant
'Wikipediaオートコンプリートからキーワード取得
'http://www.mediawiki.org/wiki/API:Main_page/ja
Dim d As Object
Dim lst As Object
Dim n As Object
Dim v As Variant
Dim url As String
Dim i As Long
Set d = Nothing: Set lst = Nothing '初期化
If ChkWikipediaLanguage(LCase(language)) = False Then language = "ja"
url = "http://" & LCase(language) & ".wikipedia.org/w/api.php?action=opensearch&format=xml&search="
url = url & EncodeURL(key_word)
On Error Resume Next
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", url, False
.setRequestHeader "Content-Type", "text/xml; charset=UTF-8"
.send
Select Case .Status
Case 200: Set d = .responseXML
End Select
End With
If Not d Is Nothing Then
Set lst = d.getElementsByTagName("Text")
ReDim v(lst.Length - 1): i = LBound(v)
For Each n In lst
v(i) = n.Text
i = i + 1
Next
End If
On Error GoTo 0
GetWikipediaAutocomplete = v
End Function
Private Function ChkWikipediaLanguage(ByVal language As String) As Boolean
'Wikipediaの対応言語判定
'http://meta.wikimedia.org/wiki/List_of_Wikipedias
Dim ret As Boolean
ret = True '初期化
Select Case LCase(language)
Case "en" 'English
Case "sv" 'Swedish
Case "de" 'German
Case "nl" 'Dutch
Case "fr" 'French
Case "war" 'Waray-Waray
Case "ceb" 'Cebuano
Case "ru" 'Russian
Case "it" 'Italian
Case "es" 'Spanish
Case "vi" 'Vietnamese
Case "pl" 'Polish
Case "ja" 'Japanese
Case "pt" 'Portuguese
Case "zh" 'Chinese
Case "uk" 'Ukrainian
Case "ca" 'Catalan
Case "fa" 'Persian
Case "no" 'Norwegian (Bokm?l)
Case "fi" 'Finnish
Case "id" 'Indonesian
Case "ar" 'Arabic
Case "cs" 'Czech
Case "sr" 'Serbian
Case "ko" 'Korean
Case "hu" 'Hungarian
Case "sh" 'Serbo-Croatian
Case "ms" 'Malay
Case "ro" 'Romanian
Case "tr" 'Turkish
Case "min" 'Minangkabau
Case "kk" 'Kazakh
Case "eo" 'Esperanto
Case "eu" 'Basque
Case "sk" 'Slovak
Case "da" 'Danish
Case "bg" 'Bulgarian
Case "lt" 'Lithuanian
Case "he" 'Hebrew
Case "hr" 'Croatian
Case "hy" 'Armenian
Case "sl" 'Slovenian
Case "et" 'Estonian
Case "uz" 'Uzbek
Case "simple" 'Simple English
Case "gl" 'Galician
Case "vo" 'Volap?k
Case "nn" 'Norwegian (Nynorsk)
Case "el" 'Greek
Case "hi" 'Hindi
Case "la" 'Latin
Case "az" 'Azerbaijani
Case "th" 'Thai
Case "ka" 'Georgian
Case "oc" 'Occitan
Case "be" 'Belarusian
Case "mk" 'Macedonian
Case "ce" 'Chechen
Case "mg" 'Malagasy
Case "new" 'Newar / Nepal Bhasa
Case "ur" 'Urdu
Case "ta" 'Tamil
Case "tt" 'Tatar
Case "pms" 'Piedmontese
Case "cy" 'Welsh
Case "tl" 'Tagalog
Case "te" 'Telugu
Case "lv" 'Latvian
Case "bs" 'Bosnian
Case "be-x-old" 'Belarusian (Tara?kievica)
Case "br" 'Breton
Case "ht" 'Haitian
Case "sq" 'Albanian
Case "jv" 'Javanese
Case "lb" 'Luxembourgish
Case "mr" 'Marathi
Case "is" 'Icelandic
Case "ml" 'Malayalam
Case "zh-yue" 'Cantonese
Case "bn" 'Bengali
Case "af" 'Afrikaans
Case "ba" 'Bashkir
Case "pnb" 'Western Panjabi
Case "ga" 'Irish
Case "my" 'Burmese
Case "lmo" 'Lombard
Case "fy" 'West Frisian
Case "yo" 'Yoruba
Case "tg" 'Tajik
Case "an" 'Aragonese
Case "cv" 'Chuvash
Case "sco" 'Scots
Case "sw" 'Swahili
Case "ky" 'Kirghiz
Case "ne" 'Nepali
Case "io" 'Ido
Case "gu" 'Gujarati
Case "bpy" 'Bishnupriya Manipuri
Case "scn" 'Sicilian
Case "nds" 'Low Saxon
Case "ku" 'Kurdish
Case "ast" 'Asturian
Case "qu" 'Quechua
Case "als" 'Alemannic
Case "gd" 'Scottish Gaelic
Case "kn" 'Kannada
Case "su" 'Sundanese
Case "pa" 'Punjabi
Case "am" 'Amharic
Case "ckb" 'Sorani
Case "ia" 'Interlingua
Case "nap" 'Neapolitan
Case "mn" 'Mongolian
Case "bug" 'Buginese
Case "bat-smg" 'Samogitian
Case "wa" 'Walloon
Case "arz" 'Egyptian Arabic
Case "map-bms" 'Banyumasan
Case "zh-min-nan" 'Min Nan
Case "si" 'Sinhalese
Case "mzn" 'Mazandarani
Case "yi" 'Yiddish
Case "fo" 'Faroese
Case "sah" 'Sakha
Case "bar" 'Bavarian
Case "sa" 'Sanskrit
Case "vec" 'Venetian
Case "nah" 'Nahuatl
Case "os" 'Ossetian
Case "roa-tara" 'Tarantino
Case "li" 'Limburgish
Case "hsb" 'Upper Sorbian
Case "or" 'Oriya
Case "pam" 'Kapampangan
Case "se" 'Northern Sami
Case "ilo" 'Ilokano
Case "mrj" 'Hill Mari
Case "mi" 'Maori
Case "mhr" 'Meadow Mari
Case "hif" 'Fiji Hindi
Case "bcl" 'Central Bicolano
Case "frr" 'North Frisian
Case "gan" 'Gan
Case "bh" 'Bihari
Case "bo" 'Tibetan
Case "rue" 'Rusyn
Case "glk" 'Gilaki
Case "ps" 'Pashto
Case "vls" 'West Flemish
Case "nds-nl" 'Dutch Low Saxon
Case "fiu-vro" 'V?ro
Case "tk" 'Turkmen
Case "pag" 'Pangasinan
Case "diq" 'Zazaki
Case "xmf" 'Mingrelian
Case "co" 'Corsican
Case "gv" 'Manx
Case "sc" 'Sardinian
Case "km" 'Khmer
Case "csb" 'Kashubian
Case "hak" 'Hakka
Case "kv" 'Komi
Case "zea" 'Zeelandic
Case "crh" 'Crimean Tatar
Case "vep" 'Vepsian
Case "zh-classical" 'Classical Chinese
Case "ay" 'Aymara
Case "so" 'Somali
Case "dv" 'Divehi
Case "udm" 'Udmurt
Case "kw" 'Cornish
Case "eml" 'Emilian-Romagnol
Case "nrm" 'Norman
Case "rm" 'Romansh
Case "wuu" 'Wu
Case "koi" 'Komi-Permyak
Case "ug" 'Uyghur
Case "stq" 'Saterland Frisian
Case "lad" 'Ladino
Case "lij" 'Ligurian
Case "fur" 'Friulian
Case "szl" 'Silesian
Case "as" 'Assamese
Case "mt" 'Maltese
Case "cbk-zam" 'Zamboanga Chavacano
Case "gn" 'Guarani
Case "pcd" 'Picard
Case "pi" 'Pali
Case "gag" 'Gagauz
Case "ie" 'Interlingue
Case "ksh" 'Ripuarian
Case "ang" 'Anglo-Saxon
Case "dsb" 'Lower Sorbian
Case "ext" 'Extremaduran
Case "cdo" 'Min Dong
Case "ace" 'Acehnese
Case "nv" 'Navajo
Case "frp" 'Franco-Proven?al/Arpitan
Case "kab" 'Kabyle
Case "sn" 'Shona
Case "mwl" 'Mirandese
Case "lez" 'Lezgian
Case "ln" 'Lingala
Case "pfl" 'Palatinate German
Case "krc" 'Karachay-Balkar
Case "myv" 'Erzya
Case "haw" 'Hawaiian
Case "pdc" 'Pennsylvania German
Case "xal" 'Kalmyk
Case "rw" 'Kinyarwanda
Case "nov" 'Novial
Case "kaa" 'Karakalpak
Case "to" 'Tongan
Case "kl" 'Greenlandic
Case "arc" 'Aramaic
Case "ha" 'Hausa
Case "bjn" 'Banjar
Case "lo" 'Lao
Case "kbd" 'Kabardian Circassian
Case "av" 'Avar
Case "pap" 'Papiamentu
Case "ty" 'Tahitian
Case "bxr" 'Buryat (Russia)
Case "tpi" 'Tok Pisin
Case "na" 'Nauruan
Case "mdf" 'Moksha
Case "lbe" 'Lak
Case "jbo" 'Lojban
Case "wo" 'Wolof
Case "roa-rup" 'Aromanian
Case "srn" 'Sranan
Case "sd" 'Sindhi
Case "ig" 'Igbo
Case "tet" 'Tetum
Case "nso" 'Northern Sotho
Case "tyv" 'Tuvan
Case "kg" 'Kongo
Case "ab" 'Abkhazian
Case "ltg" 'Latgalian
Case "zu" 'Zulu
Case "za" 'Zhuang
Case "om" 'Oromo
Case "mai" 'Maithili
Case "tw" 'Twi
Case "chy" 'Cheyenne
Case "rmy" 'Romani
Case "cu" 'Old Church Slavonic
Case "chr" 'Cherokee
Case "tn" 'Tswana
Case "bi" 'Bislama
Case "pih" 'Norfolk
Case "rn" 'Kirundi
Case "got" 'Gothic
Case "sm" 'Samoan
Case "bm" 'Bambara
Case "xh" 'Xhosa
Case "ss" 'Swati
Case "mo" 'Moldovan
Case "iu" 'Inuktitut
Case "ki" 'Kikuyu
Case "pnt" 'Pontic
Case "lg" 'Luganda
Case "ts" 'Tsonga
Case "ee" 'Ewe
Case "ak" 'Akan
Case "ti" 'Tigrinya
Case "fj" 'Fijian
Case "ks" 'Kashmiri
Case "sg" 'Sango
Case "ff" 'Fula
Case "ny" 'Chichewa
Case "ve" 'Venda
Case "st" 'Sesotho
Case "ik" 'Inupiak
Case "cr" 'Cree
Case "dz" 'Dzongkha
Case "tum" 'Tumbuka
Case "ch" 'Chamorro
Case "ng" 'Ndonga
Case "ii" 'Sichuan Yi
Case "cho" 'Choctaw
Case "mh" 'Marshallese
Case "aa" 'Afar
Case "kj" 'Kuanyama
Case "ho" 'Hiri Motu
Case "mus" 'Muscogee
Case "kr" 'Kanuri
Case "hz" 'Herero
Case Else: ret = False
End Select
ChkWikipediaLanguage = ret
End Function
Private Function EncodeURL(ByVal target_string As String) As String
'URLエンコード
With CreateObject("ScriptControl")
.language = "JScript"
EncodeURL = .CodeObject.encodeURIComponent(target_string)
End With
End Function
Wikipediaが対応している言語かどうかをチェックする「ChkWikipediaLanguage」プロシージャーのせいでコードが長くなってしまいましたが、やっていることはWikipediaのAPIにリクエストを投げ、結果をXMLで受け取って配列に格納するという、ごく単純なものです。
実際にどのような場面で使えるのか?、ということは置いておくとして、色々な言語のWikipediaでどのようなキーワードが出てくるのかを簡単に見ることができるのは中々面白いです。


















この記事へのコメントはありません。