Questo codice è disponibile sotto le licenze CC-by-sa 3.0 e GFDL 1.3 ove applicabile (poiché pubblicata su una pagina di Teknopedia) e GPL 2.0 (poiché è un software), tenendo conto comunque che VBA, ADO e la libreria di run-time necessaria sono copyright della Microsoft Corp.
Lo metto qui per future riutilizzazioni.
Option Explicit
Sub CreaVoci()
' ISTRUZIONI
' Non è un bot. E' solo un programmino che crea una serie di file *.txt pronti per essere copiati in altrettante voci di Teknopedia.
' Per utilizzare lo script è necessario creare un foglio Excel con i seguenti campi
' (titoli nella prima riga, dati in colonna):
' N --> numero progressivo
' Città --> nome della città o località
' Contea --> contea
' ConteaWiki --> Titolo della voce di it.wiki della contea
' Status --> City, Town, Village o CDP (per altri stati modificare lo script)
' Abitanti 2000 --> numero di abitanti USCB del 2000
' Abitanti 2009 --> numero di abtanti USCB del 2009 (per altri anni modificare lo0 script)
' Area --> superficie in miglia quadrate (sq mi)
' Superficie --> superficie in km quadrati (moltiplicare area per 2,589988110336)
' INTPTLAT --> latitudine decimale (senza virgola o segno)
' INTPTLNG --> longitudine decimale (senza virgola o segno)
' latG --> latitudine in gradi
' latM --> ecc.
' latS
' lonG
' lonM
' lonS
' GNIS ID --> ID del Geographic Names Information System (GNIS) (non senrve nello script, ma è utile per cercare i dati)
' Ele(ft) --> altitudine in piedi (ft)
' Altitudine --> altitudine in metri (moltiplicare Ele(ft) per 0,3048)
' CAP --> lo Zip Code americano
' NomeAbitanti --> ovvio
' Telefono --> prefisso telefonico, Area Code americano
' Sito --> url del sito ufficiale (se esiste)
'
' Nell'editor VBA creare un modulo associato al file intitolato CreaVoci (o simile).
' Modificare "a mano" alcuni dati nello script qui sotto: percorso (il percorso assoluto dove mettere i file creati), e le varie note da inserire.
' Per altri stati modificare Mississippi ovunque nello script con quello giusto.
' Lo script funziona solo se è installato ADODB: nell'editor VBA cliccare su "Strumenti" -> "Riferimenti"
' e verificare che ci sia il flag su "Microsoft ActiveX Data Objects 2.X" (dove 2.X dovrebbe essere uguale o maggiore di 2.8).
' Lo script funziona con Excel 2003 SP3. Altre versioni da verificare.
' Riempita la tabella, lanciare la macro dal menù di Excel.
On Error GoTo Gestore_Errori
Dim cnXLS As ADODB.Connection
Dim rsXLS As ADODB.Recordset
Dim i As Long
Dim latDec As String
Dim lonDec As String
Dim latDecG, latDecM, latDecS As Double
Dim lonDecG, lonDecM, lonDecS As Double
Dim Voce, Voce0, Voce1, Voce2, Voce3, Voce4, Voce5, Voce6 As String
Dim msg As VbMsgBoxResult
Dim anno, abitanti, status, status1, densità As String
Dim percorso As String
Dim notaabitanti2000, notaabitanti2009, notasuperficie, notaaltitudine, sitoweb As String
' Inizializza un po' di variabili
percorso = "<--INSERIRE UN PERCORSO ASSOLUTO-->" ' percorso di salvataggio dei file
notaabitanti2000 = "<ref name=USCB2000>{{cita web|url=http://www.census.gov/prod/cen2000/phc-1-26.pdf|titolo=Summary Population and Housing Characteristics|data=novembre 2009|opera=Mississippi: 2000|editore=U.S. Census Bureau|accesso=23-07-2010|lingua=en}}</ref>"
notaabitanti2009 = "<ref name=USCB2009>{{cita web|url=http://www.census.gov/popest/cities/tables/SUB-EST2009-04-28.xls|titolo=Table 4. Annual Estimates of the Resident Population for Incorporated Places in Mississippi: April 1, 2000 to July 1, 2009|opera=Incorporated Places and Minor Civil Divisions|editore=U.S. Census Bureau|accesso=23-07-2010|lingua=en}}</ref>"
notasuperficie = "<ref name=SUP>{{cita web|url=http://factfinder.census.gov/servlet/GCTTable?_bm=y&-context=gct&-ds_name=DEC_2000_SF1_U&-_box_head_nbr=GCT-PH1&-CONTEXT=gct&-mt_name=PEP_2008_EST_GCTT1R_ST9S&-tree_id=806&-redoLog=false&-geo_id=04000US28&-format=ST-7|titolo=Mississippi -- Place|opera=American Fact Finder|editore=U.S. Cernsus Bureau|accesso=23-07-2010|lingua=en}}</ref>"
' Apre la connessione ADO con il foglio Excel contenente i dati in tabella
Set cnXLS = New ADODB.Connection
With cnXLS
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ActiveWorkbook.FullName & ";" & _
"Extended Properties=Excel 8.0"
.Open
End With
' Inidcare il numero di colonne/campi della tabella
ActiveWorkbook.Names.Add Name:="tblCittà", RefersToR1C1:="='" & ActiveWorkbook.ActiveSheet.Name & "'!C1:C30"
' Apre il recordset con i dati del foglio di Excel
Set rsXLS = New ADODB.Recordset
With rsXLS
.CursorType = adOpenForwardOnly
.LockType = adLockOptimistic
.ActiveConnection = cnXLS
.Source = "SELECT * FROM tblCittà WHERE (tblCittà.N Is Not Null)"
.Open
End With
While Not rsXLS.EOF
i = i + 1 'indice del record corrente
Debug.Print rsXLS.Fields("Città").Value
' Anno e numero di abitanti
If rsXLS.Fields("Abitanti 2009").Value <> "" Then
anno = 2009 & notaabitanti2009
abitanti = Format(rsXLS.Fields("Abitanti 2009").Value, "##,##0")
ElseIf rsXLS.Fields("Abitanti 2000").Value <> "" Then
anno = 2000 & notaabitanti2000
abitanti = Format(rsXLS.Fields("Abitanti 2000").Value, "##,##0")
End If
' Status della località per l'incipit
status1 = UCase(Left(rsXLS.Fields("Status").Value, 1)) & LCase(Right(rsXLS.Fields("Status").Value, Len(rsXLS.Fields("Status").Value) - 1))
Select Case rsXLS.Fields("Status").Value
Case "city"
status = "è una città (''city'')"
Case "town"
status = "è una città (''town'')"
Case "village"
status = "è una località (''village'')"
Case "CDP"
status = "è un centro abitato e un [[census-designated place]] (CDP)"
status1 = "[[census-designated place|CDP]]"
End Select
' Densità solo se esiste il numero di abitanti e la superficie
If (abitanti > 0) And (rsXLS.Fields("Superficie").Value > 0) Then
densità = Format(Round(abitanti / rsXLS.Fields("Superficie").Value, 0), "###,###")
End If
' Popola la nota sull'altitudine dal GNIS
If rsXLS.Fields("GNIS ID").Value <> "" Then
notaaltitudine = "<ref name=ALT>{{cita web|url=http://geonames.usgs.gov/pls/gnispublic/f?p=gnispq:3:::NO::P3_FID:" & rsXLS.Fields("GNIS ID").Value & "|titolo=" & rsXLS.Fields("Città").Value & "|opera=Geographic Names Information System (GNIS)|editore=U.S. Geological Survey|accesso=23-07-2010|lingua=en}}</ref>"
Else
notaaltitudine = "<ref name=ALT>{{cita web|url=http://geonames.usgs.gov/pls/gnispublic/f?p=gnispq:2:::NO::P1_CLASS,P1_STATE:Civil,Mississippi|titolo=Mississippi|opera=Geographic Names Information System (GNIS)|editore=U.S. Geological Survey|accesso=23-07-2010|lingua=en}}</ref>"
End If
' Calcola le coordinate decimali
latDecG = rsXLS.Fields("latG").Value
latDecM = rsXLS.Fields("latM").Value / 60
latDecS = rsXLS.Fields("latS").Value / 3600
lonDecG = rsXLS.Fields("lonG").Value
lonDecM = rsXLS.Fields("lonM").Value / 60
lonDecS = rsXLS.Fields("lonS").Value / 3600
latDec = CStr(Int(latDecG + latDecM + latDecS)) & "." & Mid(CStr((Round(latDecG + latDecM + latDecS, 8) - Int(latDecG + latDecM + latDecS))), 3, 8)
lonDec = CStr(Int(lonDecG + lonDecM + lonDecS)) & "." & Mid(CStr((Round(lonDecG + lonDecM + lonDecS, 8) - Int(lonDecG + lonDecM + lonDecS))), 3, 8)
' Se ha più di 10.000 abitanti mette il template Stub
If rsXLS.Fields("Abitanti 2009").Value > 10000 Then
Voce0 = "{{S|Mississippi}}" & Chr(10)
Else
Voce0 = ""
End If
' Spezza il testo per evitare troppi ritorni a capo
Voce1 = Voce0 & _
"{{ComuneUSA" & Chr(10) & _
"|nomeCitta = " & rsXLS.Fields("Città").Value & Chr(10) & _
"|nomeOriginale = " & rsXLS.Fields("Città").Value & ", Mississippi" & Chr(10) & _
"|status = " & status1 & Chr(10) & _
"|linkPanorama = " & Chr(10) & _
"|linkBandiera = " & Chr(10) & _
"|linkStemma = " & Chr(10) & _
"|linkMappa = " & rsXLS.Fields("Contea").Value & " County Mississippi Incorporated and Unincorporated areas " & rsXLS.Fields("Città").Value & " Highlighted.svg" & Chr(10) & _
"|pxMappa = 250px" & Chr(10) & _
"|stato = {{US Mississippi}}" & Chr(10) & _
"|contea = [[" & rsXLS.Fields("ConteaWiki").Value & "|" & rsXLS.Fields("Contea").Value & "]]" & Chr(10) & _
"|anno = " & anno & Chr(10) & _
"|abitanti = " & abitanti & Chr(10) & _
"|densità = " & densità & Chr(10) & _
"|zonaOraria = Central (CST)" & Chr(10) & _
"|fusoOrario = [[UTC-6]]" & Chr(10)
Voce2 = "|altitudine = " & rsXLS.Fields("Altitudine").Value & notaaltitudine & Chr(10) & _
"|superficie = " & rsXLS.Fields("Superficie").Value & notasuperficie & Chr(10) & _
"|latGradi = " & rsXLS.Fields("latG").Value & Chr(10) & _
"|latMinuti = " & rsXLS.Fields("latM").Value & Chr(10) & _
"|latSecondi = " & rsXLS.Fields("latS").Value & Chr(10) & _
"|latNS = N" & Chr(10) & _
"|longGradi = " & rsXLS.Fields("lonG").Value & Chr(10) & _
"|longMinuti = " & rsXLS.Fields("lonM").Value & Chr(10) & _
"|longSecondi = " & rsXLS.Fields("lonS").Value & Chr(10) & _
"|longEW = W" & Chr(10) & _
"|cap = " & rsXLS.Fields("CAP").Value & Chr(10) & _
"|telefono = " & rsXLS.Fields("Telefono").Value & Chr(10) & _
"|nomeabitanti =" & rsXLS.Fields("NomeAbitanti").Value & Chr(10) & _
"|sindaco =" & Chr(10) & _
"|sito =" & rsXLS.Fields("Sito").Value & Chr(10) & _
"|note =" & Chr(10) & _
"}}" & Chr(10) & Chr(10)
Voce3 = "'''" & rsXLS.Fields("Città").Value & "''' " & status & " degli [[Stati Uniti d'America]], " & _
"situata nella contea di [[" & rsXLS.Fields("ConteaWiki").Value & "|" & rsXLS.Fields("Contea").Value & "]], " & _
"nello stato del [[Mississippi]]." & Chr(10) & Chr(10) & _
"== Note ==" & Chr(10) & _
"<references/>" & Chr(10) & Chr(10) & _
"== Altri progetti ==" & Chr(10) & _
"{{interprogetto|commons=Category:" & rsXLS.Fields("Città").Value & ", Mississippi}}" & Chr(10) & Chr(10) & _
"== Collegamenti esterni ==" & Chr(10)
If rsXLS.Fields("Sito").Value <> "" Then
Voce4 = "*{{Cita web|url=" & rsXLS.Fields("Sito").Value & "|titolo=Sito ufficiale|lingua=en|accesso=23-07-2010}}" & Chr(10)
Else
Voce4 = ""
End If
Voce5 = "*{{Cita web|url=http://www.openstreetmap.org/?lat=" & latDec & "&lon=-" & lonDec & "&zoom=14|titolo=" & rsXLS.Fields("Città").Value & "|opera=OpenStreetMap|accesso=23-07-2010}}" & Chr(10) & _
"*{{Cita web|url=http://factfinder.census.gov/servlet/SAFFFacts?_event=Search&geo_id=&_geoContext=&_street=&_county=" & rsXLS.Fields("Città").Value & "&_cityTown=" & rsXLS.Fields("Città").Value & "&_state=04000US28&_zip=&_lang=en&_sse=on&pctxt=fph&pgsl=010&show_2003_tab=&redirect=Y" & _
"|titolo=" & rsXLS.Fields("Città").Value & " " & rsXLS.Fields("Status").Value & ", Mississippi" & "|opera=American Fact Finder|editore=U.S. Census Bureau|lingua=en|accesso=23-07-2010}}" & Chr(10) & Chr(10) & _
"{{Mississippi}}" & Chr(10) & Chr(10) & _
"{{Portale|Stati Uniti}}" & Chr(10) & Chr(10)
If rsXLS.Fields("Status").Value = "CDP" Then
Voce6 = "[[Categoria:Census-designated place del Mississippi]]" & Chr(10) & Chr(10) & _
"[[en:" & rsXLS.Fields("Città").Value & ", Mississippi]]"
Else
Voce6 = "[[Categoria:Comuni del Mississippi]]" & Chr(10) & Chr(10) & _
"[[en:" & rsXLS.Fields("Città").Value & ", Mississippi]]"
End If
Voce = Voce1 & Voce2 & Voce3 & Voce4 & Voce5 & Voce6
' Salva il file nel formato "Stato (nnn).txt"
Open percorso & "Missisippi (" & Format(rsXLS.Fields("N").Value, "000") & ") - " & rsXLS.Fields("Città").Value & ".txt" For Output As #1
Print #1, Voce
Close #1
rsXLS.MoveNext
Voce0 = ""
Voce1 = ""
Voce2 = ""
Voce3 = ""
Voce4 = ""
Voce5 = ""
Voce6 = ""
Voce = ""
Wend
Exit_CreaVoci:
' Chiude la connessione ADO e distrugge gli oggetti
ActiveWorkbook.Names("tblCittà").Delete
cnXLS.Close
Set rsXLS = Nothing
Set cnXLS = Nothing
Exit Sub
Gestore_Errori:
Debug.Print Err.Number
msg = MsgBox(Err.Number & " " & Err.Description)
Resume Exit_CreaVoci
End Sub