Ayuda con formula

01/02/2004 - 01:13 por Daniel S.L. | Informe spam
Hola a todos..

Hace unos dias el buen amigo Héctor me envió el siguiente código

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If StrConv(Sh.Name, vbLowerCase) = "BDATOS" Then Exit Sub
If Intersect(Target, Sh.Range("a12:a3000")) Is Nothing Then Exit Sub
With Target
If .Value <> "" Then
.Offset(, 4).Formula = "=VLookUp(" & .Offset(, 2).Address(0, 0) &
",BDatos!c2:g3000,3)"
.Offset(, 6).Formula = "=VLookUp(" & .Offset(, 2).Address(0, 0) &
",BDatos!c2:g3000,5)"

Else
.Offset(, 4).ClearContents
.Offset(, 6).ClearContents
End If
End With
End Sub

y traducido en una formula de excel da lo siguiente:

=BUSCARV(C15,BDATOS!C2:G3000,3)
=BUSCARV(C15,BDATOS!C2:G3000,5)

pero a qui es donde esta el problemas eso creo...

la formula que realmente quiero que salga es la siguiente:
=SI($A15<>"",BUSCARV($C15,BDATOS!$C$2:H3000,3,0),"")
=SI($A15<>"",BUSCARV($C15,BDATOS!$C$2:H3000,5,0),"")

NO se porque con a primera no busca bien el articulo y con la ultima si lo saca
sin problemas. Espero y alguien me de otra manita
Gracias.

Un saludo,
Daniel.

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
01/02/2004 - 04:38 | Informe spam
hola, Daniel !

y traducido en una formula de excel da lo siguiente:
=BUSCARV(C15,BDATOS!C2:G3000,3)
=BUSCARV(C15,BDATOS!C2:G3000,5)
la formula que realmente quiero que salga es la siguiente:
=SI($A15<>"",BUSCARV($C15,BDATOS!$C$2:H3000,3,0),"")
=SI($A15<>"",BUSCARV($C15,BDATOS!$C$2:H3000,5,0),"")
NO se porque con a primera no busca bien el articulo y con la ultima si lo saca sin problemas.



'dejando de lado' [un poquito y por ahora] lo referente a las referencias [semi-]absolutas/relativas
[o sea, cuando usar p.e. $A$1 ... o $A$1 ... o A$1 ... o A1]
y 'convirtiendo' la formula que SI funciona a 'totalmente relativa'
podras 'ver' la diferencia con la formula que 'deja' el codigo [p.e.]
'manual' => BUSCARV(C15,BDATOS!C2:H3000,3,0)
× codigo => BUSCARV(C15,BDATOS!C2:G3000,3)

1.- la 'principal' diferencia es el ultimo argumento de la funcion BuscarV =>en CERO -o 'falso'-< lo que significa que la base de datos NO esta 'ordenada' [y que yo 'omiti' -por error- :((
=>agrega una coma y un cero [en el codigo] 'entre' la columna a devolver y el parentesis 'de cierre'<2.- 'otra' diferencia [de momento NO 'crucial'] es que la formula 'manual' busca en el rango de columnas 'C:H'
y la que 'deja' la macro busca en el rango de columnas 'C:G'
es como si fueras a ocupar [en algun momento] 'devlover' HASTA 6 columnas a la derecha desde 'C'
[si no recuerdo mal, 'originalmente'... 'eran' las columnas 'A:F']

=> otro cambio 'importante' que veo en las 'adecuaciones' que hiciste al codigo 'propuesto' es...
la primer instruccion dentro del codigo del evento:
If StrConv(Sh.Name, vbLowerCase) = "BDATOS" Then Exit Sub


==> estas comparando 'minusculas' CONTRA 'mayusculas' <= o... cambias vbLowerCase a => vbUpperCase
o... cambias "BDATOS" a => "bdatos"
o... [de lo contrario] la macro 'se aplicara' INCLUSIVE a cambios en el rango "a12:a3000" de la hoja 'BDATOS' :((

[finalmente]
la condicionante en la formula 'manual' =>=SI($A15<>"" ... ,"")<la esta 'ejecutando' [por 'descalificacion'] la macro con la instruccion:
With Target
If .Value <> "" Then
Else
.Offset(, 4).ClearContents
.Offset(, 6).ClearContents
End If
End With



¿comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Daniel S.L.
03/02/2004 - 02:49 | Informe spam
Hola Héctor !

Gracias por responder, te comento como esta la situación.

2.- 'otra' diferencia [de momento NO 'crucial'] es que la formula 'manual' busca en


el rango de columnas 'C:H'
y la que 'deja' la macro busca en el rango de columnas 'C:G'
es como si fueras a ocupar [en algun momento] 'devlover' HASTA 6 columnas a


la derecha desde 'C'
[si no recuerdo mal, 'originalmente'... 'eran' las columnas 'A:F']



En esta parte efectivamente el rango era originalmente de 'A:F' , pero tuve que mover
el rango a 'C:H' el por que, es que hace unos dias muy amablemnte me diste este
codigo:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
With Target
Select Case .Column
Case 1: If .Value <> "" Then .Offset(, 1) = Now Else .Offset(, 1).ClearContents
Case 11: If .Value <> "" Then .Offset(, 6) = Now Else .Offset(,
6).ClearContents
Case 12: If .Value <> "" Then .Offset(, 4) = Now Else .Offset(,
4).ClearContents
End Select
End With
End Sub

y bueno esto aplica a todas las hojas, por esa razón ya no te quise molestar y para
que no aplicara a la hoja llamada BDATOS me vi forzado en mover un poquito las
referencias. para que la hoja llamada BDATOS no se afectara ya que mis datos
originalmente estaban apartir de la columna A-B-C ya que cuando escribia un articulo
en la columna a me botaba la fecha en columna b y como no se como midificar tu
formula-codigo- pues se me hizo mas facil mover mis dados hacia la columna C-D-E-F-G.

=> otro cambio 'importante' que veo en las 'adecuaciones' que hiciste al codigo


'propuesto' es...
la primer instruccion dentro del codigo del evento:
> If StrConv(Sh.Name, vbLowerCase) = "BDATOS" Then Exit Sub
==> estas comparando 'minusculas' CONTRA 'mayusculas' <=> o... cambias vbLowerCase a => vbUpperCase
o... cambias "BDATOS" a => "bdatos"
o... [de lo contrario] la macro 'se aplicara' INCLUSIVE a cambios en el rango


"a12:a3000" de la hoja 'BDATOS' :((

Por este lado te comento de que se me paso decirte de que la hoja tiene el nombre
BDATOS, nose si eso efecte en algo..?

[finalmente]
la condicionante en la formula 'manual' =>=SI($A15<>"" ... ,"")<> la esta 'ejecutando' [por 'descalificacion'] la macro con la instruccion:
> With Target
> If .Value <> "" Then
> Else
> .Offset(, 4).ClearContents
> .Offset(, 6).ClearContents
> End If
> End With



Y por este ultimo dato que me observas tedoy las gracias pór esplicare ya que apenas
estoy aprendiendo o trato de prendes de mis maestros como lo son todos ustedes los
del foro...gracias!!


¿comentas?



Disculpa por no atnder luego este mensaje no me fue posible concetarme hasta ahorita
y gracias por tu fina atencion:

Un saludo,
Daniel.
Respuesta Responder a este mensaje
#3 Héctor Miguel
03/02/2004 - 05:20 | Informe spam
hola, Daniel !

... el rango era originalmente de 'A:F' , pero tuve que mover ... a 'C:H' porque ... codigo:
... aplica a todas las hojas ... y para que no aplicara a la hoja ... BDATOS me vi forzado en mover ... las referencias.



la 'razon' por la que se 'afecta' [inclusive] a la hoja 'BDATOS'... [que te comente en el mensaje anterior] es la siguiente:
=> 'comparar' textos [en vba], por 'omision'... 'distingue' entre mayusculas y minusculas <para estar 'seguros' de una comparacion 'exacta', es necesario 'igualar' los textos 'a comparar'
[p.e.] los nombres de las hojas [en sus 'pestañas'] podrian ser mayusculas y/o minusculas
y... si estas [o no] seguro de que el usuario pudo haberlo 'modificado'... puedes 'igualar' para 'compar'...
usando la instruccion 'StrConv(Variable, 'Tipo_de_escritura') =>que te 'propuse' para el caso< si el nombre de la hoja es: 'BDATOS' o... 'BDatos' o... 'bDatos' o... [...]
la funcion 'StrConv(Sh.Name, vbLowerCase)' estaria 'devolviendo' el nombre [cualquiera-sea] en minusculas
'con lo cual' YA seria 'posible' hacer una comparacion 'exacta' versus la cadena "en_minusculas"
... 'pero' ... NO seria 'posible' hacer una comparacion 'exacta' versus la cadena "EN_MAYUSCULAS"
nota: [a menos que al inicio del modulo, en el area de las declaraciones pongas la instruccion 'Option Compare Text']

lo que te habia comentado al respecto en el mensaje anterior es:
=> otro cambio 'importante' que veo en las 'adecuaciones' que hiciste al codigo 'propuesto' es...
la primer instruccion dentro del codigo del evento:
If StrConv(Sh.Name, vbLowerCase) = "BDATOS" Then Exit Sub


=> estas comparando 'minusculas' CONTRA 'mayusculas' <=>> o... cambias vbLowerCase a => vbUpperCase
o... cambias "BDATOS" a => "bdatos"
o... [de lo contrario] la macro 'se aplicara' INCLUSIVE a cambios en el rango "a12:a3000" de la hoja 'BDATOS' :((





a lo que [me permito], agregare la nota de este mensaje:
=> al inicio del modulo, en el area de las declaraciones pon la instruccion 'Option Compare Text' < [suponiendo que NO 'requires' hacer una 'distincion' entre mayusculas y minusculas -como en casos de contraseñas-]
[lo que 'al parecer'... -segun otro mensaje-... vas a 'necesitar' en un momento dado] ;)

saludos,
hector.
Respuesta Responder a este mensaje
#4 Daniel S.L.
03/02/2004 - 16:38 | Informe spam
ok Héctor Miguel

[lo que 'al parecer'... -segun otro mensaje-... vas a 'necesitar' en un


momento dado] ;)




así parece te agradezco tu valioso tiempo...Gracias

Un saludo,
Daniel.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida