Lavorando sulla macro di patel ho elaborato la seguente proposta.
Partiamo da un file Excel vuoto, e lavoriamo su Foglio1
In un modulo standard del vba, es Modulo1, inserire questa macro:
- Codice: Seleziona tutto
Sub RepData()
Dim oFso As Object, SubD As String, dPath As String, myFile As String
Dim WordApp As Object, WordDOC As Object, WordContent As Object
Dim OData As String, NwData As String, mK1 As String, mK2 As String
Dim dFound As Boolean, pText As String, pCount As Long
OData = "04/04/2016" '<<< La vecchia data...
NwData = "09/05/2017" '<<< ...da sostituire con questa nuova
mK1 = " Data:_" 'Markers per identificare con buona certezza la data
mK2 = " Firma RGQ_"
SubD = "Reworked" '<<< I file "lavorati" saranno spostati in questa sottodirectory
'
MsgBox ("Scegliere la directory da cui prelevare i Doc da aggiornare")
With Application.FileDialog(msoFileDialogFolderPicker)
.Show
If .SelectedItems.Count = 0 Then
MsgBox ("Nessuna voce selezionata, processo abortito")
Exit Sub
End If
dPath = .SelectedItems.Item(1) & "\"
End With
'
Set oFso = CreateObject("Scripting.FileSystemObject")
If Not oFso.FolderExists(dPath & SubD) Then
oFso.CreateFolder (dPath & SubD)
End If
myFile = Dir(dPath & "*.doc*")
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = True
Do
If myFile = "" Then Exit Do
DoEvents
Set WordDOC = WordApp.Documents.Open(dPath & myFile)
pCount = WordDOC.Paragraphs.Count
dFound = False
If pCount > 2 Then
For i = pCount To pCount - 1 Step -1
pText = WordDOC.Paragraphs(i).Range.Text
If InStr(1, pText, mK1, vbTextCompare) > 0 And _
InStr(1, pText, mK1, vbTextCompare) > 0 And _
InStr(1, pText, OData, vbTextCompare) > 0 Then
dFound = True
pText = Replace(pText, OData, NwData, , , vbTextCompare)
WordDOC.Paragraphs(i).Range.Text = pText
WordDOC.Save
Exit For
End If
Next i
End If
WordDOC.Close False
If dFound Then
Name dPath & myFile As dPath & SubD & "\" & myFile
mynext = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(mynext, 1) = myFile
Cells(mynext, 2) = "Y"
Else
mynext = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(mynext, 1) = dPath & myFile
Cells(mynext, 2) = "NO"
Cells(mynext, 3) = pCount
End If
myFile = Dir
Loop
'
WordApp.Quit
Set WordDOC = Nothing
Set WordApp = Nothing
Set oFso = Nothing
End Sub
A questo punto si puo' lanciare la Sub RepData.
Essa chiede all'utente di selezionare la directory in cui sono localizzati i file; poi apre una nuova sessione di Word e uno dopo l'altro apre i file che trova.
La macro esamina gli ultimi 2 paragrafi del documento, e al loro interno cerca i "marker" indicati come Mk1 e Mk2 e la data da sostituire.
Se trova tutto allora sostituisce la data, salva il documento, lo sposta sulla subdirectory "Reworked" e sul foglio Excel scrive il nome file (colonna A) e il flag Y (colonna B).
Se invece manca qualcosa allora il file viene chiuso e sul foglio si scrive Percorso + Nome del file e il flag No, a indicare che non sono stati processati.
A questo punto, si puo' inserire sul "modulo vba del foglio1" questo codice:
- Codice: Seleziona tutto
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
If Target.Column > 1 Then Exit Sub
Dim lngx As Long
lngx = ShellExecute(vbNull, "Open", Target.Value, "", "", vbNormalFocus)
End Sub
(tasto dx sul tab col nomefile; scegli Visualizza codice, incollare il codice nel modulo vba che si apre)
In questo modo facendo doppioclick sui nomi dei file non processati essi saranno aperti e visualizzati in Word; cosi' si puo' modificarli manualmente oppure correggere il motivo per cui non erano stati processati automaticamente e ripetere la Sub RepData
Ciao