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

Micrososft Office 2010.

 
Logo_MSFTOffice2010_187x54.jpg
 
Possivelmente em meados de Junho ou Julho de 2010 a Microsoft lançará no mercado o novo MS Office 2010.
 
 
Icon_Word10_33x32.gif Icon_PowerPoint10_33x32.gif Icon_Outlook10_33x32.gif Icon_Excel10_33x32.gif icon_Onenote10_33x32.gif Icon_Access10_33x32.gif Icon_Publisher10_33x32.gif Icon_InfoPath10_33x32.gif Icon_SharePoint10_33x32.gif logo-communicator.jpg 
 
Até o momento disponibilizou-se que a nova versão do MS Office será disponibilizada em caixinhas sob os seguintes temas:

Office Home and Business 2010 
Office Professional 2010
Office Professional Plus 2010

As grandes estrelas da versão 2010 serão:
- Versão Online para criação e edição via web
- Versão para 64 bits  e
- Alguns falam a respeito de um Versão Mobile para dispositivos móveis.

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).

Continuemos na espera.

VBA Error 3275 - Unexpected error from external database driver

Pois é, erros e mais erros...

Conforme já tive chance de escrever aqui antes, invariavelmente somos expostos a erros quando estamos desenvolvendo soluções através das nossas aplicações, não raramente acompanhadas de uma demanda alta e com pouco tempo.

Especialmente quando envolve o inter-relacionamento entre aplicações distintas, neste caso utilizo o
MS Office 2007.

As interações podem ocorrer entre o MS Access e o MS Excel, numa constante troca de dados, com a criação de diversas planilhas repletas de fórmulas, ou mesmo a exportação de diversos painéis de dados (como um Dashboard) para apresentações MS PowerPoint dentro de um ciclo contínuo.

No cenário descrito acima é muito provável que nos deparemos com o famoso, pouco conhecido, mas muiiitooo chato: Erro 3275.

Este erro, quando pesquisado na literatura Microsoftniana, está acompanhado da seguinte definição:
Unexpected error from external database driver <error number>, ou,
Erro inexperado causado pelo driver de banco de dados externo <número do erro>

Este erro torna-se ainda mais comum durante a execução repetitiva da seguinte linha de comando:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, nquery, PlanTarget

Pode percebê-lo melhor dentro da funcionalidade abaixo, a qual é evocada dentro de um ciclo constante.
Function 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

Certamente percebeu a ocorrência da função Sleep() no trecho de código colado aí acima. Este foi
implementado com o único propósito de 'atrasar' a funcionalidade para que esta possa ter tempo de
exportar os dados para a planilha e em seguida dar continuidade ao processo.

Percebi, pelo menos neste meu problema, que a interação entre as aplicações necessita de um tempo para o processamento completo, o qual envolve:

- Busca dos dados dentro da base;
- Exportação destes dados para uma planilha, que tem como base um modelo;
- Adequação dos dados nesta planilha modelo.

Ao passo que o MS Access executava suas funcionalidade de uma forma rápida, o mesmo não ocorria com MS Excel que ficava 'agarrado' no seu processamento de forma mais lenta (letárgica diria). Para tanto, precisei dar um sossega leão no MS Access, utilizando a função Sleep().

Call Sleep(4000)  ' Pausa para o sistema operacional não fundir...
Pode ser que necessite dessa funcionalidade em outros aspectos, por isso te passo o modo como
resolvi aqui nesta Sleep(), mas poderá fazer de outro modo:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Seria muito legal, caso já tenha se deparado com este problema, que o comentasse, e como fez
para resolvê-lo. Desse modo criaremos um repositório para elucidar aqueles que forem atacados
pelo mesmo inconveniente Erro 3275.
 
Twitter: @officespecialis
             @brzexceldevelop
             @brzaccessdevel


Tome posse das INFORMAÇÕES da sua empresa!

Empresas em todo o mundo estão permeadas de dados oriundos de diversas origens distintas e apesar do acesso a este, têm dificuldades em obter as necessárias informações para tomar as suas mais relevantes decisões.
 
Não é menos verdade que em muitas reuniões todos estejam munidos de INFORMAÇÕES totalmente irrelevantes. Têm acesso a dados de A a Z, completamente desprovidos de conteúdo, pois estes não contém a abrangência e nem a diversificação, que lhes propiciem dinamicidade na análise.
 
Em alguns casos as corporações têm acesso a um grande amontoado de dados distribuidos nos seus servidores como BIs, Datawarehouse e cubos OLAP.
 
Informação é algo muito precioso e deve ser obtida de forma rápida e exata.

Reunir informações de diferentes países, traduzindo-os nas estratégias e targets pré-estabelecidos tem sido um desafio para a maioria dos executivos em todo o mundo.
Não raro seus KPIs (Indicadores de Performance) não estão alinhados com as estratégias da empresa.

A diversidade de bases de dados nas quais as informações podem estar são muito variáveis, quando necessita consolidar tais informações em
Dashboards e Scorecards, estes precisam estar reundos de modo coerente e sucinto.

Os
Balanced Scorecards oferecem aos executivos as ferramentas que necessitam para alcançar o sucesso na obtenção de suas informações. Esta importante ferramenta traduz a missão e a estratégia da sua empresa num conjunto abrangente de medidas de desempenho que serve como base para o sistema de medição e gestão estratégica. Perseguindo os objetivos financeiros, incluindo os vetores de desempenho desses objetivos.

O grande dilema é: Mesmo estando cercado por dados de todas as origens, como posso  obter INFORMAÇÕES relevantes para tomar minhas decisões?

?ui=2&view=att&th=1254a1f913f53170&attid=0.1&disp=attd&realattid=ii_1254a1f913f53170&zw
Os conceitos e as regras de negócio precisam ser aplicados aos dados de modo a atender a empresa como um TODO e não apenas a alguns departamentos e países.

Os resultados mais comuns são INFORMAÇÕES IMPRECISAS, números que não coicidem durante as reuniões, resultando no adiamento de decisões altamente relevantes, ou na tomada de decisões inseguras.

Para que a Direção da empresa possa tomar decisões abalizadas, torna-se imprescindível que o conteúdo seja coeso, sintético e direcionado para atender o foco das reuniões.

O
Management Information System é um Sistema de Informação Gerencial, que interliga todos os dados da organização. Consiste na rede de canais de comunicação da organização permeando todas as estruturas executivas. É composto por todos os componentes que recolhem, manipulam e disseminam as informações. Nele estão inclusos hardware, software, pessoas, sistemas de telecomunicação, e os dados propriamente ditos.
Essas soluções são facilmente implementadas sem que se necessite adquirir novos softwares ou sistemas. Permita-me norteá-lo.
 
Utilize o que há de melhor em técnicas de análise!

:: Consulte seus dados concentrados em Scorecards.
:: Utilize layouts funcionais que destaquem as informações mais relevantes.
:: Envie ou arraste tabelas e gráficos para suas apresentações eletrônicas.
:: Compartilhe as informações através de Dashboards funcionais.

Cause um impacto positivo em todos os níveis executivos da sua gestão.

Entre em contato, presto consultoria pontual.

:: Avalie diferentes cenários
:: Reúna as informações mais importante para sua análise.
:: Efetue simulações com os dados reais ou com estimativas.
:: Compare suas informações com dados do seu Marketshare.
:: Tenha relatórios atualizados com informações oriundas da Internet.


Não é necessário a aquisição de nenhum produto!

Implemente soluções com os produtos já disponíveis na sua Empresa ou Departamento.

Reunir informações de diferentes países, traduzindo-os nas estratégias e targets pré-estabelecidos tem sido um desafio para a maioria dos executivos em todo o mundo.

- Torne a informação clara e compreensível nos seus relatórios
- Complete suas planilhas com mais funcionalidades.
- Melhore a apresentação das suas informações.
- Aplique layouts modernos.
- Envie dados diretamente para as apresentações do Powerpoint.
- Envie análises consolidadas diretamente para os seus clientes.
- Capte informações do marketshare diretamente da Web
.

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.

Amplie a visão:
       Demonstração 1
       Demonstração 2
 
 

Review - MS Excel 2010 X MS Excel 2007.

Bem às portas da liberação da nova versão do MS Excel 2010, queremos efetuar uma pequena e singela comparação entre as versões 2007 e 2010 (incluindo a versão 2003 quando possível). Convido-o a observar esses estudos simples mas bem elucidativos quanto a melhora de performance do MS Excel 2010.
 
Este artigo é uma tradução livre e ampliada do que foi publicado em DATABISON.

Excel 2010 x Excel 2007

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).

Tempo abrangido para a criação de tabela dinâmica:

2007-12,08 sec
2010-10,38 sec

excel-2010-excel-2007-pivot-table.png

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.  

Sub create_pivot()
t = Timer
For i = 1 To 100
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "Sheet1!R1C1:R3457C6", Version:=xlPivotTableVersion12).CreatePivotTable _
        TableDestination:=ActiveSheet.Cells(1, 1), TableName:="PivotTable1", DefaultVersion _
        :=xlPivotTableVersion12
Next i
MsgBox Timer - t
End Sub

Tempo abrangido para preencher um intervalo com números:

2003-14,86 sec
2007-32,57 sec
2010-10,86 sec

excel-2010-excel-2007-comparison-fill-range-with-number.png
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%.

Sub fill_range()
t = Timer
For i = 1 To 5000
For j = 1 To 10
Cells(i, j).Value = 10
Next j
Next i
MsgBox Timer - t
End Sub
 
 
Tempo abrangido para preencher um intervalo com fórmulas

2003-6,24 sec
2007-14,32 sec
2010-8,84 sec

excel-2010-excel-2007-comparison-fill-range-with-formulas.png

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%.

Sub fill_formula()
t = Timer
For i = 1 To 500
For j = 1 To 10
Cells(i, j).FormulaR1C1 = "=SUM(10+20)"
Next j
Next i
MsgBox Timer - t
End Sub

Tempo abrangido para a criação de gráficos

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%.

excel-2010-excel-2007-charting.png


Sub create_chart()
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
 
Pois bem senhoras e senhores, sim, há melhorias que ajudam na pontuação do MS Excel 2010 em detrimento do MS Excel 2007 em todas as suas muitas áreas.
 
Agora, não fiquemos cegos ao fato de que ao compará-lo com o MS Excel 2003, este ainda deixa poderia ser melhor.
 
Não desconsideremos o fato de que:
O MS Excel 2003 suporta     16.777.216 células por planilha,
O MS Excel 2010 suporta 17.179.869.184 células por planilha,
 
Ou seja, 1.024 vezes mais células.
 
Convido-o a ampliar os testee e a retornar-me com seus comentários e acréscimos. Assim poderemos compreender melhor e mais profundamente as reais vantagens produtivas dessa nova versão.
 

Twitter: @officespecialis
             @brzexceldevelop
             @brzaccessdevel


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

VBA Access - Criando uma planilha (MS Excel com gráfico) a partir de uma aplicação MS Access.

Vez por outra recebo pedidos sobre como criar planilhas através do Access, ou seja, a partir de uma aplicação MS Access que alguém já tem desenvolvida.

Na verdade isso é muito simples, por isso estou ampliando alguns passos nesta criação. Além de demonstrar como criar a planilha, estou populando-a com dados e inserindo um gráfico, tudo programaticamente (ou de modo automatizado, como preferem alguns).

Espero que gostem, ampliem o exemplo e me retornem opiniões e acréscimos...Ahhh e o mais importante para toda a comunidade de desenvolvedores, compartilhe com o máximo de pessoas que conhecer!

Boa diversão!

 
Private Sub cmdMakeChart_Click()
    '  Author:                           Date:                     Contact:                           URL:
    '  André Bernardes             23/11/2009 10:40   
bernardess@gmail.com     http://al-bernardes.sites.uol.com.br/
    '  Cria uma planilha, popula-a com uma periodicidade e dados, cria um gráfico.
 
    Dim AppMSExcel As Excel.Application
    Dim the_date As Date
    Dim stop_date As Date
    Dim r As Integer
    Dim new_chart As Chart
    Dim new_book As Workbook
    Dim active_sheet As Worksheet
 
    ' Abre a aplicação MS Excel.
    Set AppMSExcel = CreateObject("Excel.Application")
 
    ' Mantém aplicação escondida.
    Let AppMSExcel.Visible = True
 
    ' Cria uma nova planilha (spreadsheet).
    Set new_book = AppMSExcel.Workbooks.Add()
 
    ' Gera valores randômicos dentro de um período.
    Set active_sheet = new_book.Sheets(1)
   
    Let the_date = CDate("01/11/09")
    Let stop_date = CDate("23/11/09")
    Let r = 1
   
    Do While the_date < stop_date
        Let active_sheet.Cells(r, 1) = the_date
        Let active_sheet.Cells(r, 2) = Int(Rnd * 90) + 10
        Let the_date = DateAdd("d", 1, the_date)
        Let r = r + 1
    Loop
 
    ' Cria um gráfico (chart) conectado a estes dados.
    Set new_chart = Charts.Add()
   
    With new_chart
        Let .ChartType = xlLineMarkers
       
        .SetSourceData Source:=active_sheet.Range("A1:B" & Format$(r - 1)), PlotBy:=xlColumns
        .Location Where:=xlLocationAsObject, Name:=active_sheet.Name
    End With
 
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Top = 10
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Left = 100
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Width = 600
    Let active_sheet.Shapes(active_sheet.Shapes.Count).Height = 400
 
    ActiveChart.ChartArea.Select
 
    ' Acerta primeira fase de detalhes.
    With ActiveChart
        Let .HasTitle = True
        Let .ChartTitle.Characters.Text = "Valores de Fevereiro"
        Let .Axes(xlCategory, xlPrimary).HasTitle = True
        Let .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Data"
        Let .Axes(xlValue, xlPrimary).HasTitle = True
        Let .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Valores"
    End With
 
    ' Fecha a pasta (workbook) salvando.
    AppMSExcel.ActiveWorkbook.Close True
 
    ' Fecha o MS Excel.
    AppMSExcel.Quit
    Set AppMSExcel = Nothing
 
    MsgBox "Planilha Gerada!"
End Sub
 


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

 

A&A: Feedback - Ajuda em VBA.

Caro Vinicius,
Bom dia.
 
Primeiramente quero agradecer-lhe pelos acessos aos meus Blogs de VBA:
 
Acredito que, para pessoas que estão iniciando como você, estes sejam relevantes
por propiciar acesso a vários códigos prontos.
 
Bem, quanto a rotinas de interação com as classes gráficas, estas são extensas e
muito produtivas para a utilização.
 
Sugiro-lhe alguns sites para o seu estudo pessoal (caso não tenha problemas com a
língua inglesa, caso contrário aguarde por mais códigos em novos artigos, nos meus
Blogs):
 
 
No mais, não deixe de comprar bons livros, focando especialmente o Office 2007,
bem com a mais nova suíte 10!
 
Se possível retorne comentando sua evolução e aproveitamento...Compartilhe o
endereço dos meus Blogs com outros.
 
Obrigado e forte abraço!
 
André Luiz Bernardes
A&A - WORK, DON´T PLAY!
http://al-bernardes.sites.uol.com.br/
bernardess@gmail.com

Twitter: @officespecialis
            @brzexceldevelop
            @brzaccessdevel

2009/11/21 Vinicius Figueiredo de Castro <sssvinicius@yahoo.com.br>


Bernardes
 
Parabé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 excel
 
Muito obrigado
 
Vinicius Figueiredo de Castro
sssvinicius@yahoo.com.br

VBA Excel - Trabalhado com múltiplas WorkSheets - 02

Selecionando várias worksheets
Vejamos um exemplo de como construir uma matriz com os elementos identificados apenas em tempo de execução. Mas, primeiro nós olhamos o código que usa a declaração SELECT de uma forma raramente vista.

Sabia que o método Select tem um parâmetro opcional? Verifique o Help do MS Excel VBA e encontrará a sintaxe

Selecione o método que se aplica para o Chart, Charts, Shape, ShapeRange, Sheets, Worksheet, e objetos Worksheets.

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
 

O exemplo de código abaixo seleciona os Sheet2 Chart1, copiando-os para um novo workbook.
 
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.

Veremos como fazer isso em seguida....


Twitter: @officespecialis
@brzexceldevelop
@brzaccessdevel

Veja também:
Blog Office VBA | http://inanyplace.blogspot.com/
Blog Excel | http://brzexceldeveloper.blogspot.com/
Blog Access | http://brzaccessdeveloper.blogspot.com/

VBA Excel - Trabalhado com múltiplas WorkSheets - 01

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.

Usando o gravador de macro
Começando com o nosso amigo de confiança, o gravador de macro, no código temos a impressão de duas folhas é:

Dim nPlan As String
Dim nChart As String
Dim nSheet As String

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

Observe que o código utiliza essencialmente uma matriz com um índice para o endereçamento (Sheets(1)), ao invés da típica sintaxe Sheets("Sheet1"). Isso permitirá o funcionamento em várias worksheets ao mesmo tempo.
 
Twitter: @officespecialis
             @brzexceldevelop
             @brzaccessdevel



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

A&A: Feedback - Ajuda no VBA... tem como vc me ajudar?

Olá Gilberto,
Boa tarde.

Agradeço o contato  e interesse em VBA...

Bem, vou te passar um código que resolverá o seu problema.

Gostaria de dizer que presto assessoria quanto a desenvolvimento VBA e que pequenas questões e funcionalidades podem ser facilmente resolvidas através de um depósito pessoal e o envio através de e-mail da sua solução.

No seu caso poderá utilizar a função LastRow("B";10)

No formato acima ela retorna o número da última linha com ocorrência, numa determinada coluna a partir de uma linha inicial.

Function LastRow(nColumn As String, InitLine As Single) As Single
    ' Author:                     Date:               Contact:
    ' André Bernardes             11/08/2008 09:01    bernardess@gmail.com
    ' Retorna o número de ocorrências.

    Dim nLine As Single
    Dim nStart As Single
    Dim nFinito As Single
    Dim Cabessalho As Single
    Dim nCeo As String

    Application.Volatile

    Let nStart = InitLine + 1
    Let nFinito = 65000
    Let Cabessalho = InitLine

    Do While nStart < nFinito
        Let nCeo = nColumn & Trim(Str(nStart))

        If Application.ActiveSheet.Range(nCeo).Value = "" Then
            Exit Do
        End If

        'Let Application.StatusBar.Value = " Linha: " & nStart
        Let nStart = nStart + 1
    Loop

    Let LastRow = (nStart - 1) '- Cabeçalho
    'Let Application.StatusBar.Value = "  "
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 

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.

2009/10/16 Gilberto Freitas <gilbertorf@yahoo.com.br>
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

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


VBA Excel - Fechando planilha sem Salvar

VBA Excel - Fechando planilha sem Salvar



Segue mais uma dica preciosa do amigo Denis Ostorero.

Como fechamos uma planilha sem que ela pergunte se desejo salvar?

Suponhamos que a versão que está disponibilizando não possa ser alterada ou que você tenha um bom motivo para não permitir que seus usuários gravem alguma coisa nela...Segue modelo:

' Essa simples rotina, pode fazer um estrago...
' 1 - Fecha a pasta de trabalho ativa, SEM SALVAR, ou
' 2 - Fecha TODAS as pastas de trabalho abertas

             
Sub CloseNotSave()                

  ' Informa ao Excel que a pasta já está salva
  ThisWorkbook.Saved = True
                  
  ' Fecha a pasta de trabalho. O Excel fica aberto.
  ' Se houver outras pastas abertas, ficarão abertas
  ThisWorkbook.Close

  ' Para sair do Excel (encerrar o aplicativo) sem
  ' salvar TODAS as pastas abertas:                 
    ' Aqui ele procura (loop) pastas abertas
    ' For i = 1 To Application.Workbooks.Count
      ' Diz ao Excel que a pasta já está salva
      ' Application.Workbooks(i).Saved = True
                      
      ' Procura outras pastas abertas, até a última
    ' Next
                  
  ' Diz ao Excel que está tudo bem, que é para fechar o
  ' "estabelecimento", e ir descansar
  ' Application.Quit                
End Sub


Envie seus comentários e sugestões e compartilhe este artigo!

brazilsalesforceeffectiveness@gmail.com

✔ Brazil SFE®✔ Brazil SFE®´s Facebook´s Profile  Google+   Author´s Professional Profile  ✔ Brazil SFE®´s Pinterest       ✔ Brazil SFE®´s Tweets

eBooks VBA na AMAZOM.com.br

LinkWithinBrazilVBAExcelSpecialist

Related Posts Plugin for WordPress, Blogger...

Vitrine