El desplegable me discrimina 1 localidad VBA Excel

Muy bien no se como explicar esto porque no logro entender el motivo.
Tengo un formulario donde introduces 1 de 3 datos de una empresa y se te muestra en el listbox con la Población, Comarca y Provincia de dicha empresa. El problema es que el código me funciona correctamente menos con 1 población (que haya detectado). Adjunto unas imágenes para que veíais lo que pasa. La población que veo que no cambia comarca y provincia es BLANES

El codigo de carga de comarca y pronvia es este:

    Private Sub municipi_Change()
    If num_equipament_final.Caption = "" Then
    municipi.Value = ""
    comarca.Value = ""
    provincia.Value = ""
    End If
    On Error Resume Next
    comarca.Value = Application.WorksheetFunction.VLookup(municipi.Value, Range("Municipi_comarca"), 2, 0)
    provincia.Value = Application.WorksheetFunction.VLookup(municipi.Value, Range("Municipi_comarca"), 3, 0)
    End Sub

y los datos de estan todos en la misma tabla y del mismo rango "Municipi_comarca" en la hoja Municipis i Comarques.

¿Cuál es el motivo porque me pasa esto?

3 respuestas

Respuesta
2

[Hola

Como ya te hemos dicho, es difícil adivinar las cosas sin mucho detalle o sin ver el archivo, pero lo bueno en esta ocasión es que en la parte del código que has puesto por aquí se ve un On Error Resume Next que da luces sobre lo que ocurre.

Primero que nada te comentaré que es una mala costumbre su uso a menos que sea estrictamente necesario y en tu caso, y por lo poco que se ve, definitivamente no lo es. Segundo, al parece los datos de donde sale ese Blanes, no son los mismos en todos los casos que lo usas (veo uno en mayúsculas, otro en minúsculas...) y he ahí el dilema. Usa la misma fuente de datos para que sean iguales. Otra opción es que el cuarto argumento de tu VLookUp sea 1 y no 0, pero si por ahí hay localidades con nombre similar podría causarte otro dilema. Prueba ambos casos y comentas.

Abraham Valencia

Hola Abraham te paso el enlace del Excel.

https://drive.google.com/file/d/1rb4Il__Z2QaH2ezfo4pk-kDqVCVZsmoU/view?usp=sharing 

Lo que no entiendo es que si fuera por las mayúsculas también me pasaría si seleccionara otra opción como ves en la foto.
El error resume next esta ahi porque si no me marca error la linea:

comarca.Value = Application.WorksheetFunction.VLookup(municipi.Value, Range("Municipi_comarca"), 2, 0)

Al poner eso me quita el error y el codigo "parecia" que funcionara con normalidad con las otros municipis

Por cierto el BLANES que sale el list box no es el Blanes del municipi.
BLANES es el nombre de la empresa, en este caso y en alguno más coincide con el municipi pero hay otros que no.
Los datos del listbox hay que tomarselos como si fueran empresas (no hay nada de localidades aunque los nombres puedan coincidir)

Yo no dije que el problema eran las mayúsculas o las minúsculas, yo solo afirmé que con eso era evidente que la fuente de datos era distinta, lo que he confirmado al ver tu archivo. En un caso usas la columna C (NOM) para llenar el ListBox, pero para llenar el Label con el VLookUp usas la columna D (POBLACIÓ) y NO son iguales así te lo parezcan.

Por ejemplo en el caso Blanes, en un caso es "Blanes" y en el otro es "Blanes " ¿notas la diferencia? Si tú no, el VLookUp sí. ¿Solución? O usas la misma columna siempre, o revisas todo para asegurar que sean iguales (Repito: NO importa lo de mayúsculas/minúsculas - no en este caso al menos). Ah, obvio que si quitas el On Error Resume Next te iba a dar el error porque ¡Hay un error! (El indicado). Por eso no es bueno usarlo, porque no te permite ver/detectar los problemas.

Abraham Valencia

Es verdad Abraham había un espacio y no me había dado cuenta. De todo se aprende jajaja ya me he buscado una macro para poder borrar espacios delante y detrás de las palabras para que no me vuelva a suceder esto

Jejeje, a veces las cosas simples son las más difíciles de ver.

Saludos]

Abraham Valencia

Respuesta
2

Esta vez no voy a aportar a la pregunta en concreto, pero digamos que soy un activista en contra del On Error Resume Next jajajaja. Así que solo vengo a darte unos consejo para tus futuros proyectos ya que le estas dando en serio al VBA.

-Evita siempre los códigos que veas en internet que incluyan un On Error Resume Next ya que es una alternativa desaconsejada y vaga. Los programadores deben "enfrentar" los errores, no sortearlos por la vía mas fácil.

-VLookUp es problemático, especialmente a través de VBA. Incluso al nivel de hoja, en el Excel Moderno, vLookUp está siendo substituido por Index-Match. Cada vez menos personas usan vLookUp y comienzan a usar Index-Match.

-De todas formas, si estrictamente quieres usar vLookUp en una macro, te sugiero saltar el nivel "WorksheetFunction" y usarlo a nivel de "Application" junto con un manejo de errores correcto.

VLookUp arroja un error cuando no encuentre lo que busca, en teoría eso esta bien, el problema es el tipo de error que da. Pareciera que es un error catastrófico por la manera en que lo presenta.

¿Entonces cómo manejar eso?

Ejemplo:

Application. WorksheetFunction. VLookUp() <-- NO

Application. VLookUp() <-- SI

Ahora mira como funciona:

Sub BuscarDato()
Dim Msg As Variant
Msg = Application.VLookup("DATO", Range("A1:A5"), 1, 0)
If IsError(Msg) Then Msg = "No se encontró"
MsgBox Msg
End Sub

Observa la diferencia entre usar WorksheetFunction y no usarlo:

VIDEO DEMO

Andy

Muchas gracias Andy he hecho las modificaciones en mi código y no me da error. Aunque seguro que haberlo hecho más simple. Lo he intentado la verdad pero así es la única manera que he conseguido que me funcione.

Agradezco estas valoraciones por tu parte, son primordiales para aprender .

Dim comarca2 As Variant
Dim provincia2 As Variant
Dim msg As Variant
comarca2 = Application.VLookup(municipi.Value, Range("Municipi_comarca"), 2, 0)
provincia2 = Application.VLookup(municipi.Value, Range("Municipi_comarca"), 3, 0)
If IsError(comarca2) Then
msg = "No s'ha trobat la comarca"
MsgBox msg
Else
        comarca.Value = Application.VLookup(municipi.Value, Range("Municipi_comarca"), 2, 0)
End If
If IsError(provincia2) Then
msg = "No s'ha trobat la provincia"
MsgBox msg
Else
        provincia.Value = Application.VLookup(municipi.Value, Range("Municipi_comarca"), 3, 0)
End If

al final pensaba que poniendo comarca.value=comarca ya me saldria pero he tenido que poner al final toda la linea para que funcionara.
Te adjunto el código para que veas que tus palabras no se las lleva el viento jejejej y que cualquier aportación que hacéis por aquí yo la contemplo e intento aplicarla

Es un placer ayudarte porque se nota que le pones ganas en aprender, otros solo toman la primera respuesta y chau.

PD: debería ser comarca2, te falta el 2.

Dices:

al final pensaba que poniendo comarca.value=comarca ya....

y yo digo que debería ser comarca.value=comarca2

Y en el otro, provincia2

Pruébalo, así te evitas toda la línea larga otra vez

Respuesta

Se me atraganta un poco en código vba, pero dime una cosa. Que nombre tiene el combobox.  munisipi o Num_equipament?

Municipi es el nombre del textbox donde aparece de manera automática.
Num_equipament es el primer combobox al lado de equipament. Contiene un numero único que identifica la empresa y el resultado se muestra en en listbox. Una vez seleccionas en el listbox la opción se carga el municipi y más tarde en el evento municipi_change cambia el comarca.value y provincia.value

Es que lo que no entiendo es porque pones caption al final

num_equipament_final es un label que muestra el contenido de la selección del listbox en concreto el campo num_equipament.value.
Es como si mostrara el resultado seleccionado en label, y la condición va sujeta en que en esa casilla contenga un valor

Mi propuesta es que pruebes así a ver que hace. No la he probado.

Private Sub num_equipament_Change()
    If num_equipament.Value = "" Then
    municipi.Value = ""
    comarca.Value = ""
    provincia.Value = ""
    End If
    On Error Resume Next
    comarca.Value = Application.WorksheetFunction.VLookup(municipi.Value, Range("Municipi_comarca"), 2, 0)
    provincia.Value = Application.WorksheetFunction.VLookup(municipi.Value, Range("Municipi_comarca"), 3, 0)
    End Sub

Ahh vale. Entonces olvida mi código, no creo que funcione.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas