クリックで分類群を選択

2017年12月19日火曜日

エクセルで生物リストを整理する


遠征に行ったときに見た生き物や、生物相調査時に見られた生物をリストにまとめるとき、いちいち学名を調べたり、順番に並べるのは骨が折れますよね。

どうにか楽に出来ないものか、試行錯誤してみました。

結果、事前にエクセルに参照するリストを用意しておけば、対応する和名欄の横に学名を出力したり、順番に並べられるようにはなったので、その方法を紹介しようと思います。


これ↑が

こうなります。



では、そのやり方。
まず、エクセルを起動し、空白のブックを選択します。

次に、十字マークをクリックしてSheet2を作ります。



そして、Sheet2に、参考にするリストを書きます。

今回は練習ということで、僕がつくば市で撮影済みのトンボのリストにしました。本来なら、日本産のトンボ全種などにするのが理想です。
左端(A列)に番号を付けることで、1種1種に番号を割り振ります。

実際に書いていくのは面倒なので、こちら↓のリストをコピーして貼り付けてください。

1Zygoptera 均翅亜目Lestidae アオイトトンボ科アオイトトンボLestes sponsa (Hansemann, 1823)
2Zygoptera 均翅亜目Lestidae アオイトトンボ科オオアオイトトンボLestes temporalis Selys, 1883
3Zygoptera 均翅亜目Lestidae アオイトトンボ科ホソミオツネントンボIndolestes peregrinus (Ris, 1916)
4Zygoptera 均翅亜目Calopterygidae カワトンボ科ニホンカワトンボMnais costalis Selys, 1869
5Zygoptera 均翅亜目Calopterygidae カワトンボ科ハグロトンボAtrocalopteryx atrata (Selys, 1853)
6Zygoptera 均翅亜目Coenagrionidae イトトンボ科アオモンイトトンボIschnura senegalensis (Rambur, 1842)
7Zygoptera 均翅亜目Coenagrionidae イトトンボ科アジアイトトンボIschnura asiatica Brauer, 1865
8Zygoptera 均翅亜目Coenagrionidae イトトンボ科オオイトトンボParacercion sieboldii (Selys, 1876)
9Zygoptera 均翅亜目Coenagrionidae イトトンボ科ムスジイトトンボParacercion melanotum (Selys, 1876)
10Zygoptera 均翅亜目Coenagrionidae イトトンボ科キイトトンボCeriagrion melanurum Selys, 1876
11Anisoptera 不均翅亜目Epiophlebiidae ムカシトンボ科ムカシトンボEpiophlebia superstes (Selys, 1889)
12Anisoptera 不均翅亜目Aeshnidae ヤンマ科ギンヤンマAnax parthenope julius Brauer, 1865
13Anisoptera 不均翅亜目Aeshnidae ヤンマ科サラサヤンマSarasaeschna pryeri (Martin, 1909)
14Anisoptera 不均翅亜目Aeshnidae ヤンマ科ミルンヤンマPlanaeschna milnei milnei (Selys, 1883)
15Anisoptera 不均翅亜目Aeshnidae ヤンマ科ヤブヤンマPolycanthagyna melanictera (Selys, 1883)
16Anisoptera 不均翅亜目Gomphidae サナエトンボ科アオサナエNihonogomphus viridis Oguma, 1926
17Anisoptera 不均翅亜目Gomphidae サナエトンボ科キイロサナエAsiagomphus pryeri (Selys, 1883)
18Anisoptera 不均翅亜目Gomphidae サナエトンボ科コオニヤンマSieboldius albardae Selys, 1886
19Anisoptera 不均翅亜目Gomphidae サナエトンボ科ヒメクロサナエLanthus fujiacus (Fraser, 1936)
20Anisoptera 不均翅亜目Gomphidae サナエトンボ科フタスジサナエTrigomphus interruptus (Selys, 1854)
21Anisoptera 不均翅亜目Gomphidae サナエトンボ科ミヤマサナエAnisogomphus maacki (Selys, 1872)
22Anisoptera 不均翅亜目Gomphidae サナエトンボ科ヤマサナエAsiagomphus melaenops (Selys, 1854)
23Anisoptera 不均翅亜目Cordulegastridae オニヤンマ科オニヤンマAnotogaster sieboldii (Selys, 1854)
24Anisoptera 不均翅亜目Macromiidae ヤマトンボ科キイロヤマトンボMacromia daimoji Okumura, 1949
25Anisoptera 不均翅亜目Macromiidae ヤマトンボ科コヤマトンボMacromia amphigena amphigena Selys, 1871
26Anisoptera 不均翅亜目Libellulidae トンボ科アキアカネSympetrum frequens (Selys, 1883)
27Anisoptera 不均翅亜目Libellulidae トンボ科ウスバキトンボPantala flavescens (Fabricius, 1798)
28Anisoptera 不均翅亜目Libellulidae トンボ科オオシオカラトンボOrthetrum melania (Selys, 1883)
29Anisoptera 不均翅亜目Libellulidae トンボ科コシアキトンボPseudothemis zonata (Burmeister, 1839)
30Anisoptera 不均翅亜目Libellulidae トンボ科コノシメトンボSympetrum baccha matutinum Ris, 1911
31Anisoptera 不均翅亜目Libellulidae トンボ科コフキトンボDeielia phaon (Selys, 1883)
32Anisoptera 不均翅亜目Libellulidae トンボ科シオカラトンボOrthetrum albistylum speciosum (Uhler, 1858)
33Anisoptera 不均翅亜目Libellulidae トンボ科シオヤトンボOrthetrum japonicum (Uhler, 1858)
34Anisoptera 不均翅亜目Libellulidae トンボ科ショウジョウトンボCrocothemis servilia mariannae Kiauta, 1983
35Anisoptera 不均翅亜目Libellulidae トンボ科チョウトンボRhyothemis fuliginosa Selys, 1883
36Anisoptera 不均翅亜目Libellulidae トンボ科ナツアカネSympetrum darwinianum (Selys, 1883)
37Anisoptera 不均翅亜目Libellulidae トンボ科ノシメトンボSympetrum infuscatum (Selys, 1883)
38Anisoptera 不均翅亜目Libellulidae トンボ科ハッチョウトンボNannophya pygmaea Rambur, 1842
39Anisoptera 不均翅亜目Libellulidae トンボ科ハラビロトンボLyriothemis pachygastra (Selys, 1878)
40Anisoptera 不均翅亜目Libellulidae トンボ科マイコアカネSympetrum kunckeli (Selys, 1884)
41Anisoptera 不均翅亜目Libellulidae トンボ科マユタテアカネSympetrum eroticum eroticum (Selys, 1883)



次に、左下のSheet1をクリックして、Sheet1に移動します。
Sheet1に和名を記入しマクロを実行すると、Sheet2を参考に学名や、種番号がSheet1にコピーされてくる、という仕組みです。




上のように、Sheet1に今日見られたトンボリストを書いたとします(本当は季節外れで見れないけれど)。



書き終わったら、キーボードの「Altキー」と「F11」キーを同時に押します。
何だかよくわからないウィンドウ(VBEというらしい)が出てきたはずです。



そして、左のSheet1(赤枠)をダブルクリックすると上の図のようになると思います。




右の小さなウィンドウ(赤枠)の中に、以下のスクリプトをコピーして貼り付けてください。
Sub 和名から学名や番号の付与()
'高速化するために表示内容の更新を一端停止
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    '変数を宣言
    Dim workSh, refSh As Worksheet
    Dim RowStart As String
    Dim refJpnNameCol As Integer
    Dim JpnNameCol As Integer
    Dim MaxRow As Integer
    Dim refMaxRow As Integer
    Dim refRng As Range
    Dim workingRow As Integer
    Dim tmpStr As String
'☆Sheet1の和名は何行目から記入したか
    RowStart = 2
'☆Sheet1の和名は何列目に記入したか
    JpnNameCol = 4
'☆Sheet2(検索される側)の和名は何列目に記入したか
    refJpnNameCol = 4
'☆何列目を検索対象とするか
    refA = 1
    refB = 2
    refC = 3
    refD = 5
'☆何列目に出力するか(outputAはrefAに対応)
    outputA = 1
    outputB = 2
    outputC = 3
    outputD = 5
    'どのシートに出力するか
    Set workSh = ThisWorkbook.Worksheets("Sheet1")
    'どのシートを参照するか
    Set refSh = ThisWorkbook.Worksheets("Sheet2")
    'Sheet1の最終行をMaxRowに代入
    With Worksheets("Sheet1").UsedRange
    MaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
    End With
    'Sheet2の最終行をrefMaxRowに代入
    With Worksheets("Sheet2").UsedRange
    refMaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
    End With
    '検索対象の範囲指定
    Set refRng = Worksheets("Sheet2").Range(refSh.Cells(1, refJpnNameCol), refSh.Cells(refMaxRow, refJpnNameCol))
    '↓1行ずつ検索し、該当する箇所を出力欄にコピー(開始)
    For workingRow = RowStart To MaxRow
        tmpStr = workSh.Cells(workingRow, JpnNameCol).Value
        On Error Resume Next
'☆出力したい列数に合わせて1行ずつ便宜追加、削除しよう1/2(始め)
        refSh.Cells(Application.WorksheetFunction.match(tmpStr, refRng, 0), refA).Copy workSh.Cells(workingRow, outputA)
        refSh.Cells(Application.WorksheetFunction.match(tmpStr, refRng, 0), refB).Copy workSh.Cells(workingRow, outputB)
        refSh.Cells(Application.WorksheetFunction.match(tmpStr, refRng, 0), refC).Copy workSh.Cells(workingRow, outputC)
        refSh.Cells(Application.WorksheetFunction.match(tmpStr, refRng, 0), refD).Copy workSh.Cells(workingRow, outputD)
'☆出力したい列数に合わせて1行ずつ便宜追加、削除しよう1/2(終わり)
        If Err <> 0 Or workSh.Cells(workingRow, JpnNameCol).Value = "和名未定" Then
'☆出力したい列数に合わせて1行ずつ便宜追加、削除しよう2/2(始め)
            workSh.Cells(workingRow, outputA).Value = ""
            workSh.Cells(workingRow, outputB).Value = ""
            workSh.Cells(workingRow, outputC).Value = ""
            workSh.Cells(workingRow, outputD).Value = ""
'☆出力したい列数に合わせて1行ずつ便宜追加、削除しよう2/2(終わり)
            Err.Clear
        End If
        '進捗状況をステータスバーに表示
        Application.StatusBar = "処理中" & workingRow & "/" & MaxRow
    Next
    '↑1行ずつ検索し、該当する箇所を出力欄にコピー(終了)
    
    '処理終了をステータスバーに表示
        Application.StatusBar = "処理終了"
    
    '表示される内容の更新
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With
End Sub

そして、右のウィンドウの中で一度クリックした後、「F5キー」を押します。



マクロが実行され、対応する番号、亜目、科、学名が出力されました。



左上からポインターをドラッグして範囲を選択し、右クリック。並べ替え>昇順をクリックします。



番号順に並べ替えることが出来ました。



ファイルを保存するときは、.xlsxではなく、.xlsm(マクロ有効ブック)として保存してください。マクロも保存されているので、次回からは和名の記入後、「Alt + F11」キーを押した後、「F5」キーを押すことで番号、学名の出力が出来ます。

列を追加したり減らしたい等、自分好みにカスタマイズしたい場合は☆マークの部分をいじってください。
refは参照される側(Sheet2)の列数を、outputは出力される側(Sheet1)の列数をあらわしています。refAに書かれている内容はoutputAに、refBに書かれている内容はoutputBに出力されるようになっているので、refA = 1, outputA = 2に書き換えれば、Sheet2の1列目がSheet1の2列目にコピー(出力)されることになります。



始めにSheet2に参照するリストを作っておくのが非常に面倒ですが、一度作ってしまえば後は楽なので、ぜひ試してみてください。

説明は以上です。
もっととっつきやすい方法もあると思います。スクリプトは改変して再配布してもらって構いません。より良い方法があれば、教えていただけれるとうれしいです。また、VBA初心者のため変な部分もあるかもしれません。改善点や質問があればぜひコメント欄にお願いします。

0 件のコメント:

コメントを投稿