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 Access - Função para transpor a tabela.

Access 2002

Às vezes, talvez seja necessário transpor os dados em uma tabela ou consulta de modo que os nomes dos campos sejam listados verticalmente na coluna à esquerda e que os dados sejam distribuídos pela página horizontalmente. Por exemplo, talvez seja necessário transpor os dados de um relatório ou antes exportá-los para um arquivo de texto.

O Método a seguir mostra como é possível usar um procedimento VBA (Visual Basic for Applications) para cumprir a tarefa.

OBSERVAÇÃO: Esse método não funcionará se você tiver mais de 255 registros, pois o número máximo de campos em uma tabela do Microsoft Access é 255.

Crie um novo módulo no banco de dados e digite ou cole o seguinte procedimento:
Function Transposer(strSource As String, strTarget As String)

   Dim db As DAO.Database
   Dim tdfNewDef As DAO.TableDef
   Dim fldNewField As DAO.Field
   Dim rstSource As DAO.Recordset, rstTarget As DAO.Recordset
   Dim i As Integer, j As Integer

   On Error GoTo Transposer_Err

   Set db = CurrentDb()
   Set rstSource = db.OpenRecordset(strSource)
   rstSource.MoveLast

   ' Create a new table to hold the transposed data.
   ' Create a field for each record in the original table.
   Set tdfNewDef = db.CreateTableDef(strTarget)
   For i = 0 To rstSource.RecordCount
      Set fldNewField = tdfNewDef.CreateField(CStr(i + 1), dbText)
      tdfNewDef.Fields.Append fldNewField
   Next i
   db.TableDefs.Append tdfNewDef


   ' Open the new table and fill the first field with
   ' field names from the original table.
   Set rstTarget = db.OpenRecordset(strTarget)
   For i = 0 To rstSource.Fields.Count - 1
      With rstTarget
        .AddNew
        .Fields(0) = rstSource.Fields(i).Name
        .Update
      End With
   Next i

   rstSource.MoveFirst
   rstTarget.MoveFirst
   ' Fill each column of the new table
   ' with a record from the original table.
   For j = 0 To rstSource.Fields.Count - 1
      ' Begin with the second field, because the first field
      ' already contains the field names.
      For i = 1 To rstTarget.Fields.Count - 1
         With rstTarget
            .Edit
            .Fields(i) = rstSource.Fields(j)
            rstSource.MoveNext
            .Update
         End With

      Next i
      rstSource.MoveFirst
      rstTarget.MoveNext
   Next j

   db.Close

   Exit Function

Transposer_Err:

   Select Case Err
      Case 3010
         MsgBox "The table " & strTarget & " already exists."
      Case 3078
         MsgBox "The table " & strSource & " doesn't exist."
      Case Else
         MsgBox CStr(Err) & " " & Err.Description
   End Select

   Exit Function

End Function


Para testar a função, pressione CTRL+G. Na janela Imediato, digite a seguinte linha e pressione ENTER:

? Transposer("Suppliers","SuppliersTrans")

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

+55 (13) 9152-2565

Twitter: @officespecialis
              @brzexceldevelop
              @brzaccessdevel


Esta mensagem pode conter informação confidencial e/ou privilegiada. Se você não for o destinatário ou a pessoa autorizada a receber esta mensagem, não pode usar, copiar ou divulgar as informações nela contidas ou tomar qualquer ação baseada nessas informações. Se você recebeu esta mensagem por engano, por favor avise imediatamente o remetente, respondendo o e-mail e em seguida apague-o. Agradecemos sua cooperação.
del.icio.us

VBA Access - Alterando conexão para versão 2007

Muitos já mudaram das anteriores versões do MS Access 97, 2000 e 2003 para a versão um pouco mais recente do Office 2007. Ao fazê-la, alguns ajustes nos códigos tornaram-se altamente necessários.

Abaixo descrevo um dos mais simples, mas muito importante para manter suas aplicações rodando, não ambram mão de efetuar essa substituição nos vossos códigos.

Divirtam-se:

Quando efetuar uma conexão como a demonstrada abaixo:
   cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=c:\AlefeBete.mdb"

Preocupe-se em alterar os conteúdos em negrito:
   cat.Create "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=c:\AlefeBete.accdb"


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

Access VBA - Strings: Capitalize first character of every word automatically

Strings: Capitalize first character of every word automatically

Author(s)
Dev Ashish

(Q) How can I capitalize the first character of each word in a field/string?

(A) Under Access 97, you can use the StrConv function.  For example,

    StrConv("dev ashish", vbProperCase)

For Access 2.0, use the Proper function provided by Microsoft.

'******************* Code Begin ****************
Function Proper(X)
' Capitalize first letter of every word in a field.
' Use in an event procedure in AfterUpdate of control;
' for example, [Last Name] = Proper([Last Name]).
' Names such as O'Brien and Wilson-Smythe are properly capitalized,
' but MacDonald is changed to Macdonald, and van Buren to Van Buren.
' Note: For this function to work correctly, you must specify
' Option Compare Database in the Declarations section of this module.

Dim Temp$, C$, OldC$, i As Integer
If IsNull(X) Then
Exit Function
Else
Temp$ = CStr(LCase(X))
' Initialize OldC$ to a single space because first
' letter needs to be capitalized but has no preceding letter.

OldC$ = " "
For i = 1 To Len(Temp$)
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
OldC$ = C$
Next i
Proper = Temp$
End If
End Function
'******************* Code End ****************


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


Para listar todos os workbooks abertos é uma tarefa fácil; agradeça isso a existência da Workbooks collection. Todavia abrir todos os workbooks numa pasta específica é uma tarefa dura, mas você poderá se beneficiar desta SUB:
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


Reference::
Tags: Application, Automation, Macro, Microsoft, MS, Office, VBA, Word, code

Inline image 1



diHITT - Notícias