Let MyFile = Dir$("c:\temp\*.doc")
Let nType="*.doc"
KillProperly "c:\temp\" & MyFile
Let MyFile = Dir$("c:\temp\" & nType)
Loop
André Luiz Bernardes
bernardess @ gmail . com | InAnyPlace (Skype) | Blog Office VBA | Blog Excel | Blog Access
✔ VBA Excel Specialist® - 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. Contate-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.
Office Home and Business 2010
Office Professional 2010
Office Professional Plus 2010
Para os que fazem amplo uso de Dashboards & Scorecards, KPI, BSC e Reports, aguardarmos ansiosos a possibilidade de utilização dos SpikLiners (ou mini-graficos disponíbilizado hoje por software de terceiros).
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, nquery, PlanTargetFunction Qualquer
' 1ª FASE - Copia a planilha enviada como referência.
' ----------------------------------------------------------------------------------------
Set objExcel = CreateObject("Excel.Application")
Set objWorkBook = objExcel.Workbooks.Open(PlanBase)
' Salva planilha com o nome temporário.
objExcel.Workbooks(1).SaveAs (PlanTarget)
objExcel.Quit
' Cria Query tmp, base da planilha.
Set Cria_Query = CurrentDb.CreateQueryDef(nquery, strSQL)
Call Sleep(2000) ' Pausa para o sistema operacional não fundir...
Debug.Print Right(Now(), 8), nquery, strSQL, PlanTarget
' Insere planilha com dados.
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, nquery, PlanTarget
' Delete a query temp
DoCmd.DeleteObject acQuery, nquery
' Final - Limpa as variáveis.
' ----------------------------------------------------------------------------------------
Set Cria_Query_PXBR = Nothing
Set objWorkBook = Nothing
Set objExcel = Nothing
End Function
Call Sleep(4000) ' Pausa para o sistema operacional não fundir...Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Implemento soluções com os produtos já instalados na sua Empresa e Departamento.
Organizo os dados disponíveis, deixando seus novos relatórios com layouts funcionais.
Os desempenhos forma medidos em quatro parâmetros:
1. Tempo abrangido para a criação de tabela dinâmica;
2. Tempo abrangido para a criação de gráficos;
3. Tempo abrangido para preencher um intervalo com números;
4. Tempo abrangido para preencher um intervalo com fórmulas.
Todos os testes foram realizados em arquivos já salvos em pastas de trabalho, de modo que qualquer interferência do formato do arquivo fosse excetuada. (Aviso: Obviamente não foram feitos testes "cientificos" e, portanto, os resultados são apenas indicativos [e não conclusivos]. A execução variará de acordo com configurações de hardware e software).
2007-12,08 sec
2010-10,38 sec
Foi utilizado o código do exemplo abaixo para criar um conjunto de tabelas dinâmicas (Pivot Tables). O MS Excel 2003 não pôde participar deste ensaio, a versão do código utilizado para criar a PT (Pivot Table) seria um pouco diferente das utilizadas para o MS Excel 2007 e MS Excel 2010. O MS Excel 2010 teve um tempo de execução médio de 10,38 segundos o que foi cerca de 14% inferior ao MS Excel 2007.
2003-14,86 sec
2007-32,57 sec
2010-10,86 sec
A melhoria mais perceptível está neste desempenho ao preencher uma planilha com números. O MS Excel 2010 ficou em primeiro lugar com um tempo de 10,86 segundos. Deixando para trás o MS Excel 2003, que ficou em segundo lugar com um tempo de 14,86 segundos. Já o MS Excel 2007 ficou para trás, com um tempo de 32,57 segundos. Melhoria de 119%.
2003-6,24 sec
2007-14,32 sec
2010-8,84 sec
Aqui observamos mais uma tarefa na qual MS Excel 2010 não é melhor do que MS Excel 2007, quando se trata de preencher uma planilha com fórmulas. Mais uma vez percebemos que o trabalho imposto na Microsoft foi em melhorar o desempenho aparente. Embora o MS Excel 2003 bata seus sucessores em 6,24 segundos, o MS Excel 2010 não está muito atrás em 8.84 segundos, enquanto o MS Excel 2007 chafurda na poeira em 14,32 segundos. Aperfeiçoamento - 38%.
2007-29,62 sec
2010-10,74 sec
Este último teste foi executado para medir os progressos da área gráfica. Gostaria muito de poder comparar estes resultados com os informações do MS Excel 2003, mas, como no caso das tabelas dinâmicas, o próprio código teria sido um pouco diferente e, portanto, não estaríamos comparandor maçãs-com-maçãs. Mais uma vez, o MS Excel 2010 supera o MS Excel 2007 pela larga vantagem de 64%.
t = Timer
For i = 1 To 10
Range("A1:K4").Select
Range("K4").Activate
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$K$4")
Next i
MsgBox Timer - t
End Sub
Twitter: @officespecialis
@brzexceldevelop
@brzaccessdevel
BernardesParabéns pelo seu blog e currículo.
Gostaria de tirar uma dúvida com você. Estou começando a programar agora em excel e no inicio gostaria de ter algumas rotinas pre prontas. PRINCIPALMENTE EM GRÁFICO. Como eu consigo interagir uma planília de VBA com os gráficos de excelMuito obrigadoVinicius Figueiredo de Castro
sssvinicius@yahoo.com.br
Selecione o objeto.
expression.Select(Replace)
A expressão requer uma expressão que retorne um dos objetos acima (Chart, Charts, Shape, ShapeRange, Sheets, Worksheet, e objetos Worksheets).
Replace
É uma Variant opcional
Sheets ( "Sheet2"). Selecione
Sheets ( "Chart1"). Selecione False
ActiveWindow.SelectedSheets.Copy Como comentei anteriormente, a seleção e ativação dos objetos deve ser utilizada como último recurso. Hello folks!
Existem diversos casos nos quais desejemos realizar uma única e mesma ação em várias worksheets ao mesmo tempo.
Isso pode incluir imprimi-las ou copiá-los para outro local ou mesmo a editá-las em suas várias worksheets numa única etapa.
Em alguns casos processar uma worksheet de cada vez produzirá um resultado diferente do que se pode obter ao trabalhar em várias worksheets simultaneamente. Em outros casos, pode ser apenas uma questão de conveniência.
De qualquer modo no seu caso pode ser apenas uma questão de aprendizado de como fazê-lo.
Dois exemplos onde os resultados são diferentes:
Quando se copia um gráfico, e o dados associados a este, num único processo para outra pasta de trabalho, as referências ao gráfico também são atualizadas, fazendo referência aos dados da nova pasta. No entanto, se estas são copiados individualmente, o gráfico faria referência à worksheet original.
Outro exemplo pode ser observado no momento da impressão simultânea de várias worksheets, ao imprimi-las as páginas serão numeradas sequencialmente. Faça isso uma folha de cada vez e as páginas serão numeradas separadamente. Além disso, cada folha será um trabalho de impressão separado. Enquanto alguns podem não considerar isto como um grande problema, para outros pode ser.
Nesta dica veremos como trabalhar com várias folhas através de código VBA.
Sheets (Array ( nPlan, nChart)). Selecione
Sheets ( nSheet). Activate
Let Application.ActivePrinter = "HP-Printer on Ne01:"
ActiveWindow.SelectedSheets.PrintOut Copies: = 1, ActivePrinter: = "Acrobat Distiller Ne06 em:", Collate: = True
Boa tarde,
Estive procurando na internet alguma informação sobre o VBA. E vi num forum que voce e um outro cara sicutiram sobre a identificação da quantidade de colunas usadas em uma determinada linha no excel (não sei voce ainda se lembra).
É este o codigo.
Function UltimaLinha(Célula As Range) As Single
Application.Volatile
Let UltimaLinha = Cells(Célula.Range("A1").Column, Rows.Count).End(xlUp).Rows
End Function
So que estou precisando contar as linhas usadas em uma determinada coluna, preciso fazer o contrário do que voce fez... So que nao sei trabalhar com o VBA direito... apenas fucei e apliquei essa função que voces inventaram.
Vi que voce conhece um bocado sobre o assunto. Tem como vc me ajudar nessa?
Atenciosamente,
Gilberto Freitas
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
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.
Veja também:
Tudo em VBA
VBA Excel
VBA Access
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
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 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
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.
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).
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.