Views

...

Important:

Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog podem ser tratados como consultoria freelance.

E-mails

Deixe seu e-mail para receber atualizações...

eBook Promo

VBA - Retornando a versão corrente de qualquer aplicação Office.

Recurso rápido, simples e oportuno em épocas de troca de versão. Pode ser usado inclusive dentro do código para adaptar chamadas, abrir bases de dados, etc...

Tags: Bernardes, MS, Microsoft VBA, Scripting Languages, Microsoft Office, Office, Software/Web Development, Web Development, Office Suites, Software

Muitos de nós desenvolvedores desenvolvemos em ambientes onde estão diversas versões do MS Office. Em tal ambiente saber identificar qual versão rodará nossa aplicação é imprescindível. Não necessariamente teremos a mesma solução (código) em versões distintas.

Felizmente temos como, através do próprio VBA, identificar qual a versão de software que está sendo executada. A SUB abaixo retorna o número da versão num message box:

Sub LetVersion()
  MsgBox "O número da versão corrente é: " & Application.Version, _

    vbOKOnly, "Version"
End Sub

Você pode adequar a SUB para retornar o número da versão:

Function LetVersion() As Long
  Let LetVersion = Application.Version
End Function


André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

Twitter: @officespecialis
            @brzexceldevelop
            @brzaccessdevel

VBA Excel - Referenciando planilha 10 - Propriedade name do código da planilha.

10: Referenciando através da propriedade NAME do código da planilhas


O nome do código que se refere a um objeto de planilha, na guia da planilha corre o risco de gerar um erro. 

Sempre precisa se lembrar de atualizar o código quando mudar o nome da pasta na planilha. 

Atente para o fato de que este não seja o único problema desse método, uma vez que os usuários são capazes de mudar o nome de uma pasta na planilha a qualquer momento. Uma maneira é proteger com código que se altere a pastas com outro nome específico. 

Esse nome é atribuido automaticamente pelo MS Excel - Folha1, Folha2 e assim por diante. Mudar o nome da pasta, conforme apresentado na guia da planilha, não alterará o seu nome de código, como poderá perceber na figura D. Os nomes entre parênteses são os nomes das pastas (como mostrado nas guias da planilha). Perceba que os nomes default, os nomes de código, permanecem os mesmos, mesmo se o nome da pasta.

Figure D

O nome de código é estável.

To change a sheet's code name, use the (Name) property, as shown in Figure E. You must use the Visual Basic Editor (VBE), as you can't change this property programmatically. There are two similar properties, so don't confuse them. The Name property (without parentheses) toward the bottom of the properties list represents the name Excel displays on the sheet tab. (Code name values must start with a letter character.)

Para mudar o nome de código, use a propriedade (Name), como mostrado na figura E. Você deve usar o Editor do Visual Basic (VBE). 


Existem duas propriedades semelhantes, por isso cuide em não confundi-las.

Figure E

Mude o nome de código utilizando o  VBE.

Veja também:
Tudo em VBA
VBA Excel
VBA Access

André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

VBA Excel - Referenciando planilha 09 de 10 - Pelo índice

9: Referenciando pelo índice

Os valores dos índices vêm a calhar quando você não se importa com planilhas específicas, mas apenas com o seu número ou ordem. Certamente, isso não será uma tarefa comum, mas ocasionalmente, utilizar referência aos valores de índice pode ser providencial. O procedimento a seguir adiciona e deleta as planilhas com base no número de Sheets que deseja:

Function ControlSheetNumber(intSheets As Integer)

  
  'Add or delete sheets to equal intSheets.

  Application.DisplayAlerts = False

  'Delete sheets if necessary

  While Worksheets.Count > intSheets

    Worksheets(1).Delete

  Wend

  'Add sheets if necessary

  While Worksheets.Count < intSheets

    Worksheets.Add

  Wend

  Application.DisplayAlerts = True

End Function

Tenha cuidado ao executar esta função, pois deleta a primeira planilha objeto da sua coleção, mesmo que a planilha tenha conteúdo. Simplesmente adiciona e deleta planilhas, dependendo do valor que passemos. Esta função é útil quando criar novas planilhas (workbooks)  programaticamente.


Veja também:
Tudo em VBA
VBA Excel
VBA Access

André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com


VBA Excel - Referenciando planilha 08 de 10 - Explicita à planilha

8: Explícita à planilha

Use a propriedade Worksheets para explicitar a referência a uma planilha. Por examplo, use o código abaixo para efetuar uma referência para deletar uma planilha expedífica:

Function DeleteSheet(shtname As String)

  'Delete shtname.

  Application.DisplayAlerts = False

  Worksheets(shtname).Delete

  Application.DisplayAlerts = True

End Function


Veja também:
Tudo em VBA
VBA Excel
VBA Access

André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

VBA Excel - Referenciando planilha 07 de 10 - Referenciando o objeto Worksheet

7: Referenciando o objeto Worksheet

A coleção (collection) Worksheets contém todos os objetos planilhas (sheet) do workbook.

Utilizando um simples loop  For Each, podemos circular através da coleção (collection).

Por exemplo, o código a seguir popula um list box com os nomes de todas as planilhas (Sheets) ativas em um workbook:

Private Sub UserForm_Activate()
  'Popular o list box com os nomes das sheets
  'ativas no workbook.

  Dim ws As Worksheet

  For Each ws In Worksheets
    ws.Select

    ListBox1.AddItem ws.Name
  Next ws
End Sub

As coleções (collections) Sheets e Worksheets  possuem inicialmente objetos Worksheet, mas as coleções (collections) Sheets contém worksheets e chart sheets (planlhas gráficos).

Veja também:
Tudo em VBA
VBA Excel
VBA Access

André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

VBA - Torne maiúsculas as primeiras letras de todas as palavras (Capitalize)

Eu sei que já temos uma função específica, mas o exercício do desenvolvimento é arrebatador. Na versão do Access 97, por exemplo, pode-se utilizar:     StrConv("andré bernardes", vbProperCase)

Agora, se quiser aprenser a fazer e utilizar em qualquer aplicação do Office...

Function Captalize(X)
       ' Torna maiúscula a primeira letra de uma palavra em um campo.
       ' Use-a num evento, procedure ou após a atualização de um objeto;
       ' Por exemplo, [Last Name] = Captalize([Last Name]).
       ' Nomes como O'Brien e Wilson-Smythe serão propriamente "capitalizados",
       ' mas MacDonald será mudado para Macdonald, e van Buren para Van Buren.
       ' Note: Para que esta função funcione corretamente, você precisa especificar:
       ' Option Compare Database na declaração da sessão do módulo.

       Dim Temp$, C$, OldC$, i As Integer

       If IsNull(X) Then
              Exit Function
       Else
              Let Temp$ = CStr(LCase(X))

              '  Inicialize OldC$ com um espaço simples porque a primeira
              '  letra precisa ser aumentada, mas não as precedidas por letra.

              Let OldC$ = " "

              For i = 1 To Len(Temp$)
                     Let C$ = Mid$(Temp$, i, 1)

                     If C$ >= "a" And C$ <= "z" And (OldC$ < "a" Or OldC$ > "z") Then
                            Mid$(Temp$, i, 1) = UCase$(C$)
                     End If

                     Let OldC$ = C$
              Next i

              Let Proper = Temp$
       End If
End Function



André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com


VBA Access/Excel - LINK do Excel no Access - Solucionando problemas de #Num!

Solucionar problemas de #Num! e outros valores incorretos em uma tabela vinculada

Mesmo que visualize a mensagem Vinculação da tabela concluída, você deve abrir a tabela no modo Folha de Dados para certificar-se de que as linhas e colunas mostrem os dados corretos.

Se visualizar erros ou dados incorretos em qualquer local na tabela, execute a ação conforme descrito na tabela a seguir e, em seguida, tente vincular novamente. Lembre-se de que não é possível adicionar valores diretamente à tabela vinculada, porque a tabela é somente leitura.


Problema e Soluções
Elementos gráficos Os elementos gráficos em uma planilha do Excel, como logotipos, gráficos e imagens não podem ser vinculados no Access.
Formato de exibição Pode ser necessário definir a propriedade Formato de determinados campos no modo Design para garantir que os valores sejam exibidos corretamente no modo Folha de Dados.
Valores calculados Os resultados de uma coluna ou de células calculadas são exibidos no campo correspondente, mas não é possível visualizar a fórmula (ou expressão) no Access.
Valores de texto truncados Aumente a largura da coluna no modo Folha de Dados. Se ainda assim, não for possível visualizar o valor inteiro, isso significa que o valor tem mais de 255 caracteres. O Access pode vincular apenas aos primeiros 255 caracteres, portanto, é necessário importar os dados, em vez de vinculá-los.
Mensagem de erro de estouro de campo numérico A tabela vinculada pode parecer estar correta, mas posteriormente, ao executar uma consulta em relação à tabela, você poderá visualizar uma mensagem de erro Estouro de Campo Numérico. Isso pode acontecer em razão de um conflito entre o tipo de dados de um campo na tabela vinculada e o tipo de dados armazenado nesse campo.
VERDADEIRO ou FALSO e valores -1 ou 0 Se a planilha ou o intervalo de origem incluir uma coluna que contenha apenas valores VERDADEIRO ou FALSO, o Access cria um campo Sim/Não para a coluna na tabela vinculada. No entanto, se a planilha ou o intervalo de origem incluir uma coluna que contenha apenas valores -1 ou 0, o Access, por padrão, criará um campo numérico para a coluna, e não será possível alterar o tipo de dados do campo correspondente na tabela. Se quiser um campo Sim/Não na tabela vinculada, certifique-se de que a coluna de origem inclua valores VERDADEIRO e FALSO.
Campos com múltiplos valores O Access não oferece suporte para múltiplos valores em um campo, mesmo que a coluna de origem contenha uma lista de valores separados por ponto-e-vírgula (;). A lista de valores será tratada como um único valor, e será colocada em um campo de texto.
#Num! O Access exibe o valor de erro #Num!, em vez dos dados reais em um campo, nas seguintes situações: 

:: Se uma coluna de origem contiver alguns valores de data ou numéricos em uma coluna que contenha, principalmente, valores de texto, os valores de data e numéricos não serão importados.

:: Se uma coluna de origem contiver alguns valores de texto em uma coluna que contém, principalmente, valores numéricos, os valores de texto não serão importados.

:: Se uma coluna de origem contiver alguns valores de texto em uma coluna que contém, principalmente, valores de data, os valores de texto não serão importados.
Siga os procedimentos abaixo para minimizar as ocorrências de valores nulos na tabela:


:-: Certifique-se de que a coluna de origem não contenha valores de tipos de dados diferentes. :-: Formate as colunas no arquivo do Excel.:-: Durante a operação de vinculação, selecione o tipo de dados correto para cada campo. Se o tipo de dados for incorreto, a coluna resultante poderá conter apenas valores #Num! para todas as linhas de dados.

:-: Valores numéricos, em vez de valores de data Caso visualize um número de cinco dígitos aparentemente aleatório em um campo, verifique se a coluna de origem contém, principalmente, valores numéricos, mas também, alguns valores de data. Os valores de data que aparecem em colunas numéricas são convertidos incorretamente em um número. Substitua os valores de data por valores numéricos, e tente vincular novamente.

:-: Valores de data, em vez de valores numéricos Caso visualize um valor de data aparentemente aleatório em um campo, verifique se a coluna de origem contém, principalmente, valores de data, mas também, alguns valores numéricos. Os valores numéricos que aparecem em colunas de data são convertidos incorretamente em uma data. Substitua os valores numéricos por valores de data, e tente vincular novamente.

 
André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

VBA Excel - Referenciando planilha 06 de 10 - Referenciando uma planilha ativa (active sheet)

6: Referenciando uma planilha ativa (active sheet)

Se você não especificar um objeto, a propriedade ActiveSheet retorna por default a planilha ativa no workbook.

(É bom lembrar-se que dentro de um workbook existem diversas planilhas, nas suas respectivas pastas, aqui chamadas de Planilhas [Sheets])

Para instanciá-la, recupere o nome da planilha ativa, poderá usar algo similar ao demonstrado abaixo:

Function GetActiveSheet() As String
  Let GetActiveSheet = ActiveSheet.Name
End Function

Lembre-se esta propriedade é read-only, você não poderá usá-la para ativar uma planilha (sheet).


André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com


VBA Excel - Referenciando planilha 04 de 10 - Referência explícita a um workbook

4: Referência explícita a um workbook

Caso saiba o nome do workbook ao qual deseja fazer referência, uma referência explíta pode ser o melhor método. Para tanto lembre-se que precisará de um situação estável. Não poderá utilizar esta solução numa planilha onde o workbook muda de nome a todo momento. Mas, também poderá passar o nome do workbook como referência através de um função.

Function ActivateWB(wbname As String)
  'Abre a variável wbname.

  Workbooks(wbname).Activate
End Function

A execução é simples, passe o nome do workbook que deseja ativar como argumento da função:

ActivateWB("Alefe&BeteProcessamentodeDados.xls")

(Lembre-se que é necessário incluir a extensão .xls ou .xlsx.)

Abaixo disponibilizo uma função que também usa a propriedade do Workbooks para determinar qual workbook específico está aberto no momento:

Function IsWBOpen(wbname As String) As Boolean
  ' Abre o workbook.

  Dim wb As Workbook

  On Error Resume Next

  Set wb = Workbooks(wbname)

  IsWBOpen = Not wb Is Nothing
End Function

Se wbname estiver aberta, a função retorna True. Quando não estiver aberta, a função retorna False.


André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

VBA Excel - Referenciando planilha 05 de 10 - Referenciando um workbook pelo índice

5: Referenciando um workbooks pelo índice

Talvez nos seja imposta a condição de que o único modo para fazermos referência a um workbook seja através do valor do índice.

O MS Excel acessa o valor do índice quando o mesmo é aberto nele. o primeiro workbook aberto recebe o valor 1 de índice, o segundo workbook aberto receberá o valor 2 de índice, e assim sucessivamente.

É claro que não é tão simples, este método tem um pequeno problema que o acompanha, pois quando deletamos um workbook ou o fechamos o valor do índice de toda a coleção Workbook muda.

Por exemplo, digamos que temos 3 worbooks abertos com os seguintes índices de valor:

StatisticalDashboardFunctions.xls - 3

090809.xls - 2

A&AHumanResources.xls - 1

Se uma tarefa em particular depende que todos os três workbooks estejam abertos utilizando-se dos valores dos índices destes, poderão ocorrer alguns desencontros quando os 'instanciarmos' como segue:

  Workbooks(1).Activate

Isto ativará A&AHumanResources.xls como aberto, se você fechar A&AHumanResources.xls, StatisticalDashboardFunctions.xls e 090809.xls se moverão para baixo no índice: StatisticalDashboardFunctions.xls virá a ter o índice como 2, ao passo que 090809.xls terá o índice como 1.

Usar o valor do índice como referência para os workbooks não é necessariamente errado, mas precisa entender o que está envolvido nesta escolha, sobre os possíveis erros que poderão ocorrer e como os corrigirá.

André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

VBA Excel - Referenciando planilha 03 de 10 - Referenciando workbooks na coleção (collection) Workbooks

3: Referenciando workbooks na coleção (collection) Workbooks

As coleções Workbooks contém todos os objetos Workbook abertos. Usando a propriedade Workbooks, você pode referenciar-se a quaisquer workbooks abertos. Para instanciá-lo, a seguinte SUB populará um listbox num formulário do usuário com os nomes de todos os workbooks abertos:

Private Sub UserForm_Activate()
  'Popula o listbox com os nomes dos workbooks abertos.

  Dim wb As Workbook

  For Each wb In Workbooks
    ListBox1.AddItem wb.Name
  Next wb
End Sub

O FORM resultante é mostrado na Figura C, lista todos os workbooks abertos. Ao utilizar a referência a coleção Workbooks, você pode referenciar todos os workbooks abertos sem "hard-coding", simplesmente o nome do workbook.

Figura C

Listing all the open workbooks is an easy enough task, thanks to the Workbooks collection. However, opening all of the workbooks in a specified folder is a bit harder, as you can see in the following subprocedure:

Sub OpenAllWB()
  'Abre todos os workbooks numa pasta específica.

  Dim i As Integer

  With Application.FileSearch

    Let .LookIn = "C:\A&A"
   
Let .FileType = msoFileTypeExcelWorkbooks
      ' Se houver workbooks.

      If .Execute > 0 Then
        For i = 1 To .FoundFiles.Count
          Workbooks.Open (.FoundFiles(i))
        Next i

      ' Caso não hajam workbooks      Else
        MsgBox "Não existem workbooks para acessar.", vbOKOnly
      End If
  End With
End Sub

Esta tarefa mostra o que pode ser feito com a coleção Workbooks. Neste caso o código não circula através da coleção Workbooks; tenta tirar vantagem de um dos métodos da coleção (colection) — especificamente, o método Open (abrir).

Fechar todos os workbooks abertos é tão fácil como o foi abrí-lo, aplique a SUB abaixo:

Sub CloseAllWB()
  'Fecha todos workbooks abertos.
  Workbooks.Close
End Sub

Para visualizar mais métodos e propriedades de collection, pressione F2 no VBE e navegue no Object Browser.


André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com


VBA Excel - Referenciando planilha 02 de 10 - Referencie o workbook que estiver rodando código (currently)

2: Referencie o workbook que estiver rodando código (currently)

A propriedade em VBA para ThisWorkbook é similar a propriedade ActiveWorkbook, mas...

ActiveWorkbook avaliará o workbook com foco, ThisWorkbook se referirá ao workbook que estiver rodando no momento. Faça força para distinguir estes dois momentos distintos.

Este aparente pormenor acrescenta grande flexibilidade uma vez que o workbook ativo nem sempre é o workbook que está rodando o código.

A Figura B mostra o resultado da execução do procedimento abaixo:

Function GetThisWB() As String
  GetThisWB = ThisWorkbook.Path & "\" & ThisWorkbook.Name
End Function

Figura B



André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

VBA Excel - Referenciando planilha 01 de 10 - Referenciando o workbook ativo

10 caminhos para referenciar os workbooks do MS Excel e as worksheets usando o VBA.

1: Referenciando o workbook ativo

A propriedade do VBA ActiveWorkbook faz referência para o workbook que tem o focu. O workbook ativo talvez não contenha código que o referencie.

Por exemplo, após atualizar a informação no workbook ativo, provavelmente desejará salvá-lo, esta é uma tarefa simples para a propriedade do ActiveWorkbook. A SUB a seguir utilizará a propriedade ActiveWorkbook  para fechar o workbook ativo:

Sub CloseActiveWBSemSalvar()
  ' Fecha o workbook ativo sem salvar.

  ActiveWorkbook.Close False
End Sub

Sub CloseActiveWBSalvando()
  'Fecha o workbook ativo e o salva.

  ActiveWorkbook.Close True
End Sub

Sub CloseActiveWBEscolheSeSalva()
  'Fecha o workbook ativo escolhendo se deseja salvar.
  'Deixa o usuário decidir se deseja salvar ou não.


  ActiveWorkbook.Close
End Sub

É claro, não quero ofender a inteligência de ninguém, o exemplo foi apenas elucidativo. Pode-se facilmente combinar estes três estado em uma única função passando o modo como a ação será executada através de parâmetros.

Abaixo segue um exemplo onde o nome, o caminho serão atribuidos.

Function GetActiveWBPathName() As String

  Let GetActiveWBPathName = ActiveWorkbook.Path & "\" & ActiveWorkbook.Name
End Function

André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com


eBooks VBA na AMAZOM.com.br

LinkWithinBrazilVBAExcelSpecialist

Related Posts Plugin for WordPress, Blogger...

Vitrine