About Me

A minha foto
JRod - PORTUGAL
Microsoft [MVP] - Excel (10º ano consecutivo)
Ver o meu perfil completo
Com tecnologia do Blogger.

Seguidores

Estatisticas

Free Blog Counter

eXTReMe Tracker
2008-08-14

image

SAVE THE DATE

2008-07-27

Introduzido em 1992, os Reddick VBA (RVBA) Naming Conventions, foram publicados num grande número livros e revistas. São utilizados por milhares de programadores em todo o mundo, para denominar objectos dentro de seu código de VBA.

Estes RVBA Naming Conventions têm sido suplementados agora pelas RVBA Coding Conventions. A finalidade dos Reddick VBA (RVBA) Naming Conventions é fornecer um guia para denominar objectos no Visual Basic for Applications (VBA). Ter convenções é valioso em todo o projecto de programação. Quando são utilizados, o nome do objecto informa sobre o significado do objecto. Estas convenções tentam fornecer uma maneira de estandardizar esse significado pelo corpo de programadores de VBA.

Os objectivos das convenções de Coding Reddick VBA (RVBA), são fazer com que o código:

· Seja mais legível: As convenções permitem que um leitor compreenda o significado do código com menos esforço.

· Tenha melhor manutenção: O código pode mais confiantemente ser mudado face aos erros e realçar a sua funcionalidade.

· Dê maior confiança: O código tem maior probabilidade de se executar como seria esperado.

· Seja mais eficiente: O código executa mais rapidamente ou consome menos recursos.

 

Para saber mais, aceder a:

 

Pode fazer o download aqui do "The Reddick VBA (RVBA) Naming Conventions, Version 6.01".

2008-07-26

Esta função, por defeito, apresenta uma mensagem numa caixa de diálogo, a qual tem um botão "OK". No entanto, esta função pode apresentar outros botões e/ou um icon na caixa de diálogo.

Exemplo:

image

O código, para este exemplo, será:

Sub Mensagem()
    msg = MsgBox("Pretende Continuar?", vbInformation + vbYesNoCancel)
End Sub

No entanto, para obtermos este resultado, poderemos utilizar os chamados valores dos botões de argumento, como no seguinte exemplo de código:

Sub Mensagem()
    msg = MsgBox("Pretende Continuar?", 64 + 3)
End Sub

Segue-se um quadro com o nome das principais Constantes, o seu Valor e a respectiva Descrição:

image

image

Tópicos relacionados:

2008-06-29

Se pretendermos que uma determinada célula contenha o nome da folha (nome esse que se encontra no tabulador dessa folha), como no exemplo:

image image

podemos utilizar o seguinte segmento de código, ligado à folha em causa:

Private Sub Worksheet_Activate()
    On Error Resume Next
    Range("C6").Value = ActiveSheet.Name
End Sub

Se pretendermos repetir um footer (rodapé) em diversas folhas, a partir de uma determinada folha, podemos efectuar da seguinte forma:

1º - Criamos o nosso footer, como habitualmente (Ver > Cabeçalho/Rodapé)

2º - Seleccionamos a folha que contém o footer (parent worksheet) e a seguir CTRL-Click no(s) tabulador(es) que queremos que venham a conter aquele footer (child(ren) worksheet), ou seja, marcamos um grupo.

3º - Na barra de ferramentas, escolhemos Ficheiro > Configurar Página

4º - Desmarcar o grupo e verificar se o footer já se encontra nas outras worksheets.

Tópicos relacionados:

2008-05-25

Há dias, foi-me perguntado qual o método para se poder imprimir, de uma só vez, Ranges provenientes de duas WorkSheets.

Uma das possibilidades, é utilizar uma mistura de Excel (definição das áeras de impressão nas duas WorkSheets) e de VBA, no sentido de, a partir daquela definição, imprimir de uma só vez, mas em duas folhas distintas, os Ranges pretendidos.

Exemplo:

Sheet1:

image 

Sheet2:

image

 

Para definir as respectivas áreas de impressão:

1 - "marcar" o Range pretendido

2 - File>PrintArea>Set Print Area

 image

3 - A definição das áreas de impressão deve ser efectuada para as duas Sheets.

 

E, agora, para a impressão dos Ranges definidos, o código VBA:

 

Sub ImprimeDeUmaVez()

    Sheets(Array("Sheet1", "Sheet2")).Select
    ActiveWindow.SelectedSheets.PrintOut

End Sub

 

Tópicos relacionados:

2008-05-01

Enquanto criamos objectos (barra de Ferramentas - Desenho), se mantivermos premida a tecla "SHIFT", estaremos a efectuar o que se chama "constrangimento".

Os efeitos são os seguintes:

  • Os botões "linha" e "seta", desenham linhas perfeitamente horizontais ou verticais, ou linhas diagonais com incrementos exactos de 15º (0º, 15º, 30º, etc...)
  • o botão "rectângulo", desenha quadrados perfeitos
  • o botão "oval", desenha círculos perfeitos

Exemplo:

Objectos

 

Tópicos relacionados:

2008-04-04

Recebido por mail (adaptado):

"A minha duvida é a seguinte:
Tenho umas macros num documento de excel para executarem algumas funções, entre as quais a de gravar uma imagem em formato MDI.
Acontece que o ficheiro principal está num servidor assim como as pastas onde gravo essas imagens.
Tenho atalhos em varios computadores da rede para esse ficheiro.
1ª - Qual a possibilidade de puder trabalhar no mesmo ficheiro ao mesmo tempo nos tres computadores?
2ª- Após a instalação de uma impressora nova que serve dois desses computadores as macros deixaram de funcionar convenientemente, pois só num
dos computadores é permitido executar a macro correctamente. No outro computador para quando chega à parte de gravar  a imagem .MDI.
As macros são as seguintes ou melhor parte delas.
________________________________________________
Sheets("M D").Select
    Range("A1").Select
      Application.Dialogs(xlDialogPrinterSetup).Show
        ActiveWindow.SelectedSheets.PrintOut Copies:=1
    Application.ActivePrinter = "Microsoft Office Document Image Writer em
Ne01:"
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, _
        ActivePrinter:="Microsoft Office Document Image Writer em Ne01:", _
        Collate:=True, _
        PrintToFile:=True, _
        PrToFileName:="\\Hdl\cir\Stocks\Coz\Mapas\Mapa de  " &
Format(Now, "dd-mmm-yy h-mm-ss") & ".mdi"
__________________________________________________

Sheets("Extemporanea").Select
  Application.Dialogs(xlDialogPrinterSetup).Show
  ActiveWindow.SelectedSheets.PrintOut Copies:=1
    Application.ActivePrinter = "Microsoft Office Document Image Writer em
Ne01:"
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, _
        ActivePrinter:="Microsoft Office Document Image Writer em Ne01:", _
        Collate:=True, _
        PrintToFile:=True, _
        PrToFileName:="\\Hdl\cir\Stocks\Coz\Extemporaneas\Extemporânea

 

Quando a macro chega a [[Application.ActivePrinter = "Microsoft Office Document Image Writer em Ne01:"]] pára, mas só num computador, se alterar para
[[Application.ActivePrinter = "Microsoft Office Document Image Writer em Ne00:"]], fica a funcionar nesse computador e dá erro no outro.
Serão as portas  da impressora?? Como faço para remediar a coisa??
Já tentei retirar  [[em Ne00 ou em Ne01]], mas tambem dá erro."

 

Comentário:

Como possível solução, inserir, no início das macros, o seguinte código:

Dim sStr As String

sStr = Application.ActivePrinter
Application.EnableEvents = False
On Error Resume Next
Application.ActivePrinter = "Microsoft Office Document Image Writer on Ne02:"
If Err.Number = 1004 Then
    Application.ActivePrinter = "Microsoft Office Document Image Writer on Ne01:"
    Err.Clear
End If

Tópicos relacionados:

2008-04-03

C. Moreira, enviou-me uma folha de cálculo, na qual pretendia o seguinte:

Alterar o mês em A1 e o valor em B1. Se o mês for Janeiro, Fevereiro ou Março, as células D1, D2 e D3 assumem o valor de B1, caso contrário ficam com os valores que apresentam.

Apresentou então o exemplo:

image

E forneceu a solução, ou seja, com a utilização da chamada "referência circular".

Vejamos, então, como foi feito:

Em D1, digitou: =IF(A1="Janeiro";B1;D1)

Em D2: =IF(A1="Fevereiro";B1;D2)

Em D3: =IF(A1="Março";B1;D3)

Depois, fez o seguinte:

image

Como se pode ver, sempre que em A1 se coloque o mês, o valor transfere-se para a coluna D, para a célula que corresponde ao mês digitado.

  Comentário:

O único problema da referência circular é que, se for aberto outro workbook antes deste, aparece, por defeito, o facto de não haver referência circular. Logo, quando se abre o 2º workbook (que tem a tal referência circular) vai aparecer sempre uma mensagem de aviso...

Claro que há uma maneira de resolver o problema e fazer com que a referência circular fique por defeito, mesmo que se abra outro qualquer workbook primeiro: é colocar a seguinte macro no próprio workbook:

Private Sub Workbook_Open()
Application.Iteration = True
End Sub



Deste modo, sempre que o workbook seja aberto, vai ler, à abertura, a macro acima e, assim, activa referência circular.





Tópicos relacionados:



2008-02-25

 Clicar no banner

 

O TechDays está a chegar!

 

11-14 de Março 2008 - Centro de Congressos de Lisboa

2008-02-24

Há dias, colocaram-me a seguinte questão (adaptada): "Como posso fazer com que, digitando uma sequência de 3 algarismos numa determinada célula da Folha1, por exemplo, em A1, apareça, na coluna B, o resultado da pesquisa na Folha2, em que as células da coluna B contêm determinados números, cujos primeiros 3 algarismos, a contar da esquerda, podem ou não conter os algarismos digitados, na mencionada célula A1 da Folha1. Especificidade: não existe, na tabela da folha2, nenhum número que termine em 0 [zero] (ex: 12500)".
 
Vejamos o exemplo:
 
Resultado que se pretende na Coluna B da Folha1, ao inserir em A1 os algarismos 125:
 
A pesquisa a ser efectuada, na Folha2, procurando pelos 3 algarismos digitados, devendo dar como resultado, todos os números que, na Coluna B, contenham os algarismos digitados na Folha1, na célula A1:
 

Assim, teremos que digitar, na célula B1 fa Folha 1, a seguinte fórmula: =VLOOKUP(A1;Sheet2!$A$1:$B$10;2)

 

Por sua vez, na célula B2, digitamos a seguinte fórmula:

=IF(B1="";"";IF(RIGHT(B1;1)=1;"";IF(VLOOKUP($A$1;Sheet2!$A$1:$B$10;2)=$B$1;$B$1-1)))

 

E, para terminar, digitamos na célula B3, copiando para tantas células dessa coluna (B4, B5, B6, etc...), quantas aquelas que sejam necessárias, para mostrar todas as ocorrências que contenham os 3 algarismos mencionados:
 

=IF(B2="";"";IF(VALUE(RIGHT(B2;1))=1;"";IF(VLOOKUP($A$1;Sheet2!$A$1:$B$10;2)=$B$1;$B$1-VALUE(RIGHT(B2;1)))))

 

Tópicos relacionados: