Notifications
Clear all

COMO ESCOLHER DESTINO CÓPIA COM 2 CONDIÇÕES??

16 Posts
2 Usuários
0 Reactions
3,683 Visualizações
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Boa noite a todos,

Necessito de uma ajuda numa aplicação que desenvolvi para copiar endereços de ficheiros de acordo com uma Ordem inserida, copiando de uma origem para o respetivo destino.
A ideia é copiar os ficheiros de uma pasta de um material, associado à Ordem inserida, para o destino correspondente de uma máquina para se produzir esse material!

Neste momento tenho duas dúvidas que não estou a conseguir continuar no código já desenvolvido...

A primeira e mais importante dúvida que tenho é a seguinte:
- Quando tenho 1 único material, que pode ir para 2 destinos de endereços diferentes, como devo proceder para o utilizador escolher a máquina de destino a copiar os ficheiros desse mesmo Material?
Ou seja, 1 material pode ser produzido em 2 máquinas e queria a seleção do destino fosse feita pelo operador, ou seja, que aparecesse uma msgbox ou um UserForm com as máquinas encontradas para o material e o utilizador conseguir escolher se era a primeira que aparece ou então aparecer todas as máquinas para produzir o Material e escolher qual a correta?
Tenho dúvidas de como proceder para esta seleção.
Alguém pode ajudar?

A segunda dúvida:
Vai de encontro com o facto de ao copiar os ficheiros para a pasta da máquina, aconteceu-me já por 2 vezes, apagar a pasta da máquina, e não apenas o conteúdo no interior da pasta.. eu já tenho o código desenvolvido para eliminar o conteúdo, mas acho que o por ter duplicado em diferentes linhas, pode estar associado a não se encontrar na linha correta de compilação do código.. Podem pf aclarar-me posteriormente essa opção e local do código já desenvolvido? (identifiquei com comentários essa linha)

O meu muito obrigado!

Em anexo envio o ficheiro com o código já desenvolvido..
Para entrar no ficheiro basta selecionar o botão "Entrar" no canto inferior direito e Confirmar..
Tenho como teste para seleção a Ordem 1035200.

O meu obrigado desde já a quem me conseguir dar ideias e ajudar nestas dúvidas!!

Cumprimentos para todos!
Pedro Santos

 
Postado : 04/07/2017 2:55 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Já desenvolvi um pouco mais o código, e cheguei no ponto de aparecer uma Msgbox ao encontrar 1 material e a 1ª máquina associada ao mesmo.
O erro que estou a obter é que se existir apenas um material para uma só máquina, aparece, sim a Msgbox, mas em caso de a Máquina estiver mal atribuída e o operador selecionar a resposta à Msgbox: "NÃO", ele continua copiando os dados para a pasta corresponde à Máquina selecionada..
Só funciona para materiais duplicados, no caso de k=3, quando coloco resposta2 que não, coloquei a função "Exit SUB"..
Abaixo o código:


    'OEC PARA LINKS
    Dim k           As Double: k = 1
    Dim resposta As Integer
    Dim resposta2 As Integer
Nlinh = WLk.Range("B1").End(xlDown).Row
    
    For j = 2 To Nlinh
    
        Pn = Trim(UCase(WLk.Range("B" & j).Value))
        
        
        'Verifica se é similar
        VFF = Pn Like Material
        
        'Se VF for verdadeiro
        If VFF = True Then
            
            Cami = Trim(UCase(WLk.Range("C" & j).Value))
            Dest = Trim(UCase(WLk.Range("E" & j).Value))
            Maq = Trim(UCase(WLk.Range("D" & j).Value))
            k = k + 1
            
            MsgBox "Encontrou PN no Separador LINKS !!!! -  " & Dest & k, vbExclamation, "Aviso do PN na Base de Dados - LINKS"
        
'####CREIO QUE AQUI TERÁ DE SER CRIADA A CHAMADA PARA SE MATERIAL TIVER DUAS MAQUINAS O OPERADOR ESCOLHER SE É ESSA.. SE FOR CONFIRMA E COPIA, SENÃO CONTINUA ATÉ APARECER PROXIMA MAQUINA E CONFIRMA..
'#### SE NÃO FOR NENHUMA DAS DUAS, SAI FORA DO CICLO E NÃO COPIA NEM ELIMINA CONTEUDOS DAS PASTAS DAS MAQUINAS
            
            If k = 2 Then
                resposta = MsgBox("Confirma que a Máquina a carregar o programa é a: " & Maq & "?", vbYesNo + vbQuestion, "Empty Sheet")
                If resposta = vbYes Then Exit For
                'If resposta = vbNo Then Exit Sub ' AO SELECIONAR NÃO ELE NÃO CONTINUA A ANALISAR SE EXISTE OUTRA MÁQUINA PARA O MATERIAL.. :(
            End If
            
            If k = 3 Then
                resposta2 = MsgBox("Confirma que a Máquina a carregar o programa é a: " & Maq & "?", vbYesNo + vbQuestion, "Empty Sheet")
                If resposta2 = vbYes Then Exit For
                If resposta2 = vbNo Then Exit Sub
            End If
        End If
                
    Next j

Alguém com ideias/sugestões para este problema :?: :?:

Em relação ao ponto 2, verifico que se estiver com a pasta aberta, ele elimina-me a pasta CNC01, quando pretendia apenas que me eliminasse o conteúdo dentro da pasta..
Abaixo o código:

FromPath = Cami
    ToPath = Dest

    Set fso = CreateObject("scripting.filesystemobject")
    If Right(FromPath, 1) = "" Then
        FromPath = Left(FromPath, Len(FromPath) - 1)
    End If

    On Error Resume Next
    
'##### Onde colocar o código para eliminar os ficheiros já existentes na pasta da Máquina??
    'AQUI??
        fso.DeleteFolder (ToPath)
        Set fso = Nothing
    
    If Right(ToPath, 1) = "" Then
        ToPath = Left(ToPath, Len(ToPath) - 1)
        On Error Resume Next
'#### OU AQUI?? POIS NUM EXEMPLO QUE TESTEI ELIMINOU POR COMPLETO A PASTA CNC_01 E NÃO APENAS OS FICHEIROS NO INTERIOR
        'fso.DeleteFolder (ToPath & "")
       ' Set fso = Nothing
    
    End If
    
    Set fso = CreateObject("scripting.filesystemobject")
    If fso.FolderExists(FromPath) = False Then
        MsgBox FromPath & "Não Existe Ligação - Verifique se Introduziu o número correto!" & vbCrLf & vbCrLf & "Em caso de dúvida, contactar Pedro Santos - Z11048" & vbCrLf & "Pode enviar Mail, através do Botão Enviar E-Mail no Menu Principal", vbCritical, "Erro no Endereço"
        Exit Sub
    End If

'## AQUI NAO ELIMINOU
    'On Error Resume Next
    'fso.DeleteFolder (ToPath)
    'Set fso = Nothing

    fso.CopyFolder Source:=FromPath, Destination:=ToPath
    MsgBox "Já pode encontrar os Ficheiros do endereço: " & FromPath & " no Endereço: " & ToPath & vbCrLf & vbCrLf & "Programa na Máquina:  " & Maq, vbInformation, "Programas em Máquina - " & Maq

    Application.ScreenUpdating = True

Algumas ideias? :idea:

Em anexo coloco o ficheiro já disponivel com a programação acima atualizada!
Obrigado pela atenção!

 
Postado : 05/07/2017 4:44 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde Pedro,

Explique mais sobre qual seria a sequência dos eventos. De qual célula para qual célula, de planilha para planilha...

att,

 
Postado : 06/07/2017 12:05 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Olá grande Bruno,

Antes de mais, obrigado pela sua atenção a este post!

Em conclusão, o pretendido é um operador, colocar o número de uma ordem de produção que tem de fazer numa máquina e passar para a pasta da máquina(pasta destino) os ficheiros associados ao material a ser produzida (pasta origem). Existem no Total 6 máquinas em Produção!
Criei apenas os formulários, para melhorar a apresentação e não ser necessário utilizador abrir diretamente o excel.

Então, na planilha Pedro, aparece apenas a ordem de produção inserida pelo operador.
Após Modificação do Valor da Célula B3, da planilha Pedro, que contém a Ordem de Produção, eu chamo a macro 1.
Esta Macro, vai procurar a Ordem inserida pelo operador na céula B3, planilha "Pedro", na planilha "BDadosOEC", e após encontrar pega o Material associado à ordem.
Como a Ordem é gerada de um sistema informático, eu extraio todas as ordens e materiais ligados às Ordens e coloco-os numa tabela, que servirá como uma base de dados da minha Obra em Curso de Produção.
Campos: ORDEM || MATERIAL... || QTD..||...

Depois de ter guardado o Material numa variável, vou à planilha "LINKS" procurar o mesmo Material e pegar a Pasta de Origem (onde tem tem os ficheiros do Material) e a pasta de destino (pasta da Máquina associada ao material), que acaba por ser também uma Base de Dados de Materiais & Endereços.

Após pegar estes valores e confirmar a Máquina, pretendo que Elimine os ficheiros que estejam no interior da Pasta da Máquina de destino (e não a pasta da máquina, como por vezes, sem perceber, me acontece) e Copiar de seguida os valores da pasta de Origem para a pasta da Máquina (para o operador da máquina chamar esses programas no CPU da máquina, e produzir o material correspondente à ordem).

Este código até aqui já o tenho bastante desenvolvido, contudo, estou-me debatendo na prática com as duas questões mencionadas no 1ª post:
Em casos que 1 material possa ser produzido em duas máquinas diferentes, tipo Material A, pode ser produzido na Máquina 1 e na Máquina 3, como possibilitar ao operador selecionar a máquina correta(neste caso a pasta de destino correcta)?
Eu tentei com uma MsgBox, mas se clicar que não, quando existe apenas uma máquina, ele copia-me na mesma os ficheiros do Material e não estou a conseguir contornar isso aí... (Usar algum UserForm com as maquinas que encontrar e deixar utilizador escolher?)
Depois a outra dúvida é se realmente o código para eliminar o conteúdo no interior da pasta de destino se encontrar correctamente implementado, pois já me aconteceu ter a pasta aberta e ao compilar o código, eliminar a pasta do própria Máquina!

Grato se me puder esclarecer e qualquer outra dúvida disponha!

Um grande abraço! :) :)

 
Postado : 06/07/2017 2:16 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Bruno, se tiver mais alguma dúvida pf coloque..
Já fiz alguns testes, mas ainda não consegui solucionar os problemas mencionados!

Obrigado e um abraço!

 
Postado : 10/07/2017 7:30 am
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Continuo sem conseguir e necessito mesmo de ajuda no codigo que desenvolvi..
Continua a aparecer msgbox msm que seja um programa para uma máquina apenas...
Necessito de implementar este código.
Alguem me consegue ajudar?

 
Postado : 24/07/2017 2:36 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa noite Pedro,

Anexe uma dessa planilha que recebem a informação, ou seja, uma dessas planilhas que estão em 'Endereço' e 'Destino'.

att,

 
Postado : 31/07/2017 3:59 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Boa noite Pedro,

Anexe uma dessa planilha que recebem a informação, ou seja, uma dessas planilhas que estão em 'Endereço' e 'Destino'.

att,

Olá Bruno,

O pretendido é copiar os ficheiros todos de uma pasta para outra, como exemplo abaixo:

Origem:
C:UsersPedro SantosDesktopPNPN_1 C:UsersPedro SantosDesktopMáquinasCNC_01
Destino:
C:UsersPedro SantosDesktopPNPN_2 C:UsersPedro SantosDesktopMáquinasCNC_02

Nessa pasta posso ter ficheiros .xls .txt ou .h (que são os programas para as máquinas);

De momento o código já está copiando todos os ficheiros dentro da pasta de origem, para a pasta de destino, mas nem sempre elimina o conteúdo que já existir de um ficheiro copiado anteriormente (ou seja, deverá eliminar todo o conteudo da pasta antes de colar copia, de forma a não ter ficheiros duplicados ou programas misturados na pasta de destino).

 
Postado : 31/07/2017 4:17 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde Pedro,

No caso eu quero saber o que se deve copiar e como é esse arquivo que vai receber o que foi copiado.
No caso é copiar um Arquivo (Workbook) de uma pasta para outra?

att,

 
Postado : 01/08/2017 11:35 am
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Olá Bruno,

De momento, o pretendido é copiar todos os arquivos!
Caso não seja possível, que copie os que tenham extensão: .h (que são os programas dentro da pasta que compilam nas máquinas)
Por exemplo, copiar todos os arquivos do endereço: PN/PN1/

Para a pasta de destino:

Cujo resultado final pretendido seria este:

Se voce entrar no meu ficheiro, na opção "entrar" e novamente "entrar":

poderá ver que ele já está copiando os ficheiros de uma pasta para a outra, independentemente da sua extensão.
O que nem acontece é apagar os ficheiros da pasta de destino, quando já existem outros anteriores lá. Ou seja, o código deve apagar primeiro os ficheiros dentro da pasta CNC/01 e só depois copiar os ficheiros da origem para essa pasta!
O que me estava acontecendo por vezes, é que ele apagava a propria pasta CNC01 e não apenas os ficheiros no seu interior!

 
Postado : 01/08/2017 2:12 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde Pedro,

Olhando seu problema montei um código que acredito que faça o que você precisa. Verifique o Módulo2 no arquivo em anexo.

Eu coloquei uma InputBox para que o usuário coloque um número referente a pasta de destino.
Depois notei que colocar um ListBox seria melhor, porém não montei.
Deixei no código alguns comentários, assim você pode entender melhor o que fiz.

Teste e dê retorno.

att,

 
Postado : 11/08/2017 11:59 am
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Olá Bruno,

Antes de mais, o meu muito obrigado por ter tido a atenção do meu projecto. :D
Testei logo o código desenvolvido e sim, funciona para um dos problemas que tinha:
Como operador selecionar a máquina de destino se 1 peça pode ser produzida em 2 máquinas (ou +)!
E também apagou somente o conteúdo no interior da pasta de destino! :)
Agora reparei que se for apenas 1 programa para uma máquina, ou seja, introduzindo a Ordem 1035201 ou 1035203, aparece um erro:

"Tipos incompativéis" no seguinte código:

Trecho que deleta os arquivos da pasta de Destino
    Dim Deletar As String
    Deletar = CStr(NLinksD(Mover) & "*")   '- ->> Esta é a linha que aparece o erro!!
    'Comando para deletar todos os arquivos de uma pasta especificada.
    On Error Resume Next
    Kill (Deletar) 

Sabe do que se pode tratar?

Relativamente ao ponto de melhoria que falou acima:
Ou seja, o seu input box funciona... Já agora o listbox que mencionou pode mostrar algum exemplo de como pensaria montar para no futuro eu trabalhar nela?

Muito obrigado e um abraço.

 
Postado : 11/08/2017 12:47 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde Pedro,

Esqueci de adicionar um valor a variável 'Mover' no Select Case. Veja essa nova versão do arquivo.

Sobre a minha sugestão é: Pegar os valores das variáveis (links) -> Jogar na Planilha -> Chamar em um ListBox -> O usuário seleciona o caminho -> O que foi selecionado no ListBox vai para uma variável -> Continua o código.

Para você estudar tem vários links na internet. Tem esse por exemplo: http://www.macoratti.net/13/10/vba_xlsqry.htm
Essa explicação gostei bastante: https://programacaopassoapasso.wordpres ... lecionado/

att,

 
Postado : 11/08/2017 3:03 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Olá Bruno,

Está ótimo, apenas acrescentei a Condição IF no Case 2, pois dava erro se colocasse cancelar a opção. Também se fechasse a janela, ou não escrevesse nenhum numero aparecia a Msgbox de ficheiros Transferidos, quando na verdade não se encontravam transferidos.

 Case 2
             Mover = InputBox("Escreva 1 para a pasta ser movida para:" _
                            & NLinksD(1) & vbCrLf & vbCrLf & " Escreva 2 para a pasta ser movida para: " & NLinksD(2))
                            If Mover = "" Then Exit Sub

De resto testei e está funcionando direitinho, falta apenas testei na prática!! :D

Em relação à ListBox, teria de fazer um ciclo For e desistir do CASE 2?
Ou caso fosse CASE 2, incluía lá dentro o Ciclo For, para percorrer todas as colunas com o Material e gravar em variáveis diferentes na coluna que tem a pasta de destino para copiar os ficheiros?
Se percebi a ideia posterior seria Pegar nessas variáveis e colar elas numa outra planilha, na mesma coluna e linhas seguidas.
Depois criava uma Textbox a aparecer esses endereços e o utilizador selecciona 1 apenas e depois confirmava a pasta de destino do mesmo era isso?
Pelos exemplos apenas aparece como criar Listbox e tenho aqui ainda a dúvida dos For/Case e do processo..

Obrigado! Valeu!

Um abraço!

 
Postado : 12/08/2017 4:32 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde Pedro,

Alterei o código e coloquei numa ListBox para ser escolhido o destino.

Teste e dê retorno.

att,

 
Postado : 16/08/2017 3:10 pm
Página 1 / 2