none
erros em comandos ActiveWindow RRS feed

  • Pergunta

  • Eu preciso ativar e desativar diversas vezes durante um programa os elementos visuais da janela do excel

    e tenho utilizado:

    ActiveWindow.DisplayGridlines = True
    
    ActiveWindow.DisplayHeadings = True
    
    ActiveWindow.DisplayHorizontalScrollBar = True
    
    ActiveWindow.DisplayVerticalScrollBar = True 
           
    ActiveWindow.TabRatio = 0.4
    
    ActiveWindow.ScrollIntoView Left:=1, Top:=1, Width:=1, Height:=1 
    'estou utilizando este para que a planilha abra sempre com o canto esquerdo no alto

    Isso funcionou bem, mas de repente começou a retornar erro sem que nada justificasse. (ou pelo menos não encontrei nada)

    Esses procedimentos estão uma uma Sub normal (tenho 2 uma que Ve os elementos de tela, e uma que NÃO ve os elementos de tela)

    Eu chamo as sub, dependendo da necessidade, a partir de outra sub normal, mas em alguns casos de eventos de planilha.

    Obrigado


    Rui Martins

    quarta-feira, 29 de abril de 2015 19:36

Todas as Respostas

  • Você pode estar tendo erros porque está tentando executar essas macros a partir de um estado em que a aplicação não possui uma janela ativa. Tente:

    Sub Main()
        If ActiveWindow Is Nothing Then Exit Sub
        
        ActiveWindow.DisplayGridlines = True
        ActiveWindow.DisplayHeadings = True
        ActiveWindow.DisplayHorizontalScrollBar = True
        ActiveWindow.DisplayVerticalScrollBar = True
        ActiveWindow.TabRatio = 0.4
        ActiveWindow.ScrollIntoView Left:=1, Top:=1, Width:=1, Height:=1
    End Sub
    Alternativamente, pode ser que sua planilha esteja protegida no momento em que você esteja tentando executar essa macro.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    segunda-feira, 4 de maio de 2015 12:04
    Moderador
  • Tudo bem Felipe, entendi, mas em que momento isso pode acontecer se sempre há uma planilha visível?

    Este comando que vc colocou faz com que os comandos sejam ignorados. Não gera erro, mas tb não executa a formatação. Desta forma em que momento devo colocar esses comandos pra que o usuário veja apenas o que se deseja?

    Essa situação pode acontecer em um evento como Activate?

    Aliás, eu gostaria de uma explicação melhor sobre as diferenças de comportamento entre activate, select e visible.

    Por exemplo: o visible, ativa a planilha e dispara o evento activate? Ou apenas torna visível?
    Depois de um activate, ou visible é necessário um select para que os comandos seguintes assumam aquela como active sheet?

    Quando eu quero que uma determinada planilha seja aberta e ativada após uma sub, qual comando devo utilizar?

    Obrigado


    Rui Martins

    terça-feira, 5 de maio de 2015 12:30
  • Visible é uma propriedade do objeto Worksheet que pode ter três estados: xlSheetVisible, xlSheetHidden, xlSheetVeryHidden

    Select é um método da coleção Sheets e do objeto Worksheet. No exemplo abaixo, temos três planilhas selecionadas, mas a planilha ativa é a Plan2. A saber: nunca se pode ter mais de uma planilha ativa.

    Activate um método do objeto Worksheet que dá foco numa planilha. É possível você não ter nenhuma planilha ativa: por exemplo, pressione Ctrl+W até fechar todas as planilhas e digite na janela de verificação imediata ?ActiveWindow Is Nothing e pressione Enter. Verá que resultará em Verdadeiro.

    ---

    Em relação a eventos:

    Quando você clica numa planilha e o foco não estava anteriormente nela, é disparado o evento Worksheet_Activate. Quando você seleciona outra planilha, dispara o evento Worksheet_Activate.

    Obviamente, um evento pode disparar de duas formas diferentes: quando você altera o estado de visibilidade de uma planilha para xlSheetVisible, o Excel dá foco à ela e então o evento Worksheet_Activate é disparado. Alternativamente, se você executa Plan1.Activate e a janela atual não é Plan1, o foco é dado a Plan1 e seu evento Worksheet_Activate é disparado.

    ---

    "Quando eu quero que uma determinada planilha seja aberta e ativada após uma sub, qual comando devo utilizar?"

    Use:

    ThisWorkbook.Worksheets("Plan1").Activate


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quarta-feira, 6 de maio de 2015 01:28
    Moderador
  • Beleza!

    Agora, eu estou em uma planilha,plan1, e tenho 2 planilhas ocultas, plan2 e plan3, onde preciso copiar uma área de uma delas, plan2, e colar em outra, plan3, que não é a que está ativa.

    Eu preciso torná-las visíveis, selecionar Plan2, copiar, selecionar a plan3 e colar, e só depois reativar a plan1?


    Rui Martins

    quarta-feira, 6 de maio de 2015 14:55
  • Ok.
    Tornar uma planilha visible executa o activate. Ativar uma planilha tb a torna visivel?

    quando mando ativar uma planilha eu coloco o comando antes ou depois do

    If ScrUp Then Application.ScreenUpdating = True, ou antes?


    Obrigado


    Rui Martins

    quarta-feira, 6 de maio de 2015 19:23
  • "Ativar uma planilha tb a torna visivel?"

    Não. Se você tentar executar o método Activate num objeto Worksheet que possui a propriedade Visible diferente de xlSheetVisible, obterá um erro em tepmo de execução.

    ---

    Sobre a segunda pergunta, vou esclarecer algo: ativar/desativar as atualizações da tela não influencia, em nenhum momento, na propriedade Visible, no método Activate ou Select, ou no evento Worksheet_Activate. Logo, a resposta é: indifere.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    quarta-feira, 6 de maio de 2015 23:39
    Moderador
  • Maravilha, isto está sendo muito esclarecedor.

    Desta forma, para executar operações ou cópia e cola em planilhas ocultas só devo utilizar o select? Ou preciso torná-las visíveis e ativá-las, selecionar, e só depois efetuar as operações? E, depois disso, ocultar de novo pq não quero que ela fiquem visíveis.

    obrigado


    Rui Martins


    sexta-feira, 8 de maio de 2015 12:53
  • Rui, através do VBA você pode fazer coisas no Excel que não poderia através de ferramentas nativas, como, por exemplo copiar conteúdo de uma célula numa outra oculta sem desoculta-la antes.

    Por exemplo, se tanto Plan1 como Plan2 estiverem ocultas, esse código irá rodar sem problemas:

    Worksheets("Plan1").Range("A1").Copy Destination:=Worksheets("Plan2").Range("B2")

    Respondendo a pergunta: você pode copiar e colar dados sem alterar o estado de visibilidade as planilhas. E a dica final é: evite utilizar os métodos Select, Activate e os objetos ActiveCell, ActiveSheet, ActiveWorkbook em rotinas de automatização de planilhas.

    Se você tem um código que não sabe como fazer essa conversão, poste aqui que darei uma sugestão.


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    sexta-feira, 8 de maio de 2015 13:05
    Moderador
  • Excelente essa instrução. Vou aplicar e verificar.

    Uma pergunta: São copiados apenas os dados? Ou os formatos tb?

    Eu tenho um outro problema que está funcionando com copia e cola, mas que talvez vc tenha uma solução melhor.

    Eu tenho uma linha de fórmulas que preciso copiar e colar em uma área de dados onde é permitido que sejam digitados valores sobre as fórmulas, mas antes de recarregar a planilha eu tenho de restituir as formulas que foram cobertas por dados que já foram salvos para serem lidos novamente pela mesma planilha.

    Eu copio a linha de fórmulas e colo especial somente as fórmulas na área toda.

    Vc tem alguma outra solução?

    mntAcaoPac.[frmlsMntAcaoPac].Select  'seleciona linha de fórmulas
    Selection.Copy
        
    mntAcaoPac.[AreaDadosMntAcaoPac].Select 'seleciona área de dados para receber as fórmulas
    Selection.PasteSpecial Paste:=xlPasteFormulas, operation:=xlNone, SkipBlanks:=True, Transpose:=False
    
    Obrigado


    Rui Martins

    sábado, 9 de maio de 2015 15:36
  • Oi Felipe, usei esse comando e ele funcionou, mas copiou as fórmulas e não os dados. eu preciso que copie somente os dados, em um caso, e em outro somente as fórmulas, sem mexer na formatação.

    Tem como? Eu tive de retornar ao copy/paste especial.


    Rui Martins

    domingo, 10 de maio de 2015 01:56
  • Basta alterar o parâmetro do método PasteSpecial. Um ponto de atenção: não utilize os métodos Select ou Activate! Veja que é possível fazer o que deseja sem selecionar ou ativar planilhas ou células.

    mntAcaoPac.[frmlsMntAcaoPac].Copy
        
    mntAcaoPac.[AreaDadosMntAcaoPac].PasteSpecial Paste:=xlPasteValues


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    segunda-feira, 11 de maio de 2015 13:51
    Moderador
  • Realmente tenho tido muitos problemas com esses comandos, mas não sei como evitá-los
    por exemplo:

    Tenho de classificar algumas áreas que estão devidamente nomeadas e sempre dá erro no select.

    p32_rgFonteAcaoSel.[AreaClassRgFonteAcaoSel].Select
        ActiveWorkbook.Worksheets("rgFonteAcaoSel").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("rgFonteAcaoSel").Sort.SortFields.Add Key:=Range( _
        "B3:B407"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal                                                                                                                        'coluna cod. UndOrcSel
        ActiveWorkbook.Worksheets("rgFonteAcaoSel").Sort.SortFields.Add Key:=Range( _
            "C3:C407"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal                                                                                                                        'coluna cdAcao Pactuada (SubAcao)
        ActiveWorkbook.Worksheets("rgFonteAcaoSel").Sort.SortFields.Add Key:=Range( _
            "D3:D407"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal                                                                                                                        'coluna cd fonte de recurso
            
        With ActiveWorkbook.Worksheets("rgFonteAcaoSel").Sort
            .SetRange [AreaClassRgFonteAcaoSel]
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        

    Eu tirei o select, mas continuou dando erro no sort.

    O outros que tinha, estou tentando evitá-los

    Como fazer para que uma planilha se torne ativa e com o cursor em uma determinada célula?
    Eu estou usando:

    plan1.activate
    plan1.[Celini].select

    A mesma coisa qdo preciso fazer um FreezePanes, eu seleciono a célula e uso o ActiveWindow.FreezePanes=True

    Eu tb uso para ajustar a planilha à tela toda, qdo ativo uma planilha, o ActiveWindows.Zoom=true e para isso seleciono uma área de uma coluna, ou uma largura, e depois uso ActiveWindow.zoom, ou com true, ou com a porcentagem do zoom.
    Normalmente uso o select após efetuar o zoom para configurar a planilha na tela e não ficar a área do zoom marcada, aí seleciono uma célula com o select.

    Para proteger e desproteger uso o ActiveSheet.(Un)Protect

    O ActiveWorkBook é utilizado apenas nos Sorts

    Se eu mudar para ThisWorkbook, fará diferença, ou ThisWorksheet, se for o caso?

    Para que a planilha abra alinhada na primeira coluna da esquerda e no topo, eu estou utilizando

        ActiveWindow.ScrollIntoView "sig" />

    Rui Martins


    terça-feira, 12 de maio de 2015 13:32
  • "A mesma coisa qdo preciso fazer um FreezePanes, eu seleciono a célula e uso oActiveWindow.FreezePanes=True"

    Realmente, para o FreezePanes não tem remédio. Se quiser congelar painés, tem que desocultar a planilha, ativa-la e usar o método dessa mesma forma que usa atualmente. Um erro de design, na minha opinião.

    Em relação ao Zoom, continue fazendo assim também, com o método Select. A maioria das ações não são necessárias selecionar ou tornar visível uma planilha, mas você está usando justamente as que precisa, as exceções.

    ---

    "Para proteger e desproteger uso o ActiveSheet.(Un)Protect"

    Não faça assim. Faça:

    ThisWorkbook.Worksheets("Nome da Planilha").Protect
    'ou
    Plan1.Protect

    ---

    Aprenda a distinguir bem o objeto ActiveWorkbook do ThisWorkbook.

    Worksheets("Plan1").Activate, por exemplo, seleciona a planilha Plan1 da pasta de trabalho ativa. É equivalente a ActiveWorkbook.Worksheets("Plan1").Activate

    Por outro lado, ThisWorkbook.Worksheets("Plan1").Activate ativa Plan1 da planilha que contém o código VBA. Guarde isso.

    O objeto ThisWorksheet não existe, mas sim o ActiveSheet.

    ---

    "Para que a planilha abra alinhada na primeira coluna da esquerda e no topo,"

    Não testei, mas experimente algo como:

    Application.Goto Plan1.Range("A1"), True

    ---

    Vou sugerir um código para substituir o que está usando atualmente... por favor, a que intervalo AreaClassRgFonteAcaoSel se refere?


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 12 de maio de 2015 21:16
    Moderador
  • Felipe,

    excelentes ensinamentos, mas me permita um adendo: tinha achado estranho desde outra vez que li a respeito disso (se me recordo bem numa explicação sua mesmo), então resolvi fazer um teste. Algumas operações, como o 'FreezePanes' não precisam que a planilha esteja visível, apenas ativa. Fiz o teste no meu Excel 2010 como abaixo e obtive sucesso:

    Plan2.Activate
    Plan2.Range("C10").Select
    ActiveWindow.FreezePanes = True

    A 'Plan2' está oculta (inclusive se xlSheetVeryHidden) e funcionou corretamente. Não sei se tem alguma limitação, mas no teste simples funcionou.

    Abraço.



    Filipe Magno

    quarta-feira, 13 de maio de 2015 01:34
  • OI Felipe,

    Na realidade, estou trabalhando com um BD na planilha.

    rgFonteAcao é o nome do arquivo de dados das fontes de recursos de Ações das secretarias da prefeitura, e tem as Instâncias Anterior, selecionado e Atual.

    Eu tenho uma planilha "Anterior" onde tenho registros em um arquivo de vários órgãos (cada linha um registro), uma planilha "Selecionado" com o mesmo leiaute (acrescido de uma chave de indexação) e tem apenas os registros de um determinado órgão selecionado, e um "Atual", onde estão as informações atualizadas/acrescentadas a partir de uma planilha de formulário de ED(entrada de dados), que lê o  "Selecionado" e as alterações e inclusões são passadas para a planilha "Atual". Ao fechar o programa pego todas as linhas de dados do "Atual"e cubro a "Anterior". A partir da primeira utilização terei apenas os registros Atualizados de um único órgão. As leituras são feitas por fórmulas nas células de cada registro que selecionam as informações que preciso.

    Para melhorar a leitura do "Selecionado" na planilha de ED e os registros ficarem todos em primeiro lugar classifico os registros a partir de uma chave de classificação de 2 campos (colunas), mas preciso de uma chave de acesso unívoca classificada que criei concatenando os campos, para usar com PROCV. Assim a Área de classificação (AreaClass) é diferente da Área de Dados (AreaDados) do arquivo rgFonteAcao.

    Espero ter sido claro.

    Obrigado


    Rui Martins


    quarta-feira, 13 de maio de 2015 02:55