Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Orden de tabulación en una hoja (como si fuera un formulario)

63 views
Skip to first unread message

~ jose ~

unread,
Feb 17, 2006, 4:26:29 PM2/17/06
to
Hola, tengo una curiosidad,

Expongo el asunto:
Hay una hoja protegida y existen celdas "desbloqueadas" para poder
escribir en ellas.
Las celdas desprotegidas son:
B1,B2, D1,D2, F1,F2,
B4,B5, D4,D5, F4,F5,
Si nos situamos en B1 al pulsar el "tabulador" nos manda a D1
y si nos situamos en B1 y le damos al "enter" nos mandaria a B2

Se podria dar un orden a las celdas que quiero ir pulse el "enter" o el
"tabulador" indistintamente?
El orden por ejmeplo seria:
B1, B2, D1, D2, F1, F2, B4, B5, D4, D5, F4, F5

Esto que expongo sé que se puede hacer si fuera esto un formulario
pero en una hoja no se si se puede.

Venga un saludo

Héctor Miguel

unread,
Feb 18, 2006, 3:55:16 AM2/18/06
to
hola, jose !

> Hay una hoja protegida y existen celdas "desbloqueadas" para poder escribir en ellas.
> Las celdas desprotegidas son: B1,B2, D1,D2, F1,F2, B4,B5, D4,D5, F4,F5,

> Si nos situamos en B1 al pulsar el "tabulador" nos manda a D1 y... "enter" nos mandaria a B2


> Se podria dar un orden a las celdas que quiero ir pulse el "enter" o el "tabulador" indistintamente?

> El orden por ejmeplo seria: B1, B2, D1, D2, F1, F2, B4, B5, D4, D5, F4, F5 [...]

el siguiente ejemplo 'hace' los saltos de celda en el orden que indicas indistintamente del 'enter' o el 'tab' :))
es un codigo +/- 'largo' [pero estoy tratando de evitar la 'des-re-habilitacion' de los eventos] ;)
haria falta saber si -tambien- necesitas 'moitorear' los 'regresos' [cuando se pulsa mayus+enter o mayus+tab] -?-
[creo que] no seria dificil adaptarlo/recortarlo/... para otras necesidades 'similares' ;)
[probablemente] sera necesario 'mover' los codigos de re-asignacion de las teclas...
de -> los eventos '_open' y '_beforeclose' -> del libro ...
a -> los eventos '_activate' y '_deactivate' -> de 'esa' hoja -?-

si cualquier duda [o informacion adiiconal]... comentas ?
saludos,
hector.
=====

1) en un modulo de codigo 'normal'
Option Private Module
Public misCeldas, dCelda As String, Actual As Byte, Saltar As Byte, Sig As Byte, nCelda As String
Sub SaltarCeldas()
Range(nCelda).Select
End Sub

2) en el modulo de codigo del libro [ThisWorkbook]
Private Sub Workbook_Open()
misCeldas = Array("b1", "b2", "d1", "d2", "f1", "f2", "b4", "b5", "d4", "d5", "f4", "f5")
With Application
misCeldas = .Transpose(.Transpose(misCeldas))
.OnKey "~", "SaltarCeldas": .OnKey "{enter}", "SaltarCeldas": .OnKey "{tab}", "SaltarCeldas"
End With
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
With Application: .OnKey "~": .OnKey "{enter}": .OnKey "{tab}": End With
End Sub

3) en el modulo de eventos de 'esa' hoja
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
dCelda = LCase(Target.Cells(1).Address(0, 0))
For Sig = 1 To UBound(misCeldas)
If dCelda = misCeldas(Sig) Then Actual = Sig: Exit For
Next: If Actual = UBound(misCeldas) Then Saltar = 1 Else Saltar = Actual + 1
nCelda = misCeldas(Saltar)
End Sub


~ jose ~

unread,
Feb 18, 2006, 3:12:23 PM2/18/06
to
Hola Hector,
He seguido todos los pasos que me has dado y me dá error.
En el editor de VB me sale el error en:

For Sig = 1 To UBound(misCeldas)

Alguna sugerencia?

KL

unread,
Feb 18, 2006, 4:50:03 PM2/18/06
to
Hola chicos,

1) Este error probablemente se debe a que no se ha ejecutado el procedimiento asociado al evento Opn de ThisWorkbook.

op1: haz clic dentro del siguiente procedimiento en el Editor VBA y pulsa F5

Private Sub Workbook_Open()
misCeldas = Array("b1", "b2", "d1", "d2", "f1", "f2", "b4", "b5", "d4", "d5", "f4", "f5")
With Application
misCeldas = .Transpose(.Transpose(misCeldas))
.OnKey "~", "SaltarCeldas": .OnKey "{enter}", "SaltarCeldas": .OnKey "{tab}", "SaltarCeldas"
End With
End Sub

op2: Guarda el archivo, cierralo y vuelve a abrir habilitando los macros.

2) Me parece que ambas llamadas a la funcion TRANSPOSE sobran en este codigo (pero igual se me escapa algo), por lo que yo cambiaria
el macro de arriba

Private Sub Workbook_Open()
misCeldas = Array("b1", "b2", "d1", "d2", "f1", "f2", "b4", "b5", "d4", "d5", "f4", "f5")
With Application

.OnKey "~", "SaltarCeldas": .OnKey "{enter}", "SaltarCeldas": .OnKey "{tab}", "SaltarCeldas"
End With
End Sub

3) Creo que el siguiente bucle estara saltandose siempre el primer elemento de la matriz:

For Sig = 1 To UBound(misCeldas)

If dCelda = misCeldas(Sig) Then Actual = Sig: Exit For
Next: If Actual = UBound(misCeldas) Then Saltar = 1 Else Saltar = Actual + 1

op1: cambiar el 1 por 0

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
dCelda = LCase(Target.Cells(1).Address(0, 0))

For Sig = 0 To UBound(misCeldas)


If dCelda = misCeldas(Sig) Then Actual = Sig: Exit For

Next: If Actual = UBound(misCeldas) Then Saltar = 0 Else Saltar = Actual + 1


nCelda = misCeldas(Saltar)
End Sub

op2: cambiar el 1 por LBound(misCeldas)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
dCelda = LCase(Target.Cells(1).Address(0, 0))

For Sig = LBound(misCeldas) To UBound(misCeldas)


If dCelda = misCeldas(Sig) Then Actual = Sig: Exit For

Next: If Actual = UBound(misCeldas) Then Saltar = LBound(misCeldas) Else Saltar = Actual + 1


nCelda = misCeldas(Saltar)
End Sub

op2: Poner la instruccion 'Option Base 1' en la primera linea del modulo de la hoja

Option Base 1

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
dCelda = LCase(Target.Cells(1).Address(0, 0))

For Sig = 1 To UBound(misCeldas)

If dCelda = misCeldas(Sig) Then Actual = Sig: Exit For
Next: If Actual = UBound(misCeldas) Then Saltar = 1 Else Saltar = Actual + 1
nCelda = misCeldas(Saltar)
End Sub

Saludos,
KL


"~ jose ~" <carpi...@gmail.com> wrote in message news:1140293543....@z14g2000cwz.googlegroups.com...

~ jose ~

unread,
Feb 18, 2006, 8:53:10 PM2/18/06
to
Hola, he estado probando todo lo que me has dicho, pero tengo dudas de
si lo he heho bien.
Me sale este eror de interrupcion (resaltado en amarillo)

Range(nCelda).Select

Esto se encuentra en un modulo 'normal'

Sub SaltarCeldas()
Range(nCelda).Select
End Sub

Lo hasbeis probado vosotros?
a mi no me funciona.
Un saludo

Héctor Miguel

unread,
Feb 19, 2006, 1:18:54 AM2/19/06
to
hola, jose !

> ... he estado probando todo lo que me has dicho, pero tengo dudas de si lo he heho bien.


> Me sale este eror de interrupcion (resaltado en amarillo)
> Range(nCelda).Select
> Esto se encuentra en un modulo 'normal'
> Sub SaltarCeldas()
> Range(nCelda).Select
> End Sub
> Lo hasbeis probado vosotros?
> a mi no me funciona.

el error se debe a que... en el momento 'preciso' en que se abre el archivo, la variable 'nCelda' NO se ha 'inicializado' :-(
debido [obviamente] a que no se ha efectuado ningun cambio o 'seleccion' de celda/rango [activo] aun :))
[para evitar el uso de alguna instruccion del tipo 'On Error Resume Next']... prueba a cambiar la instruccion...
de -> Range(nCelda).Select
a -> If nCelda <> "" Then Range(nCelda).Select

saludos,
hector.


Héctor Miguel

unread,
Feb 19, 2006, 1:54:27 AM2/19/06
to
hola, chicos "

> KL escribio en el mensaje ...
> 2) Me parece que ambas llamadas a la funcion TRANSPOSE sobran en este codigo (pero igual se me escapa algo) [...]


> 3) Creo que el siguiente bucle estara saltandose siempre el primer elemento de la matriz:

> For Sig = 1 To UBound(misCeldas) [...]


> op1: cambiar el 1 por 0

> op2: cambiar el 1 por LBound(misCeldas)

> op3: Poner la instruccion 'Option Base 1' en la primera linea del modulo de la hoja [...]

perdon por el 'exceso' de informacion :))
[en realidad] por andar evitando la des-re-habilitacion de los eventos... olvide 'comentar el punto' :D

-> el uso de la 'doble funcion' transpose [de hoja de calculo], tiene como objetivo [en el codigo]...
'tomar' una matriz de tipo variant base 0 [por omision] unidimemsional-horizontal...
para 'devolver' una matriz 'convertida' a base 1 [cortesia de Laurent Longre alla por 1999] :D

saludos,
hector.


KL

unread,
Feb 19, 2006, 7:17:29 AM2/19/06
to
Hola HM,

> -> el uso de la 'doble funcion' transpose [de hoja de calculo], tiene como objetivo [en el codigo]...
> 'tomar' una matriz de tipo variant base 0 [por omision] unidimemsional-horizontal...
> para 'devolver' una matriz 'convertida' a base 1 [cortesia de Laurent Longre alla por 1999] :D

Interesante :-)

Saludos,
KL

~ jose ~

unread,
Feb 19, 2006, 2:03:47 PM2/19/06
to
Hola,
En un principio expuse este post como curiosidad,
me pareció una buena forma para hacer alguna aplicación en el
'futuro' y caso es que lo estoy emplando en una aplicación que ya
tengo y me está gustando mucho.

El caso que he hecho todo lo uqe me habéis dicho y funciona
"perfectamente", lo único hay una pequeña "pega".
Al abrir el libro si quiero darle al 'enter' o al 'tab' para moverme
sobre la hoja, no hace nada.
Primero hay que pinchar en cualquier celda para que funcione estas
teclas.
Supongo que será alguna chorradica que modificar...no?

Otra cosa, ya que me ha gustado tanto este código, se podria lleva a
mas hojas del mismo libro?
Claro cambiando en cada hoja el orden de tabulación.

He probado a copiar el código de la 'hoja1' a la 'hoja2' , modificar
el código el 'libro' y alguna cosa más pero como no tengo ni pu..
idea de VB entoces, como que no se hacerlo!.
Én estos momentos no me hace falta, (para la aplicación que tengo
hecha) pero seria muy interesante verdad?

Bueno, en vuestras manos lo dejo
Un saludo

Héctor Miguel

unread,
Feb 19, 2006, 11:51:11 PM2/19/06
to
hola, jose !

___ 1___
> ... expuse este post como curiosidad, me parecio una buena forma para hacer alguna aplicacion en el 'futuro'
> ... lo estoy empleando en una aplicacion que ya tengo y me esta gustando mucho.
> ... funciona "perfectamente", lo unico hay una peque#a "pega".
> Al abrir el libro... darle al 'enter' o al 'tab'... no hace nada... hay que pinchar en cualquier celda para que funcione
> Supongo que sera alguna chorradica que modificar...no?
___ 2 ___
> ... se podria lleva a mas hojas del mismo libro?... cambiando en cada hoja el orden de tabulacion.
> He probado a copiar el codigo de la 'hoja1' a la 'hoja2', modificar el codigo del 'libro' y alguna cosa mas pero... no se hacerlo!.
> en estos momentos no me hace falta, (para la aplicacion que tengo hecha) pero seria muy interesante verdad?

1) la 'pega' que mencionas, tiene una 'razon' [perfectamente] 'fundamentada' y que involucra los siguientes puntos:
a) las teclas enter-return y tab [por si solas] tienen carcteristicas de 'navegacion' [disparan el evento '_selectionchange']
b) al ser 'redireccionadas' para ejecutar un procedimiento... DEJAN de 'hacer su reporte' [dejando a excel -como- 'perdido'] :))
-> toma en cuenta que se esta modificando el 'comportamiento normal' de dichas teclas desde el evento '_open' del libro :(
-> y que en mi propuesta 'original' hacia los comentarios al respecto +/- como sigue:
' [probablemente] sera necesario 'mover' los codigos de re-asignacion de las teclas...


' de -> los eventos '_open' y '_beforeclose' -> del libro ...
' a -> los eventos '_activate' y '_deactivate' -> de 'esa' hoja -?-

2) para 'hacer' una navegacion 'controlada' -> en varias hojas del libro [ademas de considerar el punto anterior]... seguramente...
a) requerira de 'matrices' [varias o de dimensiones multiples] para las hojas, y cada hoja con 'sus celdas'
b) buscar cual seria la 'secuencia perfecta' para el orden de la des/re/asignacion de procedimientos a 'las teclas' [de navegacion]

3) una -posible- alternativa [para el caso 'simple' de la consulta original] es 'forzar' una re/seleccion de celdas y un sendkeys "{enter}"
-> desde el mismo evento '_open' del libro [si no te incomoda 'perder el punto' donde te habias quedado al cerrar el libro] -?-

[como veras] 'esas' teclas requieren de un 'manejo'... perfectamente definido [para poder 'manipularlas' sin perder otros 'beneficios'] :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.


~ jose ~

unread,
Feb 20, 2006, 2:46:31 PM2/20/06
to
Hola de nuevo,

He conseguido hacer que al abrir el libro me funcionen las teclas
'enter' y 'tab' sin tener que pinchar en ninguna otra celda.
Como ya comenté, la hoja está protegida y existen celdas
desprotegidas para poder escribir en ellas, pues bien, en el código
del libro en el evento

Workbook_BeforeClose

solo hay que añadirle esta linea:

Sheets("Hoja1").Range("a1").Select

Esto haria que al cerrar el libro nos deja la celda seleccionada en
"A1"
y al abrir el libro, como anteriormente hemos protegido el libro
DESACTIVANDO la opción de "Seleccionar celdas bloqueadas", lo que hace
es automáticamente mandarnos a la celda desprotegida.

He probado la posibilidad de que al abrir el libro ejecute una macro
que seleccione la celda "A1" (por ejemplo) pero me dá error, se me
queda parado en:

For Sig = 1 To UBound(misCeldas)

Así que se me ocurrio la forma que os he comentado.

Ahora lo que estoy intentando hacer es aplicar el orden de tabulación
a otras hojas pero eso ya se me escapa, no doy con el código.
No estoy escribiendo código (porque no se), solo estoy copiando y
pegando de un lado a otro del libro y modificando alguna cosilla que
otra, pero sin más.
Mi cogote no dá para más! (de momento) jejeje

Bueno un saludo, ok?

~ jose ~

unread,
Feb 20, 2006, 3:24:00 PM2/20/06
to
Hola,
Acabo de ver un problema... (bueno en realidad son dos)

Si tenemos el código por ejemplo en la "hoja1"
y nos vamos a cualquier hoja del libro veremos que si pulsamos el
'enter' o el 'tab' nos mandará siempre a la celda "F5" (os recuerdo
que "F5" es la última celda a la que iriamos si estubieramos en la
"hoja1").

El problema sigue mas allá, si abrimos otro archivo excel y pulsamos
'enter' o 'tab', nos hace lo mismo, nos manda a "F5".

Chungo no????

El segundo problema es que antes os he puesto el código mal, este
funciona mejor:

Sheets("Hoja1").Select
Range("a1").Select

Un saludo

Héctor Miguel

unread,
Feb 27, 2006, 12:29:39 AM2/27/06
to
hola, jose !

> Acabo de ver un problema... (bueno en realidad son dos)

> Si tenemos el codigo por ejemplo en la "hoja1" y nos vamos a cualquier hoja del libro veremos que
> si pulsamos el 'enter' o el 'tab' nos mandará siempre a la celda "F5" (...es la ultima celda... si estubieramos en la "hoja1").
> El problema sigue mas alla, si abrimos otro archivo excel y pulsamos 'enter' o 'tab', nos hace lo mismo, nos manda a "F5"...

como te comentaba en el mensaje anterior...
-> ... 'esas' teclas requieren de un 'manejo'... perfectamente definido [para poder 'manipularlas' sin perder otros 'beneficios'] :))

puedes exponer cuales seran los rangos [y su respectivo orden] -> para cada hoja donde requieras 'manejar' dichas teclas ?

saludos,
hector.


0 new messages