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

17/02/2006 - 22:26 por ~ jose ~ | Informe spam
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

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
18/02/2006 - 09:55 | Informe spam
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
Respuesta Responder a este mensaje
#2 ~ jose ~
18/02/2006 - 21:12 | Informe spam
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?
Respuesta Responder a este mensaje
#3 KL
18/02/2006 - 22:50 | Informe spam
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 ~" wrote in message news:
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?
Respuesta Responder a este mensaje
#4 ~ jose ~
19/02/2006 - 02:53 | Informe spam
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

KL wrote:
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 ~" wrote in message news:
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?
Respuesta Responder a este mensaje
#5 Héctor Miguel
19/02/2006 - 07:18 | Informe spam
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.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida