Visual Basic para Aplicaciones - If Not isEmpty(range) ...Else IsEmpy (Range)

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 24/01/2018 03:24:05
Buenas Noches.

Tengo un problemita con una Macro que controla unos CheckBox. En realidad no la entiendo bien y creo que estoy haciendo todo mal

En Principio la macro, lo que haces es que el checkbox1 este DESBLOQUEADO, si el la celda g23 tiene algun valor ( String), y Si el usuario marca el CheckBox1, el resto de los checkboxs se desactiva. Y luego en el caso de que la celda G23 no tenga ningún debería desactivarse, junto con el resto, y bloquearse.

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
Private Sub CheckBox1_Click()
 
    If Not IsEmpty(G23) Then
    CheckBox1.Locked = False
    CheckBox2.Locked = FAlse
    CheckBox3.Locked = False
    CheckBox4.Locked = False
 
      ElseIf CheckBox1.Value = True Then
      CheckBox2.Value = False
      CheckBox3.Value = False
      CheckBox4.Value = False
 
    Else: IsEmpty (G23)
    CheckBox1.Value = False
    CheckBox1.Locked = True
    CheckBox2.Locked = True
    CheckBox3.Locked = True
    CheckBox4.Locked = True
 
 
   End If
   'End If
 
End Sub
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 Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 24/01/2018 12:51:57
En primer lugar que el CheckBox1 esté bloqueado o no depende de la acción sobre la celda y esto es un código que debe ir en la hoja de la celda en cuestión y se activa cuando se modifica la celda.

Por otro lado el CheckBox1_Click solo se ejecuta cuando este desbloqueado, lo cual quiere decir que la celda G23 tiene datos. Preguntar en este procedimiento si hay hatos es absurdo.

El código correcto seria esto:

1
2
3
4
5
6
7
8
9
10
11
Private Sub CheckBox1_Click()
    If CheckBox1.Value = True Then
       CheckBox2.Locked = False
       CheckBox3.Locked = False
       CheckBox4.Locked = False
    Else
       CheckBox2.Locked = True
       CheckBox3.Locked = True
       CheckBox4.Locked = True
    End If
End Sub

Cuando se vacíe la celda G23 debes bloquear los 4 CheckBox y ponerlos a valor False.

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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 25/01/2018 03:26:01
Hola Antoni.

Si en primer lugar pido disculpas porque me explique mal.

Lo que deseo hacer, es que si en la celda (g23) y también en la (G29), no hay datos, que los Checkbox estén bloqueado, de esa forma voy a evitar unos errores que se podrían llegar a producir, ya que estos checkbox controlan algunas otras cosas. Luego cuando me desperté al otro día me di cuenta que estaba mal, es decir, no tenia que escribir este código sobre el checkbox sino sobre la Hoja en cuestión, pero no se como o cuales son las variables a declarar, si lo puedo hacer con ACTIVATE o ByVAL.

Por otro lado, lo que quiero hacer y ya lo hice, es que si el usuario selecciona el checkbox 1 no pueda seleccionar otros, ya que son excluyentes entre si, es decir, puede elegir o uno o el otro, pero no 2 o 3 o 4 al mismo tiempo.

Saludos, y gracias por la info.

Eduardo
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: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 25/01/2018 07:47:45
Debes poner este código en la hoja en cuestión

1
2
3
4
5
6
7
8
9
10
11
12
Option Explicit
 
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Estado As Boolean
    If Target.Address = "$G$23" Or Target.Address = "$G$29" Then
       If Target.Value <> "" Then Estado = False Else Estado = True
       CheckBox1.Locked = Estado
       CheckBox2.Locked = Estado
       CheckBox3.Locked = Estado
       CheckBox4.Locked = Estado
    End If
End Sub

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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 26/01/2018 02:53:21
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
Private Sub Worksheet_Change(ByVal Target As Range)
 
    Dim Estado As Boolean
 
    If Target.Address = "$G$23" Then
       If Target.Value <> "" Then Estado = False Else Estado = True
       CheckBox1.Locked = Estado
       CheckBox2.Locked = Estado
       CheckBox3.Locked = Estado
       CheckBox4.Locked = Estado
       CheckBox5.Locked = Estado
       CheckBox6.Locked = Estado
       End If
 
    Else: Target.Address = "$G$29"
       If Target.Value <> "" Then Estado = False Else Estado = True
       CheckBox7.Locked = Estado
       CheckBox8.Locked = Estado
       CheckBox9.Locked = Estado
       CheckBox10.Locked = Estado
       CheckBox12.Locked = Estado
       CheckBox12.Locked = Estado
        End If
 
End Sub



Supongo que podria ser algo asi, pero no logro que funcione

G23 controla los checkbox del 1 al 6 y G29 del 7 al 12

Abrazo
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: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 26/01/2018 10:15:37
Te has echo un lio con los IF, ELSE y END IF

Esto es lo correcto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Estado As Boolean
    If Target.Address = "$G$23" Then
       Estado = True: If Target.Value <> "" Then Estado = False
       CheckBox1.Locked = Estado
       CheckBox2.Locked = Estado
       CheckBox3.Locked = Estado
       CheckBox4.Locked = Estado
       CheckBox5.Locked = Estado
       CheckBox6.Locked = Estado
    End If
    If Target.Address = "$G$29" Then
       Estado = True: If Target.Value <> "" Then Estado = False
       CheckBox7.Locked = Estado
       CheckBox8.Locked = Estado
       CheckBox9.Locked = Estado
       CheckBox10.Locked = Estado
       CheckBox12.Locked = Estado
       CheckBox12.Locked = Estado
    End If
End Sub

Para que el código se vea asi tienes que usa el icono </> que hay encima del cuadro de texto.

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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 30/01/2018 01:42:46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub Worksheet_Activate()
 
    Dim Estado As Boolean
    If Range("G23").Value = "" Then
       Estado = True: If Range("g23").Value <> "" Then Estado = False
       CheckBox1.Locked = Estado
       CheckBox2.Locked = Estado
       CheckBox3.Locked = Estado
       CheckBox4.Locked = Estado
       CheckBox5.Locked = Estado
       CheckBox6.Locked = Estado
    End If
    If Range("G29").Value = "" Then
       Estado = True: If Range("g29").Value <> "" Then Estado = False
       CheckBox7.Locked = Estado
       CheckBox8.Locked = Estado
       CheckBox9.Locked = Estado
       CheckBox10.Locked = Estado
       CheckBox12.Locked = Estado
       CheckBox12.Locked = Estado
    End If
End Sub

Antoni, Probe el dodigo y no funciona, luego intente con esta variente del codigo y tampoco.

La verdad es que no se me ocurre que mas inventar.

La unica vez que me funciono, ..mal pero mas o menos funcionaba, fue cuanto utilice el "IsEmpty", pero no se como funciona realmente.

Saludos

Larga vida y prosperidad
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: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 30/01/2018 09:37:37
Enviame el libro y lo reviso.
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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 30/01/2018 12:14:55
El libro tiene muchas Macros, esta en cuestión se encuentra en la Hoja "Solicitud"

No te espantes de mis códigos,

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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 30/01/2018 13:30:00
He modificado las macros y ya funcionan bien

Esta se activa cuando modificas una celda

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Estado As Boolean
    If Target.Address = "$G$23" Then
       Estado = False: If Target.Value <> "" Then Estado = True
       CheckBox1.Enabled = Estado
       CheckBox2.Enabled = Estado
       CheckBox3.Enabled = Estado
       CheckBox4.Enabled = Estado
       CheckBox5.Enabled = Estado
       CheckBox6.Enabled = Estado
    End If
    If Target.Address = "$G$29" Then
       Estado = False: If Target.Value <> "" Then Estado = True
       CheckBox7.Enabled = Estado
       CheckBox8.Enabled = Estado
       CheckBox9.Enabled = Estado
       CheckBox10.Enabled = Estado
       CheckBox11.Enabled = Estado
       CheckBox12.Enabled = Estado
    End If
End Sub

Esta se ejecuta cuando la hoja es activa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Worksheet_Activate()
    Dim Estado As Boolean
    If Range("G23").Value = "" Then
       Estado = False: If Range("G23").Value <> "" Then Estado = True
       CheckBox1.Enabled = Estado
       CheckBox2.Enabled = Estado
       CheckBox3.Enabled = Estado
       CheckBox4.Enabled = Estado
       CheckBox5.Enabled = Estado
       CheckBox6.Enabled = Estado
    End If
    If Range("G29").Value = "" Then
       Estado = False: If Range("G29").Value <> "" Then Estado = True
       CheckBox7.Enabled = Estado
       CheckBox8.Enabled = Estado
       CheckBox9.Enabled = Estado
       CheckBox10.Enabled = Estado
       CheckBox11.Enabled = Estado
       CheckBox12.Enabled = Estado
    End If
End Sub

Los checkBox 1, 2 , 3 y 4 por un lado y los 7, 8, 9 y 10 por hubiese sido mejor un boton de opciones porque son excluyentes y cada grupo debe estar dentro de cuadro de grupo y te ahorras todo el codigo de exclusión.

Para mejorar el uso del formulario tendrías que bloquear toda la hoja y desbloquear las celdas de edición y salta de celda a celda evitando las que están en blanco.

La versión C tienes un ejemplo

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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 31/01/2018 02:56:40
Bueno, te comento que probé tu código, pero detecte un problema, así como lo planteas funciona, pero el problema surge cuando la celda que tiene que tener datos.
En los ejemplos o en el código que me pasas, siempre se hace referencia a la celda o al contenido de la celda, es decir, G23 o G29, son iguales a un valor de la Hoja "Source", o sea: "=SOURCE!G100" o "=SOURCE!K100", es decir las celdas nunca tienen el valor "", sino que siempre estan con algun valor. Entonces implemente, apuntar las celdas de referencia a las hojas donde el usuario escribe los datos, que son "DATOS FILIATORIOS2", y "DATOS FILIATORIOS3".

Así se visualiza el código en cuestión, Pero no logro hacerlo funcionar, porque cuando hago el debug, me dice que esas celdas o rangos están vacías. Supongo que me falta declarar algún tipo de variable string, o me tengo que referir a esos hojas y rangos de otra forma.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub Worksheet_Activate()
    Dim Estado As Boolean
 
    If Worksheets("Datos Filiatorios2").Range("F12").Value = "" Then
       Estado = False: If Worksheets("Datos Filiatorios2").Range("F12").Value <> "" Then Estado = True
       CheckBox1.Enabled = Estado
       CheckBox2.Enabled = Estado
       CheckBox3.Enabled = Estado
       CheckBox4.Enabled = Estado
       CheckBox5.Enabled = Estado
       CheckBox6.Enabled = Estado
    End If
    If Worksheets("Datos Filiatorios3").Range("F12").Value = "" Then
       Estado = False: If Worksheets("Datos Filiatorios3").Range("F12").Value <> "" Then Estado = True
       CheckBox7.Enabled = Estado
       CheckBox8.Enabled = Estado
       CheckBox9.Enabled = Estado
       CheckBox10.Enabled = Estado
       CheckBox11.Enabled = Estado
       CheckBox12.Enabled = Estado
    End If
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: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 31/01/2018 07:57:53
Este evento debes ponerlo en la hoja Solicitud y SOLO se ejecuta cuando activas la hoja.

Había dos Fallos: uno el primer IF y segundo la celda de referencia, hacías referencia a F12 y debe ser a E12.

Ahora ya funciona.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub Worksheet_Activate()
    Dim Estado As Boolean
 
    Estado = False: If Worksheets("Datos Filiatorios2").Range("E12").Value <> "" Then Estado = True
    CheckBox1.Enabled = Estado
    CheckBox2.Enabled = Estado
    CheckBox3.Enabled = Estado
    CheckBox4.Enabled = Estado
    CheckBox5.Enabled = Estado
    CheckBox6.Enabled = Estado
 
    Estado = False: If Worksheets("Datos Filiatorios3").Range("E12").Value <> "" Then Estado = True
    CheckBox7.Enabled = Estado
    CheckBox8.Enabled = Estado
    CheckBox9.Enabled = Estado
    CheckBox10.Enabled = Estado
    CheckBox11.Enabled = Estado
    CheckBox12.Enabled = Estado
End Sub

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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 31/01/2018 12:54:34
Buenisimo, ahora si funciono!!!

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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 27/02/2018 01:14:36
Hola Antoni.

Perdon que te moleste. Pero tengo un problema con esta Macro

Resulta que tengo otra macro en el mismo libro, que lo que hace es borrar los datos que fueron ingresados por los usuarios. El problema es que tengo un Boton, que se llama "BORRAR DATOS", que lo que hace es seleccionar las hojas, luego las celdas donde hay datos y borrarlos, pero tema es que cuando sellecciona la hoja llamada SOLICITUD, cuando la selecciona y por ende la activa, se ejecuta la macro que esta arriba, y se interrrumpe el proceso por el cual se borran los datos de las hojas

Cualquier cosa te mando los archivos

Este es el codigo

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
Sub CleanAllSheets()
 
Dim T1 As String, T2 As String, T3 As String, T4 As String
 
T1 = "Datos Filiatorios"
T2 = "Datos Filiatorios2"
T3 = "Datos Filiatorios3"
T4 = "Solicitud"
 
 
sheets(Array(T1)).Select
'
    Union(Range("Q32:V32,E36:R36,D38:E38,H38:I38,L38:M38,Q38:V38,T36:V36,E40:F40,I40:K40,N40:P40,S40:V40,E42:H42,K42:N42,S42:V42,D4:E4,H4:P4,E6:P6,E8:I8,L8:P8,E12:H12,K12:N12,Q12:V12" _
    ), Range("F14:G14,I14:K14,N14:P14,S14:V14,F16:H16,L16:N16,R16:T16,E18:H18,L18:N18,R18:T18,E20:G20,H22:M22,Q22:V22,F26:V26,F28:G28,I28:K28,N28:P28,S28:V28,E30:H30,L30:N30,R30:V30,F32:K32,Q32:V32" _
    ), Range("E36:R36,D38:E38,H38:I38,L38:M38,Q38:V38,T36:V36,E40:F40,I40:K40,N40:P40,S40:V40,E42:H42,K42:N42,S42:V42,E46:L46,O46:V46,F48:L48,O48:V48,E50:L50,O50:P50,S50:T50,V50,E52:H52,K52:M52" _
    ), Range("P52:R52,U52:V52,E54:H54,K54:L54,O54:V54,E56:H56,L56:N56,F58:I58,M58:V58,F60:I60,M60:V60,E64:I64,D4:E4,H4:P4,S4:V4,E6:P6,E8:I8,L8:P8,S8:V8,E12:H12,K12:N12,Q12:V12,F14:G14,I14:K14,N14:P14" _
    ), Range("S14:V14,F16:H16,L16:N16,R16:T16,E18:H18,L18:N18,R18:T18,E20:G20,H22:M22,Q22:V22,F26:V26,F28:G28,I28:K28,N28:P28,S28:V28,E30:H30,L30:N30,R30:V30,F32:K32")).Select
 
    Range("D4:E4").Activate
 
    'Selection.ClearContents
 
    Application.Wait Now + #12:00:01 AM#
 
sheets(Array(T2)).Select
 
     Union(Range("Q32:V32,E36:R36,D38:E38,H38:I38,L38:M38,Q38:V38,T36:V36,E40:F40,I40:K40,N40:P40,S40:V40,E42:H42,K42:N42,S42:V42,D4:E4,H4:P4,E6:P6,E8:I8,L8:P8,E12:H12,K12:N12,Q12:V12" _
    ), Range("F14:G14,I14:K14,N14:P14,S14:V14,F16:H16,L16:N16,R16:T16,E18:H18,L18:N18,R18:T18,E20:G20,H22:M22,Q22:V22,F26:V26,F28:G28,I28:K28,N28:P28,S28:V28,E30:H30,L30:N30,R30:V30,F32:K32,Q32:V32" _
    ), Range("E36:R36,D38:E38,H38:I38,L38:M38,Q38:V38,T36:V36,E40:F40,I40:K40,N40:P40,S40:V40,E42:H42,K42:N42,S42:V42,E46:L46,O46:V46,F48:L48,O48:V48,E50:L50,O50:P50,S50:T50,V50,E52:H52,K52:M52" _
    ), Range("P52:R52,U52:V52,E54:H54,K54:L54,O54:V54,E56:H56,L56:N56,F58:I58,M58:V58,F60:I60,M60:V60,E64:I64,D4:E4,H4:P4,S4:V4,E6:P6,E8:I8,L8:P8,S8:V8,E12:H12,K12:N12,Q12:V12,F14:G14,I14:K14,N14:P14" _
    ), Range("S14:V14,F16:H16,L16:N16,R16:T16,E18:H18,L18:N18,R18:T18,E20:G20,H22:M22,Q22:V22,F26:V26,F28:G28,I28:K28,N28:P28,S28:V28,E30:H30,L30:N30,R30:V30,F32:K32")).Select
 
    Range("D4:E4").Activate
 
    'Selection.ClearContents
 
    Application.Wait Now + #12:00:01 AM#
 
 
sheets(Array(T3)).Select
 
     Union(Range("Q32:V32,E36:R36,D38:E38,H38:I38,L38:M38,Q38:V38,T36:V36,E40:F40,I40:K40,N40:P40,S40:V40,E42:H42,K42:N42,S42:V42,D4:E4,H4:P4,E6:P6,E8:I8,L8:P8,E12:H12,K12:N12,Q12:V12" _
    ), Range("F14:G14,I14:K14,N14:P14,S14:V14,F16:H16,L16:N16,R16:T16,E18:H18,L18:N18,R18:T18,E20:G20,H22:M22,Q22:V22,F26:V26,F28:G28,I28:K28,N28:P28,S28:V28,E30:H30,L30:N30,R30:V30,F32:K32,Q32:V32" _
    ), Range("E36:R36,D38:E38,H38:I38,L38:M38,Q38:V38,T36:V36,E40:F40,I40:K40,N40:P40,S40:V40,E42:H42,K42:N42,S42:V42,E46:L46,O46:V46,F48:L48,O48:V48,E50:L50,O50:P50,S50:T50,V50,E52:H52,K52:M52" _
    ), Range("P52:R52,U52:V52,E54:H54,K54:L54,O54:V54,E56:H56,L56:N56,F58:I58,M58:V58,F60:I60,M60:V60,E64:I64,D4:E4,H4:P4,S4:V4,E6:P6,E8:I8,L8:P8,S8:V8,E12:H12,K12:N12,Q12:V12,F14:G14,I14:K14,N14:P14" _
    ), Range("S14:V14,F16:H16,L16:N16,R16:T16,E18:H18,L18:N18,R18:T18,E20:G20,H22:M22,Q22:V22,F26:V26,F28:G28,I28:K28,N28:P28,S28:V28,E30:H30,L30:N30,R30:V30,F32:K32")).Select
 
    Range("D4:E4").Activate
 
    'Selection.ClearContents
 
    Application.Wait Now + #12:00:01 AM#
 
sheets(Array(T4)).Select '<<---------------Aqui esta el problema. 
 
    Union(Range("R5:V5,F35:K35,M35:P35,S35:V35,F37:K37,M37:P37,S37:V37,H39:K39,M39:P39,R39:V39,H41:K41,M41:P41,R41:V41" _
        ), Range("R5:V5,F35:K35,M35:P35,S35:V35,F37:K37,M37:P37,S37:V37,H39:K39,M39:P39,R39:V39,H41:K41,M41:P41,R41:V41" _
        ), Range("G47:K47,G49:K49,G51:K51,H53:K53,G55:K55,G57:K57,Q47:V47,Q49:V49,Q51:V51,Q53:V53,Q55:V55,G61:N61,K63:N63" _
        ), Range("S61:V61,S63:V63,C77:G77,C79:G79,C81:G81,H77:L77,H79:L79,H81:L81,M77:Q77,M79:Q79,M81:Q81,R77:V77,R79:V79" _
        ), Range("R81:V81,H86:L86,H88:L88,H90:L90,H92:L92,H94:L94,H96:L96,H98:L98,N98:S98,E100:V100,R5:V5,F35:K35,M35:P35" _
        ), Range("S35:V35,F37:K37,M37:P37,S37:V37,H39:K39,M39:P39,R39:V39,H41:K41,M41:P41,R41:V41,G47:K47,G49:K49,G51:K51" _
        ), Range("H53:K53,G55:K55,G57:K57,Q47:V47,Q49:V49,Q51:V51,Q53:V53,Q55:V55,G61:N61,K63:N63,S61:V61,S63:V63,E68:G68" _
        ), Range("I68:V68,F70:H70,J70:T70,C77:G77,C79:G79,C81:G81,H77:L77,H79:L79,H81:L81,M77:Q77,M79:Q79,M81:Q81,R77:V77" _
        ), Range("R79:V79,R81:V81,H86:L86,H88:L88,H90:L90,H92:L92,H94:L94,H96:L96,H98:L98,N98:S98,E100:V100,E105:G105,I105:R105" _
        ), Range("U105:V105,F107:I107,F109:V109,D113:K113,E115:V115,N113:S113,E125:V125,N119:S119,R5:V5,F35:K35,M35:P35,S35:V35" _
        ), Range("F37:K37,M37:P37,S37:V37,H39:K39,M39:P39,R39:V39,H41:K41,M41:P41,R41:V41,G47:K47,G49:K49,G51:K51,H53:K53" _
        ), Range("G55:K55,G57:K57,Q47:V47,Q49:V49,Q51:V51,Q53:V53,Q55:V55,G61:N61,K63:N63,S61:V61,S63:V63,E68:G68,I68:V68" _
        ), Range("F70:H70,J70:T70")).Select
 
    Range("N119").Activate
 
    'Selection.ClearContents
 
    sheets(Array(T4)).Select
 
    Rows("104:126").Select
    Range("104:126").Activate
    Selection.EntireRow.Hidden = True
 
    Application.Wait Now + #12:00:01 AM#
 
    Rows("85:102").Select
    Range("85:102").Activate
    Selection.EntireRow.Hidden = True
 
    Application.Wait Now + #12:00:01 AM#
 
    Rows("74:82").Select
    Range("74:82").Activate
    Selection.EntireRow.Hidden = True
 
    Application.Wait Now + #12:00:01 AM#
 
    Rows("67:71").Select
    Range("67:71").Activate
    Selection.EntireRow.Hidden = True
 
    Application.Wait Now + #12:00:01 AM#
 
    Rows("60:64").Select
    Range("60:64").Activate
    Selection.EntireRow.Hidden = True
 
    Application.Wait Now + #12:00:01 AM#
 
    Rows("46:57").Select
    Range("46:57").Activate
    Selection.EntireRow.Hidden = True
 
 
End Sub

En definitiva, como puedo hacer para solucionarlo.

Ya casi termine, lo único que le falta, es que la macro que limpia los datos, funcione bien.

Ah eso y saber como puedo hacer que los vínculos entre los libros de excel sean relativos a la ubicación de este archivo
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: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 27/02/2018 16:11:40
Hay una solución pero no se como aplicarla.
Hacer una variable publica que la vean todos lo módulos y según su estado no ejecuta los eventos automáticos. Pero no se como crearla.
Llevo muchos años programando y los objetos y sus eventos no lo domino, seguro que hay otras formas de hacerlo pero cuando no las se voy a lo menos chapucero y que funcione.

Cambios en tu función enviada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Option Explicit
 
Sub CleanAllSheets()
    Dim T1 As String, T2 As String, T3 As String, T4 As String, a As Boolean
     ...
    Application.Wait Now + #12:00:01 AM#
 
    a = Salir(1): sheets(Array(T4)).Select
    a = Salir(2)
    ...
    Rows("46:57").Select
    Range("46:57").Activate
    Selection.EntireRow.Hidden = True
End Sub
 
Function Salir(Opcion As Byte) As Boolean
    Static SW as Boolean
    If Opcion = 1 Then SW = True
    If Opcion = 2 Then SW = False
    Salir = SW
End Function

Y los cambios en el evento que no deseas que se ejecute

1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Activate()
    Dim Estado As Boolean
 
    If Salir(0) Then Exit Sub
 
    Estado = False: If Worksheets("Datos Filiatorios2").Range("E12").Value <> "" Then Estado = True
    ...
    End If
End Sub

¿Como Funciona? Supongo que sera fácil deducirlo viéndolo así de cerca.

Te cuento:

Creo una función con una variable ESTÁTICA y que acepta tres valores como parámetro,
1 pone la variable a True
2 pone la variable a False
0 No cambia el valor

Llama a la función y la pone a True
Cambia de hoja
Se ejecuta el Evento Worksheet_Activate y llama a la función con valor 0, le devuelve True y sale
Llama a la función y la pone a False.

¿Que pasa cuando entre en la hoja solicitud en cualquier otra circunstancia?

Se ejecuta el Evento Worksheet_Activate y llama a la función con valor 0, le devuelve False y continuara.

¿Que pasa si el valor por defecto no es Falso?

Pues nos aseguramos la jugada y ponemos esto en ThisWorkBook

1
2
3
4
Private Sub Workbook_Open()
    Dim a As Boolean
    a = Salir(2)
End Sub

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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 31/03/2018 02:15:45
Hola Antoni,

Te escribo por aquí, ya que una ves mas necesito tu ayuda.

Tengo un problema, con el libro de excel en el que estuve trabajando. Este libro esta vinculado con unos archivos Word. El problema reside en que en mi ámbito laboral, cuando ejecutamos algún archivo no se guardan en carpetas en los equipos personales, sino que hay una serie de carpetas compartidas en el servidor local de cada sucursal.

En ese libro, hay una macro para actualizar todos los links, de manera automática. El problema es que la ruta en el servidor es diferente que en un equipo local.

Ahora bien, el problema ya lo tengo mas o menos resuelto, tengo que construir la ruta de manera manual, aplicando una serie de comandos como "activeworkbook.path". o "Environ", pero no me sirve del todo, ya que al utilizar ese comando la ruta que trae es la siguiente: "R:\Compartido\[carpeta del usuario]\[Carpeta del Archivo].
Pero, la ruta del archivo según windows es SMFS0064\\Compartidos\\[carpeta del usuario]\\[Carpeta del Archivo].

El problema principal, es que no se como obtener esa variable de entorno, si así fuera ya lo hubiera solucionado.

Así que si puedo obtener el nombre de la carpeta, luego puedo construir toda la ruta usando una serie de concatenaciones.

Se que no es lo mejor, pero por el momento es lo único que se me ocurre.

Saludos como siempre, y desde ya 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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 31/03/2018 09:07:20
No acabo de ver claro lo que me explicas, hay algo que se me escapa.
La ruta: R:\Compartido\[carpeta del usuario]\[Carpeta del Archivo] supongo que es una ruta de red y como tiene una letra de disco esta mapeada.

¿Que es mapeada? es asignar una unidad e disco a una ruta de red. y se hace desde MS-DOS con el comando NET USER o desde el explorador de Windows con la opción Conectar a unidad de red

Es decir puedes hacer esto:

1
C:\> DIR \\192.168.100.45\Compartido\Usuario\Documentos\*.*

o Puedes hacer esto

1
2
NET USER R: \\192.168.100.45\C$
C:\> DIR R:\Compartido\Usuario\Documentos\*.*

Supongo que esto: SMFS0064 es el servidor pero por lo que se y se poco de redes me falta las dos barras:

1
\\SMFS0064\Compartidos\[carpeta del usuario]\[Carpeta del Archivo]

Prueba poniendo las dos barras a la izquierda o cuatro si tienes que ponerlas dobles:

1
\\\\SMFS0064\\Compartidos\\[carpeta del usuario]\\[Carpeta del Archivo]


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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 31/03/2018 15:17:12
Si tal cual. R:\Compartido\[carpeta del usuario]\[Carpeta del Archivo] es la ruta del disco en la red, y la obtengo cuando utilizo el comando Thiswork.path, pero no me sirve, porque entiendo que esta mapeada.

SMFS0064, es el servidor y si falta 2 barras.

la ruta seria así como vos decís.

\\\\SMFS0064\\Compartidos\\[carpeta del usuario]\\[Carpeta del Archivo]

Pero se puede obtener esta ruta con algun comando. desde VBA en excel?

Para reemplazar los links en todos los formularios de word utilizo este codigo

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
Sub Replace_Link()
 
Dim objWord As Word.Application
Dim wdSel As Object
Dim doc As Document
 
Dim warch1 As Word.Document     'Registro Respaldo Documental Cliente1
Dim warch1a As Word.Document    'Registro Respaldo Documental Cliente2
Dim warch1b As Word.Document    'Registro Respaldo Documental Cliente3
 
Dim warch2 As Word.Document     'Planilla de Referencias y Antecedentes Cliente1
Dim warch2a As Word.Document    'Planilla de Referencias y Antecedentes Cliente2
Dim warch2b As Word.Document    'Planilla de Referencias y Antecedentes Cliente3
 
Dim warch3 As Word.Document     'Datos de Cliente1
Dim warch3a As Word.Document    'Datos de Cliente2
Dim warch3b As Word.Document    'Datos de Cliente3
 
Dim warch4 As Word.Document     'DDJJPep Cliente1
Dim warch4a As Word.Document    'DDJJPep Cliente2
Dim warch4b As Word.Document    'DDJJPep Cliente3
 
Dim warch5 As Word.Document     'DDJJSnob Cliente1
Dim warch5a As Word.Document    'DDJJSnob Cliente2
Dim warch5b As Word.Document    'DDJJSnob Cliente3
 
Dim warch6 As Word.Document     'Información Complementaria Cliente1
Dim warch6a As Word.Document    'Información Complementaria Cliente2
Dim warch6b As Word.Document    'Información Complementaria Cliente3
 
Dim warch7 As Word.Document     'Registro de Firmas Cliente1
Dim warch7a As Word.Document    'Registro de Firmas Cliente2
Dim warch7b As Word.Document    'Registro de Firmas Cliente3
 
Dim warch8 As Word.Document     'ResolucionSUP
Dim warch9 As Word.Document     'NotificacionSUP
Dim warch10 As Word.Document    'SolicitudUP
 
Dim warch11 As Word.Document    'Condiciones TC
Dim warch12 As Word.Document    'Condiciones CA
Dim warch13 As Word.Document    'Condiciones Cuenta de la Seguridad Social
Dim warch14 As Word.Document    'Condiciones Cuenta Sueldo
Dim warch15 As Word.Document    'Condiciones Paquetes
Dim warch16 As Word.Document    'Condiciones Cuenta Corriente
Dim warch17 As Word.Document    'Categoria Inversor
Dim warch18 As Word.Document    'Condicion TItulos y Valores
Dim warch19 As Word.Document    'Condiciones Grales Prestamos
Dim warch20 As Word.Document    'Prestamos Notificacion al Cliente
Dim warch21 As Word.Document    'Condiciones R299 (9)
Dim warch22 As Word.Document    'Condiciones R299 (2A)
Dim warch23 As Word.Document    'Condiciones R360 (9)
Dim warch24 As Word.Document    'Condiciones R360 (1A)
Dim warch25 As Word.Document    'Condiciones R508 (2)
Dim warch26 As Word.Document    'Condiciones R508 (3)
Dim warch27 As Word.Document    'Condiciones R508 (1A)
Dim warch28 As Word.Document    'Condiciones R509 (1)
Dim warch29 As Word.Document    'Condiciones R509 (1A)
Dim warch30 As Word.Document    'Condiciones R509 (3)
Dim warch31 As Word.Document    'Condiciones R511 (1A)
Dim warch32 As Word.Document    'Condiciones R511 (1)
Dim warch33 As Word.Document    'Condiciones R512 (1)
Dim warch34 As Word.Document    'Condiciones R512 (1A)
Dim warch35 As Word.Document    'Condiciones R513 (1)
Dim warch36 As Word.Document    'Condiciones R513 (1A)
Dim warch37 As Word.Document    'Condiciones R520 (1)
Dim warch38 As Word.Document    'Condiciones R520 (1A)
Dim warch39 As Word.Document    'Condiciones R518 (1A)
Dim warch40 As Word.Document    'Condiciones R538 (1A)
Dim warch41 As Word.Document    'Condiciones R545 (1A)
Dim warch42 As Word.Document    'Otro
Dim warch43 As Word.Document    'Otro
Dim warch44 As Word.Document    'Otro
 
Set Inicio = sheets(ActiveSheet.Name)
'nom = Inicio.Range("AA3")
nom = ThisWorkbook.Path
 
Ruta1 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA3")  'warch1 Registro Respaldo Documental
Ruta2 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA4")  'warch2 Planilla de Referencias y Antecedentes
Ruta3 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA5")  'warch3 Datos Clientes
Ruta4 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA6")  'warch4 DDJJ PEP
Ruta5 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA7")  'warch5 DDJJ SNOB
Ruta6 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA8")  'warch6 Informacion Complementaria
Ruta7 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA9")  'warch7 Registro de Firmas
Ruta8 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA10")     'warch8 REsolucion UP
Ruta9 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA11")     'warch9 Notificacion UP
'rutaX1 = ThisWorkbook.Path & "\" & Range("AA12")    'RESERVADO ARCHIVO EXCEL Notificaciones Prestamos
Ruta10 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA13")    'warch10 Solicitud Unica de Productos
'rutaX1 = ThisWorkbook.Path & "\" & Range("AA14")    'RESERVADO ARCHIVO EXCEL Planilla de Comisiones
Ruta11 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA15")    'warch11 Condiciones Tarjeta de Credito
Ruta12 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA16")    'warch12 Condiciones Caja de Ahorros
Ruta13 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA17")    'warch13 Condiciones Cuenta de la Seguridad Social
Ruta14 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA18")    'warch14 Condiciones Cuenta Sueldo
Ruta15 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA19")    'warch15 Paquetes de Servicios
Ruta16 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA20")    'warch16 Condiciones Cuenta Corriente Pesos
'rutaX2 = ThisWorkbook.Path & "\" & Range("AA21")    'RESERVADO ARCHIVO EXCEL Detalle de Financiacion de Tarjeta de Creditos
Ruta17 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA22")    'warch17 Categorizacion Inversion Personas Fisicas
Ruta18 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA23")    'warch18 **
Ruta19 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA24")    'warch19 Prestamo Personal
Ruta20 = ThisWorkbook.Path & "\" & Range("AA25")    'warch20 Prestamos Notificacion al Clientes
'rutaX2 = ThisWorkbook.Path & "\" & Range("AA26")    'RESERVADO ARCHIVO EXCEL PAGARE
Ruta21 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA27")    'warch21 Reg 299(9)
Ruta22 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA28")    'warch22 Reg 299(2A)
Ruta23 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA29")    'warch23 Reg 360(9)
Ruta24 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA30")    'warch24 Reg 360(1A)
Ruta25 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA31")    'warch25 Reg 508(2)
Ruta26 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA32")    'warch26 Reg 508(3)
Ruta27 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA33")    'warch27 Reg 508(1A)
Ruta28 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA34")    'warch28 Reg 509(1)
Ruta29 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA35")    'warch29 Reg 509(1A)
Ruta30 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA36")    'warch30 Reg 509(3)
Ruta31 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA37")    'warch31 Reg 511(1A)
Ruta32 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA38")    'warch32 Reg 511(1)
Ruta33 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA39")    'warch33 Reg 512(1)
Ruta34 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA40")    'warch34 Reg 512(1A)
Ruta35 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA41")    'warch35 Reg 513(1)
Ruta36 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA42")    'warch36 Reg 513(1A)
Ruta37 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA43")    'warch37 Reg 520(1)
Ruta38 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA44")    'warch38 Reg 520(1A)
'rutaX2 = ThisWorkbook.Path & "\" & Range("AA26")    'RESERVADO ARCHIVO EXCEL
Ruta39 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA46")    'warch39 Reg 518(1A)
Ruta40 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA47")    'warch40 Reg 538(1A)
Ruta41 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA48")    'warch41 Reg 545(1A)
Ruta42 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA49")    'warch42
Ruta43 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA50")    'warch43
Ruta44 = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range("AA51")    'warch44
 
 
 
'En esta instancia se llama a la Aplicacion WORD, para que se active y abra los archivos que se indican a continuacion
 
Set objWord = CreateObject("Word.Application")
        objWord.Visible = True
 
    'Set warch1 = objWord.Documents.Open(Ruta1)
    'objWord.Activate
    'objWord.ActiveDocument.Content.Select
    Set wdSel = objWord.Selection
    wdSel.Find.ClearFormatting
    wdSel.Find.Replacement.ClearFormatting
 
            With wdSel.Find
 
            .Text = "E:\\Edus\\EDUARDO\\PROYECTOS\\"
            .Replacement.Text = nom
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            End With
 
        wdSel.Find.Execute Replace:=wdReplaceAll
 
    Set warch2 = objWord.Documents.Open(Ruta2)
    objWord.Activate
    objWord.ActiveDocument.Content.Select
    Set wdSel = objWord.Selection
    wdSel.Find.ClearFormatting
    wdSel.Find.Replacement.ClearFormatting
 
            With wdSel.Find
 
            .Text = "E:\\Edus\\EDUARDO\\PROYECTOS\\"
            .Replacement.Text = nom
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            End With
 
        wdSel.Find.Execute Replace:=wdReplaceAll
 
    objWord.Documents.Close SaveChanges:=True

Y asi se repite una cantidad N de veces

Como veraz, aca el link se reemplaza por thisworkbook.path y no es la variable que me sirve.

Espero que te hay quedado un poco mas claro.

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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 01/04/2018 17:58:26
No es lo que me comentas pero te simplificado el código.

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
Sub Replace_Link()
    Dim objWord As Word.Application, wdSel As Object, doc As Document
    Dim warch(44) As Word.Document, Celdas as Variant
    Dim warcha(7) As Word.Document
    Dim warchb(7) As Word.Document, Ruta(44) as String
 
    Set Inicio = sheets(ActiveSheet.Name)
    nom = ThisWorkbook.Path
    Celdas = Array("", "AA3" , "AA4" , "AA5" , "AA6" , "AA7" , "AA8" , "AA9", "AA10", _
                   "AA11", "AA13", "AA15", "AA16", "AA17", "AA18", "AA19", "AA20", _
                   "AA22", "AA23", "AA24", "AA25", "AA27", "AA28", "AA29", "AA30", _
                   "AA31", "AA32", "AA33", "AA34", "AA35", "AA36", "AA37", "AA38", _
                   "AA39", "AA40", "AA41", "AA42", "AA43", "AA44", "AA46", "AA47", -
                   "AA48", "AA49", "AA50", "AA51")
    For a = 1 to 44
        Ruta(a) = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range(Celda(a))
    next
 
    ' --- En esta instancia se llama a la Aplicacion WORD, para que se active y 
    '     abra los archivos que se indican a continuacion
 
    Set objWord = CreateObject("Word.Application")
    objWord.Visible = True
 
    for A = 1 TO 44
        Set warch1 = objWord.Documents.Open(Ruta(A))
        objWord.Activate
        objWord.ActiveDocument.Content.Select
        Set wdSel = objWord.Selection
        wdSel.Find.ClearFormatting
        wdSel.Find.Replacement.ClearFormatting
        With wdSel.Find
            .Text = "E:\\Edus\\EDUARDO\\PROYECTOS\\"
            .Replacement.Text = nom
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        wdSel.Find.Execute Replace:=wdReplaceAll
        objWord.Documents.Close SaveChanges:=True
    Next

Como puedes ver las 126 línea del principio quedan reducidas a 17 y abrir los documentos a 20 líneas y no a 20 por documento.

Por otro lado, la ruta:

\\\\SMFS0064\\Compartidos\\[carpeta del usuario]\\[Carpeta del Archivo]

¿Qué quieres decir con “se puede obtener esta ruta con algún comando? desde VBA en excel"?
¿Obtenerla de dónde?

Creo entender que en los formularios de Word buscas "E:\\Edus\\EDUARDO\\PROYECTOS\\" para reemplazarla por la ruta anterior.

Por mi poca experiencia en Excel, macros y Word: Las macros de Excel tienen poco campo de maniobra en Word, en cambio las macros de Word tienen algo más de maniobra en Excel, pero cada una en su casa son superiores.

Quiero decir que si la macro es solo para cambiar una ruta de un grupo de documentos en Word y si estas teniendo problemas para hacerlo con la macro de Excel has lo en una macro de Word.

En mi experiencia frustrada intente modificar la cabecera de unos documentos Word desde una macro en Excel, imposible acceder a la cabecera. Al final pase la macro a Word y todo eran facilidades.

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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 02/04/2018 01:10:08
Buenisimo Antoni!!!!

eso simplifica mucho las cosas.

Pero mi problema esta en linea 16

Ruta(a) = ThisWorkbook.Path & "\" & Worksheets("Solicitud").Range(Celda(a))

El problema en si es que ThisWorkbook.Path, trae como ruta a
"R:\Compartido\[Carpeta de usuario]\Carpeta del archivo",
y en mi trabajo, esa ruta no existe, ya que es
"\\\\SMFS0064\\Compartidos\\[carpeta del usuario]\\[Carpeta del Archivo]"

Por eso es que necesito reemplazarla.

Cuando digo "obtener", me refiero a que utilizando las variables del entorno con "Environ", puedo obtener algunos datos que me sirven para el trabajo, como el numero de usuario, la fecha, la hora, el servidor y algunas cosas mas.

Estas son variables de entorno de windows, pero ninguna de estas me sirve para obtener la ruta de la carpeta del servidor donde esta alojado el archivo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
asl.log	Destination=file	<SYSTEM>
ComSpec	%SystemRoot%\system32\cmd.exe	<SYSTEM>
NUMBER_OF_PROCESSORS	8	<SYSTEM>
OneDrive	C:\Users\Edus\OneDrive	SkynetFX8x\Edus
OS	Windows_NT	<SYSTEM>
Path	C:\VulkanSDK\1.1.70.1\Bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\	<SYSTEM>
Path	%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;	NT AUTHORITY\SYSTEM
Path	%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;	SkynetFX8x\Edus
PATHEXT	.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC	<SYSTEM>
PROCESSOR_ARCHITECTURE	AMD64	<SYSTEM>
PROCESSOR_IDENTIFIER	AMD64 Family 21 Model 2 Stepping 0, AuthenticAMD	<SYSTEM>
PROCESSOR_LEVEL	21	<SYSTEM>
PROCESSOR_REVISION	0200	<SYSTEM>
PSModulePath	%ProgramFiles%\WindowsPowerShell\Modules;%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules	<SYSTEM>
TEMP	%SystemRoot%\TEMP	<SYSTEM>
TEMP	%USERPROFILE%\AppData\Local\Temp	NT AUTHORITY\SYSTEM
TEMP	%USERPROFILE%\AppData\Local\Temp	SkynetFX8x\Edus
TMP	%SystemRoot%\TEMP	<SYSTEM>
TMP	%USERPROFILE%\AppData\Local\Temp	NT AUTHORITY\SYSTEM
TMP	%USERPROFILE%\AppData\Local\Temp	SkynetFX8x\Edus
USERNAME	SYSTEM	<SYSTEM>
VK_SDK_PATH	C:\VulkanSDK\1.1.70.1	<SYSTEM>
VULKAN_SDK	C:\VulkanSDK\1.1.70.1	<SYSTEM>
windir	%SystemRoot%	<SYSTEM>

Por eso te preguntaba, como se podría usar el comando NET USER. o si puedo, de alguna otra forma, obtener los nombre de las carpetas y solamente los nombres de las carpetas.y no toda la ruta

Espero que me haya hecho entender.

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
Imágen de perfil de Antoni Masana
Val: 1.134
Oro
Ha mantenido su posición en Visual Basic para Aplicaciones (en relación al último mes)
Gráfica de Visual Basic para Aplicaciones

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Antoni Masana (498 intervenciones) el 02/04/2018 08:38:23
Si ejecutas esta macro:

1
2
3
Sub Macro_1()
    MsgBox ThisWorkbook.Path
End Sub

y la respuesta es la ruta: "R:\Compartido\[Carpeta de usuario]\Carpeta del archivo"

Temo contrariarte pero SI que existe porque no se la inventa. Es la ruta del archivo al abrirlo.

Si ejecutas esta macro y en la segunda línea te sale la ruta que supuestamente no existe y el nombre del libro estas luchando contra molinos (Sacado del Quijote de la mancha)

1
2
3
Sub gg_2()
    MsgBox ThisWorkbook.Path & vbCrLf & ActiveWorkbook.FullName
End Sub

Abre una ventana de comandos de MS-DOS y ejecuta

1
C:\> NET USER

Un problema es que un documento ya ser Word o Excel tengan un link a otro documento con una ruta estática, es decir por ejemplo: W:\Documentos\Word, si se ejecuta en un equipo en el que no exista esta ruta los enlaces fallaran.

Ahora bien si la referencia a dicha ruta es ThisWorkbook.Path y todos los ficheros están en la misma ruta la cosa funcionara mejor.

Si yo tengo mapeada la ruta como R:\Documentos\Word y otro usuario como T:\Word porque a realizado el mapeo diferente el resultado es el mismo.

En mi caso R: es igual a \\SMFS0064\\Compartidos\
Y el otro es T: es igual a \\SMFS0064\\Compartidos\Documentos.

Otro problema son las carpetas personales, en mi caso el nombre de la carpeta seria
\\SMFS0064\\Compartidos\Antonio\Documentos
y la tuya
\\SMFS0064\\Compartidos\Eduardo\Documentos

si ejecuto este comando desde MS-DOS

1
NET USER R: \\SMFS0064

cuando abre uno de tus documentos accediendo a la ruta a partir del nombre de disco R, el ThisWorkbook.Path me devolvera

R:\Eduardo\Documentos

En cambio si accedo a mismo lugar por la referencia \\SMFS0064\Eduardo\Documentos me devuelve esta.

No se si la explicación aclara los términos o hablamos de cosas diferentes, las explicaciones y los ejemplo son de memoria porque en casa no tengo un servidor para los ejemplos y poder probar lo que digo, mañana le doy un vistazo.

Dime si vamos por buen camino porque no se si acabo de entender tu problemática y si me explico que se entienda. Puede que se entienda pero hablemos de cosas diferentes.

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

If Not isEmpty(range) ...Else IsEmpy (Range)

Publicado por Eduardol (35 intervenciones) el 02/04/2018 22:04:18
Hola Antoni.

Lo entiendes muy bien.

El lo que me llama la atención es que el método, Thisworkboo.path, si funciona para abrir los archivos de word, pero cuando uso esa variable para actualizar los links a los documentos word, esa ruta no funciona, ya que excel de alguna manera no la interpreta, y si interpreta la ruta "\\\\SMFS0064\\Compartidos\\[carpeta del usuario]\\[Carpeta del Archivo]". Sinceramente no se porque es así, es decir, porque funciona abriendo los archivos y no para los links,

Ahora entiendo que debe ser muy difícil realmente conseguir esa ruta. Por eso te preguntaba como es que se puede conseguir solamente el nombre de la carpeta, pero no la ruta- Porque a SMFS0064, puedo construirlos, haciendo que smf sea una variable estática, S0064, lo obtengo usando la variable de entorno, que me dice a que dominio estoy logreado, "\\Compartido\\" también seria una variable estática, y los nombres de las carpetas no, porque dependerá de donde guarden la carpeta del archivo los usuarios.

Te pido perdón si no me explico bien, o usando la terminología adecuada.

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