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.

Tags: ,