VBA – Carregando o controle Imagem através de uma URL

Mais uma do fórum.

Em alguns sistemas, é comum precisar carregar uma imagem do disco local para mostrá-la num formulário VBA. A tarefa é simples e comum de ser fazer aos programadores VBA:

Imagem.Picture = LoadPicture("CaminhoLocal")

Simples. Porém, o método LoadPicture não dá suporte a carregar imagens da internet. Ao tentar colocar no parâmetro filename o um endereço de internet, o código gera um erro.  Nas andanças da Internet, chegamos a um código que, sendo  uma adaptação do LoadPicture, faz o dito trabalho (mantive os comentários originais para garantir a autoria):

Option Explicit
 
Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
    "URLDownloadToFileA" (ByVal pCaller As Long, _
    ByVal szURL As String, ByVal szFileName As String, _
    ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
 
Private Declare Function DeleteUrlCacheEntry Lib "Wininet.dll" _
    Alias "DeleteUrlCacheEntryA" ( _
    ByVal lpszUrlName As String) As Long
 
Private Declare Function GetTempFileName Lib "kernel32" Alias _
    "GetTempFileNameA" (ByVal lpszPath As String, _
    ByVal lpPrefixString As String, ByVal wUnique As Long, _
    ByVal lpTempFileName As String) As Long
 
Private Declare Function SetFileAttributes Lib "kernel32" Alias _
    "SetFileAttributesA" (ByVal lpFileName As String, _
    ByVal dwFileAttributes As Long) As Long
 
 
Private Const ERROR_SUCCESS As Long = 0
Private Const BINDF_GETNEWESTVERSION As Long = &H10
Private Const INTERNET_FLAG_RELOAD As Long = &H80000000
Private Const FILE_ATTRIBUTE_TEMPORARY = &H100
 
 
Private Function DownloadFile(sSourceUrl As String, _
                              sLocalFile As String) As Boolean
 
  'Download the file. BINDF_GETNEWESTVERSION forces
  'the API to download from the specified source.
  'Passing 0& as dwReserved causes the locally-cached
  'copy to be downloaded, if available. If the API
  'returns ERROR_SUCCESS (0), DownloadFile returns True.
   DownloadFile = URLDownloadToFile(0&, _
                                    sSourceUrl, _
                                    sLocalFile, _
                                    BINDF_GETNEWESTVERSION, _
                                    0&) = ERROR_SUCCESS
 
End Function
 
Function LoadPictureUrl(sSourceUrl As String) As IPictureDisp
   Dim sLocalFile As String
 
   On Error GoTo err_h
 
   'Create a buffer
   sLocalFile = String(260, 0)
   'Get a temporary filename
   GetTempFileName "C:\", "KPD", 0, sLocalFile
   'Remove all the unnecessary chr$(0)'s
   sLocalFile = Left$(sLocalFile, InStr(1, sLocalFile, Chr$(0)) - 1)
   'Set the file attributes
   SetFileAttributes sLocalFile, FILE_ATTRIBUTE_TEMPORARY
 
  'Attempt to delete any cached version of the file.
   DeleteUrlCacheEntry sSourceUrl
 
   If DownloadFile(sSourceUrl, sLocalFile) = True Then
 
      'hfile = FreeFile
      'Open sLocalFile For Input As #hfile
      'Text1.Text = Input$(LOF(hfile), hfile)
      'Close #hfile
      Set LoadPictureUrl = LoadPicture(sLocalFile)
      Kill sLocalFile
   Else
      'Create a bogus error
      Err.Raise 999
   End If
 
   Exit Function
err_h:
   Set LoadPictureUrl = LoadPicture("")
End Function

Um exemplo de código bem simples que faz o trabalho seria:

Private Sub UserForm_Initialize()
    Me.Image1.Picture = LoadPictureUrl("http://www.tomasvasquez.com.br/images/Logo_Tomas.gif")
End Sub

Um viva a comunidade de VBA!

Referências

http://www.mrexcel.com/forum/showthread.php?t=116387

Office – Removendo quebras de linha no Excel

Mais uma que valeu de tão ridículo.

A necessidade

Limpar os dados de uma planilha em Excel que tinha em várias colunas, texto com quebras de linha. Em resumo, era necessário tirar tais quebras de linha para fazer a análise dos dados. Das soluções que procurei e testei, desde de jogar os dados em outros programas, plugins pagos e outras coisas, a que mais resolveu foi essa:

  1. Selecione toda a área da planilha que contém as células com os dados a serem limpos e Copie (Ctrl+C)
  2. Cole em um documento do Word vazio (Ctrl+V) (os dados devem ir em formato de tabela)
  3. Ative a tela de Localizar/Substituir (Ctrl+U), clique em Mais de logo depois em Especial. Na lista que aparecer, selecione o item “Quebra manual de linha”. Na caixa de localizar deve aparecer o caractere “^l”
  4. Deixe a caixa Substituir por em branco
  5. Clique em Substituir tudo
  6. Com isso, as quebras de linha devem ter sido removidas de dentro das células
  7. Selecione a tabela do Word, Copie e Cole novamente no Excel

Acreditem ou não, foi a solução que mais deu resultado.

Bom proveito!

Referências

http://www.proz.com/forum/general_technical_issues/45225-is_there_a_way_to_remove_all_manual_line_breaks_in_an_excel_file.html

Firefox – Plugin para redicionar URLs (Redirector)

Outra necessidade que só o dia a dia explica. Em resumo, precisávamos que, ao apontar para um determinado domínio da internet, fosse feito um redirecionamento automático para outro.

A alternativa que vem a mente é a manutenção do arquivo hosts, no caso do Windows (mas acredito que haja algo equivalente no Linux), mas ele, além de não ser muito indicado para isso, não resolve todos os problemas de proxy reverso e não se dá muito bem com endereços de destino, preferindo endereços IP.

Mexer com DNS seria muito trabalhoso. A alternativa que resolveu? Um plugin para o navegador Firefox chamado Redirector.

O help é bem completo quanto ao uso e configuração. Depois de instalado, ele cria no canto inferior direito navegador um ícone que evidencia seu funcionamento:

Redirector em funcionamento
Redirector em funcionamento no Firefox

Um clique com o botão direito sobre o “R” ativa a tela de configurações. A partir daí, é só criar seus redirecionamentos, que conta com níveis de customizações desde simples WildCards até o uso de Regular Expressions! Um exemplo bem simples seria o seguinte:

Exemplo de uso do Redirector
Exemplo de uso do Redirector

Não dá para ser mais claro. Toda vez que alguma requisição for feito ao domínio http://www.meudominio.com.br, ela será automaticamente redirecionada para o http://teste.meudominio.com.br. Os caracteres adicionais foram necessários para que todo o restante da url seja passado corretamente, como querystrings e subpastas.

Página do plugin

https://addons.mozilla.org/pt-BR/firefox/addon/5064/

Talvez isso seja pouco comum no dia a dia, mas em cenários de testes, pode ajudar um bocado.

Pesquisa – A aceitação do Ensino a Distância no Brasil

Caros leitores deste blog.

Atualmente trabalho no desenvolvimento do Trabalho de Conclusão de Curso da Pós Graduação que estou cursando. O título do trabalho é:

Educação a Distância: os impactos na formação dos profissionais

Quem acompanha o blog, sabe que o assunto é discorrido por aqui. Em uma das fases deste trabalho, é preciso fazer um levantamento, baseado em um pesquisa de campo. O que é isso? Simples, é preciso levantar dados com base em um questionário que é montado alinhado ao objetivo do trabalho.

Resumindo, faço uso deste espaço para convidar a todos a me ajudar neste levantamento, respondendo a um questionário que disponibilizei neste site com a ferramenta LimeSurvey (falarei mais dela neste blog em breve).

Antes que se assustem, o questionário é simples e rápido de responder. Leva em média 5 minutos, já que 90% das questões são de múltipla escolha. Há no máximo 2 dissertativas, que também são bem diretas. Como algumas questões dependem do perfil de quem está respondendo, foi preciso separar o questionário. O perfil dos respondentes são:

Discentes

Essencialmente alunos. Se você faz parte de algum curso atualmente ou já fez, este é o seu questionário

Link: http://www.tomasvasquez.com.br/limesurvey/index.php?sid=45254&lang=pt-BR

Docentes

Professores, tutores, orientadores.

Link: http://www.tomasvasquez.com.br/limesurvey/index.php?sid=56435&lang=pt-BR

Empresas

Empresários, pessoas que trabalham em Recursos Humanos, ou tomadores de decisão no momento da contratação.

Link: http://www.tomasvasquez.com.br/limesurvey/index.php?sid=24681&lang=pt-BR

O resultado desta pesquisa será tabulado e publicado até janeiro de 2011, que é quando entregarei o trabalho, que por fim também publicarei por aqui.

Agradeço antecipadamente a todos os que puderem colaborar direta ou indiretamente com este trabalho. Se tiverem dúvidas a respeito, comentem para possa esclarecê-las por aqui, por email ou por onde quer que seja.

Avisos

A ferramenta utilizada para o levantamente está em testes. Portanto, pode acontecer de haver algum problema durante a resposta ao questionário. Se isso acontecer, peço por favor que abondone a sessão atual e reinicie o questionário.

Abraços
Tomás