✔ Programação GLOBAL® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog devem ser tratados como consultoria freelance. Queiram contatar-nos: brazilsalesforceeffectiveness@gmail.com | ESTE BLOG NÃO SE RESPONSABILIZA POR QUAISQUER DANOS PROVENIENTES DO USO DOS CÓDIGOS AQUI POSTADOS EM APLICAÇÕES PESSOAIS OU DE TERCEIROS.
VBA - Retornando a versão corrente de qualquer aplicação Office.
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
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
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
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
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com
VBA Access - Função para transpor a tabela.
À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
? Transposer("Suppliers","SuppliersTrans")
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.
VBA Access - Alterando conexão para versão 2007
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"
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)
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
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!
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 **************** |
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).
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.
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á.
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 SubEsta 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.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
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
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