Listas Validadas con VBA y Como Bloquear movimiento de Pantalla

16/06/2009 - 00:37 por Oscar | Informe spam
Hola a los Amigos

Por favor, necesito un codigo BVA para bloquear el movimiento de la
pantalla, solo de una sola hoja de un Libro. Tengo un formulario para pedidos
en esta hoja que no debe moverse.
Asimismo, en el mismo formulario tengo celdas con validación de lista pero
que tienen un codigo adicional para que el usuario pueda ingresar la primera
letra y se seleccionen las coincidencias. El codigo lo indico aqui mas abajo;
pero tengo el preblema que el codigo funciona solo si las listas estan en la
misma hoja de la macro. Por favor, ayudarme para que las listas puedan estar
en otras hojas (ocultas) para que pueda editarlas cuando necesario.
Gracias

Option Explicit
Private Sub TempCombo_KeyDown(ByVal _
KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
'Hide combo box and move to next cell on Enter and Tab
Select Case KeyCode
Case 9
ActiveCell.Offset(0, 1).Activate
Case 13
ActiveCell.Offset(1, 0).Activate
Case Else
'do nothing
End Select

End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
Boolean)
Dim str As String
Dim cboTemp As OLEObject
Dim ws As Worksheet
Set ws = ActiveSheet
Cancel = True
Set cboTemp = ws.OLEObjects("TempCombo")
On Error Resume Next
With cboTemp
.ListFillRange = ""
.LinkedCell = ""
.Visible = False
End With
On Error GoTo errHandler
If Target.Validation.Type = 3 Then
Application.EnableEvents = False
str = Target.Validation.Formula1
str = Right(str, Len(str) - 1)
With cboTemp
.Visible = True
.Left = Target.Left
.Top = Target.Top
.Width = Target.Width + 15
.Height = Target.Height + 5
.ListFillRange = ws.Range(str).Address
.LinkedCell = Target.Address
End With
cboTemp.Activate
Application.ScreenUpdating = True

End If
errHandler:
Application.EnableEvents = True
Exit Sub

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim str As String
Dim cboTemp As OLEObject
Dim ws As Worksheet
Set ws = ActiveSheet

Set cboTemp = ws.OLEObjects("TempCombo")
On Error Resume Next
If cboTemp.Visible = True Then
With cboTemp
.Top = 10
.Left = 10
.ListFillRange = ""
.LinkedCell = ""
.Visible = False
.Value = ""
End With
End If

errHandler:
Application.EnableEvents = True
Exit Sub

End Sub

Oscar Menacho
Lima - Perú



Slds
Oscar M

Preguntas similare

Leer las respuestas

#1 Oscar
22/06/2009 - 17:43 | Informe spam
Hola Héctor,
Gracias por tus respuestas. Te explico mejor mi solicitud. Tengo un libro
con 4 hojas. La hoja1 tiene un formulario de pedidos y las restantes 3 hojas
tienen listas simples: clientes, productos y empr-transp, que contienen
información para ser llenada automaticamente en la Hoja1 con la funcion
BuscarV.
Necesito que el "scroll" vertical y horizontal este deshabilitado solo en la
hoja1 (que no se mueva con las barras de desplazameinto ni con las teclas de
flechas). Esto lo necesito asi, por que en la misma hoja1 hay listas al
extremo derecho y los usuarios no deben poder modificarlas (conocen muy poco
de excel).
En cuanto al codigo de VBA para las celdas validadas con lista, te preciso
que en la Hoja1 hay varias celdas con listas validadas que estan afectas por
el Codigo VBA que te indiqué. Aqui te pido por favor me ayudes con este
codigo, ya que hay una variable "str" que esta asociada a la propiedad
'LisFillRange' que varia de acuerdo a la celda a validar. Te agradecere me
sugieras la modificación en ese Codigo VBA para identificar la lista
respectiva de cada celda validada cuando se haga doble-clik en ellas.
Gracias nuevamente.

Slds
Oscar M


"Héctor Miguel" wrote:

hola, Oscar !

> ... necesito un codigo BVA para bloquear el movimiento de la pantalla, solo de una sola hoja de un Libro.
> Tengo un formulario para pedidos en esta hoja que no debe moverse.

=> cual es la causa/razon/motivo/circunstancia/... para "bloquear" y que se entiende por "movimiento de pantalla" y de cual hoja ???

> ... en el mismo formulario tengo celdas con validacion de lista
> ... que tienen un codigo adicional para que el usuario pueda ingresar la primera letra y se seleccionen las coincidencias.
> El codigo lo indico aqui mas abajo; pero tengo el preblema que el codigo funciona solo si las listas estan en la misma hoja de la macro.
> Por favor, ayudarme para que las listas puedan estar en otras hojas (ocultas) para que pueda editarlas cuando necesario...

=> la clave para que puedas "meter" en cuadros de lista/combos elementos de cualquier hoja y rango...
es su propiedad: .ListFillRange, misma que (generalmente) es una cadena de texto que pudiera hacer referencia (p.e.)
- a un rango con nombre: -> .ListFillRange = "rangonombrado"
- a la hoja y rango "especificos" : -> .ListFillRange = "hoja25!a1:k50"
=> todo "depende" de como nececites que sea "identificada" la hoja a la que corresponde el rango con los elementos a listar (?)

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ los codigos expuestos __
> Option Explicit
> Private Sub TempCombo_KeyDown(ByVal _
> KeyCode As MSForms.ReturnInteger, _
> ByVal Shift As Integer)
> 'Hide combo box and move to next cell on Enter and Tab
> Select Case KeyCode
> Case 9
> ActiveCell.Offset(0, 1).Activate
> Case 13
> ActiveCell.Offset(1, 0).Activate
> Case Else
> 'do nothing
> End Select
>
> End Sub
>
> Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
> Boolean)
> Dim str As String
> Dim cboTemp As OLEObject
> Dim ws As Worksheet
> Set ws = ActiveSheet
> Cancel = True
> Set cboTemp = ws.OLEObjects("TempCombo")
> On Error Resume Next
> With cboTemp
> .ListFillRange = ""
> .LinkedCell = ""
> .Visible = False
> End With
> On Error GoTo errHandler
> If Target.Validation.Type = 3 Then
> Application.EnableEvents = False
> str = Target.Validation.Formula1
> str = Right(str, Len(str) - 1)
> With cboTemp
> .Visible = True
> .Left = Target.Left
> .Top = Target.Top
> .Width = Target.Width + 15
> .Height = Target.Height + 5
> .ListFillRange = ws.Range(str).Address
> .LinkedCell = Target.Address
> End With
> cboTemp.Activate
> Application.ScreenUpdating = True
>
> End If
> errHandler:
> Application.EnableEvents = True
> Exit Sub
>
> End Sub
>
> Private Sub Worksheet_SelectionChange(ByVal Target As Range)
> Dim str As String
> Dim cboTemp As OLEObject
> Dim ws As Worksheet
> Set ws = ActiveSheet
>
> Set cboTemp = ws.OLEObjects("TempCombo")
> On Error Resume Next
> If cboTemp.Visible = True Then
> With cboTemp
> .Top = 10
> .Left = 10
> .ListFillRange = ""
> .LinkedCell = ""
> .Visible = False
> .Value = ""
> End With
> End If
>
> errHandler:
> Application.EnableEvents = True
> Exit Sub
>
> End Sub



Respuesta Responder a este mensaje
#2 Héctor Miguel
22/06/2009 - 22:26 | Informe spam
hola, Oscar !

Tengo un libro con 4 hojas. La hoja1 tiene un formulario de pedidos y las restantes 3 hojas tienen listas simples:
clientes, productos y empr-transp, que contienen informacion para ser llenada automaticamente en la Hoja1 con la funcion BuscarV.
Necesito que el "scroll" vertical y horizontal este deshabilitado solo en la hoja1
(que no se mueva con las barras de desplazameinto ni con las teclas de flechas)



=> para inmovilizar el desplazamiento por una hoja, prueba en tu codigo estableciendo la propiedad .ScrolllArea en una direccion fija
(p.e.) <cual hoja>.ScrollArea = "$A$1" o... activesheet.scrollarea = activewindow.visiblerange.address
OJO: solo no te olvides de regresarla a una cadena vacia al termino de tus macros (.ScrollArea = "")

... para las celdas validadas con lista... en la Hoja1 hay varias celdas con listas validadas que estan afectas por el Codigo VBA que te indique.
Aqui te pido por favor me ayudes con este codigo, ya que hay una variable "str" que esta asociada a la propiedad 'LisFillRange'
que varia de acuerdo a la celda a validar sugieras la modificacion en ese Codigo VBA
para identificar la lista respectiva de cada celda validada cuando se haga doble-clik en ellas.



=> si te refieres a que no puedes identificar el origen de la lista cuando este proviene de "otra" hoja (?)...

1) DEJA de hacer referencia a la hoja activa (es decir, evita el uso de instrucciones de este tipo):
Dim ws As Worksheet
Set ws = ActiveSheet
(...)
.ListFillRange = ws.Range(str).Address

2) cambia la asignacion del listfillrange por algo +/- como lo siguiente:
.ListFillRange = Evaluate(str)

(esto, asumiendo que la variable "str" ya lleva incluida la hoja con el rango de origen de tus validaciones) (?)

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida