Excel - NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

 
Vista:
sin imagen de perfil
Val: 200
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Quico (93 intervenciones) el 19/01/2019 10:02:40
A través de una macro, consigo generar informes individuales con una plantilla de 'word' y con un "nombre único para cada informe" (con una combinacion de celdas)
Los datos fuente se van importando desde la misma macro, y estos datos contienen repeticiones y nuevas entradas.

Aqui viene la duda, pues no consigo EVITAR que vuelva a generar los que ya habia generado.
En estos informes individuales, se escriben datos a posteriori, y si lo vuelve a generar, lo machaca haciéndome perder esta información.

Trato de combinar funciones del tipo FileSystemObject y object.FileExists, pero no consigo dar con la solución.

Set fso = CreateObject("scripting.filesystemobject")

If fso.fileexists(objWord() & "\" & nombd) Then
objWord.ActiveDocument.SaveAs nombd = False

nota: adjunto el archivo macro con la función de generar los documentos.

Muchas gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Andres Leonardo
Val: 3.890
Plata
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Andres Leonardo (1474 intervenciones) el 21/01/2019 15:29:12
y si a la macro le pones una validacion adicional con una celda o campo adicional donde verifiques si esta en falso , o en 0 se genere si es verdadero o 1 no lo considere y siga al sigueiente,... si quieres reprocesar solo bastara con poner la columna a cero y con esto ya lo reprocesa

Con esto incluso optimizas ya que evitas estar validando disco .. ya que las validaciones son dentro de la misma hoja,...
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 200
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Quico (93 intervenciones) el 21/01/2019 17:28:33
Hola Andrés.
Gracias por tu respuesta
No sabría ahora mismo hacer muy bien lo que me dices.
Pero ya que he de ir importando datos cada X días, creo que lo más practico es la MACRO que simplemente deje en color o las letras en gris claros si ya existen en la lista principal.

De esta manera, aquellos que quedan en color negro normal, es porque son nuevos valores (NO REPETIDOS) y entonces simplemente los selcciono y los copio en la lista principal.

Creo que es más rápido y limpio que el campo adicional que me plantéas, ya que la propia 'macro' me devolvería los calores repetidos.

En todo caso...¿Como harías tu propuesta? Es decir, como imcoprtaraia esa celda adicional que me dihera por ejemplo:

- EXISTE (cuando es un valor reptido)
-NUEVO (cuando no esta en la lista principal)

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 200
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Quico (93 intervenciones) el 21/01/2019 17:59:21
Disculpa, me he confundido al leer tu respuesta.

Quizá me expliqué mal.
La principal funcion de esta macro, es la de generar documentos independientes en word.
Para ello, usa una plantilla word (*dotx) y allí envia una serie de datos que provienen de un CSV.

¿Cual es mi problema?
Pues que en esos informes indivuales, añado cosas e información a posteriori, y necesito mantenerlos en la misma carpeta X tiempo.

Necesito, que la misma macro que me genera los documentos, sea capaz de descartar los que ya ha hecho, precisamente para que no me vuelva a generar un documento con el mismo nombre, machancado la información que yo he podido añadir.

Yo pensaba que con las instrucciones FileSystemObject y object.FileExists le podía indicar algo del estilo:

"Si cuando generas el informe word, coincide el nombre (object.FileExists) no lo hagas y continua al siguiente informe"

De esta manera, solo generaria los NUEVOS.
En este ejemplo, la primera vez hace 3 informes.
La segunda vez, hay 2 filas de datos, pero como 3 coinciden porque ya las generó, SOLO CREA 2 INFORMES.

¿Es posible hacer esto? Siempre que coincida que se le indique que se guarden en el mismo path.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Andres Leonardo
Val: 3.890
Plata
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Andres Leonardo (1474 intervenciones) el 21/01/2019 20:21:22
utiliza esta funcion si quieres devuevlve vacio si no existe
ojo esto es excel ... entonces es VBA y puedes usar esta ...

Tu validacion seria algo asi

1
2
3
if   Dir(r) =  ""  then  ' no existe  y r es la ruta completa dle archivo
      ' aqui no existe deberias seguir con tu proceso de creacion
end if
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 200
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Quico (93 intervenciones) el 22/01/2019 18:17:31
No se si el problema podría resolverse añadiendo algo en la macro a esto:

ruta = ruta & "\" '<--Con esta variable le indicamos que se guarden los informes en la carpeta que hemos creado.
nombd = ruta & Cells(i, "B") & "-" & Cells(i, "D") & ".docx" '<--El nombre de la columna B+D "US-Summary"
ObjWord.ActiveDocument.SaveAs nombd
ObjWord.Quit (False)
Next

Osea, esta parte final de la macro le indica que los infomes individuales que esta haciendo, los ponga en ruta,
con el nombre X nombd = ruta & Cells(i, "B") & "-" & Cells(i, "D") & ".docx"
y por último un ObjWord.ActiveDocument.SaveAs nombd para decirle que con ese nombre se guarde como X.

¿Como le puedo decir "Si existe en la ruta un nombd que ya esta hecho o que coincide, no lo hagas y pasa al siguente informe?
He probado lo que me decías, pero no me hace nada en la macro VBA.

¿Alguna idea, Andres?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Andres Leonardo
Val: 3.890
Plata
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Andres Leonardo (1474 intervenciones) el 22/01/2019 19:44:50
Intenta asi me cuentas...


1
2
3
4
5
6
7
ruta = ruta & "\" '<--Con esta variable le indicamos que se guarden los informes en la carpeta que hemos creado.
nombd = ruta & Cells(i, "B") & "-" & Cells(i, "D") & ".docx" '<--El nombre de la columna B+D "US-Summary"
if   Dir(nombd ) =  ""  then  ' no existe 
     ObjWord.ActiveDocument.SaveAs nombd
ObjWord.Quit (False)
end if
Next
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 200
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Quico (93 intervenciones) el 22/01/2019 23:54:14
¡¡¡¡ Pues ciertamente Andres has dado enel clavo!!!
Tu arreglo no 'machaca' un documento creado antes. ¡Así que es lo que andaba buscando!!
Muchas gracias.

Una duda más.
Ante mi incapacidad de crear un CONTADOR como dios manda, Decidi poner una fórmula en una celda: =CONTARA(A3:A500) del total de archivos a generar.
Así que enla macro lotengo como:
CONTADOR = Worksheets("CSV").Range("AA1").Value
Lo utilizo para un mensaje final y con la variable, así del estilo:
Respuesta = MsgBox("Se han generado " & CONTADOR & " informes con el nombre de la 'Story'

Pero claro, es algo cutre, ya que cuando esta usa el CONTADOR me da el total de la columna A y no los que genera.
me explico.

1ª vez ----> Genera los informes A, B, C -----> CONTADOR =3 en este caso.
2º vez ----> Genera los informes A, B, C, D, E ----> Gracias a tu arreglo, no machaca A, B,C; pero si genera D, E. ----> CONTADOR=5, y no se como hacer para que me haga la diferencia. En este caso, genera 2 informes.

No se si el CONTADOR puede contabilizar el total de informes que genera en base a:
- Si no existen, doy el total que GENERO.
- Si alguno coincide con el nombre if Dir(nombd ) = "" then ' no existe y no lo genero, no lo contabilizo. ¡Solo cuento los nuevos!

Muchas gracias por lo de if Dir(nombd ) = "" then
:-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Andres Leonardo
Val: 3.890
Plata
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Andres Leonardo (1474 intervenciones) el 23/01/2019 14:58:47
HolaMe alegra muchisimoooo qu ete haya funcionado como quieres.....

lo del contador como muy bien dices ... pues es tan sencillo como CONTAR como debe ser si grabo el archivo lo cuento .. prueba asi...


1
2
3
4
5
6
7
8
9
dim CONTADOR = 0  as integer  ' cuando sean mas de 32Mil documentos cambias el tipo de dato :)
ruta = ruta & "\" '<--Con esta variable le indicamos que se guarden los informes en la carpeta que hemos creado.
nombd = ruta & Cells(i, "B") & "-" & Cells(i, "D") & ".docx" '<--El nombre de la columna B+D "US-Summary"
if   Dir(nombd ) =  ""  then  ' no existe 
     ObjWord.ActiveDocument.SaveAs nombd
     ObjWord.Quit (False)
     CONTADOR = CONTADOR + 1
end if
Next

'al final mostrara ...
1
2
Respuesta = MsgBox("Se han generado " & CONTADOR & " informes con el nombre de la 'Story'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 200
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Quico (93 intervenciones) el 24/01/2019 00:34:08
Pues si que ha funcionado, Andrés.
De nuevo muchas grcias!!!!

¡Ahora funciona perfectamente!! :-)

Me he encontrado otro pequeño problema, y es que cuando guarda los 'informes', algunos tienen carácteres no imprimibles y da error. :-(
He pensado que la mejor solución era que cuando importo el CSV (que luego me servirá para crear los documento individuales), se corrigan todos esos caracteres.
¡De esta manera ya quedarían arreglados!
Pero he puesto al final de esta macro, cuando ya ha importado el CSV, una función, pero me da error....

La macro es esta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Sub Importar_CSV()
 
'Definir objetos a utilizar
Dim RutaArchivo As String 'ruta donde busca el archivo
Dim wsDestino As String
 
'Definimos con 'wsDestino' la hoja llamada CSV
Set ws = Worksheets("CSV")
 
'Controlamos algun posible error.
On Error Resume Next
 
'Forzamos para que solo abra ficheros CSV con un cuadro de dialogo
RutaArchivo = Application.GetOpenFilename(Title:="XXXX - Busca y selecciona el archivo CSV a importar...", _
                            filefilter:="Text Files (*.csv),*.csv")
 
'Forzamos que el CSV se abra en la pestaña CSV
    With ws.QueryTables.Add(Connection:="TEXT;" & RutaArchivo, Destination:=ws.Range("$A$2"))
 
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
 
' Y aqui es dónde le indico que selecciones la columna D para buscar y corregir los datos no imprmibles.
Columns("D:D").Select  '<--Le indico que ha de actuar solo en la columna D
Dim Characters As String   '<--Defino el string 'Characters'
Dim I As Long
Characters = "#$%()^*&/"  '<-- Le digo los caracteres que se han de eliminar o cambiar.
 For I = 1 To Len(Characters)
        Str = Replace$(Str, Mid$(Characters, I, 1), "")
    Next
    RemoveSpecial = Str
End Function
 
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.159
Plata
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Antoni Masana (1493 intervenciones) el 24/01/2019 13:34:28
A lo dicho Andres te añado una pequeña alternativa para crear documentos con el mismo nombre:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub CorrespondenciaConWord()
    ...
        Next
 
        If Right(ruta, 1) <> "/" Then ruta = ruta & "\"
        nombd = ruta & Cells(i, "B") & "-" & Cells(i, "D") & ".docx"
        Num = 0
        While Dir(nombd) <> ""
            Num = Num + 1
            nombd = ruta & Cells(i, "B") & "-" & Cells(i, "D") & "-" & Format(Num, "000") & ".docx"
        Wend
 
        objWord.ActiveDocument.SaveAs nombd
        objWord.Quit (False)
    Next
    ...
End Sub

Si el fichero existe crea un fichero con un número adjunto

Ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Issue key-Summary.docx
Issue key-Summary-001.docx
Issue key-Summary-002.docx
Issue key-Summary-003.docx
LFPWS-11081-Esto seria un titulo 3.docx
LFPWS-11081-Esto seria un titulo 3-001.docx
LFPWS-11081-Esto seria un titulo 3-002.docx
LFPWS-11081-Esto seria un titulo 3-003.docx
LFPWS-11082-Esto seria un titulo 2.docx
LFPWS-11082-Esto seria un titulo 2-001.docx
LFPWS-11082-Esto seria un titulo 2-002.docx
LFPWS-11082-Esto seria un titulo 2-003.docx
LFPWS-11083-Esto seria un titulo 1.docx
LFPWS-11083-Esto seria un titulo 1-001.docx
LFPWS-11083-Esto seria un titulo 1-002.docx
LFPWS-11083-Esto seria un titulo 1-003.docx

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 200
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

NO GENERAR/REPETIR DOCUMENTOS YA EXISTENTES USANDO: FileSystemObject y object.FileExists

Publicado por Quico (93 intervenciones) el 24/01/2019 17:35:56
Ah!! Pues muchas gracias.
Parece una alternativa interesante tambien.
Intentaré probarla para ver que tal.

Muchas gracias!! :_)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar