Ciao AlbertoBaVi,
se posso permettermi un consiglio, creare tre tabelle una per ciascun ruolo non è, a mio avviso, l'approccio più efficiente al problema: cosa accadrebbe se una persona cambiasse ruolo (ammettendo che questo fosse possibile)? Dovresti eliminare la persona
in una tabella ed accodarla in un'altra.
Io creerei una tabella anagrafica unica per tutte le persone gestendo un campo che identifica il ruolo di questa persona. In questo modo basterebbe cambiare il valore di quel campo per cambiare il ruolo di quella persona in tutto il db.
Seguendo questa filosofia, per importare i tuoi dati in una nuova tabella, ho fatto in questo modo:
- ho creato una nuova tabella "Anagrafica_Ruoli" con due campi: IdRuolo (Contatore) e Ruolo (descrittivo del ruolo
identico ai ruoli che hai nella tabella di origine). Nella tabella ho precaricato i ruoli esistenti.
- ho creato una nuova tabella "Anagrafica_Persone" con i seguenti campi: IdAnagrafica (contatore), IdRuolo (numerico), Nome (stringa), Cognome (stringa), Citta (stringa).
Ipotizzando che la tua tabella origine si chiami Anagrafica ed abbia 2 campi, Campo1 e Campo2, ho inserito all'interno di VBA un nuovo modulo standard e fatto girare questa routine:
Sub sAnagrafica()
Dim db As DAO.Database
Dim rstO As DAO.Recordset 'Anagrafica origine
Dim rstD As DAO.Recordset 'Anagrafica Persone
Dim rstR As DAO.Recordset 'Ruoli
Set db = CurrentDb
With db
Set rstO = .OpenRecordset("Select * From Anagrafica", dbOpenSnapshot, dbReadOnly)
Set rstD = .OpenRecordset("Select * From Anagrafica_Persone", dbOpenDynaset, dbSeeChanges)
End With
With rstO
Do While Not .EOF
If DCount("*", "Anagrafica_Ruoli", "Ruolo = '" & !Campo1 & "'") > 0 Then
'sono in presenza di un ruolo
Set rstR = db.OpenRecordset("Select * From Anagrafica_Ruoli " _
& "WHERE Ruolo = '" & !Campo1 & "'", dbOpenSnapshot, dbForwardOnly)
.MoveNext
Do While Not DCount("*", "Anagrafica_Ruoli", "Ruolo = '" & !Campo1 & "'") > 0
rstD.AddNew
rstD!IdRuolo = rstR!IdRuolo
rstD!Nome = Split(!Campo1, " ")(0)
rstD!Cognome = Split(!Campo1, " ")(1)
rstD!Citta = !Campo2
rstD.Update
.MoveNext
If .EOF Then Exit Do
Loop
.MovePrevious
rstR.Close
End If
.MoveNext
Loop
End With
rstD.Close
rstO.Close
db.Close
Set rstR = Nothing
Set rstD = Nothing
Set rstO = Nothing
Set db = Nothing
End Sub
La routine divide anche il nome/cognome della persona tenendo conto di uno spazio separatore e ipotizzando che il nome venga prima del cognome (mi sono basato sul tuo esempio). Ovviamente potresti non volere questa separazione e in questo caso sostituisci
le due righe in grassetto con un'unica riga rstD!NomeCognome = !Campo1 (modificando ovviamente anche il nome del campo nella tabella Anagrafica_Persone.
La routine è sicuramente perfettibile ma nel test raggiunge il suo scopo
David