los eventos y RefEdit

02/07/2007 - 17:46 por Ivan | Informe spam
hola a todos,

aunque ya he visto en la ayuda de msdn que los controles refedit, a parte de tener ciertas particularidades, vienen con
algunos problemas para algunas ediciones de excel (en concreto para la mia : 2002/xp), hay una cosa que no deja de
llamarme la atencion y que no se si se debe a estos 'defectos' o a que no estoy usando alguna propiedad adecuadamente

el caso es que he estadohaciendo pruebas para poner la direccion del rango seleccionado en formato 'relativo'.

Esto parece no tener problema cuando se trata del rango seleccionado tal cual. Por ej. poniendo en el change algo asi:

refedit1=range(refedit1).address(0,0) ' devuelve el rango asi=> a1 o a1:a2 pej.

1.-aqui aparece la primera curiosidad: si incluyo cualquier otro tipo de instruccion en el change 'vuelve' a 'devolver'
el formato hoja!$a$1. aunque estas instrucciones no esten directamente relacionadas con el tema.

2.- la segunda curiosidad es que, si por ejemplo intento poner como texto del refedit la direccion de currentregion, o
mas concretamente, la direccion de la 1ª celda del currentregion, tampoco lo permite, aparte de devolver el fomrto
hoja-celda. Por ej. <>>

refedit1=range(refedit1).currentregion.cells(1).address(0,0)

me devuelve esto =>

hoja!$a$1

y no hace ningun caso al codigo introducido, ni siquiera usando alguna variable boolean para evitar posibles
repeticiones del change. . Tampoco logro modificar el text del refedit (si no es sobre la referencia seleccionada) desde
ningun otro procedimiento. Y de aqui surge la 3ª duda

3.- aunque he visto que varios de los eventos del refedit no 'suceden' al menos en exel 2002, tampoco acabo de entender
como se suceden los del formulario cuando se pulsa el refedit. Pensaba que se dispararian bien el resize, el Layout, o
al menos el activate al aceptar en el refedit y volverse a mostrar el formulario. Pero por mis pruebas ninguno de estos
parece producirse ni al 'mostrar' el refedit ( y ¿ ocultar el formulario?) ni al volver a mostrarse tras aceptar en
el refedit

bueno, no se si se me ha entendido, y posiblemente tampoco sea muy importante, pero lo mismo es solo modificar el valor
de alguna propiedad que no logro ver. Como siempre agradezco vuestra ayuda.

un saludo y hasta pronto
Ivan

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
03/07/2007 - 06:06 | Informe spam
hola, Ivan !

aunque ya he visto en la ayuda de msdn que los controles refedit, a parte de tener ciertas particularidades
vienen con algunos problemas para algunas ediciones de excel (en concreto para la mia : 2002/xp)
hay una cosa que no deja de llamarme la atencion y que no se si se debe a estos 'defectos' o
a que no estoy usando alguna propiedad adecuadamente
el caso es que he estado haciendo pruebas para poner la direccion del rango seleccionado en formato 'relativo'.
Esto parece no tener problema cuando se trata del rango seleccionado tal cual. Por ej. poniendo en el change algo asi:
refedit1=range(refedit1).address(0,0) ' devuelve el rango asi=> a1 o a1:a2 pej.



-> imagino que tus pruebas no son igual de *sencillas* que la forma de exponerlas en esta consulta -?- por lo que...
[creo que] seria mejor si comentas *que* es lo que realmente necesitas *controlar/hacer/...*
con la seleccion del usuario en un cuadro de edicion de referencias -?-

1.-aqui aparece la primera curiosidad: si incluyo cualquier otro tipo de instruccion en el change 'vuelve' a 'devolver'
el formato hoja!$a$1. aunque estas instrucciones no esten directamente relacionadas con el tema.
2.- la segunda curiosidad es que, si por ejemplo intento poner como texto del refedit la direccion de currentregion
o mas concretamente, la direccion de la 1a celda del currentregion, tampoco lo permite
aparte de devolver el fomrto hoja-celda. Por ej. > refedit1=range(refedit1).currentregion.cells(1).address(0,0)
me devuelve esto => hoja!$a$1



-> notaras que los cuadros de edicion de referencias, cuando son utilizados [p.e.] desde el asistente para funciones,
solo devuelven el nombre de la hoja al seleccionar rangos en hojas diferentes a la celda donde se introduce la formula/funcion
[sin embargo] cuando estos RefEdit's son controles de un formulario [supongo que] necesitan *insistir* con el nombre de la hoja
puesto que no estan vincuados directamente con ninguna de las hojas en el libro -?-

y no hace ningun caso al codigo introducido, ni siquiera usando alguna variable boolean para evitar posibles repeticiones del change.
Tampoco logro modificar el text del refedit (si no es sobre la referencia seleccionada) desde ningun otro procedimiento.
Y de aqui surge la 3a duda
3.- aunque he visto que varios de los eventos del refedit no 'suceden' al menos en exel 2002
tampoco acabo de entender como se suceden los del formulario cuando se pulsa el refedit.
Pensaba que se dispararian bien el resize, el Layout, o al menos el activate al aceptar en el refedit y volverse a mostrar el formulario.
Pero por mis pruebas ninguno de estos parece producirse ni al 'mostrar' el refedit ( y ¿ ocultar el formulario?)
ni al volver a mostrarse tras aceptar en el refedit



-> una forma *segura* de saber si los eventos de un objeto/control/... son disparados/reconocidos/... [o no]
es usando un MsgBox "Nombre del evento" [obviamente] en cada uno de los eventos del objeto/control/...
necesitaras 'saltar' algunos *ofensivos* [como mouseover, mousedown, etc.] ya que resultaran un *estorbo* a la agilidad del evento :))
-> ademas de que exista la posibilidad de que unos eventos inhiban a otros [segun su *momento*] -?-

bueno, no se si se me ha entendido, y posiblemente tampoco sea muy importante
pero lo mismo es solo modificar el valor de alguna propiedad que no logro ver...



si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Ivan
04/07/2007 - 02:14 | Informe spam
hola Hector, lo primero gracias de nuevo por tu ayuda.

-> imagino que tus pruebas no son igual de *sencillas* que la forma de exponerlas en esta consulta -?- por lo
que...
[creo que] seria mejor si comentas *que* es lo que realmente necesitas *controlar/hacer/...*
con la seleccion del usuario en un cuadro de edicion de referencias -?-



en realidad, aunque lo que quiero es obtener tanto la ref. del currentregion, de la 1ª celda de este y de la fila de
titulos, esto no creo que tenga mucho problema obtenerlo del refedit

aun menos con la ayuda de alguna que otra respuesta tuya en el foro <pej:
Hoja=left(refedit1,inst(refedit1,"!")-1)...etc>,

pero estaba intentando hacerlo un poco mas 'amigable'/claro para el usuario mostrando directamente la ref.
correspondiente y a ser posible en formato 'a1:a2', aunque se hubiera seleccionado cualquier otra celda o rango (eso
si, dentro de la lista)

y aqui es donde han empezado a surgir los problemas, que incluyen cierres de la aplicacion, aun llamando al userform
desde la interfaze de excel (por lo que he visto este problema si esta documentado cuando se prueba desde el editor de
vba).

Pero esto aparte, lo que si me ha intrigado es el motivo de la 'discriminacion' que hace el control al menos en el
change, pues, como comentaba, si parece admitir el cambio cuando se trata del propio rango seleccionado con el refedit
(pej: Hoja1!&a&2 si me lo 'muestra' como 'a2' con refedit=range(refedit).address(0,0) ) pero no asi cuando intento que
muestre otro rango obtenido del contenido del refedit

otra cosa que tambien me llama la atencion es el que si se incluye alguna otra instruccion en el change, empiezan los
problemas

pej; ( nota: no hagas mucho caso a algunas de las instrucciones, son simples pruebas <entre otras muchas> para marear la
perdiz)

Private Sub RefEdit1_Change()
'' esto 1º solo si funciona, pero si desmarco alguna instruccion de las siguientes(poniendo como comentario la 1ª en
caso necesario), por un lado o por otro acaba dando problemas o simplemente devolviendo el formato Hojaa1!tal

refedit=range(refedit).address(0,0)

' msgbox "Hola mundo"
' refedit=range(refedit).currentregion.cells(1,1).address(0,0)
' refedit=worksheets(left(refedit1,instr(refedit1,"!")-1).range(refedit).currentregion.cells(1,1).address(0,0)
' Range(RefEdit1).Select
' RefEdit1.Text = _
' Range(Replace(Right(RefEdit1.Text, Len(RefEdit1.Text) - InStr(RefEdit1.Text, "!")), "$", "")). _
' CurrentRegion.Address(0, 0)
' RefEdit1.Text = _
' Replace(Right(RefEdit1.Text, Len(RefEdit1.Text) - InStr(RefEdit1.Text, "!")), "$", "")
' nO = nO + 1
' msj = msj & vbCr & "RefEdit1_Change nroOrden " & nO
End Sub

en cualquier caso, ante el riesgo de cierre, de momento he desistido de usarlo, al menos hasta que me imforme un poco
mejor de los posibles parches que parecen existir y de los problemas que pudieran derivarse del uso.

pero no deja de llamarme la atencion la cosa

necesitan *insistir* con el nombre de la hoja puesto que no estan vincuados directamente con ninguna de las hojas en
el libro





supongo que un poco de aqui debe derivar el problema, que a pesar de parecer poder usarse como un cuadro de texto (con
la peculiaridad de devolver las ref. de los rangos seleccionados) sin embargo debe de existir algun tipo de vinculacion
con el rango seleccionado que genera los mencionados problemas cuando este vinculo se 'rompe' exteriormente (pej.
cambiando el text) y que se debe mantener (o eso me parece) incluso despues de volver a un estado, llamemosle 'inactivo'

en fin, a lo mejor acabo de decir una de mis tonterias, pero es por buscar algun 'consuelo'

-> una forma *segura* de saber si los eventos de un objeto/control/... son disparados/reconocidos/... [o no]
es usando un MsgBox "Nombre del evento"



en realidad esta es +/- una de las pruebas que habia hecho, y de ahi mi sorpresa al comprobar que durante toda la
secuencia desde que:

se entra al refedit (enter) ->
->se pulsa el boton (dropbuttonclick) ->
->aparentemente el userform se redimensiona al tamaño del refedit (pensaba que se dispararia el Resize de form, pero no
parece que lo haga ) ->
-> se selecciona un/os rango/s (change/s) ->
->se pulsa nuevamente el boton (aqui ya no parece producirse el Dropbuttonclick) ->
->vuelve a mostrarse el form en su tamaño normal (tampoco parece producirse el Layout) ->
->curiosamente aqui parece (a lo mejor es solo una impresion, pues no he logrado delimitarlo) volver a producirse un
ultimo change de refedit

hasta que se sale, no parece producirse ningun evento del formulario, o al menos yo no he logrado detectarlo, para
utilizarlo en cambiar el text, que es posible que desde un evento externo si sea posible (lo es al menos en intialize
del form)

bueno, si has/habeis llegado hasta aqui, gracias tambien por tu paciencia y espero que mas o menos se me halla entendido
algo.

Y, lo dicho, tampoco es muy importante, de hecho, y tambien por practicar me he 'fabricado' una especie de refedit
propio con un form modal, un textbox y un commandbutton, y usando una hoja predefinida (y su selectionchange) como
plantilla.

pero, aunque sea un topico, el saber no ocupa (demasiado) lugar

lo dicho, grracias de nuevo y un saludo
Ivan
Respuesta Responder a este mensaje
#3 Héctor Miguel
04/07/2007 - 02:39 | Informe spam
hola, Ivan !

si el control RefEdit te esta causando 'tropiezos' [sobre todo por la version documentada]...
usa el 'inputbox' =>del objeto 'application'<= [que NO es lo mismo que un 'inputbox' de vba]
te paso un ejemplo al final de este mensaje ;)

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

en un modulo de codigo 'normal' ==Sub X_macro()
'[... otras lineas de tu codigo ...]
Dim Celda As Range, Seleccion As Range
On Error Resume Next ' por si las dudas '
Application.ScreenUpdating = True ' el 'refresco' de la pantalla debe estar 'activo' '
Set Seleccion = Application.InputBox( _
Prompt:="Selecciona la/s celda/s de referencia...", _
Title:="En espera de la seleccion...", _
Default:=ActiveCell.Address, _
Type:=8) ' Type:=8 'significa' que 'se espera' un objeto rango seleccionado ->por el usuario<- '
On Error GoTo 0 ' liberamos la omision de errores '
If Seleccion Is Nothing Then
Exit Sub ' u otras instrucciones '
Else
For Each Celda In Seleccion
'[... pon aqui las instrucciones 'validas' ...]
Next
End If
'[... otras lineas de tu codigo ...]
End Sub
Respuesta Responder a este mensaje
#4 Ivan
04/07/2007 - 03:40 | Informe spam
hola de nuevo, Hector,

como siempre, otra papeleta resuelta y otras cuantas cosillas para la
saca (conocia el msgbox de application, pero no el inputbox <ni, es
evidente, sus interesantes detalles>). Muchas gracias de nuevo.

para probarlo (auqnque no se si esta sera la forma definitiva de uso)
he hecho esta adaptacion de tu codigo, para obtener, en este caso, y
con ciertos riesgos aun por investigar, la primera celda de una lista

Public Function RefConInputBox() As String
Dim Seleccion As Range
On Error Resume Next
Application.ScreenUpdating = True
Set Seleccion = Application.InputBox( _
Prompt:="Selecciona la/s celda/s de referencia...", _
Title:="En espera de la seleccion...", _
Default:=ActiveCell.Address, _
Type:=8)
On Error GoTo 0
If Not Seleccion Is Nothing Then
RefConInputBox = Seleccion.CurrentRegion.Cells(1).Address(0, 0)
Set Seleccion = Nothing
End If
End Function

y he probado a llamarla desde un boton adosado a un textbox (simulando
el refedit) de esta forma

Private Sub CommandButton1_Click()
TextBox1 = RefConInputBox
End Sub

parece funcionar bien y hacer el apaño, adaptandolo, para todas las
cuestiones que planteaba ( aparte posiblemente de otras muchas)

lo dicho, muchas gracias una vez mas

un saludo y hasta pronto
Ivan

PD: en cuanto al refedit, me temo que, como comentas, sea un problema
de la version. Y aun actualizando los parches que creo existen, esto
no seria garantia al ejecutarse en otros equipos. Pero tu solucion
zanja el problema (al menos de momento)
Respuesta Responder a este mensaje
#5 Ivan
04/07/2007 - 03:54 | Informe spam
hola de nuevo,

FE DE .. metedura de pata =>>

(conocia el msgbox de application, pero no el inputbox <ni, es


evidente, sus interesantes detalles>



creo que se me ha ido la olla y he confundido el propio metodo
Inputbox con un (creo) inexistente metodo msgbox. En fin, se nota que
no lo he usado mucho.


un saludo
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida