none
Onde escrever os Codigos VBA no Excel, Class,Module,Sheet,This Workbook? RRS feed

  • Pergunta

  • Bom dia.

    Ainda sou iniciante em VBA e gostaria de saber onde esrever os codigos no Excel que tem locais como Class, Module Sheet e This Workook. Quais as consequencias se escrever em determinados locais, vantagens , desvanagens e precaucoes.Podera o programa nao rotar se coclocar em locais indevidos?

    Nao sei se e o caso abaixo, tem a ver alguma coisa com esse assunto, que tenho dois arquivos abertos com nomes "cartao pontos" e "dados1" sendo que o codigo abaixo foi escrito no arquivo "cartao pontos" em This Workbook.A intencao eh rodar o codigo com o arquivo "cartao ponto" ativado e filtrar dados do arquivo "dados1" e copiar no arquivo "cartao pontos".

    Do arquivo cartao ponto consigo ativar filtro no arquivo "dados1"(ws.Range("a1").AutoFilter 4, "<>"), mas nao consigo selecionar os dados filtrados (ws.Range("a1").CurrentRegion.Select) para poder copiar no arquivo "cartao ponto".Para tal precisei antes ativar com ws.activate e depois selecionar........nao sei se estou fazendo algum erro banal ou falta alguns conhecimentos fundamentais ou tem alguma coisa com o tema de onde escrever os codigos, pois depois de selecionados os dados preciso ativar novamente o "cartao ponto" para colar os dados e sao passos a mais que queria evitar pois tem muito arquivos que tem que ser copiados.

    Desde ja agradeco a quem possa me esclarecer.

    Tadao

    Sub copiadados1()

    Dim ws As Object
    Dim wst As Object


    Set ws = Workbooks("dados1").Worksheets("sheet1")
    Set wst = Workbooks("cartao ponto").Worksheets("sheet1")

    ws.Range("a1").AutoFilter 4, "<>"
    'ws.Range("a1").CurrentRegion.Select <-----com esse codigo deu erro
    ws.Activate
    Range("a1").CurrentRegion.Select


    ws.AutoFilterMode = False

    Workbooks("cartao ponto").Worksheets("sheet1").Activate


    End Sub

    quarta-feira, 20 de maio de 2015 15:52

Respostas

  • A resposta dessa postagem esta no final da postagem no Microsoft Community do link abaixo .

    Agradeco ao Felipe pelo esclarecimento.

    Tadao

    http://answers.microsoft.com/pt-br/office/forum/office_2013_release-excel/como-mudar-as-caracteristicas-das-mensagens-do/b7e36c48-f765-4d3d-9cbd-25945a3e15d7

    terça-feira, 27 de outubro de 2015 00:38

Todas as Respostas

  • Tadao, 

    Quanto a onde incluo o código, isso vai da visibilidade... por exemplo, imagine que você crie uma função que qualquer worksheet ou UserForm possa acessar, nesse caso você poderia optar por criar um módulo para isso e incluir todas as funções lá.

    Se por exemplo você incluir uma função dentro de um Form, essa função só poderá ser chamada caso o Form esteja aberto.

    Escolha onde por seu método imaginando quem pode acessar.

    Já um Módulo de Classe serve também com o mesmo propósito mas lá você também pode incluir um pouco de OOP, criando objetos como PESSOA, CLIENTE, PRODUTOS e incluir suas respectivas propriedades como COD, DESC e etc.

    Quanto ao seu método... tenta assim e ve se roda...


    Sub copiadados1()
    
    Dim ws As Worksheet 'porque definir como object de eu sei que tipo ele é???
    Dim wst As Worksheet
    
    
    Set ws = Workbooks("dados1").Worksheets("sheet1")
    Set wst = Workbooks("cartao ponto").Worksheets("sheet1")
    
    ws.Range("a1").AutoFilter 4, "<>"
    
    Workbooks("dados1").Activate 'Garanto que o Workbook estará ativo
    ws.Activate 'Garanto que a worksheet Ws estará ativa quando selecionado
    
    ws.Range("a1").CurrentRegion.Select <-----com esse codigo deu erro
    
    Range("a1").CurrentRegion.Select
    ws.AutoFilterMode = False
    
    Workbooks("cartao ponto").Worksheets("sheet1").Activate
    
    End Sub


    Natan

    quarta-feira, 20 de maio de 2015 16:23
  • Ola Natan, obrigado pela ajuda.

    Nao entendi muito bem a sua explicacao, mas quando abro o editor de VBA aparece o VBAProject(Nome do Arquivo)

    Debaixo do VBAProject abrem os Class, Module, Sheet , This Workbook e UserForm. Quanto ao Class e UserForm, acho que ainda e cedo para o meu nivel .

    Se por exemplo escrevo os codigos no window code do sheet1 ela so vai rodar no sheet1? Se quiser que rode em qualquer sheet devo escrever em This Workbook?. Quando tiver varios Workbooks aberto e quiser que rode em qualquer workbooks aberto devo escrever em Module?

    Quanto a pergunta abaixo,

    Dim ws As Worksheet 'porque definir como object de eu sei que tipo ele é???

    e que o meu livro texto que utilizo nao tem definicao de variaveis como Worksheet, Workbook, Range...O livro explica que o workshhet assim como workbook ou range sao Objetos. Mas como voce diz, se eu definir uma variavel como Worksheet ela nao aceita Range e vice versa? 

    Obrigado pelo comentario dos codigos abaixo, entendi perfeitamente as acoes dos codigos,

    Workbooks("dados1").Activate 'Garanto que o Workbook estará ativo
    ws.Activate 'Garanto que a worksheet Ws estará ativa quando selecionado
    

    mas porque tenho que ativar o arquivo "dados1" para selecionar e consigo fazer o auto filtro sem ativar?

    O codigo acima foi escrito no This Workbook, mas mesmo escrevendo no Module o codigo abaixo da erro.

    ws.Range("a1").CurrentRegion.Select '<-----com esse codigo deu erro

    Tadao


    quinta-feira, 21 de maio de 2015 07:46
  • Correto Tadao, sheets, workbooks,ranges... Todos são objetos,  da mesma forma que uma palavra e um número são variáveis.... A diferença é exatamente o que cada objeto representa.... Um objeto do tipo object não invoca os métodos nem as propriedades. específicas do que eu realmente necessito... Então se eu sei qual tipo de objeto vou usar eu declaro ele mesmo. 

    Quanto a chamar um método escrito em uma sheet... Você pode chamar assim: sheets("nomedasheet").NomedoMetodo e ela deve estar como public... 

    Quanto a usar o método em outro workbooks.. Nesse caso você precisa identificar para o código em qual workbook.sheet o procedimento será realizado...

    e no erro... tenta assim e ve se roda:

    ws.Range("a1").Select


    Natan

    quinta-feira, 21 de maio de 2015 18:59
  • Mais uma vez obrigado pelo retorno Natan.

    1. Acho que entedi um pouco o que voce quis dizer com (da mesma forma que uma palavra e um número são variáveis...).Isso quer dizer que , se por exemplo declaro um a variavel como "string", essa variavel nao vai aceitar as propiedades como inteiros ou fracionarios, nao e. Assim como se declarar uma variavel como "integer",nao vai aceitar as propiedades como maiusculas ou minusculas,certo?Mas no caso da variavel "object" nao e como se fosse um diretorio e os "workbook", "worksheet", "ranges" ser o seu subdiretorio? se for assim se declarar a variavel como "object", eu estou achando que todas as propiedades dos  "workbook", "worksheet", "ranges" tambem devem aceitar.......por  favor corrija-me se o meu aciocinio estiver errado.\
    2. Quanto a sua explicacao do(Quanto a chamar um método escrito em uma sheet... Você pode chamar assim: sheets("nomedasheet").NomedoMetodo e ela deve estar como public... 
    3. Quanto a usar o método em outro workbooks.. Nesse caso você precisa identificar para o código em qual workbook.sheet o procedimento será realizado...) voce quis dizer que se por exemplo escrever os codigos no Sheet1 e quiser referir o Range("a1") do Sheet1 nao precisa adicionar nada, porem se quiser referir a mesma celula no Sheet2 teria que escrever Worksheets("Sheet1").Range("a1"), correto? e se tivesse escrito os codigos no Sheet2 para referir a uma celula do Sheet1 teria que escrever Worksheets("Sheet1").Range("a1"), e caso escrevesse os codigos em This Workbook ou Module, para referir uma celula em qualquer que seja os Sheets teria que identificar , obviamenete, de qual Workbooks("nomebook") e qual Worksheet("nomedasheet"), nao e verdade? se asim for, entao e melhor escrever os codigos numa sheet que mais tem acessos de dados para omitir nos comandos as referencias do Workbooks("nomearquivo").worksheets("nomedasheet"), nao e? Eu ainda nao entendi para que serve esse This Wokbook e Module....
    4. e no erro... tenta assim e ve se roda: .Ja tentei e nao rodou.Gostaria de frisar que o "ws" esta declarado como Woksheet como sugeriu, e coloquei na variavel "ws"  set ws= Workbooks("dados1").worksheets("sheet1") ,e rodei a rotina com o arquivo "cartao ponto" ativado pois os codigos estao escritos no This Workbook desse arquivo.

    Tadao


    sexta-feira, 22 de maio de 2015 02:15
  • A resposta dessa postagem esta no final da postagem no Microsoft Community do link abaixo .

    Agradeco ao Felipe pelo esclarecimento.

    Tadao

    http://answers.microsoft.com/pt-br/office/forum/office_2013_release-excel/como-mudar-as-caracteristicas-das-mensagens-do/b7e36c48-f765-4d3d-9cbd-25945a3e15d7

    terça-feira, 27 de outubro de 2015 00:38