O processo de conversão de log’s de MS Excel© para ADIF é relativamente simples e pode ser feito recorrendo a um pouco de programação em VBA. Através deste link pode consultar as especificações do ADIF 1.0 que é utilizado pela maioria dos programas de registo, é importante que leia este documento.
Para iniciar um processo de conversão baseado neste tutorial começe por criar um arquivo em MS Excel©. Na primeira linha escreva o nome dos campos que vai querer importar (Consulte as especificações do ADIF 1.0 relativamente ao nome dos campos). Ainda na primeira linha, digite “ADIF RAW” na última célula, é aqui que vai ser escrito o texto em ADIF.
A folha de cálculo fica com um aspecto parecido com este (mas ainda sem os dados na linha 2). Embora o formato ADIF não especifique um número mínimo de campos, no mínimo o seu registo de QSO deve ter valores para Call, QSO_Date, Time_On, Band e Mode.
De seguida seleccione toda a folha e formate as células como texto.
Grave o arquivo como xls2adi.xls (folha de cálculo do MS Excel©)
Vamos agora escrever e inserir o código em VBA. Vá a Ferramentas/Macros e clique em Editor de Visual Basic (Alt+F11).
No editor de VBA clique duas vezes em ‘EsteLivro’ que está na janela ‘Project – VBAProject’. É aqui que vai ficar o bloco de código principal que vai ser executado quando abrir novamente este arquivo.
O bloco de código que se segue define algumas variáveis e chama a função fCampoAdifValido (linha 05) que vai verificar se o nome do campo que está na primeira linha corresponde à especificação do ADIF. Se todos os nomes dos campos estiverem correctos a função chama o procedimento pEscreveAdif (linha 09) que vai escrever o registo em ADIF, caso um dos campos tenha um nome inválido a função mostra uma mensagem de erro (linha 07) e termina.
Copie/cole ou digite o seguinte código:
Private Sub Workbook_Open() Dim bNomeDoCampoValido As Boolean iUltimaLinha = fQualEAUltimaLinha(conLinhaInicial) sUltimaColuna = fQualEAUltimaColuna(conColunaInicial) bNomeDoCampoValido = fCampoAdifValido(conColunaInicial, sUltimaColuna) If bNomeDoCampoValido = False Then MsgBox ("Foram encontrados nomes de campo inválidos" & vbCrLf & "Remova as colunas preenchidas a vermelho!") Else pEscreveAdif End If End Sub
No editor de VBA clique em Insert/Module. É neste módulo vai ficar o restante código que é chamado pelo bloco principal.
As constantes conLinhaInicial (linha 02 do próximo bloco) e conColunaInicial (linha 03 do próximo bloco) definem que a linha 2 (da folha de cálculo) tem o primeiro registo e que a coluna A (da folha de cálculo) o primeiro campo.
As funções fQualEAUltimaLinha (linha 08 do próximo bloco) e fQualEAUltimaColuna (linha 17 do próximo bloco) vão determinar qual a última linha e coluna de dados. Isto impôe que uma célula vazia significa o fim do Log de registos.
A função fCampoAdifValido (linha 05 do bloco anterior) testa a validade do nome do campo. No ciclo ‘Select Case sNomeDoCampo’ (linha 31 do próximo bloco) podem ser adicionados mais campos de acordo com a especificação do ADIF.
O procedimento pEscreveAdif (linha 09 do bloco anterior) vai escrever o texto em ADIF na coluna que tem “ADIF RAW” na primeira linha. Neste procedimento é retirado o ifen do campo QSO_DATE, os dois pontos do campo TIME_ON e acrescentado um M no fim do campo BAND. Para tornar esta macro mais rigorosa podem ser impostas mais condições de verificação de dados dentro deste procedimento.
Copie/cole ou digite o seguinte código dentro do módulo:
Option Explicit Public Const conLinhaInicial As Integer = 2 Public Const conColunaInicial As String = "A" Public iUltimaLinha As Integer Public sUltimaColuna As String Public iAdifRaw As Integer Public Function fQualEAUltimaLinha(iPrimeiraLinha As Integer) As Integer Dim iValRecebido As Integer iValRecebido = iPrimeiraLinha Do While Len(Folha1.Cells(iValRecebido, "A")) > 0 iValRecebido = iValRecebido + 1 Loop fQualEAUltimaLinha = iValRecebido - 1 End Function Public Function fQualEAUltimaColuna(sPrimeiraColuna As String) As String Dim iValRecebido As Integer iValRecebido = Asc(sPrimeiraColuna) Do While Len(Folha1.Cells(1, Chr(iValRecebido))) > 0 iValRecebido = iValRecebido + 1 Loop fQualEAUltimaColuna = Chr(iValRecebido - 1) End Function Public Function fCampoAdifValido(sPrimeiraColuna As String, sUltimaColuna As String) As Boolean Dim sNomeDoCampo As String Dim iColunaCorrente As Integer For iColunaCorrente = Asc(sPrimeiraColuna) To Asc(sUltimaColuna) sNomeDoCampo = LCase(Folha1.Cells(1, iColunaCorrente - 64)) Select Case sNomeDoCampo Case Is = "band": fCampoAdifValido = True Case Is = "call": fCampoAdifValido = True Case Is = "cqz": fCampoAdifValido = True Case Is = "mode": fCampoAdifValido = True Case Is = "qso_date": fCampoAdifValido = True Case Is = "rst_rcvd": fCampoAdifValido = True Case Is = "rst_sent": fCampoAdifValido = True Case Is = "srx": fCampoAdifValido = True Case Is = "stx": fCampoAdifValido = True Case Is = "time_on": fCampoAdifValido = True Case Is = "adif raw" fCampoAdifValido = True iAdifRaw = iColunaCorrente - 64 Case Else Folha1.Cells(1, iColunaCorrente - 64).Interior.Color = RGB(255, 0, 0) fCampoAdifValido = False End Select Next End Function Public Sub pEscreveAdif() Dim iLinhaCorrente As Integer Dim iColunaCorrente As Integer Dim sTextoNaCelula As String Dim sLinhaEmAdif As String For iLinhaCorrente = conLinhaInicial To iUltimaLinha sLinhaEmAdif = "" For iColunaCorrente = Asc(conColunaInicial) To Asc(sUltimaColuna) - 1 If LCase(Folha1.Cells(1, Chr(iColunaCorrente))) = "band" Then sTextoNaCelula = Folha1.Cells(iLinhaCorrente, Chr(iColunaCorrente)) & "M" Else If LCase(Folha1.Cells(1, Chr(iColunaCorrente))) = "qso_date" Then sTextoNaCelula = Replace(Folha1.Cells(iLinhaCorrente, Chr(iColunaCorrente)), "-", "") Else If LCase(Folha1.Cells(1, Chr(iColunaCorrente))) = "time_on" Then sTextoNaCelula = Replace(Folha1.Cells(iLinhaCorrente, Chr(iColunaCorrente)), ":", "") Else sTextoNaCelula = Folha1.Cells(iLinhaCorrente, Chr(iColunaCorrente)) End If End If End If sLinhaEmAdif = sLinhaEmAdif & "<" & LCase(Folha1.Cells(1, Chr(iColunaCorrente))) & ":" & Len(sTextoNaCelula) & ">" & sTextoNaCelula Next Folha1.Cells(iLinhaCorrente, iAdifRaw) = sLinhaEmAdif & "<" & "EOR" & ">" Next End Sub
Clique em File/Save xls2adi.xls e feche o editor de VBA.
Agora copie os dados dos seus arquivos de MS Excel© que quer converter para as colunas apropriadas, grave no final e encerre o MS Excel©.
Pode ter necessidade de alterar as definições de sugurança do MS Excel© para executar macros, se necessário vá a Ferramentas/Macros e clique em Segurança, escolha um nível mais baixo. Este procedimento foi escrito para o MS Excel© em MS Windows XP© (ambos em versão portuguesa). Se vai utilizar este código noutra língua, por exemplo em inglês, substitua o termo ‘Folha1’ por ‘Sheet1’
Ao fazer duplo clique no arquivo xls2adi.xls, o código que acabámos de inserir vai ser executado e na coluna “ADIF RAW” está o nosso Log em formato ADIF.
Agora para terminar, seleccione o conteúdo da coluna “ADIF RAW” e copie (Ctrl+C), inicie o Bloco de Notas (Notepad) e cole (Ctrl+V). Grave o arquivo com a extenção adi.
Este exemplo de código é de utilização livre, pode-o utilizar sem restrições. É um exemplo muito simples daquilo que pode ser feito apenas recorrendo ao VBA (Visual Basic for Applications). Complemente este código com validações mais precisas, nomeadamente nos campos ‘qso_date’ e ‘time_on’, onde os formatos devem condizer com a especificação ADIF. Se detectar algum erro ou tiver alguma dúvida, não hesite em comentar. Espero que o artigo lhe seja util.