Página 1 de 1

Barreiro - Analista de TI

Enviado: 05 Jul 2018 às 16:07
por betobarreiro
Usando uma rotina para executar macros de outras aplicações, me deparei com a situação descrita nos anexos.
Onde foi que eu errei ?
Por favor, tenho 3641 planilhas que utilizam a macro Emite_Etiquetas.
São utilizadas para identificar para quem vão as refeições dos pacientes do Hospital.
Cada vez que tenho de alterar a Macro tenho de alterar as 3641 planilhas.
Essa rotina seria de grande valia para mim.
A mensagem é: "Não é possível executar a macro 'Dietas do dia 01_ONCOLOGIA.xlsm!Emite_Etiquetas'. Talvez ela não esteja disponível neta pasta de trabalho ou todas as macros estejam desabilitadas."
A macro é executada normalmente nas planilhas; neste caso de chamada da macro que está em outra planilha é que ocorre o erro.
Agradeço sua atenção.

Re: Barreiro - Analista de TI

Enviado: 05 Jul 2018 às 18:40
por gfranco
Boa tarde.
Minha primeira sugestão é tentar unir tudo isso numa única base (com o power query, por exemplo) e rodar uma única macro.
Entretanto, fazendo unicamente o que vc pediu, montei o exemplo que posto no anexo.
Descompacte a pasta zipada.Nela tem 3 arquivos.
2 chamados "teste macro 1 e 2 " e outro chamado "Erro macro excel"
Com os dois primeiros fechados, abra o arquivo "Erro macro excel" e execute a macro "executarMacros" clicando no botão.
Uma janela se abrirá... selecione os 2 primeiros arquivos ( ou apenas 1) e clique em abrir.
Acredito que a leitura desta rotina será suficiente para vc reproduzir no seu cenários real.

Barreiro - Analista de TI

Enviado: 11 Jul 2018 às 17:45
por betobarreiro
Continuo recebendo a mesma msg de erro, mesmo aplicando sua recomendação.
A tabela tem senha; apliquei a senha.
Mas, não quer funcionar.

Barreiro - Analista de TI

Enviado: 12 Jul 2018 às 07:11
por gfranco
Bom dia.
Na adaptação para a sua rotina vc observou a concatenação dos apóstrofos com o nome da pasta- destino assim como eu fiz aqui ?
Application.Run "'" & wbnew.Name & "'!teste"
Observe que eu concatenei o nome da pasta-alvo com um apóstrofo no início e outro no fim.

Barreiro - Analista de TI

Enviado: 18 Jul 2018 às 12:06
por betobarreiro
Não está funcionando como esperado.
Explico:
Eu tenho várias pastas (11). Cada uma contém 31 planilhas (uma para cada dia). Dentro de cada dia, tenho 6 refeições e tenho um VBA para emissão das etiquetas.
Quando "arq" vai buscar o nome do arquivo, ele abre a pasta do dia 01 para usar a macro contida lá.
O que é preciso é que a macro do dia 01 use os dados da planilha do dia 18 que estou querendo imprimir.
Deu prá entender ? Não sei se fui claro.
Talvez, se eu te mandar duas pastas dê para entender melhor.
O que você acha ?
Muito obrigado pela atenção.

Barreiro - Analista de TI

Enviado: 18 Jul 2018 às 14:51
por gfranco
Boa tarde.
Acredito que se vc postar essa pasta de trabalho vai ficar mais claro o entendimento.

Barreiro - Analista de TI

Enviado: 20 Jul 2018 às 14:27
por betobarreiro
Boa tarde,
Como você vai ver, cada planilha tem 11 abas:
01. O que vai ser servido em cada uma das 6 refeições;
02. Planilha que a nutricionista imprime;
03 a 06 as refeições;
07. Os valores e totais do dia;
08. Planilha com o desenho das etiquetas;
09. os setores onde são entregues as refeições
No VBA está a rotina de impressão.
O problema é este: a "Oncologia" e o "SPA" contém a mesma rotina. Quero ter a possibilidade de usar a rotina da "Oncologia" no "SPA". Quando usei a rotina que você me forneceu no "SPA", o VBA abriu e executou a rotina com a tabela da "Oncologia".
Como "chamar" a rotina VBA para ser executada em qualquer planilha ?
Quando usava COBOL, ASSEMBLER ou qq outra linguagem, usava rotinas de "LOAD" e executava uma rotina.
Não dá para fazer isso também com o VBA ?
Abraços,
Barreiro

Barreiro - Analista de TI

Enviado: 20 Jul 2018 às 17:14
por gfranco
Boa tarde.
Eu baixei as planilhas e li as macros.
Na minha opinião, será muito mais produtivo estabelecer uma rotina para juntar todas as planilhas de dietas numa única base (tendo uma coluna identificadora de ala/departamento , uma coluna de tipo de dieta e uma de data para poder identificar o dia).
Depois escreve-se uma única macro pra produzir essas etiquetas...
No meu modo de ver, essa é a maneira mais sóbria de resolver. Mas deixe o tópico aberto pois tem outros colaboradores que podem ter opinião diversa da minha.
Com o power query (disponível à partir da versão 2010 do excel) a união de bases iguais é muito simples.

Re: Barreiro - Analista de TI

Enviado: 21 Jul 2018 às 22:27
por osvaldomp
betobarreiro escreveu: Como "chamar" a rotina VBA para ser executada em qualquer planilha ?
Veja se este caminho pode te ajudar.
É possível criar um arquivo Excel, de nome PERSONAL.XLSB, específico para receber macros que podem ser "chamadas" a partir de qualquer outro arquivo Excel.
O arquivo PERSONAL abre/fecha automaticamente ao abrir/fechar o Excel (ele só aparece no editor de VBA).
Então você colocaria nesse arquivo o seu atual código Emite_Etiquetas, e em seguida mudaria o vínculo dos botões existentes nas 6 planilhas de cada arquivo, que atualmente estão vinculados ao código existente em cada arquivo, para o código colocado no PERSONAL.XLSB. Após, o código Emite_Etiquetas existente em cada arquivo ficaria sem uso pois todas as etiquetas seriam emitidas via código colocado no PERSONAL.

Se você quiser testar este caminho:
Abra qualquer um dos arquivos Excel (por exemplo Dietas do dia 01_SPA.xlsm), caso ainda não exista o arquivo PERSONAL.XLSB no seu Excel (se já existe ele aparece à esquerda na janela do editor de VBA), para inseri-lo basta iniciar uma gravação de macro e na caixa de diálogo Armazenar macro em: escolher Pasta de trabalho pessoal de macros / OK, em seguida finalize a gravação. Assim o arquivo terá sido criado, aparecerá à esquerda na janela do editor de VBA e o Módulo1 conterá uma macro vazia. Basta então copiar o código Emite_Etiquetas do arquivo SPA e colar em substituição à macro vazia. O código Emite_Etiquetas do arquivo SPA pode então ser deletado.

Em seguida será necessário vincular os botões "Emitir Etiquetas" das planilhas à macro agora instalada no PERSONAL.
Se fiz a conta certa são (6 botões por arquivo) x (31 arquivos) x (12 setores) = 2.232 botões para serem vinculados, é isso?

Para facilitar preparei um código que faz a vinculação. Se quiser testar insira um novo módulo no arquivo PERSONAL (duplo clique em PERSONAL / menu Inserir / Módulo) e cole nesse novo módulo o código abaixo. Substitua no código os números 123 pela senha da planilha. Considerei que a senha é igual para as 6 planilhas (a propósito, no futuro, se for necessário disponibilizar planilhas protegidas informe a senha).
Código: Selecionar todos
Sub VinculaMacro()
 Dim f As Shape, ws As Worksheet
  For Each ws In Worksheets(Array("DESJEJUM", "09 HORAS", "ALMOÇO ", "15 HORAS", "JANTAR", "21 HORAS"))
   ws.Protect "123", UserInterfaceOnly:=True
   For Each f In ws.Shapes
    If f.Type = 1 Then f.OnAction = "PERSONAL.XLSB!Emite_Etiquetas"
   Next f
 Next ws
End Sub
Salve e feche o Excel, salve também o PERSONAL. Reabra o arquivo SPA, aperte Alt + F8, escolha VinculaMacro / Executar, em seguida faça o teste com a macro Emite_Etiquetas clicando no botão "Emitir Etiquetas" em cada uma das 6 planilhas.

Se o resultado for o esperado aí é só rodar o código VinculaMacro nos demais trocentos arquivos. Se os nomes dos trocentos arquivos seguem alguma máscara então é possível incrementar o código VinculaMacro para que ele abra cada um dos arquivos e faça a vinculação.

Barreiro - Analista de TI

Enviado: 23 Jul 2018 às 15:48
por betobarreiro
Vou testar sua sugestão. Acho que funciona. Breve retorno.
P.S. Desculpe pela senha; é nanu, de Núcleo de Apoio à Nutrição.

Barreiro - Analista de TI

Enviado: 24 Jul 2018 às 13:21
por betobarreiro
FUNCIONOU !!! :D
Obrigado Osvaldomp.
Vou procurar responder a alguns tópicos da turma.
Acho que minha experiencia com Excel pode ajudar alguém.
Tenha um bom dia.
Até a próxima.