Notifications
Clear all

Se um arquivo já existe, cria o arquivo(2)

11 Posts
2 Usuários
0 Reactions
3,343 Visualizações
(@wolneypk)
Posts: 188
Reputable Member
Topic starter
 

Amigos, é o seguinte:

Preciso que o Excel verifique na pasta "cliente" se o arquivo "003.xlsm" já existe.
Se ele não existir, então ele cria esse arquivo, se já existir, então ele cria o 003(2).xlsm.
Só que tem um detalhe: Se já existir o 003.xlsm e o 003(2).xlsm, ele deverá criar o 003(3).xlsm e assim sucessivamente.

Entenderam?
Acredito que seja necessário criar um loop para isso mais já estou á uns 2 dias tentando criar o código e nada...

 
Postado : 22/05/2013 12:42 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Eu faria algo assim:

Option Explicit

Public Function RetornarNomeDaPastaDeTrabalho()
Dim fso             As New Scripting.FileSystemObject
Dim oPasta          As Scripting.Folder
Dim Pasta           As String
Dim Nome1           As String
Dim Nome2           As String
Dim Cont            As Long
Dim ArquivoExiste   As Boolean

    Pasta = "W:TESTE"
    Set oPasta = fso.GetFolder(Pasta)
    
    Nome1 = "003.xlsm"
    Nome2 = "003(numero).xlsm"
    If fso.FileExists(oPasta.Path & "" & Nome1) Then
        ArquivoExiste = True
        Cont = 2
        Do
            If Not fso.FileExists(oPasta.Path & "" & VBA.Replace(Nome2, "numero", Cont)) Then
                ArquivoExiste = False
                RetornarNomeDaPastaDeTrabalho = VBA.Replace(Nome2, "numero", Cont)
                Exit Do
            End If
            Cont = Cont + 1
        Loop Until ArquivoExiste = False
    Else
        RetornarNomeDaPastaDeTrabalho = Nome1
    End If
    Set oPasta = Nothing
    
End Function

Para funcionar, crie uma referencia para o microsoft scripting runtime

 
Postado : 22/05/2013 1:06 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Faala Fernando,

Não consegui rodar a sua aqui... (tenho de fazer alguns ajustes nela, mas to meio com pressa agora)

Eu faria assim:

Option Explicit

Sub backup()
Dim i           As Long
Dim BaseFile    As Variant
Dim Pasta       As String
Dim wb          As Workbook

Pasta = "C:cliente"
Set wb = ActiveWorkbook

    If Dir(Pasta & "backup.xlsm", vbArchive) = Empty Then
        ChDir "C:cliente"
        wb.SaveAs Filename:=Pasta & "backup.xlsm"
        Else
        For i = 2 To 200
            If Dir("C:clientebackup(" & i & ").xlsm", vbArchive) = Empty Then
                ChDir "C:cliente"
                wb.SaveAs Filename:=Pasta & "backup(" & i & ").xlsm"
                Exit For
            End If
        Next i
    End If

End Sub

Qualquer coisa da o grito.
Abraço

 
Postado : 22/05/2013 1:34 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bernardo,

É pq eu criei uma função que retornará o nome adequado para o salvamento.
E usei o drive W com uma pasta de teste.

O wolneypk terá que fazer as devidas adaptações para que funcione no código dele.
wolneypk, outra opção é você subir seu arquivo desde que compactado, para podermos fazer as devidas adaptações para você.

abs,

FF

 
Postado : 22/05/2013 1:49 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Fernando Fernandes, desde 1971 tirando cartas da manga.
o/

hahahahahahahahah

Eu to aprendendo esse VBA ainda...

 
Postado : 22/05/2013 1:54 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Só uma obs quanto a Function do Fernando, para que a mesma funcione devemos habilitar em Referências a Biblioteca "Microsoft Scripting Runtime".

Bernardo, na Function criada, seria o caso só de alterar a linha que define o diretório : Pasta = "W:TESTE" para Pasta = "C:TESTE", lembrando que como a instrução está logo no inicio, se o Diretório ainda não existir dará erro.

Agora quanto a sua rotina, como está com o Titulo de "backup", imagino que seria para se criar um "Backup" ou Cópia da Pasta que estivermos trabalhando, se for isto a mesma contem alguns erros nas instruções :
Primeiro você já definiu o Diretorio na Variavel Pasta : Pasta = "C:cliente", depois colocou a instrução para verificar se o arquivo existe :

If Dir(Pasta & "backup.xlsm", vbArchive) = Empty Then - Estamos verificando se existe o arquivo de nome "backup.xlsm" na pasta "C:cliente", ok

Mas se ou não não existir, você usou a propriedade ChDir para alterar o caminho, ficando:
ChDir "C:cliente"

Mas na próxima instrução, esta definição não tem efeito, uma vez que o arquivo será salvo no caminho já definido na Variável "Pasta" e não no novo caminho "C:cliente"
wb.SaveAs Filename:=Pasta & "backup.xlsm"

Uma outra obs sobre a instrução acima, é a utilização do SaveAs, ela não Salva uma cópia e sim salva o arquivo que está utilizando com o novo nome definido em FileName, ou seja, "backup.xlsm", então se a intensão é fazer um backup do arquivo que estamos utilizando(guardar uma cópia), devemos utilizar "SaveCopyAs".

Nas outras linhas temos novamente as declarações utilizando ChDir sem necessidade, pelo menos da forma que estão, pois continuamos salvando o arquivo conforme o caminho definido na Variavel "Pasta".

Então quando utilizamos o ChDir para alterar o caminho ele já fica automaticamente alterado na memoria, sendo assim escreveríamos a instrução da seguinte forma para salvar o arquivo no novo caminho:
wb.SaveAs Filename:= "backup(" & i & ").xlsm" - sem a utilização da Variável Pasta

Não entendi o porque do For ... Next (2 to 200), se não estamos contando a quantidade de arquivos na pasta, pois desta forma a Variável "i" será sempre "2".

Nas linhas seguintes temos novamente o ChDir, lembrando que uma vez utilizado, enquanto não alterarmos novamente ela será sempre o Último Caminho Definido, então não precisamos alimenta-la novamente.

Então como o caminho já estava definido, não precisamos de declara-lo na instrução abaixo ;
If Dir("C:clientebackup(" & i & ").xlsm", vbArchive) = Empty Then
ficando sómente :
If Dir("backup(" & Cont & ").xlsm", vbArchive) = Empty Then

As linhas abaixo acredito que com a explicação acima já de para entender o porque não precisaria existirem.

Voltando a ideia de queremos fazer um "Backup" ou seja uma Cópia de Segurança do arquivo que estamos utilizando, eu sugiro a rotina abaixo :

Sub BackupMauro()

    Dim PastaBkp       As String
    Dim wb              As Workbook
    Dim Cont            As Long
    Dim ArquivoExiste   As Boolean
    
    'Definimos o Caminho para  Salvar a Cópia
    PastaBkp = "C:Backup"

    Set wb = ActiveWorkbook
    
    'Verificamos se já existe uma cópia com o nome "Backup"
    If Dir(PastaBkp & "backup.xls", vbArchive) = Empty Then
        
        'Setamos o Caminho
        ChDir PastaBkp
        
        'Lembrando que a instrução abaixo, não salva uma cópia
        'e sim salva o arquivo que estamos usando com o novo Nome
       ' wb.SaveAs Filename:=PastaBkp & "backup.xlsm"
        
        'Salva uma copia (Backup) do arquivo no caminho especificado
        wb.SaveCopyAs Filename:="backup.xls"
        
    Else
        
        'Variável se o arquivo existe
        ArquivoExiste = True
                
        'Verificamos quantos arquivos *.xls" temos na Pasta onde definimos acima
        'Para as cópias
        With Application.FileSearch
            .LookIn = PastaBkp
            .FileType = msoFileTypeExcelWorkbooks
            .Execute
            
            'Só para ilustração, pode apagar
            MsgBox (.FoundFiles.Count)
            
            'Aramzenamos a quantidade de arquivos
            Cont = (.FoundFiles.Count)
        End With
                
                'E salvamos uma Cópia com o nome "backup + o numero armazenado
                'na Variável Cont
                wb.SaveCopyAs Filename:=PastaBkp & "backup(" & Cont & ").xls"

    End If

End Sub

Na rotina acima a instrução Application.FileSearch, veja que só estamos verificando pelo tipo de arquivo (.FileType = msoFileTypeExcelWorkbooks) e não pelo nome, mas isto seria o caso de ajustar.

Não sei se fugi um pouco do assunto do tópico, mas fica ai mais uma idéia de se fazer os Backups.

[]s

 
Postado : 22/05/2013 7:18 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Vixi...
tomei uma descascada agora...

hahhahahahhaha
brincadeira Mauro... Levo tudo como uma "crítica" construtiva... aprendo demais com isso e já aprendi demaiss sobre VBA com você (esses pequenos detalhes).
Essa daí fiz gravando as macros e umas correçõezinhas... tava com pressa na hora, mas funcionou... hahahahhaha

O Fernando é outro... m;as aprendi com ele mais na comunidade...

acho que to viciando no VBA e form, agora que to prendendo... (vou acabar esquecendo as fórmulas).

Abraço

 
Postado : 22/05/2013 8:42 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Que nada Bernardo, depois de uns 10 anos a gente aprende mais um pouquinho, rsrsrsrsrs

É sempre bom ter mais colaboradores, eu ainda não conhecia o Fernando, mas só com as postagens recentes dele já aprendi mais alguns macetes, por assim dizer.

[]s

 
Postado : 22/05/2013 8:58 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Péraí que rolou uma lágrima aqui, ahauhauhauahauh

Valeu galerinha. Mas assim, nunca podemos esquecer o que o Excel pode fazer por nós, e quando é o limite para começarmos a usar o VBA.
O Excel faz muita coisa interativamente, portanto, Excel Interativo + Excel VBA = Excel Chuck Norris...

Mas Bernardo, não pode esquecer as fórmulas não, até pq, vc é um dos maiores dominadores de fórmulas que eu conheço ;-)

Saudades da época da comunidade no Orkut. Era cada arranca rabo ali, ahuahuahauah

Mauro, quem sabe, sabe! Estamos aqui todos no mesmo barco. Eu tb aprendo muito com vocês!
Ah, em tempo, eu informei da referênca lá na minha resposta, só não ensinei a fazer, não deu tempo... valeu por detalhar!

Valeu,

 
Postado : 22/05/2013 9:49 pm
(@wolneypk)
Posts: 188
Reputable Member
Topic starter
 

Então caras, tentei fazer as devidas adaptações mais acabou ficando além das minhas habilidades rsrsrs
Vejam, vou tentar explicar oq já fiz e oq estou tentando fazer e vou subir o arquivo para você verem.

É assim, estou criando um sistema de emissão de pedidos.
O funcionário insere todos os ítens e se a quantidade de ítens for superior á 21 ele divide o pedido em duas páginas. Ou seja, se o pedido tem 50 ítens, o pedido terá 3 páginas e assim por diante.
Os arquivos serão salvos na pasta com o nome do código do cliente (se o código do cliente é 003, ele salva o pedido na pasta 003)
O nome do arquivo será a data atual (yyyy - mmmm - dd)
Inseri no Modulo4 uma função que é utilizada para verificar se um arquivo ou pasta existe e ele é chamado de CaminhoExiste.
O form que estou tentando fazer tudo isso é o form Pedidos.

Bom, é isso rapazeada.
Estou subindo o arquivo, quem puder dar uma olhada, vou agradecer DEMAIS!
PS. subi ele no 4Shared pois ele tem mais de 500kb

Segue o link http://www.4shared.com/zip/YlvF-uHz/projeto_cad_clientes.html

 
Postado : 23/05/2013 9:47 am
(@wolneypk)
Posts: 188
Reputable Member
Topic starter
 

Ráááá!
Consegui cacildis!
Ufa, realmente esse foi difícil!

Olha, estudei muito o exemplo que os amigos me sugeriram, mais não consegui adaptar ele para o meu caso (acho que por burrice mesmo), então tentei adaptar da minha maneira e ele ficou assim:

O sistema inicialmente deve criar um arquivo com o nome yyyy - mmmm - dd & numero da página
Se existir apenas uma página, ele salva o arquivo como 2013 - maio - 23 (Pag1).xlsm
Caso existam mais páginas, ele cria o (Pag2), (Pag3)... e assim por diante.

Mais o grande detalhe foi esse:
Vamos supor que a pessoa emita um pedido agora com 2 páginas
2013 - maio - 23 (Pag1).xlsm
2013 - maio - 23 (Pag2).xlsm

Até ai tudo bem!
O meu problema é que se no mesmo dia, o funcionário fosse emitir mais um pedido para esse cliente, o programa iria criar um arquivo "2013 - maio - 23 (Pag1).xlsm" subscrevendo o que já existe.

O resultado final foi que ele identifica se existe um arquivo com esse nome e se tiver ele soma +1 na variável da página até encontrar um arquivo que não exista!

Obrigado á todos os mestres que se esforçaram para trazer uma luz no fim do túnel!
Ajudaram a clarear as idéias e chegar em um resultado funcional!

Vou marcar o exemplo do Mauro como Resolvido pois ali está o esforço de todos

PS. estou subindo o arquivo resolvido do 4Shared para quem quiser dar uma olhada :)
Segue o Link http://www.4shared.com/zip/w_69JQ4Y/projeto_cad_clientes2.html

Forte abraço e obrigado galera!

 
Postado : 23/05/2013 1:17 pm