Notifications
Clear all

Atualizar Módulos Automaticamente

8 Posts
2 Usuários
0 Reactions
2,235 Visualizações
(@pauloczc)
Posts: 0
New Member
Topic starter
 

Boa tarde,

Tenho um certo número de planilhas que são compartilhadas na empresa onde trabalho. Estas planilhas fazem uso de macros em comum (macros genericas), portanto essas macros ficam salvas na pasta PERSONAL de cada computador, justamente para poder servir para várias planilhas. Porém, muitas vezes tenho que fazer modificações nessas macros, de acordo com novas necessidades da empresa. Neste ponto é que preciso de ajuda. Atualmente, toda vez que atualizado alguma macro, tenho que ficar entrando em cada computador e importando manualmente a macro atualizada para a pasta personal de cada um dos computadores da empresa. Preciso criar um sistema automático para quando as planilhas fossem abertas, elas automaticamente atualizariam os módulos que contém as macros que precisam ser atualizadas. Esses módulos eu deixo compartilhados em uma pasta da rede interna da empresa, portanto precisaria que o arquivo do excel quando fosse aberto, automaticamente puxasse o módulo atualizado para dentro do arquivo excel, substituindo o módulo anterior.

Alguém sabe como automatizar esse tipo de trabalho?

 
Postado : 25/12/2017 2:20 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Paulo, não sei se tem como atualizar o "Personal", mas no link abaixo tem várias rotinas para se lidar como os módulos, desde deletar modulo, deletar somente a macro, criar novo modulo, substituir modulo ou macro, de uma olhada, lembrando que alem de a opção de habilitar macro tem de estar habilitada tem de habilitar "confiar no projeto".

http://www.cpearson.com/excel/vbe.aspx
Operations Described On This Page

Adding A Module To A Project
Adding A Procedure To A Module
Copy A Module From One Project To Another
Creating A New Procedure In A Code Module
Creating An Event Procedure
Deleting A Module From A Project
Deleting A Procedure From A Module
Deleting All VBA Code In A Project
Eliminating Screen Flicker When Working With The Visual Basic Editor
Exporting A VBComponent To A Text File
Listing All Procedures In A Module
Reading A Procedure Declaration
Renaming A Module
Searching A Module For Text
Testing If A VBCompoent Exists
Total Code Lines In A Component
Total Code Lines In A Project
Total Lines In A Project
Workbook Associated With A VBProject

[]s

 
Postado : 26/12/2017 5:51 am
(@pauloczc)
Posts: 0
New Member
Topic starter
 

Muito obrigado pelo link Mauro!!!!

Com certeza este link vai ajudar mto... Pena que não sou intendido de programação, faço essas programações em VBA apenas com o que aprendi sozinho pela internet.

Pelo que vi neste link, o item "Copy A Module From One Project To Another" serve para o que preciso, porém invés de copiar o modulo a partir de um arquivo, eu teria que copiar o modulo a partir de uma pasta. Vou analisar melhor e ver o que consigo.

Por enquanto deixarei em aberto a discussão, caso alguém ja tenha uma solução.

 
Postado : 26/12/2017 6:14 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Paulo como citei acima, não tenho a certeza quanto a alteração via macro no arquivo "Personal", aqui no serviço não temos a cesso para testar, mas segue um exemplo onde utilizo rotinas já conhecidas para abrirmos um determinado arquivo e altera-lo, então ajustei para que abra, e supondo que este já tenha um modulo chamado "Módulo1" cria-se a macro no mesmo, salva e fecha.
Pelas dicas do site indicado, como disse que já existe a macro, você pode-usar a opção de deleta-la e criar nova ou ver qual fica melhor, la tem várias opções.
Para testar, descompacte o arquivo em uma mesma Pasta, ou altere o caminho na rotina.

Lembre-se que tem de habilitar a referencia "Microsoft Visual Basic for Applications Extensibility 5.3" e confiança no projeto
Criar Macro em Modulo de outro arquivo

[]s

 
Postado : 26/12/2017 8:08 am
(@pauloczc)
Posts: 0
New Member
Topic starter
 

Mauro,

Fiz uns testes aqui com essas planilhas que me mandou em anexo, e reparei que essa macro ADICIONA um procedimento ao MODULO1 (sendo que este "MODULO1" ja tem que estar criado na pasta de destino). Porém, essa macro não apagou outros procedimentos que já estavam no MODULO1 do arquivo de destino, ou seja, ele vai adicionando procedimentos, e não substituindo procedimentos. Você conseguiria corrigir isso para mim?

Outra coisa, em relação a fazer esse processo na pasta PERSONAL, simplesmente teríamos que alterar o caminho, pois as macros gravadas ficam em um arquivo chamado PERSONAL, e esse arquivo fica em um caminho a principio oculto no windows, mas aqui eu ja tirei do modo oculto. O caminho da planilha PERSONAL é "C:UsersPauloAppDataRoamingMicrosoftExcelXLINÍCIO". Você conseguiria acertar essa macro sua para fazer a SUBSTITUIÇÃO de mais de um MÓDULO com todos os PROCEDIMENTOS que estão dentro de cada módulo?

Aqui eu uso em torno de 8 módulos com vários procedimentos dentro de cada um. Separo os procedimentos relacionados dentro dos mesmos módulos. Eu teria que fazer a substituição de todos os modulos dentro da planilha chamada PERSONAL que fica no caminho indicado ali em cima, que é o caminho padrão do excel (não fui eu que escolhi).

Lembrando, a planilha PERSONAL fica neste caminho "C:UsersPauloAppDataRoamingMicrosoftExcelXLINÍCIO" e os módulos dentro do servidor compartilhado ficam neste outro caminho "X:EstoqueESCOLAS"

Não sei se ficou muito confuso para vc entender. Como eu não entendo muito de programação então eu me perco um pouco quando chega nesse nivel de complexidade, mas pelo que notei não parece estarmos muito longe de ser possível fazer isso.

 
Postado : 26/12/2017 9:41 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Paulo, para evitar de se criar macros repetidas, usamos a rotina para deletar antes e depois recria-la, quanto ao caminho da pasta é só alterar onde está indicado, então para a questão de Deletar a existente, criar a nova e alterar o caminho fiz o ajuste das instruções, como já temos os arquivos anexos vou postar somente as rotinas e você substitui :

Ressaltando, que dependendo da versão do excel o arquivo Personal tem extensão diferente, se estiver usando da v 2007 pra cima o arquivo é "PERSONAL.XLSB" se 2003 é "PERSONAL.XLS", na rotina está "XLSB".
Obviamente, após trocar as rotinas, você não conseguirá testar mais com o arquivo modelo que enviei, ou terá de coloca-lo na mesma pasta onde está indicado na rotina.

Faça BACKUP antes de seus arquivos para evitar problemas e poder restaura-laos

Não entendi quando diz "e os módulos dentro do servidor compartilhado ficam neste outro caminho "X:EstoqueESCOLAS", está se referindo a arquivos ?

Uma outra coisa, o caminho que passou se refere ao seu PC, e pelo que li, cada PC tem um arquivo PERSONAL ? ou todos acessam somente o PERSONAL no caminho que citou ? Se cada PC tiver um arquivo PERSONAL terá de alterar os caminhos, podendo te-los nas celulas do arquivo e fazer um LOOP.

Primeiro adicionamos a rotina que irá deletar a macro existente

Sub DeleteProcedureFromModule()
        Dim VBProj As VBIDE.VBProject
        Dim VBComp As VBIDE.VBComponent
        Dim CodeMod As VBIDE.CodeModule
        Dim StartLine As Long
        Dim NumLines As Long
        Dim ProcName As String
        
        Set VBProj = wbCadastro.VBProject
        Set VBComp = VBProj.VBComponents("Módulo1")
        Set CodeMod = VBComp.CodeModule
    
        ProcName = "HelloWorld"
        With CodeMod
            StartLine = .ProcStartLine(ProcName, vbext_pk_Proc)
            NumLines = .ProcCountLines(ProcName, vbext_pk_Proc)
            .DeleteLines StartLine:=StartLine, Count:=NumLines
        End With
    End Sub

Troque a Macro por esta :

Public Sub DefineCaminhoEArquivo()
    Dim abrirArquivo As Boolean
    Dim wb As Workbook
    Dim caminhoCompleto As String
    Dim ARQUIVO_DADOS As String
    Dim PASTA_DADOS As String
    
    abrirArquivo = True
    
    'Nome do Arquivo
    'Altere para o nome que está usando
    'ARQUIVO_DADOS = "PERSONAL.XLS" ' - versão Excel 2003
    
    ARQUIVO_DADOS = "PERSONAL.XLSB" ' - versão Excel 2007-2016
    
    'Caminho da pasta onde está o arquivo
    'Estamos indicando que os dois arquivos estão na mesma pasta
    'Ajuste para onde estiver o seu arquivo
    'PASTA_DADOS = ThisWorkbook.Path '- se os arquivos estivessem na mesma pasta
    
    'Caminho da pasta PERSONAL
    PASTA_DADOS = "C:UsersPauloAppDataRoamingMicrosoftExcelXLINÍCIO"
    
    If ThisWorkbook.Name <> ARQUIVO_DADOS Then
        'monta a string do caminho completo
        If PASTA_DADOS = vbNullString Or PASTA_DADOS = "" Then
            caminhoCompleto = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, vbNullString) & ARQUIVO_DADOS
        Else
            If Right(PASTA_DADOS, 1) = "" Then
                caminhoCompleto = PASTA_DADOS & ARQUIVO_DADOS
            Else
                caminhoCompleto = PASTA_DADOS & "" & ARQUIVO_DADOS
            End If
        End If
        
        'verifica se o arquivo não está aberto
        For Each wb In Application.Workbooks
            If wb.Name = ARQUIVO_DADOS Then
                abrirArquivo = False
                Exit For
            End If
        Next
        
        'atribui o arquivo e abrimos com a opção de somente leitura falso para poder salvar
        If abrirArquivo Then
            Set wbCadastro = Workbooks.Open(Filename:=caminhoCompleto, ReadOnly:=False)
        Else
            Set wbCadastro = Workbooks(ARQUIVO_DADOS)
        End If
    Else
        Set wbCadastro = ThisWorkbook
    End If
    
    'Exibe o arquivo aberto
    'se quiser oculto troque para "False"
    wbCadastro.Windows(1).Visible = True
    
    'Deletamos antes a Macro já existente
    Call DeleteProcedureFromModule
    
    'criamos o novo procedimento
    'pode usar a rotina para deletar a macro existente e adicionar a nova
    Call CreateProcedure
    
    'Fechar o arquivo e salvar
    'Call FechaArquivo
    
End Sub

[]s

 
Postado : 26/12/2017 11:11 am
(@pauloczc)
Posts: 0
New Member
Topic starter
 

Mauro Coutinho

Cara, somente agora voltei a trabalhar nisso. Tirei férias no final do ano e logo depois que voltei ja tive uma semana bem corrida.

Infelizmente não consegui fazer nada com sua ajuda até agora. Pode ser que eu não tenha me expressado muito bem então não ficou claro o problema, ou eu mesmo que não tenho conhecimento suficiente para entender a rotina criada por você.

A questão é a seguinte: eu tenho 7 MODULOS criados:

"Ajustar_Resumo_Corte"
"Contatos_Gmail"
"Correções"
"Est_Unif_Esc"
"Link_ResumoCorte_EstoqueUnif"
"Shapes_1"
"Shapes_2"

Estes modulos ficam armazenados na pasta PERSONAL de cada computador que fará uso desses módulos. Toda vez que faço alterações nesses módulos, então jogo os módulos atualizados dentro de uma pasta compartilhada no servidor da empresa (la ficam todos os módulos, porém só atualizo os necessários). Portanto, preciso de uma macro na qual quando for rodada dentro do computador do usuario final, essa macro deverá pegar a pasta PERSONAL do proprio computador, deletar os 7 modulos existentes ali dentro, e então substituir pelos mesmos 7 módulos que estão na pasta compartilhada no servidor, independentemente se o modulo foi atualizado ou nao, a macro que estamos criando precisa atualizar todos os 7 modulos para garantir sempre que o computador esteja trabalhando com a ultima versão modificada.

Creio que agora ficou mais claro a problematica, e pelo pouco que entendi da rotina criada, não me parece que ela vai conseguir fazer isso. Caso seja mais fácil, eu poderia colocar essa rotina que estamos criando (este novo módulo que poderia ser chamado de ATUALIZAÇÃO DE MACROS), também dentro da pasta personal de cada computador.

Caso vc ou alguem conseguir resolver isso para mim, por favor, envie o módulo pronto com as rotinas necessarias pois eu não tenho conhecimento suficiente de programação e não consigo entender as funções que estão sendo usadas ;) . O meu conhecimento se resume a usos internos do excel, sem caminhos/pastas e arquivos externos. Somente deixe indicado onde tenho que inserir o caminho da pasta do servidor onde contém os modulos que devem ser "puxados" para atualizar a pasta personal, bem como o caminho da propria pasta personal do computador do usuario final.

 
Postado : 06/01/2018 6:03 pm
(@pauloczc)
Posts: 0
New Member
Topic starter
 

Boa tarde,
Dei uma fuçada na pagina indica pelo Mauro Coutinho e descobri que na verdade o código para suprir minha necessidade é bem mais simples que o caminho que ele estava seguindo. Ou seja, como quero substituir módulos e não procedimentos dentro de módulos, então o processo se torna mais simples.

Estou deixando em anexo a solução que encontrei para fazer o que preciso.

Tenho certeza que este processo poderia ser ainda mais simplificado, tanto através de loops como também através simplesmente do comando sobrescrever (neste caso não precisaria mandar deletar os módulos para depois recolocar, poderia apenas mandar carregar os módulos que quero sobrescrevendo os quais possuem mesmo nome). Mas enfim, com meu pouco conhecimento na área considero que já fiz um grande feito. Com certeza isso não seria possível sem a ajuda do amigo Mauro.

Agradeço enormemente a ajuda obtida e peço desculpas caso eu tenha causado algum transtorno pela falta de conhecimento.

Grande abraço.

 
Postado : 11/01/2018 11:04 am