quinta-feira, outubro 07, 2010

VBA: MousePointer = vbHourglass - não usar!!!

Esse comando transforma o ponteiro em ampulheta...:
MousePointer = vbHourglass

...Mas não o use. Ele provoca crashes aleatórios no Excel, de forma que vc nem saberá dizer onde está o problema no código!

quarta-feira, outubro 06, 2010

VBA Excel: sobre deslocamento na planilha

Evitar percorrer as células de uma planilha em loop de leitura (por meio do .Activate e .Select), estando ao mesmo tempo dentro de um outro loop de leitura com .Activate e .Select em outra planilha.
Ao tentar passar os dados de uma planilha a outra, às vezes os dados "vazam" e vão cair em outra planilha totalmente não-relacionada.
Parece ser um bug mesmo, com ocorrência aleatória, e nem sempre reprodutível.
Sugestão: usar %hashes, se possível.

sexta-feira, março 26, 2010

Excluir item de hash..

O Help do VBA nao ajuda nisso...
Estou tentando:

hash_1.Remove (item)

Será que funfa?

terça-feira, fevereiro 23, 2010

Hash em VBA

Quanto mais eu conheço VBA.. mais eu dou valor ao Perl!!
Olha que complicação pra criar um Hash:

Sub aaa()
    Set d = CreateObject("Scripting.dictionary")
    d.Add "A", "B"
    d.Add "C", "D"
    a = d.items
    b = d.keys
    For i = 0 To d.Count - 1
         MsgBox a(i) & ", " & b(i)
    Next i
End Sub

Em Perl, bastaria %aaa = ( )....

sexta-feira, fevereiro 19, 2010

Errormsg: Erro de Compilação: É impossível localizar o projeto ou biblioteca


Erro ocorre ao tentar abrir um arquivo com macros em outro computador, possivelmente com alguns controles adicionais de Excel desativados. Solução possível (ainda testando): na máquina onde deu erro, entrar no VBE e selecionar para cada projeto (form): Ferramentas -> Referências. Ele deve mostrar o que saiu errado. Essa foi a janela que resultou:


Teoricamente a solução seria simplesmente recompilar o projeto desmarcando esses controles, (já que seria inviável pedir a todos os usuários que instalem os controles ausentes -- a não ser que haja uma forma automática de fazê-lo?).
[UPDATE]
Possível forma automática: Iniciar->Executar->CMD
Copiar DLL  para \windows\system32
reg32srv Nome_da_DLL
Por exemplo, a solução seria adicionar o Mscomct2.ocx em todas as máquinas usando um pacote contendo um .BAT que faria a cópia da DLL e posterior registro.
[/UPDATE]
É mais viável dar um "jeitinho" e alterar o projeto do que alterar o Excel de cada usuário final...

Evento Change() em um ComboBox

Se algum evento altera o conteúdo de um ComboBox, convém logo no início do evento limpar todo o conteúdo que existia anteriormente nesse ComboBox. Ex.:

           Dim x As Integer
           For x = 1 To cboBox1.ListCount
               cboBox1.RemoveItem 0
           Next x

A partir disso, tudo pronto para trabalhar com .AddItem() ou .List().

quinta-feira, fevereiro 18, 2010

Recuperar células adjacentes a um Find()

No help do Excel, o Find() deveria retornar um range. O que ele retorna, na verdade, é o .Value da célula localizada. Mas se for necessário navegar nas células adjacentes deve-se considerar como range mesmo.

Veja exemplo:

Set Mat = Worksheets("Banco_Sistema").Range("E:E").Find(txtMat.Text)
If Mat Is Nothing Then
    Dim Resposta As Integer
    Resposta = MsgBox("Servidor não encontrado!! Deseja adicioná-lo manualmente?", vbYesNo)
    Select Case Resposta
    Case vbYes
        txtNome.Visible = True
        labNomeServidor.Visible = False
    Case vbNo
        txtMat.Text = ""
        labNomeServidor.Caption = "Nome do Servidor"
        txtNome.Text = ""
        txtNome.Visible = False
        labNomeServidor.Visible = True
    End Select
Else
    enderecoMat = Mat.Address(False, False)  'Referencia relativa
    Dim Resposta2 As Integer
    Resposta2 = MsgBox("Por favor, confirme os dados do servidor selecionado:" & vbNewLine & vbNewLine & "Matrícula: " & txtMat.Text & vbNewLine & "Nome: " & Mat.Offset(0, 1), vbYesNo)
    Select Case Resposta2
    Case vbYes
        labNomeServidor.Caption = Mat.Offset(0, 1)
    Case vbNo
        labNomeServidor.Caption = "Nome do Servidor"
        txtNome.Text = ""
        Mat = ""
    End Select

End If
Procuramos o texto colocado no txtBox, e retornamos o Value da primeira célula à direita.