Compartir a través de

Usar una Array como lista de validacion.

Anónimas
2011-08-12T09:04:59+00:00

Hola a todos,

Despues de realizar mediante VBA una busqueda en un rango y recoger todos los valores validos en una Array ¿como asigno los valores de esa Array a una lista de validacion de una celda?.

Lo mas elemental (desde mi pobre punto de vista):

With Target.Offset(0, 3).Validation

        .Delete

        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _

        xlBetween, Formula1:=Array     ' he probado con el nombre de la Array con y sin parentesis pero no funciona.

        .IgnoreBlank = True

        .InCellDropdown = True

        .InputTitle = ""

        .ErrorTitle = ""

        .InputMessage = ""

        .ErrorMessage = ""

        .ShowInput = True

        .ShowError = True

    End With

Saludos

Microsoft 365 y Office | Excel | Para la casa | Windows

Pregunta bloqueada. Esta pregunta se migró desde la Comunidad de Soporte técnico de Microsoft. Puede votar si es útil, pero no puede agregar comentarios o respuestas ni seguir la pregunta.

0 comentarios No hay comentarios

Respuesta aceptada por el autor de la pregunta

Héctor Miguel 71,595 Puntos de reputación
2011-08-24T02:20:43+00:00

<<<<1) es importante que expongas el codigo con el que construyes el "array" With Hoja4.Range("A11:A65536")

    Set c = .Find(Target, LookIn:=xlValues)

   Contador = 0

   If Not c Is Nothing Then

        FirtsAddress = c.Address

        Do

        valor(Contador) = c.Offset(0, 3) 'valor es aqui la Array [ ... ]

 

<<<<2) para el tipo de validacion (xlValidateList), el argumento "Formula1" debe contener una lista de valores (valor constante o valor de cadena) delimitados por comas o una referencia de hoja de calculo a dicha lista.

Por aqui pasa la solucion, pero.....

<<<<3) es importante notar que el caracter delimitador (si coma o punto y coma) dependera de la configuracion regional del equipo donde se ejecuta la macro.

En mi caso punto y coma, Pero esto es para funciones ¿no?

  1. si estas usando "Target" significa que el codigo esta en algun evento ('_change' o '_selectionchange') en un modulo de clase (hoja o libro) que lo podria volver "repetitivo/machacante/..." (a menos que tengas algun "candado" para su ejecucion ?)

Te refieres a esto:

If Not Target = "" And Not Intersect(Target, [D11:D65536]) Is Nothing Then........................

hola, Ignacio !

  1. una vez que colectas los valores en el "array" (en tu ejemplo la variable llamada "valor"), la forma de asignarlo a las reglas de validacion por codigo es cambiar la parte de "Formula1":

de: => Formula1:=Array

  a: => Formula1:=Join(valor, sL)

  1. la "nueva" variable (sL) es para identificar el separador de listas (y argumentos) en el equipo donde se ejecuta la macro, la defines y la estableces en 2 lineas de codigo (en alguna parte de tu proceso) +/- como sigue:

  Dim sL As String

  sL = Application.International(xlListSeparator)

  1. al conocer el evento que usas (probablemente el '_change') y las razones para machacar reglas de validacion por codigo (probablemente) se podria sugerir otro metodo o procedimiento, ya que las reglas de validacion tienen alguna "hiper-sensibilidad" cuando son repetidamente administradas por codigo y podrian poner en riesgo la integridad de esa hoja, ademas, no es claro como reaccionaria el codigo cuando el "Target" es de varias celdas (???)

probablemente existan otras formas de lograr el objetivo (si comentas cual es exactamente ?)

saludos,

hector.

p.d. agrego: si la cadena resultante del Join(... excede 255 caracteres, la propiedad "Validation" fallara :-(

¿Le ha resultado útil esta respuesta?

0 comentarios No hay comentarios

8 respuestas adicionales

Ordenar por: Muy útil
  1. Anónimas
    2011-08-23T14:42:11+00:00

    Ya tienes tarea, Héctor. No te quejes que te ha respondido a todos los puntos que le planteabas. ;-)))

    ¿Le ha resultado útil esta respuesta?

    0 comentarios No hay comentarios
  2. Anónimas
    2011-08-23T13:48:11+00:00

    Puff al final me cogéis de vacaciones, gracias a los dos.

    Hector te añado algunos detalles:

    <<<<1) es importante que expongas el codigo con el que construyes el "array"

    With Hoja4.Range("A11:A65536")

        Set c = .Find(Target, LookIn:=xlValues)

       Contador = 0

       If Not c Is Nothing Then

            FirtsAddress = c.Address

            Do

            valor(Contador) = c.Offset(0, 3) 'valor es aqui la Array

            Contador = Contador + 1

            Set c = .FindNext(c)

            Loop While Not c Is Nothing And c.Address <> FirtsAddress

        End If

    End With

    <<<<2) para el tipo de validacion (xlValidateList), el argumento "Formula1" debe contener una lista de valores (valor constante o valor de cadena) delimitados por comas o una referencia de hoja de calculo a dicha lista.

    Por aqui pasa la solucion, pero.....

    <<<<3) es importante notar que el caracter delimitador (si coma o punto y coma) dependera de la configuracion regional del equipo donde se ejecuta la macro.

    En mi caso punto y coma, Pero esto es para funciones ¿no?

    1. si estas usando "Target" significa que el codigo esta en algun evento ('_change' o '_selectionchange') en un modulo de clase (hoja o libro) que lo podria volver "repetitivo/machacante/..." (a menos que tengas algun "candado" para su ejecucion ?)

    Te refieres a esto:

    If Not Target = "" And Not Intersect(Target, [D11:D65536]) Is Nothing Then........................

    Muchas gracias

    ¿Le ha resultado útil esta respuesta?

    0 comentarios No hay comentarios
  3. Héctor Miguel 71,595 Puntos de reputación
    2011-08-13T04:25:31+00:00

    hola, Ignacio !

    1. es importante que expongas el codigo con el que construyes el "array"
    2. para el tipo de validacion (xlValidateList), el argumento "Formula1" debe contener una lista de valores (valor constante o valor de cadena) delimitados por comas o una referencia de hoja de calculo a dicha lista
    3. es importante notar que el caracter delimitador (si coma o punto y coma) dependera de la configuracion regional del equipo donde se ejecuta la macro
    4. si estas usando "Target" significa que el codigo esta en algun evento ('_change' o '_selectionchange') en un modulo de clase (hoja o libro) que lo podria volver "repetitivo/machacante/..." (a menos que tengas algun "candado" para su ejecucion ?)

    hay otras eventualidades que no se deberian suponer/adivinar/inventar/... (desde este lado del mensaje), sino exponer con claridad desde la consulta, para poder (RE)crear un modelo y entorno de trabajo (+/- exactamente ?) "iguales al tuyo"

    si cualquier duda (o informacion adicional)... comentas ?

    saludos,

    hector.

    ¿Le ha resultado útil esta respuesta?

    0 comentarios No hay comentarios
  4. Anónimas
    2011-08-12T13:21:30+00:00

    Mientras Hector no se levanta...

    Define un nombre con la matriz de datos.

    ¿Le ha resultado útil esta respuesta?

    0 comentarios No hay comentarios