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 Suby 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
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
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
- Compartir respuesta
[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
- Compartir respuesta
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 SubObserva la diferencia entre usar WorksheetFunction y no usarlo:
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 Ifal 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
- Compartir respuesta
Deberíamos hacer un club de los "anti On Error..." jajaja. Con gente que incia lo entiendo un poco, pero aL igual que tú, cuando veo gente que se supone conoce VBA años solo siento ¡Plop! en mi cabeza je je je. Ah, sobre tu consejo de evitar el "WorkSheetFunction" (y otros), pienso igual que tú pero no sé si es que ya estoy viejo o qué, siempre coloco cosas no obligatorias como eso, o "Let", o declarar variables completas y no resumidas, etc., porque creo (repito, creo/siento) que la gente nueva lo entiende mejor je je je. Reconozco que en cosas personales de VB.Net sí "voy al grano" (para mi trabajo casi nunca he usado VBA). Saludos. - Abraham Valencia
jaja si me estresa cuando veo a los "pro" poniendo el Resume Next jajaja. El tema de "WorksheetFunction" me atrevo a decir que es un bug de Microsoft, pero es solo una especulación mía. Yo la verdad es que aprendí VBA a regañadientes, honestamente no me gusta, pero tuve que aprenderlo porque trabaje 8 años con un programador que hacia todo en Access con VBA y no quería cambiar, así que me tocó aprender. Igual le agradezco porque los programadores debemos saber la mayor cantidad de lenguajes posibles. - Andy Machin
Si mal no recuerdo, la explicación de Microsoft en algún momento fue de que... al analizar un objeto más, podía causar problemas, en buena cuenta: Un Bug nunca solucionado como tú mencionas jejeje. A mí me gusta mucho el VBA, me encanta la verdad, ah, el de Access sí lo usaba hace muchos años por trabajo porque la ONG en dónde trabajé una década no adquiría MySQL o SQLServer para las bases de datos jejeje. Ah, me estresa también cuando la gente cree que hace sistemas con VBA, lo siento, pero tenía que decirlo jejeje. Saludos. - Abraham Valencia
A mi no es que no me guste VBA, de hecho me gusta porque es fácil, la sintaxis es un estilo tipo Phyton de semántica dinámica, sin caracteres extraños. Como dicen "Si sabes Ingles, sabes Phyton". El problema con VBA es sus limitaciones, a veces una cosa que se hace muy simple en otro lenguaje, en VBA hay que hacer malabares para conseguirlo. Si hablamos de estres, también cuando ponen Set Objeto = Nothing antes de End Sub. Me parece ridículo, hay un experto aquí que le pone eso a casi todas sus macros. Respondí sobre eso no hace mucho. - Andy Machin
Aqui esta el link de la respuesta. VBA cuenta con un Garbage Collector, en conclusion, no es necesario destruir ibjetos manualmente en VBA.Cuando se debe usar = Nothing en Excel - Andy Machin
A mí me gusta mucho por la facilidad, justamente, no tanto por mí que soy de la "vieja guardia", sino por el usuario común, ya que induce a empezar a programar en lenguajes "mejores". Un dilema de este foro es la falta de discusión teórica o de debates entre programadores "viejos" (como yo je je je), recomiendo para eso Ayuda Excel o Todo Excel. Un ejemplo, lo de Nothing, lo conozco bien pero te copio/pego algo de esta conversación: https://ayudaexcel.com/foro/topic/41864-como-utilizar-nothing - Abraham Valencia
Hay algo muy relacionado a las buenas costumbres, como dice Gerson. La declaración de variables es una, no necesariamente obligatoria en VBA, pero que definitivamente ayuda (al menos en "algo") a acelerar los proceso además de ayudar a mejorar el orden o que otros entiendan lo que se está haciendo. Otra buena es el dejar libres dichas variables, como con el uso de Erase o el Nothing con Set. Tampoco necesarios ya que el "End Sub" libera toda la memoria. Yo, como soy de la "vieja guardia", siempre, pero absolutamente los uso. Desde mi "viejo" punto de vista, los buenos programadores jamás dejarán de usar esas cosas. - Abraham Valencia
Lo segundo es mi opinión y tiene algo de relación a lo que te comentaba hace un rato: Creo que los novatos igual pueden ordenarse un poco al ver esas "viejas" costumbres. Como ves, soy consciente de que el "En Sub" hace su trabajo, pero igual en mi caso lo uso por costumbre y otros. Por cierto, en tu explicación del enlace, definitivamente muchos lo hacen por la razón 1, con el grupo de amigos de los otros foros, te aseguro que somo la opción 2. Si entras a esos foros, los conocerás (Cacho, Gerson, Hector Miguel, etc.) Todos tenemos entre 12 y 20 años en foros... estamos viejos :p - Abraham Valencia
PD: Eso no quita que sí, hay "expertos" que creen que realmente sirve ante del End Sub je je je - Abraham Valencia
Yo nunca fui de "forear" tanto, conozco este foro precisamente porque hace muuuchos años cuando tuve que aprender VBA hice una pregunta aquí, no recuerdo que fue, pero creo que pude resolver lo que necesitaba. Por eso en marzo de este año, por alguna razón me vino a la mente el recuerdo de este foro y decidí participar, esta vez como experto, y devolver el favor jajaja. Pero sin duda le echaré una mirada a esos que me recomiendas :) - Andy Machin