UniversoExcelForo

Respuesta a consultas.
Fecha de creación: 09.Abril.2012

Fundadores: Wibly,Tyno,Servando,Sakkar,Rosendo2,RMaximo,Railar,Mcoronel,Ioyama,Igtelo,Hugotron,Drochar,Dedos,Alberto,Adolfo

No se pueden hacer consultas de Excel o VBA por mensaje privado.
Utiliza el botón buscar del foro y te ahorras tiempo para obtener "ayuda".

No estás conectado. Conéctate o registrate

Ver el tema anterior Ver el tema siguiente Ir abajo  Mensaje [Página 1 de 1.]

1RESUELTO Condición mayor o igual que el 30/05/16, 06:46 am

Dark_Charlie


Hola, buenos días.

Soy nuevo en el foro y noob en cuanto a Visual Basic y Excel. Estoy empezando en una nueva empresa y hay consultas con Excel que no sé realizar a la base de datos. 

Trabajo con Excel 2010 y Visual Basic para Excel. Mediante macros me conecto a la base de datos en SQL. 

Pues bien, necesito realizar la condición mayor o igual que (>=) y no lo consigo, es decir, deseo que cuando salga el valor "503" los resultados sean todos mayores o iguales a 10 (los valores más bajos no nos interesan). Algo similar deseo con el "880", en este caso deseo que los valores que salgan sean iguales a 100, ¿me podéis ayudar? Os adjunto un txt con el código. 

Ante todo, gracias de antemano.
Archivos
macro excel.txt
No tienes los permisos para descargar los archivos.
(8 KB)

2RESUELTO Re: Condición mayor o igual que el 30/05/16, 07:58 am

Dark_Charlie


He conseguido que la referencia 503 muestre únicamente los resultados mayores o iguales a 10. Tan solo me queda conseguir que la 880 me muestre los resultados iguales a 100. Alguien que sepa, ¿he de poner un value? ¿en ese caso como lo hago?

Gracias

3RESUELTO Re: Condición mayor o igual que el 30/05/16, 11:35 am

tyno


Hola Charlie.
Bien venido al foro.
Es un poco muy dificil deducir cual puede ser la solucion a tu problema ya que no se puede reproducir la funcion de tu codigo  y por otro lado no se sabe que clase de resultados debe traer  la referencia 880.

Pero ¿no has probado de repetir la instruccion que utilizaste para la referencia 503 y en su lugar asignar 880, asi por ejemplo:


      If rs("Global Dimension 2 Code") = "880" Then
            If Val(Right(rs("Item No_"), 2)) =100 Then
                If Range("L" & fila) = rs("Item No_") Then
                    ' si el producte és el mateix, no el carrega.
                     Range("N" & fila) = rs("STOCKCALCULADO") 
                    fila = fila + 1
                Else
                    Range("a" & fila + 1, "z" & fila + 1).EntireRow.Insert (xlShiftDown)
                    Range("C" & fila) = "1" 'original, primera carga
                    Range("D" & fila) = "0" 'no grabada
                    Range("G" & fila) = rs("Tipo medida base")
                    Range("H" & fila) = rs("Medida base")
                    Range("I" & fila) = rs("Unit Cost")
                    'RsPreu.Open "select campprecio from tablalaquesea where codproducto='" & rs("Item No_") & "' order by lafechaquesea ", oConexion, adOpenStatic, adLockReadOnly
                    'RsPreu.MoveLast
                    'Range("A" & fila) = RsPreu("camprecio")
                    Range("J" & fila) = rs("Global Dimension 2 Code")
                    Range("K" & fila) = rs("Item Category Code")
                    Range("L" & fila) = rs("Item No_")
                    Range("M" & fila) = rs("description")
                    Range("N" & fila) = rs("STOCKCALCULADO")
                    'Range("O" & fila) = ""
                    fila = fila + 1
                    '  Filas = ActiveCell.Value2
                    '  MiRango.EntireRow.Insert (xlShiftDown)
                    '  ActiveCell.Offset(0, -1).Copy Destination:=MiRango.Offset(-Filas, -1)
                End If
            Else
            End If


Saludos

Dark_Charlie


Hola tyno, primero de todo muchísimas gracias por responder Wink . He probado a hacerlo así, como tú me dices, pero fijándome, la cuestión es que los resultados de dicha referencia deben ser "100K" o "100T" y parece ser que al tener las letras no me busca nada (aunque no me da fallo de compilación). 

Es decir, parece que en teoría está bien, pero en práctica, al acompañar la "T" y la "K" al número "100" no me lo encuentra. He intentado a poner "=100K" o "=100T" pero ahí si que me da error de   Crying or Very sad

Yo creo que ese es el problema, y no sé solucionarlo, ¿se te ocurre algo tyno?

PD: Muchas gracias de nuevo tyno. Very Happy

5RESUELTO Re: Condición mayor o igual que el 30/05/16, 12:25 pm

Dark_Charlie


Poniendo únicamente = 100 no me hace nada...

6RESUELTO Re: Condición mayor o igual que el 30/05/16, 12:43 pm

Dark_Charlie


Creo que la solución sería cambiar el Value por un Data (ya que no reconoce la T ni la K), pero no sé muy bien como hacerlo, ¿alguna ayuda?

Os dejo una imagen del Excel, con las referencias 880 y los valores 100K y 100T para que os hagáis una idea. 

Gracias!
Archivos
problema vb.png
No tienes los permisos para descargar los archivos.
(15 KB)

7RESUELTO Re: Condición mayor o igual que el 30/05/16, 01:09 pm

tyno


Parece que el problema viene por ese lado que mencionas. Prueba lo siguiente:

en lugar de esto en rojo: 


      If rs("Global Dimension 2 Code") = "880" Then
            If Val(Right(rs("Item No_"), 2)) =100 Then


esto: Val(Left(Right(rs("Item No_"), 4),3) = 100 Then

Si no da el resultado asi como esta a su vez habria que probar si ese 100 va con o sin comillas 100 o "100"

A ver que pasa

8RESUELTO Se esperaba separador de listas el 31/05/16, 04:13 am

Dark_Charlie


Hola tyno, 

Lo he puesto como me has dicho pero me da un error de compilación "se esperaba separador de listas o)", ¿sabes por qué puede pasar?

Saludos y gracias nuevamente.

9RESUELTO Re: Condición mayor o igual que el 31/05/16, 04:34 am

Dark_Charlie


Mi solución (no sé si es la idónea) ha sido ponerle un paréntesis más, quedando así:

If Val(Left(Right(rs("Item No_")), 4), 3) = 100 Then


Ahora ya no me da el error de "se esperaba separador de listas o)" sino que me dice "error de compilación: El argumento no es opcional". Me imagino que debo declarar todos los parámetros con un OPTIONAL, ¿cierto? Si es así, ¿podéis echarme un cable para saber como añadirlo?

Gracias de nuevo.

10RESUELTO Re: Condición mayor o igual que el 31/05/16, 05:38 am

Dark_Charlie


Me respondo a mí mismo, 

He dejado la línea tal que así:


If Val(Left(Right(rs("Item No_"), 4), 3)) = 100 Then


No me da error de compilación, parece que lo ejecuta bien, pero me sigue mostrando todos los valores de 880 y no solo los que son = 100 (y yo tan solo quiero que me muestre los 100T y los 100K).


Tyno, nuevamente gracias por tu ayuda, muy agradecido. ¿Alguna otra idea?


Saludos. 

11RESUELTO Re: Condición mayor o igual que el 31/05/16, 09:49 am

tyno


Esto es prueba y error.

Entonces otra prueba seria:

If rs("Global Dimension 2 Code") = "880" Then
If Right(rs("Item No_"), 4) = "100T" Or  Right(rs("Item No_"), 4) = "100K" Then


Por otro lado, ¿no seria mas facil hacer la consulta SQL copiarla y pegarla en Excel para luego procesarla? Seria un paso mas que dura dos segundos. Lo digo como una sugerencia ya que en realidad no se porque realizas este proceso en Excel de esta manera.

Saludos

12RESUELTO Re: Condición mayor o igual que el 31/05/16, 11:41 am

Dark_Charlie


Hola tyno, gracias de nuevo por responder. 

He probado esto último y compila bien, pero Excel parece ser que no lo entiende y no consigue que se me muestren solo los 100K y los 100T, no entiendo por que...

En cuanto a tu consejo de realizar la consulta directamente en SQL y copiarla y pegarla en Excel parece una buena idea, aunque no sé como llevarla a cabo, ¿conoces de algún tutorial que me enseñe a realizarlo? 

Gracias de nuevo por tu contestación tyno, me mantengo a la espera con impaciencia.

13RESUELTO Re: Condición mayor o igual que el 31/05/16, 03:09 pm

tyno


A lo que me referia es que si tienes la el SQL se podria hacer directamente la consulta copiar los datos del resultado y pegarlos en Excel, claro que yo estoy pensando en SQL Server ¿no se si se trata de esto?

Y volviendo a la instruccion que estamos viendo, es dificil (por lo menos para mi) darme cuenta donde esta el error ya que no puedo reproducir el proceso.

Probando modificar esto que veo al final del codigo:

rs.MoveNext
Loop
rs.Close

Set rs = Nothing

Insertando esto antes del Loop

rs("Unit Cost")="" '<<<<<<<<<<<rs.MoveNext
Loop
rs.Close

Set rs = Nothing

14RESUELTO Re: Condición mayor o igual que el 01/06/16, 05:25 am

Dark_Charlie


Buenos días tyno,

Poniendo lo que me has propuesto me salta error '3251' en tiempo de ejecución. El Recordset actual no admite actualizaciones. 

En cuanto a lo que me comentas, yo accedo de forma remota al servidor y me puedo conectar a SQL Server Management Studio, ¿desde ahí puedo realizar consultas? ¿sabes de algún manual que pueda ayudarme?

Me han recomendado esto:

If InStr(1,rs("Item No_"), "100",compareMethod.text) <>0 Then


Lo pongo, me da error de definir la variable y, ni quitando el 1, se soluciona. He leído algo sobre las Funciones de Cadena de Texto (me imagino que para cambiar los valores 100K y 100T como si de un texto se tratase) pero no sé qué cadena utilizar ni como hacerlo...


¿Alguna ayuda?


PD: Gracias de nuevo tyno por ayudarme.  Wink

15RESUELTO Consulta SQL el 01/06/16, 11:03 am

Dark_Charlie


Estoy intentando realizar la consulta directamente a SQL como bien me has comentado pero me da error de sintaxis y no se me ejecuta bien, ¿le podrías echar un ojo?

Gracias!
Archivos
consulta sql.txt
No tienes los permisos para descargar los archivos.
(1 KB)

16RESUELTO Re: Condición mayor o igual que el 01/06/16, 05:04 pm

tyno


Hola Charly
A lo que me  referia con la consulta SQL es que si tenias instalado en tu PC sql server 2008 u otra version podias ejecutar la consulta en este y luego copiar los datos y pegarlos en Excel. Esto con la simple instruccion Select * from mi_tabla. Pero si no es asi entonces de mi parte no pretendo terminar replanteando lo que ya venias desarrollando, porque este no es el foro para sql server y como lo venimos haciendo vamos a perder tiempo.
Sin embargo se me ocurre que en lugar de utilizar esa macro que ya tenias para extraer los datos filtrados de acuerdo a esos criterios que estamos viendo quizas lo mejor seria extraer todos los datos en bruto y una vez que tienes esta informacion en tu archivo Excel entonces ahi ver la forma de desglosar o reorganizar la informacion de acuerdo a tus necesidades. No se si me explico? seria utilizar la macro que ya tienes solo traer todos los datos, nada de estar filtrando por Global Dimension 2 Code y por  Item No_ (que veo son las condiciones que estas utilizando principalmente)

Por ejemplo si pruebas el codigo de esta manera:

Código:
    Set rs = New ADODB.Recordset
   
    rs.Open "SELECT    [Bando Ibérica, S_A_$Item].[Unit Cost], [Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code], [Bando Ibérica, S_A_$Item Ledger Entry].[Item Category Code], " & _
                    " [Bando Ibérica, S_A_$Item Ledger Entry].[Item No_], [Bando Ibérica, S_A_$Item].Description, [Bando Ibérica, S_A_$Item].[Tipo medida base], " & _
                    " [Bando Ibérica, S_A_$Item].[Medida base], SUM([Bando Ibérica, S_A_$Item Ledger Entry].Quantity) AS STOCKCALCULADO " & _
                    " FROM [Bando Ibérica, S_A_$Item Ledger Entry] INNER JOIN " & _
                    " [Bando Ibérica, S_A_$Item] ON [Bando Ibérica, S_A_$Item Ledger Entry].[Item No_] = [Bando Ibérica, S_A_$Item].No_ " & _
                    " WHERE    ([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '700') OR " & _
                    "([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '701') OR " & _
                    "([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '800') OR " & _
                    "([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '600') OR " & _
                    "([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '840') OR " & _
                    "([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '830') OR " & _
                    "([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '780') OR " & _
                    "([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '300') OR " & _
                    "(([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '602') AND ([Bando Ibérica, S_A_$Item Ledger Entry].[Item Category Code] = 'BFGEN') ) OR " & _
                      "(([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '880') AND ([Bando Ibérica, S_A_$Item Ledger Entry].[Item Category Code] = 'TN10') AND ([Bando Ibérica, S_A_$Item Ledger Entry].[Item Category Code] = 'TN15') ) OR " & _
                      "([Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code] = '503') " & _
                      "GROUP BY  [Bando Ibérica, S_A_$Item].[Tipo medida base],[Bando Ibérica, S_A_$Item].[Medida base], [Bando Ibérica, S_A_$Item].[Unit Cost],[Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code], " & _
                      "[Bando Ibérica, S_A_$Item Ledger Entry].[Item Category Code],[Bando Ibérica, S_A_$Item Ledger Entry].[Item No_] , [Bando Ibérica, S_A_$Item].Description " & _
                      "ORDER BY [Bando Ibérica, S_A_$Item Ledger Entry].[Global Dimension 2 Code], [Bando Ibérica, S_A_$Item Ledger Entry].[Item Category Code], " & _
                      "[Bando Ibérica, S_A_$Item Ledger Entry].[Item No_] ", oConexion, adOpenStatic, adLockReadOnly
   
    Do While Not rs.EOF

                If Range("L" & fila) = rs("Item No_") Then
                    Range("N" & fila) = rs("STOCKCALCULADO")
                    fila = fila + 1
                Else
                    Range("a" & fila + 1, "z" & fila + 1).EntireRow.Insert (xlShiftDown)
                    Range("C" & fila) = "1" 'original, primera carga
                    Range("D" & fila) = "0" 'no grabada
                    Range("G" & fila) = rs("Tipo medida base")
                    Range("H" & fila) = rs("Medida base")
                    Range("I" & fila) = rs("Unit Cost")

                    Range("J" & fila) = rs("Global Dimension 2 Code")
                    Range("K" & fila) = rs("Item Category Code")
                    Range("L" & fila) = rs("Item No_")
                    Range("M" & fila) = rs("description")
                    Range("N" & fila) = rs("STOCKCALCULADO")
                    fila = fila + 1
                End If
         
       
        rs.MoveNext
    Loop
   
    rs.Close
    Set rs = Nothing
   

Aclaro que no se si esto funciona porque no puedo probarlo y no se si va a fallar porque se esta omitiendo algo, pero en fin, si esto funciona y llegas a tener todos los datos en una Hoja Excel despues seria ver la manera de filtrarlos, lo cual ya en Excel puede ser mucho mas sencillo.

O quizas tengas un codigo que te traiga todos los datos.

Saludos

Dark_Charlie


Tras mucho investigar y mucho mirar por internet he podido llegar a la solución.  Por lo visto estaba comparando variables de diferente tipo (numérico con cadena, por ejemplo).
 
Lo he dejado así:
Código:
If rs("Global Dimension 2 Code") <> "880" Then
            If rs("Global Dimension 2 Code") <> "530" Then
                    If Range("L" & fila) = rs("Item No_") Then 'poden faltar camps a comparar
                            ' si el producte és el mateix, no el carrega.
                            Range("N" & fila) = rs("STOCKCALCULADO")
                        fila = fila + 1
                        Else
                            Range("a" & fila, "z" & fila).EntireRow.Insert (xlShiftDown)
                            Range("C" & fila) = "1" 'original, primera carga
                            Range("D" & fila) = "0" 'no grabada
                            Range("G" & fila) = rs("Tipo medida base")
                            Range("H" & fila) = rs("Medida base")
                            Range("I" & fila) = rs("Unit Cost")
                            Range("J" & fila) = rs("Global Dimension 2 Code")
                            Range("K" & fila) = rs("Item Category Code")
                            Range("L" & fila) = rs("Item No_")
                            Range("M" & fila) = rs("description")
                            Range("N" & fila) = rs("STOCKCALCULADO")
                            'Range("O" & fila) = ""
                            fila = fila + 1
                    End If
            End If
        End If
        
       
       
        
If rs("Global Dimension 2 Code") = "880" Then
    If Right(CStr(rs.Fields("Item No_").Value), 4) = "100T" Or Right(CStr(rs.Fields("Item No_").Value), 4) = "100K" Then


Ahora ya me funciona y me muestra los valores que yo quería (100K y 100T) tan solo que cuando se cargan en Excel se me repiten, ¿es problema del Group By?


Gracias!

18RESUELTO Re: Condición mayor o igual que el 03/06/16, 11:28 am

Dark_Charlie


Vale, ya sé donde esta la solución para dejarlo todo bien solucionado. 

Creo que la mejor forma de enfocar esta macro, sería con la instrucción SELECT CASE pero no sé muy bien como realizarla, ¿alguien me echa una mano?


Tengo esto:



Código:
Select Case rs("Global Dimension 2 Code")
 
    Case “503”
 
        (Aquí lo que queremos que ocurra cuando rs("Global Dimension 2 Code") = “503”)
 
    Case “880”
 
        (Aquí lo que queremos que ocurra cuando rs("Global Dimension 2 Code") = “880”)
 
    Case Else
 
        (Aquí lo que queremos que ocurra en los demás casos)
 
End Select
 
 
Este bloque anterior, tendrás que colocarlo entre la línea
 
Do While Not rs.EOF
 
y la línea
 
Loop
 
eliminando lo que hay ahí dentro actualmente.



No sé muy bien como estructurarlo todo. 

19RESUELTO Re: Condición mayor o igual que el 05/06/16, 08:32 pm

tyno


Hola Charlie
La instrucción Select Case en realidad no ejecuta nada particular en un código, para lo único que sirve (y por eso es útil) es para dar más prolijidad a un código que contiene muchas lineas e instrucciones que ejecutar. Por ejemplo si tenemos que dependiendo de un valor que ingresemos en la celda A1 se ejecuten distintas instrucciones entonces tenemos la alternativa de hacerlo asi:

if  [A1]=0 then [B1]=A
if  [A1]=1 then [B1]=B
if  [A1]=2 then [B1]=C
if  [A1]=3 then [B1]=D
if  [A1]=4 then [B1]=E
if  [A1]=5 then [B1]=F

Con Select Case

Select Case [A1]
Case 0 :[B1]=A
Case 1: [B1]=B
Case 2: [B1]=C
Case 3: [B1]=D
Case 4: [B1]=E
Case 5: [B1]=F
End Select

Este es un ejemplo muy simple pero muestra que Select Case por un lado no tiene  ninguna función especial y queda un poco más "profesional"

Con respecto a tu asunto, mas allá de que obtengas resultados duplicados en primera instancia, luego ¿no puedes filtrar esos resultados en la Hoja Excel? de manera que obtener valores únicos.

Saludos

20RESUELTO Re: Condición mayor o igual que el 07/06/16, 05:05 am

Dark_Charlie


Ah! De acuerdo! No lo sabía tyno...

Llevo mucho tiempo peleándome con este código y, cuando consigo lo que quiero, por una razón u otra no funciona. Ahora se me duplica casi todo.

21RESUELTO Re: Condición mayor o igual que el 28/06/16, 12:15 am

Igtelo


Hola.

Tyno, como siempre, gracias. Se da por resuelto.

Saludos
Ignacio Téllez

Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.