Notifications
Clear all

Pesquisar ultimo ficheiro e salvar com numero a seguir

9 Posts
2 Usuários
0 Reactions
987 Visualizações
(@skatman)
Posts: 9
Active Member
Topic starter
 

Olá a todos,

Estou a tentar aplicar uma macro de outra versão do office que já não é suportado ( "Run-Time error '5111': Este comando não está disponível nesta plataforma. ) de salientar que agora o ficheiro é WORD 2016.

Preciso pesquisar na pasta C:UsersPublicDocumentsownCloudProcessos (vai ter ficheiros com o nome: Ref. 001-2018 ; Ref. 002-2018 ; Ref. 003-2018 ; ... )

No word, criei um campo de formulário e preciso que ele assuma o número de referência seguinte ao último que está na pasta (ele conta o total de ficheiros e soma + 1 ) e que salve o ficheiro quando o mandar imprimir ( Crtl + P )

Com todas as trocas, também perdi parte do código que manda imprimir :roll: :oops: :cry:

Sub SalvaPrint()
Dim n As Integer
endereço = "C:UsersPublicDocumentsownCloudProcessos"

[color=#FF0000][b]Set fs = Application.FileSearch[/b]  [/color]
With fs
    .LookIn = endereço
    .FileName = "Ref.*"
    .Execute
        n = .FoundFiles.Count
        ActiveDocument.SaveAs endereço & "Ref. " & n + 1
End With
End Sub

Agradeço de antemão a todos e espero que os resultados venham a servir para mais alguém.

 
Postado : 09/01/2018 6:35 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Boa tarde, SkatMan

Infelizmente a Microsoft excluiu a útil classe FileSearch do Office 2007 em diante (o último foi no 2003) e recomendou fortemente que fosse usada a classe FileSystemObjects da biblioteca (externa) Microsoft Scripting Runtime para todos os casos envolvendo manipulação de arquivos.
Infelizmente essa classe não aceita coringas então tem que fazer um loop pelos arquivos da pasta.

Sugestão:

Sub SalvaPrint()
   Dim n As Integer
   Const endereço As String = "C:UsersPublicDocumentsownCloudProcessos"
   Dim fso As Object, f As Object, fs As Object
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set fs = fso.GetFolder(endereço)
   For Each f In fs.Files
     If f.Name Like "Ref.*" Then n = n + 1
   Next f
   ActiveDocument.SaveAs endereço & "Ref. " & n + 1
End Sub

 
Postado : 09/01/2018 9:53 am
(@skatman)
Posts: 9
Active Member
Topic starter
 

Boa tarde Edson,

Muito obrigado pela pronta resposta e sem dúvida já deu fruto, pois já cria ficheiros com a sequência desejada, em formato DOCX e imprime 3 páginas como pretendo.

Só mais uma informação se possível, esse nome que atribui no nome do ficheiro, ele pode ser introduzido num campo formulário no próprio documento word ??

Ou seja, assumir esse número em uma parte do documento e depois ele salvar e imprimir ?!?!

Seja qual for o resultado, já valeu a sua ajuda.
Obrigado

Código final:

Sub Salva()
Dim n As Integer
Const endereço As String = "C:UsersPublicDocumentsownCloudProcessos"
Dim fso As Object, f As Object, fs As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set fs = fso.GetFolder(endereço)
For Each f In fs.Files
If f.Name Like "Ref.*" Then n = n + 1
Next f
ActiveDocument.SaveAs endereço & "Ref. " & n + 1 & "-2018" & ".docx"
ActiveDocument.PrintOut Copies:=3
End Sub

 
Postado : 09/01/2018 10:32 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

esse nome que atribui no nome do ficheiro, ele pode ser introduzido num campo formulário no próprio documento word ??

Seu documento já tem o Campo Formulário posicionado para receber o valor ? Ou teria que criar um FormField durante o vôo? Se já está no documento, qual o nome do bookmark associado? (para saber, clique com o botão direito na área cinza, escolha Propriedades e veja qual nome está na caixa Indicador. Ative a guia Desenvolvedor antes, caso não esteja ativada).

 
Postado : 09/01/2018 11:47 am
(@skatman)
Posts: 9
Active Member
Topic starter
 

Edson,

Eu adicionei um "campo formulário do tipo texto" que nas propriedades se identifica com o marcador "Texto30".

Se houver forma mais fácil de solucionar, posso alterar o FormField sem problema.

 
Postado : 09/01/2018 11:57 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Experimente:

Sub Salva()
  Dim n As Integer, NomeArq As String
  Const endereço As String = "C:UsersPublicDocumentsownCloudProcessos"
  Dim fso As Object, f As Object, fs As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set fs = fso.GetFolder(endereço)
  For Each f In fs.Files
    If f.Name Like "Ref.*" Then n = n + 1
  Next f
  NomeArq = endereço & "Ref. " & n + 1 & "-2018" & ".docx"
  With ActiveDocument
    .FormFields("Texto30").Result = NomeArq
    .SaveAs NomeArq
    .PrintOut Copies:=3
  End With
  Set f = Nothing: Set fs = Nothing: Set fso = Nothing
End Sub

 
Postado : 09/01/2018 12:18 pm
(@skatman)
Posts: 9
Active Member
Topic starter
 

Edson,

As funções estão funcionando na perfeição.
Somente a referência no documento vai buscar o caminho todo "C:UsersPublicDocumentsownCloudProcessosRef. 3-2018.docx" e seria suficiente a informação a negrito.
Vou tentar resolver a questão, mas muito agradeço a sua amabilidade em ajudar.

Se precisar volto a pedir :D
Valeu

 
Postado : 09/01/2018 1:01 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Então na linha

.FormFields("Texto30").Result = NomeArq

Substitua por

.FormFields("Texto30").Result = "Ref. " & n + 1 & "-2018"

 
Postado : 09/01/2018 1:19 pm
(@skatman)
Posts: 9
Active Member
Topic starter
 

Edson,

Fenomenal, eu estava a complicar "pra caramba".
Funciona 100%

OBRIGADO ( do tamanho do Cosmo ).

P.S.: Aconselha algum sitio onde possa ter aprendizagem para iniciante em VBA ?? Estou a ficar cada vez mais motivado com esta coisa.

 
Postado : 10/01/2018 6:32 am