Excel - Diferencia en las comparaciones realizadas entre Excel y VBA

 
Vista:
Imágen de perfil de Aitor
Val: 24
Ha aumentado 1 puesto en Excel (en relación al último mes)
Gráfica de Excel

Diferencia en las comparaciones realizadas entre Excel y VBA

Publicado por Aitor (5 intervenciones) el 10/02/2021 14:56:48
Hola,

Alguien sabe porque una comparación entre 2 valores de celdas da un resultado dentro de la hoja Excel y en cambio en código VBA da otro diferente, según se muestra en la imagen :

ScreenShot_20210210124227
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Diferencia en las comparaciones realizadas entre Excel y VBA

Publicado por Antoni Masana (2477 intervenciones) el 11/02/2021 10:31:03
El problema es que las fórmulas no son sensibles a mayúsculas y minúsculas, es decir "A" es igual a "a", no compara por código ASCII.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aitor
Val: 24
Ha aumentado 1 puesto en Excel (en relación al último mes)
Gráfica de Excel

Diferencia en las comparaciones realizadas entre Excel y VBA

Publicado por Aitor (5 intervenciones) el 11/02/2021 13:58:19
Gracias por responder.

El problema que encuentro es que si tienes una lista ordenada mediante la opción Ordenar/Datos/Columna A/A-Z y luego en VBA tienes un algoritmo de Búsqueda Binaria de un valor en la lista "ordenada" en la hoja de Excel no consigue encontrar el valor.

Esto es así porque la comparación entre valores ( mayor que o menor que ) alfanuméricos que realiza en Excel no coincide con la que realiza en VBA, tal vez con la Option Compare Text ( por defecto es Binary ) en el modulo de VBA si coincidan pero esta característica se aplica a nivel de modulo y te obliga a que en otras circunstancias no convenga en la programación ese tipo de comparación, lo que obliga finalmente a un modulo especifico para el procedimiento de Búsqueda Binaria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Diferencia en las comparaciones realizadas entre Excel y VBA

Publicado por Antoni Masana (2477 intervenciones) el 11/02/2021 14:15:29
Hay un truco para buscar un texto si tener en cuenta las mayúsculas y minúsculas y es usar las funciones LCASE() y UCASE().
El primero convierte a minúsculas y el segundo a mayúsculas.

Asi esto

1
If LCase([A1]) > LCase([A2]) Then MsgBox "Mayor la 1 " Else MsgBox "Mayor la 2"

o esto

1
If UCase([A1]) > UCase([A2]) Then MsgBox "Mayor la 1 " Else MsgBox "Mayor la 2"

Da el mismo resultado que esto:

1
=SI(A1 > A2;"Mayor la 1 ";"Mayor la 2")

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aitor
Val: 24
Ha aumentado 1 puesto en Excel (en relación al último mes)
Gráfica de Excel

Diferencia en las comparaciones realizadas entre Excel y VBA

Publicado por Aitor (5 intervenciones) el 11/02/2021 16:17:09
Eso funciona si tus códigos a buscar son indiferentes a mayúsculas y minúsculas, bien porque los guardas todo en minúsculas o todo en mayúsculas.
Pero si se permite introducir aleatoriamente caracteres en mayúsculas y en minúsculas y guardarlos tal cual se escriben, puede resultar que existan 2 códigos en la misma lista ordenada que son diferentes en alguna letra por ser en uno de los códigos mayúscula y en el otro minúscula.
Al elevarlos a mayúsculas para ser comparados con otro código externo (el que se busca en la lista ), serian en todo iguales y ese no es el caso, además de que tampoco podrían coexistir en la misma lista ordenada sino hubiera algo que les diferencia.
En una lista ordenada ( para búsqueda ) solo puede haber códigos únicos no admitiéndose duplicados.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Diferencia en las comparaciones realizadas entre Excel y VBA

Publicado por Antoni Masana (2477 intervenciones) el 11/02/2021 17:03:48
No nos entendemos o no nos sabemos expresar.
No acabo de entender lo que me explicas y creo que no he sabido explicarme bien.

Te pongo un Ejemplo:

Tienes en la columna A varios nombres

Ana
Antonio
Aitor
Amelio
Amancio


en la celda C1 escribe un nombre a buscar: AITOR

Si utilizamos la formula:

=BUSCARV(C1;A1:A4;1;FALSO)

Lo encuentra porque no distingue entre mayúsculas y Minúsculas.


Ahora lo quedemos hacer por código en VBA.

1
2
3
4
5
6
7
8
9
Sub Macro()
    Dim Fila as Long, Texto as String
    Texto = UCase(Range("C1"))
    Fila=1
    While UCase(Cells(Fila,"A"))  = Texto
        Fila = Fila + 1
    Wend
    MsgBox "El texto Buscado esta en la fila: " & Fila
End Sub

Esta Macro devolverá la fila 3 porque funciona para buscar AITOR - aITOR - AiToR - aItOr - aitor o cualquier combinación de mayúsculas y Minúsculas.

Si en una columna se escribe:
AA
Aa
aA
aa
BB
Bb
bB
bb
CC
Cc
cC
cc

Y se utiliza la opción de quitar repetidos resulta que Excel deja
AA
BB
CC

No se si esta explicación ayuda o enreda más.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aitor
Val: 24
Ha aumentado 1 puesto en Excel (en relación al último mes)
Gráfica de Excel

Diferencia en las comparaciones realizadas entre Excel y VBA

Publicado por Aitor (5 intervenciones) el 11/02/2021 23:22:33
Gracias por responder de nuevo.

Puede que no nos entendamos ahora pero al final seguro que si y te agradezco tu interes.

A ver si me explico mejor.

En una lista ordenada los códigos deben ser únicos, pero teniendo la necesidad de diferenciar entre Aitor y aitor, ósea que tanto Aitor como aitor pueden estar en la lista ordenada siendo únicos y diferentes y si busco Aitor tiene que buscar Aitor y si busco aitor debe buscar aitor.

Lo que ocurre es que si hago una Búsqueda Binaria desde VBA y no con la función BUSCAR de Excel sino mediante código y es que en el algoritmo esta continuamente haciendo la comparación "mayor que" o "menor que" y no la comparación "igual que" que es donde encajaría de alguna manera tu solución o utilizar StringCompare para si son iguales pero no se utiliza en la búsqueda binaria.
Te pongo un ejemplo para ver si puedes repetirlo:
En la hoja Excel la lista ordenada se puede ver que el código "ESSBB30.A89" es "MAYOR QUE" el código "ESSBB30.a89" pero en el código VBA ocurre que no es así como se puede ver en la ventana Inmediato del editor VBA:

if "ESSBB30.A89" < "ESSBB30.a89" then print "MENOR"
MENOR

ScreenShot_20210211232012


DATOS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ESSBB30.a809
ESSBB30.A809
ESSBB30.a89
ESSBB30.A89
ESSBB30.a99
ESSBB30.X1
ESSBB30.x1100
ESSBB30.x1101
ESSBB30.x1102
ESSBB30.x1105
ESSBB30.x1108
ESSBB30.x2
ESSBB30.X2
ESSBB30.X3


CODIGO VBA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Public Sub BusquedaBinaria()
    Dim max, min, centro, columna As Integer
    Dim control As Boolean
    Dim buscado As String
    buscado = Sheets("hoja1").Cells(6, 2).Value
    Debug.Print "BUSCADO=" & buscado ' codigo a buscar
    min = 1   'fila inicial de la lista
    max = 13  'fila final de la lista
    columna = 1 ' columna "A"
    control = False ' resultado de la busqueda
    Do While min <= max
        centro = Int((max + min) / 2) 'es el fiel de la balanza en la busqueda
        Debug.Print "Max=" & max & " Min=" & min & " TANTEO Centro=" & centro
        If (buscado = Sheets("hoja1").Cells(centro, columna).Value) Then
            control = True
            Debug.Print "BUSCADO=" & buscado & " ENCONTRADO en :" & centro
            Exit Do
        ElseIf buscado < Sheets("hoja1").Cells(centro, columna).Value Then
            Debug.Print "BUSCADO=" & buscado & " < " & _
                "Valor en CENTRO=" & Sheets("hoja1").Cells(centro, columna).Value
            max = (centro - 1)
        Else
            Debug.Print "BUSCADO=" & buscado & " > " & _
                "Valor en CENTRO=" & Sheets("hoja1").Cells(centro, columna).Value
            min = (centro + 1)
        End If
    Loop
    Debug.Print "ENCONTRADO=" & control
    Debug.Print ("FIN BUSQUEDA")
End Sub

VENTANA INMEDIATO

1
2
3
4
5
6
7
8
9
10
11
BUSCADO=ESSBB30.A89
Max=14 Min=1 TANTEO Centro=7
BUSCADO=ESSBB30.A89 < Valor en CENTRO=ESSBB30.x1100
Max=6 Min=1 TANTEO Centro=3
BUSCADO=ESSBB30.A89 < Valor en CENTRO=ESSBB30.a89
Max=2 Min=1 TANTEO Centro=1
BUSCADO=ESSBB30.A89 < Valor en CENTRO=ESSBB30.a809
ENCONTRADO=Falso
FIN BUSQUEDA
If "ESSBB30.A89" < "ESSBB30.a89" then print "MENOR"
MENOR
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Diferencia en las comparaciones realizadas entre Excel y VBA

Publicado por Antoni Masana (2477 intervenciones) el 12/02/2021 02:58:59
En la imagen de la lista no es que el código "ESSBB30.A89" es "MAYOR QUE" el código "ESSBB30.a89" es que cuando hay dos códigos iguales uno queda primero y el otro queda segundo y para el Excel los dos son iguales, aunque para nosotros no lo son.

Si tomo los dos códigos y añado un numero después del 9, cuando los ordeno la cosa cambia.

1
2
ESSBB30.A890  <== Ahora este es el menor
ESSBB30.a891

y

1
2
ESSBB30.a890  <== Ahora este es el menor
ESSBB30.A891

El que determina el orden para EXCEL es el último digito. Para Excel las letras anglosajonas son todas iguales, mayúsculas y minúsculas, después están la Ñ , la Ç y las vocales acentuadas entre otras que ya son otro cantar.

Si la lista se ordena según su código ASCII o binario el orden tendría que ser este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ESSBB30.A809
ESSBB30.A89
ESSBB30.X1
ESSBB30.X2
ESSBB30.X3
ESSBB30.a809
ESSBB30.a89
ESSBB30.a99
ESSBB30.x1100
ESSBB30.x1101
ESSBB30.x1102
ESSBB30.x1105
ESSBB30.x1108
ESSBB30.x2

Y este orden solo se consigue con código VBA, la A = 65 , X = 88 , a = 97 , x = 120

Con este orden tu código de búsqueda funciona.

No había acabo de entender el sistema de búsqueda y ya veo cual es.
El problema de este sistema de búsqueda es que tienes que ordenar la tabla desde VBA y no utilizar el SORT del menú de Excel.
O tienes que hacer un pequeño cambio en el programa si el código "ESSBB30.A89" es "IGUAL QUE" el código "ESSBB30.a89"

Tengo una pregunta:

¿Dónde se ve el texto del Debug.Print?


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Aitor
Val: 24
Ha aumentado 1 puesto en Excel (en relación al último mes)
Gráfica de Excel

Diferencia en las comparaciones realizadas entre Excel y VBA

Publicado por Aitor (5 intervenciones) el 12/02/2021 10:39:00
Hola Antoni de nuevo.

Debug.Print realiza la salida hacia la ventana INMEDIATO del editor de VBA, muy necesario para realizar trazas conforme se ejecuta el código y ver el flujo del programa.

Respecto al asunto en cuestión yo entiendo que debiera de haber una opción para que o bien en Excel o bien en VBA coincidieran los criterios de comparación y ordenación y así se pudieran combinar los 2 sistemas.

Por eso hay que tener en VBA un algoritmo de ORDENACION como por ejemplo QUICKSORT para una matriz (Array) y luego una Búsqueda Binaria dentro de la matriz ordenada.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Public Sub Quicksort(ByRef vArray As Variant, inLow As Long, inHi As Long)
    '---------------------------------------------------------------------------------------
    ' Procedure : QUICKSORT recursivo
    ' Author    : INTERNET
    ' Date      : 07/02/2021
    ' Purpose   : UTILIDAD DE ORDENACION DE DATOS DE UNA MATRIZ
    '---------------------------------------------------------------------------------------
    '
    On Error GoTo QuickSort_Error
    Dim pivot   As Variant
    Dim tmpSwap As Variant
    Dim tmpLow  As Long
    Dim tmpHi   As Long
    tmpLow = inLow
    tmpHi = inHi
    pivot = vArray((inLow + inHi) \ 2)
    While (tmpLow <= tmpHi)
        While (vArray(tmpLow) < pivot And tmpLow < inHi)
            tmpLow = tmpLow + 1
        Wend
        While (pivot < vArray(tmpHi) And tmpHi > inLow)
            tmpHi = tmpHi - 1
        Wend
        If (tmpLow <= tmpHi) Then
            tmpSwap = vArray(tmpLow)
            vArray(tmpLow) = vArray(tmpHi)
            vArray(tmpHi) = tmpSwap
            tmpLow = tmpLow + 1
            tmpHi = tmpHi - 1
        End If
    Wend
    If (inLow < tmpHi) Then Quicksort vArray, inLow, tmpHi
    If (tmpLow < inHi) Then Quicksort vArray, tmpLow, inHi
    On Error GoTo 0
    Exit Sub
QuickSort_Error:
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") en procedimiento QUICKSORT, line " & Erl & "."
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar