ALTERANDO NOME IDENTICO NO SALVAMENTO

PABLOMOREIRAGV 12/02/2015 14:50:24
#444479
Olá pessoal

Tenho que um arquivo em excel com um botão que faz a exportação de uma planilha em PDF, onde o usuário informa o nome do arquivo e local onde o mesmo será salvo. Porém, se o usuário informar um nome de arquivo já existente, ele obviamente não é gerado.
Diante disso, preciso que este código quando identificasse que o nome do arquivo que o usuário informou, já existe no destinho que em ele escolheu, este mesmo nome seja alterado automaticamente.
Ex: O usuário salvou o primeiro arquivo com o nome TESTE. Ao salvar o segundo arquivo de mesmo nome no mesmo destino altera-se o nome para TESTE(1)...o terceiro TESTE(2)... etc.
Estou postando uma planilha modelo em anexo. Alguém pode me ajudar? Desde já agradeço.

Obrigado,
Pablo Moreira
TUNUSAT 13/02/2015 09:35:12
#444498
PABLOMOREIRAGV,

Você precisa verificar antes de disparar:
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
nome + [Ô].pdf[Ô], Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
False


Se o arquivo existe:
=========================================================================
Verificar se um Arquivo ou Caminho Existe
http://www.ambienteoffice.com.br/officevba/verificar_se_um_arquivo_ou_caminho_existe/
=========================================================================
Sub Teste()
Dim s As String

s = [Ô]c:    emp    este.xlsx[Ô]
If CaminhoExiste(s) Then
MsgBox [Ô]O caminho ou arquivo [ô][Ô] & s & [Ô][ô] existe e é válido.[Ô] _
, vbInformation _
, [Ô]Informação[Ô]
Else
MsgBox [Ô]O caminho ou arquivo [ô][Ô] & s & [Ô][ô] não existe ou é inválido.[Ô] _
, vbCritical _
, [Ô]Erro[Ô]
End If
End Sub

Function CaminhoExiste(sCaminho As String) As Boolean
[ô]Testa se um caminho ou arquivo existe (ou é válido)

[ô]Caso deseja testar se um caminho existe, certifique-se que o
[ô]parâmetro de entrada sCaminho TERMINE com uma \, como, por
[ô]exemplo, Debug.Print CaminhoExiste([Ô]c:    emp\felipe\[Ô]). Caso
[ô]contrário, a função buscará um arquivo chamado felipe, sem
[ô]extensão, na pasta c:    emp.

If Dir(sCaminho) = vbNullString Then
CaminhoExiste = False
Else
CaminhoExiste = True
End If

[ô]A forma abreviada da função pode ser escrita como:
[ô]CaminhoExiste = Dir(sCaminho) <> vbNullString
End Function


Se não existir tudo bem.

(agora entra recursividade)
Se existir você precisa verificar se o último caractere é um número.
Se for um número, verifique se o penúltimo caracter é um número (para casos de valores 10 ou maiores).
Se for um número, verifique se o penúltimo caracter é um número (para casos de valores 100 ou maiores).
... e assim até encontrar um letra, o primeiro caracter do nome do arquivo ou a [Ô]\[Ô].

Pega o número encontrado e soma mais um ...
... anexa ao nome do arquivo e manda gravar!


é isso?

[][ô]s,
Tunusat.
PABLOMOREIRAGV 13/02/2015 10:25:16
#444503
TUNUSAT,

Tentei adaptar esse código ao arquivo modelo que postei, parece que está identificando o caminho mesmo. Porém, não sei executar esta implementação referente a alteração automática do nome que você sugeriu.
Segue anexo modelo com o código adaptado.
TUNUSAT 13/02/2015 16:46:26
#444508
PABLOMOREIRAGV,

O legal seria montar uma função à parte que recebe uma string que é o nome sem a extensão, trata e depois devolve formatado.
Este código que eu postei verifica se o trecho apresentado é composto de um número.
=====================================================
SOMENTE NUMEROS
http://vbmania.com.br/index.php?modulo=detalhe&id=8652
=====================================================
Dai você vai lendo o arquivo de trás para frente pegando a raspa da mandioca...

... vou colocar uma função que fiz às pressas ...
... mudei de [Ô].PDF[Ô] para [Ô].TXT[Ô] só para ficar mais fácil para eu testar ...
... por favor melhore-a:
Function Renomeia(strNome As String) As String
[ô]TEM variáveis d+ acho que dá para melhorar!
Dim strCaracter As String
Dim strCaracterAnterior As String
Dim strNovoNome As String
Dim intTamanho As Integer
Dim i As Integer

[ô]Lê cada caractere do arquivo
For i = 0 To Len(strNome) - 1
[ô]Caso o arquivo seja composto SOMENTE de números o bicho pega aqui!
strNovostrNome = strNome + 1
[ô]Pega os caracteres de trás para frente
strCaracter = Mid(strNome, Len(strNome) - i, i + 1)

[ô]Verifica que se é número o que se pegou
If InStr([Ô]0123456789[Ô], strCaracter) = 0 Then
[ô]Reposiciona caracter válido
strCaracter = strCaracterAnterior

[ô]Verifica o tamanho restante do arquivo
intTamanho = Len(strNome) - Len(strCaracter)

[ô]Incrementa somente depois de verificar o tamanho! Caso passe de 99 para 100 (por exemplo)
strCaracter = strCaracter + 1

If intTamanho > 0 Then
[ô]Coloca a parte texto + o número incrementado
strNovostrNome = Left(strNome, intTamanho) & strCaracter
End If

[ô]Sai da rotina
Exit For
End If

[ô]Guarda a posição anterior (que era sempre válida)
strCaracterAnterior = strCaracter

Next

[ô]Devolve o nome alterado correto
Renomeia = strNovostrNome
End Function



Teste +/- assim:

    [ô]nome = [Ô]TESTE[Ô]
[ô]nome = [Ô]TESTE12[Ô]
nome = [Ô]12345[Ô]

[ô]If CaminhoExiste(SelecionarPasta + [Ô]\[Ô] + nome + [Ô].pdf[Ô]) Then
If CaminhoExiste(SelecionarPasta + [Ô]\[Ô] + nome + [Ô].txt[Ô]) Then
[ô]MsgBox [Ô]O caminho ou arquivo [ô][Ô] & s & [Ô][ô] existe e é válido.[Ô] _
, vbInformation _
, [Ô]Informação[Ô]

nome = Renomeia(nome)

MsgBox [Ô]O strNome do arquivo é [ô][Ô] & nome & [Ô][ô] existe e é válido.[Ô] _
, vbInformation _
, [Ô]Informação[Ô]


O caminho é por aqui.

[][ô]s,
Tunusat
MITSUEDA 13/02/2015 20:51:32
#444511
Resposta escolhida
Pablo,

Adaptei no exemplo anterior que tinha lhe passado!

Tem uma observação importante não esquece de fazer referencia a dll Microsoft Scripting Runtime

No VBA menu Ferramentas > Referencias...

Abraço
PABLOMOREIRAGV 16/02/2015 22:38:14
#444554
MITSUEDA, muito obrigado... o seu modelo deu certinho no que eu estava aplicando em meu projeto.
Tópico encerrado , respostas não são mais permitidas