Tenta o seguinte código sendo CONEXAO a varíavel representativa do objeto ADODB.CONNECTION e RS como um ADODB.Recordset:
DIM NOME_TABELA AS STRING
DIM SQL AS STRING
'AGRUPA POR DESCRICAO
SQL = "SELECT DESCRICAO FROM TABELA GROUP BY DESCRICAO"
RS.OPEN SQL, CONEXAO
'CRIA AS TABELAS TEMPORARIAS E INSERE OS DADOS CORRESPONDENTES A CADA TABELA DE ACORDO COM A DESCRIÇÃO
DO WHILE NOT RS.EOF
NOME_TABELA = F_CREATE_TABLE (RS(0))
SQL = "SELECT DESCRICAO, HORASAIDA, DATASAIDA INTO " & NOME_TABELA & _
" FROM TABELA WHERE DESCRICAO = '" & RS(0) & "'"
CONEXAO.EXECUTE SQL
RS.MOVENEXT
LOOP
'DELETA TODOS OS DADOS DA TABELA
SQL = "DELETE FROM TABELA"
CONEXAO.EXECUTE SQL
RS.MOVEF IRST
'INSERE OS DADOS DAS TABELAS TEMPORÁRIAS PARA A TABELA PRINCIPAL
DO WHILE NOT RS.EOF
CALL S_INSERE_DADOS (RS(0))
RS.MOVENEXT
LOOP
'APAGA AS TABELAS TEMPORARIAS
RS.MOVEF IRST
DO WHILE NOT RS.EOF
SQL = "DROP TABLE TABELA_" & RS(0)
CONEXAO.EXECUTE SQL
RS.MOVENEXT
LOOP
PRIVATE FUNCTION F_CREATE_TABLE(BYVAL NOME_TAB AS STRING) AS STRING
DIM SSQL AS STRING
DIM TABELA AS STRING
TABELA = "TABELA_" & NOME_TAB
SSQL = "CREATE TABLE " & TABELA & _
" (DESCRICAO TEXT(50), HORASAIDA TIME, DATASAIDA DATE)"
F_CREATE_TABLE = TABELA
CONEXAO.EXECUTE SSQL
END SUB
PRIVATE SUB S_INSERE_DADOS(BYVAL NOME_TAB AS STRING)
DIM TABELA AS STRING
TABELA = "TABELA_" & NOME_TAB
SQL = "SELECT TOP 3 DESCRICAO, HORASAIDA, DATASAIDA INTO TABELA FROM " & TABELA & " ORDER BY DATASAIDA DESC, HORASAIDA DESC"
CONEXAO.EXECUTE SQL
END SUB
Este é um exemplo somente. Vc irá inserir os campos de acordo com sua necessidade. Lembrando que usei "TOP 3" para pegar os primeiro 3 registros da tabela em ordem DECRESCENTE, ou seja, as datas mais recentes com as horas mais recentes. Sempre coloque as tabelas temporárias com a mesma estrutura da tabela principal e/ou com os campos que vc irá precisar.
Qualquer problema posta ae
at+