Excel - Macro para NO cambio de posicion de hojas

   
Vista:
Imágen de perfil de JoaoM

Macro para NO cambio de posicion de hojas

Publicado por JoaoM (161 intervenciones) el 21/12/2014 01:40:38
Hola amig@s

Pido disculpas si hay que pedir porque no creo ser necesario subir un libro como ejemplo porque todo libro puede tener varias hojas según la necesidad.
Cualquier libro que abra nuevo, puedo agregarle más y más hojas antes de escribir algo en el

Vengo esta vez en busca de una macro para que No permita el cambio de POSICION de las hojas

Sabemos que colocar en mouse encima de la pestaña del nombre de la hoja y arrastrarla a otra posición (antes o después) es fácil hacerlo, pues quiero EVITAR ESO PRESISAMENTE

Tengo Hojas nombradas personalizadas. Las hojas son muchas pero la macro hacer referencia a todas las existentes

Un ejemplo del orden de las hojas con los nombres

1- Inicio
2- Factura
3- Proveedor
4- Productos
5- Copia_Factura

Lo que quiero es que nadie pueda cambiar su posición.
Si 1º esta Inicio pues Inicio permanecerá POR SIEMPRE en puesto 1 aunque traten de cambiarla al 5º

Productos está en posición 4, pues seguirá POR SIEMPRE en 4º aunque traten de cambiarla al 2º por ejemplo, algún aviso de que: MsgBox "No se permite hacer el cambio"

Mis agradecimientos a quien pueda suministrarme dicha macro
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 LaO

Macro para NO cambio de posicion de hojas

Publicado por LaO (67 intervenciones) el 21/12/2014 23:40:40
Hola JoaoM,

Puedes asignar la siguiente rutina en un módulo y ubicar su llamada en los eventos del libro Workbook_SheetDeactivate y Workbook_Open.

Básicamente lo que hará el código es reordenar las hojas sin importar cuantas veces el usuario cambien sus posiciones. Esta solución si bien no impide en primera instancia que una hoja se mueva, de cualquier forma regenera la estructura que necesitas obligando al usuario a desistir.

Otras variantes seguramente se pueden considerar, que van desde inhabilitar el click derecho del mouse hasta desaparecer los tabs de las hojas con sus nombres, pero esto deriva en una restricción funcional mucho mas agresiva para el usuario final.

El código del módulo es el siguiente:
---------------------------------------------------------------------------------------------------------------------------->
Public Sub SheetsControl()
On Error GoTo e

Dim ws As Worksheet
Dim strName As String
Dim numIndex As Integer

'procedure
For Each ws In ThisWorkbook.Worksheets

'vars
strName = ws.Name
numIndex = ws.Index

'compare results
Select Case strName

Case "Inicio"
If numIndex <> 1 Then ws.Move Before:=Sheets(1)

Case "Factura"
If numIndex <> 2 Then ws.Move Before:=Sheets(2)

Case "Proveedor"
If numIndex <> 3 Then ws.Move Before:=Sheets(3)

Case "Productos"
If numIndex <> 4 Then ws.Move Before:=Sheets(4)

Case "Copia_Factura"
If numIndex <> 5 Then ws.Move Before:=Sheets(5)

End Select

Next ws

Exit Sub

e:

MsgBox "Error: " & Err.Description, vbCritical, "Mensaje"

End Sub
---------------------------------------------------------------------------------------------------------------------------->

El código en el worbook es como se indica:

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
'get control
SheetsControl
End Sub

---------------------------------------------------------------------------------------------------------------------------->

Un saludo,
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
Imágen de perfil de JoaoM

Macro para NO cambio de posicion de hojas

Publicado por JoaoM (161 intervenciones) el 21/12/2014 23:57:20
Hice lo mandato pero no hace nada,

Intercambio una hoja con otra y nada pasa, cierro el libro y abre y nada pasa

Gracias por el interes en tu ayuda
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 LaO

Macro para NO cambio de posicion de hojas

Publicado por LaO (67 intervenciones) el 22/12/2014 00:21:51
Hola JoaoM:

Bien, para facilitar esto adjunto te copio el libro con lo expuesto y en el que puedes observar su funcionamiento. Tan solo es importante aclarar y entender la dinámica de los eventos donde aplica el procedimiento:

'//Cada vez que se abra el libro se ejecuta la rutina
Private Sub Workbook_Open()
'get control
SheetsControl
End Sub

'//Cada vez que el usuario cambie de una hoja a otra se ejecuta la rutina
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
'get control
SheetsControl
End Sub

Tu puedes decidir en cuales otros eventos quieres llamar el script para visualizar de manera mas inmediata el efecto reorder del codigo.

Un saludo,
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
Imágen de perfil de JoaoM

Macro para NO cambio de posicion de hojas

Publicado por JoaoM (161 intervenciones) el 22/12/2014 00:44:53
Asi mismo lo hiice amigo LAO.
Solo no coloque el evento Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
pero los demas si.

para el modulo y para el Open del libro.

Probare con el que no hice
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 LaO

Macro para NO cambio de posicion de hojas

Publicado por LaO (67 intervenciones) el 22/12/2014 00:57:44
Hola JoaM,

Hay otro detalle que debes tener en cuenta. En el ejemplo del libro que te he enviado, los indices de las hojas son los que corresponden al código expuesto en el módulo. Debes asegurarte que estos índices son los mismos que tiene tu libro, si no es así, deberás ajustarlos en la rutina. Así mismo, el nombre de las hojas debe ser exacto para que la validación del Select Case tenga sentido.

De hecho la prueba es mu sencilla, cada vez que una hoja es movida, el evento Workbook_SheetDeactivate(ByVal Sh As Object) se dispara y reordena las hojas sin ningún problema. Esto sucede muy rápido.

Un saludo,
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
Imágen de perfil de JoaoM

Macro para NO cambio de posicion de hojas

Publicado por JoaoM (161 intervenciones) el 22/12/2014 02:38:07
Pues eso.
Iba precisamente comentarte sobre ese detalle.
Las hojas en el editor estan así expuestas

y por eso talves sea el detalle que en el tuyo funciona perfecto y el mio no.

Mi pregunta Hector,

En el Select Case ¿tiene que estar el orden como en el editor o como esta en Excel?

Te dejo la imagen de como esta en el editor y como estan en Excel. Dime cual es valida

2a9tp5h

Fijate que la hoja Filtro esta oculta y es la ultima en Excel y en el editor es la primera pero, esta esta todo el tiempo oculta
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 LaO

Macro para NO cambio de posicion de hojas

Publicado por LaO (67 intervenciones) el 22/12/2014 15:38:45
Hola JoaoM,

Efectivamente el problema radica en la ndexación que tiene tu libro. Para tratar esto es necesario capturar el id real de las hojas que no es posible modificar por parte del usuario y reasignar la ubicación de los eventos en el libro para que no se genere un conflicto durante la reordenación de las hojas.

Así las cosas, coloca la rutina que he modificado en los eventos:

1
2
3
4
5
6
7
8
9
10
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'get control
SheetsControl
End Sub
 
Private Sub Workbook_Open()
'get control
SheetsControl
ThisWorkbook.Save
End Sub

--------------------------------------------------------------------------------------------------->

La rutina modificada es como se indica:

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
Public Sub SheetsControl()
On Error GoTo e
 
Dim ws As Worksheet
Dim strCodeName As String
 
'procedure
For Each ws In ThisWorkbook.Worksheets
 
'vars
strCodeName = ws.CodeName
 
'get results
Select Case strCodeName
 
    'inicio
    Case "Hoja5"
    ws.Name = "Inicio"
 
    'factura
    Case "Hoja7"
    ws.Name = "Factura"
 
    'proveedor
    Case "Hoja3"
    ws.Name = "Proveedor"
 
    'copias_factura
    Case "Hoja8"
    ws.Name = "Copias_Factura"
 
End Select
 
Next ws
 
'get final reorder
Sheets("Inicio").Move after:=Sheets("Filtro")
Sheets("Factura").Move after:=Sheets("Inicio")
Sheets("Proveedor").Move after:=Sheets("Factura")
Sheets("Copias_Factura").Move after:=Sheets("Proveedor")
 
Exit Sub
 
e:
 
MsgBox "Error: " & Err.Description, vbCritical, "Mensaje"
 
End Sub

--------------------------------------------------------------------------------------------------->

Con esto se generará un reordenamiento cada vez que el usuario abra y cierre el libro. Por favor lo pruebas y comentas.

Un saludo,
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
Imágen de perfil de JoaoM

Macro para NO cambio de posicion de hojas

Publicado por JoaoM (161 intervenciones) el 22/12/2014 19:54:40
OK

Voy a integrarle las demas hojas tambien.

Si algo pasa, aviso

Gracias LaO
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 JoaoM

Macro para NO cambio de posicion de hojas

Publicado por JoaoM (161 intervenciones) el 07/01/2015 21:42:12
Quiero dar las gracias a llos que de alguna forma, dieron su t iempo para ayudarme a la solucion

Se puede cerrar el tema dandolo como

Resuelto
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