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?


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



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.


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   

VBA Access - Removendo campos programaticamente

Remove Fields From MDB programmatically O código VBA abaixo será usado para remover um campo de uma tabela do MS Access através da codificação VBA. Sobre a função: Aceitará três parâmetros 1. Database Path - O caminho completo da base de dados MS Access 2. TableName - O nome correto da tabela do MS Access de onde o campo será removido. 3. FieldName - O nome do campo a ser removido.
Function RemoveFieldFromMSACCESSTable (ByVal AccessDBPath, _                                        ByVal AccessTableName As String, _                                        AccessFieldName As String _                                       ) As Boolean   ' Declaração das variáveis.   Dim AccessDB As Database   Dim AccessDBPath As Variant   Dim Td As TableDef   On Error Resume Next   ' Informa o Path do MS Access DB, baseado na TableName.   ' Abre a base de dados.   Set AccessDB = OpenDatabase(AccessDBPath) 'if linked table          If Err <> 0 Then                ' Caso falhe, retorna a base de dados.     Exit Function          End If      ' Retorna a tabela.      Set Td = AccessDB.TableDefs(AccessTableName)      If Err <> 0 Then            ' caso falhe obtém a tabela.            GoTo End      End IF   ' Deletando o campo.   With Td            ' Deleta o campo.            .Fields.Delete AccessFieldName            If Err <> 0 Then                  ' Caso falhe a deleção do campo - possivelmente não existe.                  GoTo End            End If      End With      Let RemoveFieldFromMSACCESSTable = True ' O Default é False caso tenha falhado.   ' Limpa. End:      Set Td = Nothing      ' Close the Database      If Not AccessDB Is Nothing Then AccessDB.Close      Set AccessDb = Nothing End Function
Exemplo do uso:
Public Sub RemoveField () ' Exemplo da chamada: If (RemoveFieldFromMSACCESSTable ( "C:\Bernardes\A&A.mdb", "Clientes", "TimeStamp") Then MsgBox "Campo removido com sucesso!" End If End Sub
 

A chamada acima é utilizada para excluir de "C:\Bernardes\A&A.mdb", o nome da tabela é Clientes, e o nome do campo é "TimeStamp"
 
 
Twitter: @officespecialis
             @brzexceldevelop
             @brzaccessdevel
Veja também: Blog Office VBA

VBA Access - Função para saber se existe um arquivo.

Tudo bem que seja uma função básica, mas com sua utilidade.

Esta função retorna True se não houver um arquivo com o nome que você passar, mesmo que esteja escondido ou seja um arquivo de sistema.

Assume o diretório atual, se você não incluir um caminho.

Retorna False se o nome do arquivo for uma pasta, a menos que você passe True para o segundo argumento.

Retorna False para qualquer erro, por exemplo: nome de arquivo inválido, a permissão foi negada, o servidor não foi encontrado.

Procura um arquivo chamado nFile.accdb na pasta de dados: ExisteArquivo ("C: \ Data \ nFile.accdb")

Procura um arquivo chamado nFile.txt em um servidor de rede: ExisteArquivo ("\ \ MyServer \ MyPath \ nFile.txt")

Verifique se há um arquivo ou pasta no servidor com o nome Bernardes: ExisteArquivo ("\ \ MyServer \ Bernardes", True)

Verifica a pasta do banco de dados atual para um arquivo chamado A&A-InAnyPlace.xlsx: ExisteArquivo (TrailingSlash (CurrentProject.path) & "A&A-InAnyPlace.xlsx")

Function ExisteArquivo (ByVal strFile As String, Optional bFindFolders As Boolean) As Boolean     Dim lngAttributes As Long

    'Inclui arquivos read-only (somente leitura), hidden (escondidos), e system (de sistema).     Let lngAttributes = (vbReadOnly Or vbHidden Or vbSystem)

    If bFindFolders Then         Let lngAttributes = (lngAttributes Or vbDirectory) 'Inclui pastas.     Else         Do While Right$(strFile, 1) = "\"             Let strFile = Left$(strFile, Len(strFile) - 1)         Loop     End If

    ' Se Dir() retornar alguma coisa, é porque existem arquivos.     On Error Resume Next     Let FileExists = (Len(Dir(strFile, lngAttributes)) > 0) End Function

Function TrailingSlash (varIn As Variant) As String     If Len(varIn) > 0 Then         If Right(varIn, 1) = "\" Then             Let TrailingSlash = varIn         Else             Let TrailingSlash = varIn & "\"         End If     End If End Function
 
Twitter: @officespecialis              @brzexceldevelop              @brzaccessdevel André Luiz Bernardes A&A - WORK, DON´T PLAY! http://al-bernardes.sites.uol.com.br/ bernardess@gmail.com

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


Hello folks!

Existem diversos casos nos quais desejemos realizar uma única e mesma ação em várias worksheets simultaneamente. Isso pode incluir imprimi-las ou copiá-los para outro local ou mesmo 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 ao mesmo tempo. 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 os 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 sheets. 

Usando o gravador de macro 
Começando com o nosso amigo de confiança, o gravador de macro, 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.


Referências
Tags: VBA, Excel, Sheet, simultâneo, 


Access VBA - API: Alterando as propriedades ForeColor e Bold num nó selecionado de um Treeview







API: Alterando as propriedades ForeColor e Bold no NÓ selecionado de um Treeview:

Bem, para ser sincero com vocês o controle TreeView da Microsoft não suporta nenhum realce no texto de um NÓ que esteja selecionado.

Embora você possa destacar (highlight) um NÓ através da execução de um código no evento Click, o NÓ previamente destacado (highlighted) perderá tal destaque.

Para que possa testar este exemplo, coloque um Treeview (refiro-me a versão 6), sobre um formulário e, com o nome tvwTest-lo. Copie o seguinte código abaixo no módulo de classe do formulário.

Usando a API SendMessage, será possível recuperar as configurações atuais de um NÓ, e para repetir todos os NÓS, se a propriedade Bold for definida como verdadeira para um NÓ, pode forçar o NÓ para ser redefinido,  redesenhando-o normalmente.

Private Type TV_ITEM
    mask As Long
    hItem As Long
    state As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    iSelectedImage As Long
    cChildren As Long
    lParam As Long
End Type
 
Private Declare Function apiSendMessage _
    Lib "user32" Alias "SendMessageA" _
  (ByVal hWnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) _
  As Long
 
Private Const TVIS_BOLD  As Long = &H10
Private Const TV_FIRST As Long = &H1100
Private Const TVM_GETITEM As Long = (TV_FIRST + 12)
Private Const TVIF_HANDLE = &H10
Private Const TVGN_ROOT = &H0

Private Const TVIF_CHILDREN = &H40
Private Const TVM_GETNEXTITEM = (TV_FIRST + 10)
Private Const TVGN_CHILD = &H4
Private Const TVIF_STATE = &H8
Private Const TVM_SETITEM = (TV_FIRST + 13)
Private Const TVGN_NEXT = &H1

Private Const TVGN_CARET = &H9
Private mobjLastNode As Node
Private mlngBackColor As Long
 
Private Sub Form_Load()
    Dim objNode As Node
    Dim i As Integer

    For i = 1 To 10
        Set objNode = tvwTest.Nodes.Add(, , "r" & i, "ANode" & i)
    Next
End Sub
 
Private Sub sResetItems _
(hWnd As Long, hItem As Long)

Dim tvi As TV_ITEM
Dim hItemChild As Long
Dim objNode As Node
 
    If hItem = 0 Then
        Let hItem = apiSendMessage(hWnd, _
                            TVM_GETNEXTITEM, _
                            TVGN_ROOT, _
                            ByVal 0&)
    End If

    If Not mobjLastNode Is Nothing Then
        With mobjLastNode
            Let .ForeColor = vbBlack
            Let .BackColor = mlngBackColor
        End With
    End If

    Do While Not hItem = 0
        Let tvi.hItem = hItem
        Let tvi.mask = TVIF_CHILDREN Or TVIF_STATE
        Let tvi.stateMask = TVIS_BOLD

        Call apiSendMessage(hWnd, _
                    TVM_GETITEM, _
                    0, _
                    tvi)
        If tvi.state And TVIS_BOLD = TVIS_BOLD Then
            Let tvi.state = tvi.state And Not TVIS_BOLD
            Call apiSendMessage( _
                hWnd, _
                TVM_SETITEM, _
                0, _
                tvi)
        End If

        If (tvi.cChildren) Then
            Let hItemChild = apiSendMessage( _
                        hWnd, _
                        TVM_GETNEXTITEM, _
                        TVGN_CHILD, _
                        ByVal hItem)

            Call sResetItems(hWnd, hItemChild)
        End If

        Let hItem = apiSendMessage (hWnd, _
                                    TVM_GETNEXTITEM, _
                                    TVGN_NEXT, _
                                    ByVal hItem)
    Loop
End Sub

Private Sub tvwTest_NodeClick _
(ByVal Node As Object)

   Call sResetItems(Me.tvwTest.hWnd, 0)

    With Node
        Let .Bold = True
        Let .ForeColor = vbBlue
        Let mlngBackColor = .BackColor
        Let .BackColor = vbYellow
    End With

    Set mobjLastNode = Node
End Sub

Developed by Dev Ashish

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 - 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
diHITT - Notícias