Species Dictionary

This page will contain useful functions for managing species dictionary


Match taxonversionkeys in ACCESS

This VBA matches taxonversionkeys from the NHM nameserver. Need to include taxon names in taxon field of dataset table and link nameserver of species dictionary as TaxonDictionary

Dim db As Database
Dim tbl As TableDef
Dim rec As Recordset
Dim fld As Field
Dim strSql As String
Dim qry As QueryDef
Dim blVariable As Boolean
Dim iTaxa As Long
Dim arrTaxa As Variant
Public Sub Match_Taxa()

'SET CURRENT DB
Set db = CurrentDb
'SysCmd acSysCmdSetStatus, ""

'ADD TAXONVERSIONKEY FIELD IF NOT PRESENT
blVariable = False
Set tbl = db.TableDefs("Dataset")
For Each fld In tbl.Fields
  If fld.Name = "TaxonVersionKey" Then
    blVariable = True
  End If
Next

If blVariable = False Then
  Set fld = tbl.CreateField("TaxonVersionKey", dbText)
  With fld
    .Size = 255
  End With
  tbl.Fields.Append fld
  tbl.Fields.Refresh
End If
blVariable = False

'CREATE TAXON MATCHING TABLE
On Error Resume Next
db.QueryDefs.Delete ("tempMatchTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchTaxa1")
strSql = "SELECT Dataset.Taxon, Dataset.Taxon AS Taxon_Modified, Dataset.TaxonVersionKey, 0 AS Matched, TaxonDictionary.INFORMAL_GROUP AS TaxonGroup FROM Dataset "
strSql = strSql & "INNER JOIN TaxonDictionary ON Dataset.Taxon = TaxonDictionary.TAXON_NAME "
strSql = strSql & "GROUP BY Dataset.Taxon, Dataset.Taxon, Dataset.TaxonVersionKey, 0, TaxonDictionary.INFORMAL_GROUP;"
qry.SQL = strSql

On Error Resume Next
db.TableDefs.Delete ("TaxonMatching")
db.QueryDefs.Delete ("tempMatchTaxa2")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchTaxa2")
strSql = "SELECT tempMatchTaxa1.Taxon, tempMatchTaxa1.Taxon_Modified, tempMatchTaxa1.TaxonVersionKey, tempMatchTaxa1.Matched, Count(tempMatchTaxa1.TaxonGroup) AS TaxonGroup INTO TaxonMatching FROM tempMatchTaxa1 "
strSql = strSql & "GROUP BY tempMatchTaxa1.Taxon, tempMatchTaxa1.Taxon_Modified, tempMatchTaxa1.TaxonVersionKey, tempMatchTaxa1.Matched;"
qry.SQL = strSql
qry.Execute
On Error Resume Next
db.QueryDefs.Delete ("tempMatchTaxa1")
db.QueryDefs.Delete ("tempMatchTaxa2")
On Error GoTo 0

'RULE OUT TAXON MATCHING WHERE TAXON OCCURS ACROSS TAXON GROUPS
On Error Resume Next
db.QueryDefs.Delete ("tempMatchTaxaATG")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchTaxaATG")
strSql = "UPDATE TaxonMatching SET TaxonMatching.Taxon_Modified = 'AcrossTaxonGroups' "
strSql = strSql & "WHERE (((TaxonMatching.TaxonGroup)>1));"
qry.SQL = strSql
qry.Execute
On Error Resume Next
db.QueryDefs.Delete ("tempMatchTaxaATG")
On Error GoTo 0

'RUN MAIN TAXON MATCHING QUERIES
Call SpeciesMatchingQueries

'RUN ADDITIONAL TAXON MATCHING QUERIES
'Call AdditionalSpeciesMatchingQueries

Set rec = db.OpenRecordset("TaxonMatching")
iTaxa = rec.RecordCount

'MODIFY NAMES AN RERUN MATCHING QUERIES
If iTaxa <> 0 Then
  'MODIFY TAXON NAMES
  Call ModifyTaxonName
  Call SpeciesMatchingQueries
  'Call AdditionalSpeciesMatchingQueries

  On Error Resume Next
  db.QueryDefs.Delete ("tempTaxonMatching")
  On Error GoTo 0
  Set qry = db.CreateQueryDef("tempTaxonMatching")
  strSql = "UPDATE TaxonMatching SET TaxonMatching.Taxon_Modified = [TaxonMatching]![Taxon];"
  qry.SQL = strSql
  qry.Execute
  On Error Resume Next
  db.QueryDefs.Delete ("tempTaxonMatching")
  On Error GoTo 0

End If

'RECOUNT TAXONMATCHING TABLE
iTaxa = rec.RecordCount

'DELETE TAXONMATCHING TABLE IF EMPTY
If iTaxa = 0 Then
 On Error Resume Next
  db.TableDefs.Delete ("TaxonMatching")
 On Error GoTo 0
 db.TableDefs.Refresh
End If

'DISPLAY END MESSAGE
SysCmd acSysCmdSetStatus, "Matching finished: " & iTaxa & " taxa remaining"

rec.Close

End Sub

Public Sub ModifyTaxonName()

'MODIFICATION 1: ADD SUBSP. TO TRINOMIAL
If iTaxa <> 0 Then
  With rec
    .MoveFirst
    Do Until .EOF
      arrTaxa = Split(rec("Taxon"), " ", -1, vbTextCompare)
      If UBound(arrTaxa) = 2 Then
        .Edit
        rec("Taxon_modified") = arrTaxa(0) & " " & arrTaxa(1) & " " & "subsp. " & arrTaxa(2)
        .Update
      End If
      .MoveNext
    Loop
   End With
End If

End Sub

Public Sub SpeciesMatchingQueries()

'SPECIES MATCHING QUERIES - THESE MATCHES SHOULD PRODUCE THE OPTIMAL TAXON MATCHING

'FIRST ROUND: GET TAXA WITH UNIQUE TAXONVERSIONKEY
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT TaxonMatching.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "WHERE (((TaxonMatching.Matched)=0));"
qry.SQL = strSql

Call FindUniqueMatches

'SECOND ROUND: GET TAXA WITH UNIQUE TAXONVERSIONKEY WHERE NAME_FORM IS WELL FORMED
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT TaxonMatching.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "WHERE (((TaxonMatching.Matched)=0) AND ((TaxonDictionary.NAME_FORM)='W'));"
qry.SQL = strSql

Call FindUniqueMatches

'THIRD ROUND: GET TAXA WITH UNIQUE TAXONVERSIONKEY WHERE NAME_STATUS IS RECOMMENDED
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT TaxonMatching.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "WHERE (((TaxonMatching.Matched)=0) AND ((TaxonDictionary.NAME_STATUS)='R'));"
qry.SQL = strSql

Call FindUniqueMatches

'FOURTH ROUND: GET TAXA WHERE UNIQUE TAXONVERSIONKEY EQUALS UNIQUE RECOMMENDED TAXONVERSIONKEY
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT TaxonMatching.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "WHERE (((IIf([TaxonDictionary]![NBN_TAXON_VERSION_KEY_FOR_RECOMMENDED_NAME]=[TaxonDictionary]![NBN_TAXON_VERSION_KEY],'T','F'))='T'));"
qry.SQL = strSql

Call FindUniqueMatches

'FIFTH ROUND: GET TAXA WHERE RANK OF UNIQUE TAXONVERSIONKEY EQUALS RANK OF RECOMMENDED TAXONVERSIONKEY
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxaR")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxaR")
strSql = "SELECT TaxonMatching.Taxon_Modified, TaxonDictionary.RECOMMENDED_NAME_RANK AS Rank FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "GROUP BY TaxonMatching.Taxon_Modified, TaxonDictionary.RECOMMENDED_NAME_RANK;"
qry.SQL = strSql

On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT tempMatchingTaxaR.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM tempMatchingTaxaR "
strSql = strSql & "INNER JOIN TaxonDictionary ON (tempMatchingTaxaR.Rank = TaxonDictionary.RANK) AND (tempMatchingTaxaR.Taxon_Modified = TaxonDictionary.TAXON_NAME);"
qry.SQL = strSql

Call FindUniqueMatches

On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxaR")
On Error GoTo 0

End Sub

Public Sub AdditionalSpeciesMatchingQueries()

'ADDITIONAL MATCHES - THESE MATCHES MAY NOT PRODUCE THE OPTIMAL TAXON MATCHING

'SIXTH ROUND: GET TAXA WITH UNIQUE TAXONVERSIONKEY WHERE NAME_FORM IS INCORRECT
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT TaxonMatching.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "WHERE (((TaxonMatching.Matched)=0) AND ((TaxonDictionary.NAME_FORM)='I'));"
qry.SQL = strSql

Call FindUniqueMatches

'SEVENTH: GET TAXA WITH UNIQUE TAXONVERSIONKEY WHERE NAME_STATUS IS SYNONYMOUS
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT TaxonMatching.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "WHERE (((TaxonMatching.Matched)=0) AND ((TaxonDictionary.NAME_STATUS)='S'));"
qry.SQL = strSql

Call FindUniqueMatches

'EIGHTH ROUND: GET TAXA WITH UNIQUE TAXONVERSIONKEY WHERE NAME_FORM IS UNVERIFIED
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT TaxonMatching.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "WHERE (((TaxonMatching.Matched)=0) AND ((TaxonDictionary.NAME_FORM)='U'));"
qry.SQL = strSql

Call FindUniqueMatches

'NINETH ROUND: GET TAXA WITH UNIQUE TAXONVERSIONKEY WHERE NAME_STATUS IS UNVERIFIED
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT TaxonMatching.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "WHERE (((TaxonMatching.Matched)=0) AND ((TaxonDictionary.NAME_STATUS)='U'));"
qry.SQL = strSql

Call FindUniqueMatches

'TENTH ROUND: GET TAXA WHERE UNIQUE TAXONVERSIONKEY HAS MAX LATEST CHANGE
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxaLC")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxaLC")
strSql = "SELECT TaxonMatching.Taxon_Modified, Max(TaxonDictionary.DATE_RECORD_LAST_CHANGED) AS LatestChanged FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "GROUP BY TaxonMatching.Taxon_Modified;"
qry.SQL = strSql

On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT tempMatchingTaxaLC.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM tempMatchingTaxaLC "
strSql = strSql & "INNER JOIN TaxonDictionary ON (tempMatchingTaxaLC.LatestChanged = TaxonDictionary.DATE_RECORD_LAST_CHANGED) AND (tempMatchingTaxaLC.Taxon_Modified = TaxonDictionary.TAXON_NAME);"
qry.SQL = strSql

Call FindUniqueMatches

On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxaLC")
On Error GoTo 0

'ELEVENTH ROUND: GET TAXA WHERE UNIQUE TAXONVERSIONKEY HAS MAX DATE ADDED
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxaLA")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxaLA")
strSql = "SELECT TaxonMatching.Taxon_Modified, Max(TaxonDictionary.DATE_RECORD_ADDED) AS LatestAdded FROM TaxonMatching "
strSql = strSql & "INNER JOIN TaxonDictionary ON TaxonMatching.Taxon_Modified = TaxonDictionary.TAXON_NAME "
strSql = strSql & "GROUP BY TaxonMatching.Taxon_Modified;"
qry.SQL = strSql

On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa1")
strSql = "SELECT tempMatchingTaxaLA.Taxon_Modified, TaxonDictionary.NBN_TAXON_VERSION_KEY AS TaxonVersionKey, 1 AS Matches FROM tempMatchingTaxaLA "
strSql = strSql & "INNER JOIN TaxonDictionary ON (tempMatchingTaxaLA.LatestAdded = TaxonDictionary.DATE_RECORD_ADDED) AND (tempMatchingTaxaLA.Taxon_Modified = TaxonDictionary.TAXON_NAME);"
qry.SQL = strSql

Call FindUniqueMatches

On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxaLA")
On Error GoTo 0

End Sub

Public Sub FindUniqueMatches()

'CREATE TEMPTAXAMATCHING TABLE WITH UNIQUE MATCHES
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa2")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa2")
strSql = "SELECT tempMatchingTaxa1.Taxon_Modified FROM tempMatchingTaxa1 "
strSql = strSql & "GROUP BY tempMatchingTaxa1.Taxon_Modified "
strSql = strSql & "HAVING (((Sum(tempMatchingTaxa1.Matches))=1));"
qry.SQL = strSql

On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa3")
db.TableDefs.Delete ("tempTaxonMatching")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa3")
strSql = "SELECT tempMatchingTaxa1.Taxon_Modified, tempMatchingTaxa1.TaxonVersionKey INTO tempTaxonMatching FROM tempMatchingTaxa2 "
strSql = strSql & "INNER JOIN tempMatchingTaxa1 ON tempMatchingTaxa2.Taxon_Modified = tempMatchingTaxa1.Taxon_Modified;"
qry.SQL = strSql
qry.Execute
db.TableDefs.Refresh

'UPDATE TAXOMMATCHING TABLE WITH UNIQUE MATCHES
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa4")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa4")
strSql = "UPDATE tempTaxonMatching INNER JOIN TaxonMatching ON tempTaxonMatching.Taxon_Modified = TaxonMatching.Taxon_Modified "
strSql = strSql & " SET TaxonMatching.TaxonVersionKey = [tempTaxonMatching]![TaxonVersionKey], TaxonMatching.Matched = 1;"
qry.SQL = strSql
qry.Execute

'TIDY UP TABLES AND QUERIES
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa1")
db.QueryDefs.Delete ("tempMatchingTaxa2")
db.QueryDefs.Delete ("tempMatchingTaxa3")
db.QueryDefs.Delete ("tempMatchingTaxa4")
db.TableDefs.Delete ("tempTaxonMatching")
On Error GoTo 0

'UPDATE DATASET TABLE WITH UNIQUE MATCHES
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa5")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa5")
strSql = "UPDATE TaxonMatching INNER JOIN Dataset ON TaxonMatching.Taxon = Dataset.Taxon "
strSql = strSql & "SET Dataset.TaxonVersionKey = [TaxonMatching]![TaxonVersionKey] "
strSql = strSql & "WHERE (((TaxonMatching.Matched)=1));"
qry.SQL = strSql
qry.Execute
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa5")
On Error GoTo 0

'DELETE UNIQUE MATCHES FROM TAXOMMATCHING TABLE
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa6")
On Error GoTo 0
Set qry = db.CreateQueryDef("tempMatchingTaxa6")
strSql = "DELETE DISTINCTROW TaxonMatching.*, TaxonMatching.Matched FROM TaxonMatching "
strSql = strSql & "WHERE (((TaxonMatching.Matched)=1));"
qry.SQL = strSql
qry.Execute
On Error Resume Next
db.QueryDefs.Delete ("tempMatchingTaxa6")
On Error GoTo 0

End Sub

Match taxonversionkeys to EXCEL list

This function matches taxonversionkey to a taxon list using named range in Microsoft Excel

Named Range
TaxonName, TaxonVersionKey columns in specieslist worksheet
=OFFSET(specieslist!$A$2,0,0,COUNTA(specieslist!$A:$A)-1,2)

'GETS TAXONVERSIONKEY USING VLOOKUP FUNCTION FROM NAMED RANGE "SPECIESLIST"
Public Function NBN_Get_TaxonVersionKey(taxonname As String) As String

Dim tvk As String
tvk = ""

On Error Resume Next
tvk = WorksheetFunction.VLookup(taxonname, ThisWorkbook.Sheets("specieslist").Range("specieslist"), 2, False)
On Error GoTo 0

NBN_Get_TaxonVersionKey = tvk

End Function

Page tags: client dictionary vba
page_revision: 10, last_edited: 1249463055|%e %b %Y, %H:%M %Z (%O ago)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License