Saltar al contenido

Ayuda con una condición


Recommended Posts

publicado

Buenas tardes,

Tengo un problema con macros en visual basic para excel y que, por más que mire, no consigo solucionar. Tengo el siguiente código:

Option Explicit


Dim oConexion As ADODB.Connection

Sub ConnectDB()
    On Error GoTo err
    Set oConexion = New ADODB.Connection
    oConexion.Open "Provider=SQLOLEDB.1;Password=bandoiberica2015b;Integrated Security=SSPI;Persist Security Info=True;" & _
               "User ID=Administrador;" & _
               "Initial Catalog=BANDOIBERICA_2015;" & _
               "Data Source=bandoserver3"   'ip o nombre del servidor
    'MsgBox "Connexió establerta.", vbInformation, "1"
    Exit Sub
err:
    MsgBox "Error de connexió a la Base de dades: " & err.Description, vbInformation, ActiveWorkbook.Name
End Sub




Private Sub cargardatosCARGASSECUNDARIAS()
    '***************
    Dim ulti As Long
    Dim Cadena As String
    Dim Filas As Single, MiRango As Object
    Set MiRango = Range(ActiveCell.Offset(1, 0), ActiveCell.Offset(Filas, 0))
    '***************
    ConnectDB

    Dim fila As Integer
    Dim columna As String
    Dim rs As ADODB.Recordset
    'Dim RsPreu As ADODB.Recordset
    
    fila = 10
    columna = "A"
    
    Set rs = New ADODB.Recordset
    'Set RsPreu = 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] = '300') 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] = '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] = '780') 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] = '830') 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] = '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 rs("Global Dimension 2 Code") = "600" Then
        '    If Left(rs("Item No_"), 5) = "B2CBR" Or Left(rs("Item No_"), 5) = "ROUND" Then
        '       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")
        '        fila = fila + 1
        '    Else
        '    End If
        If rs("Global Dimension 2 Code") = "503" Then
            If Val(Right(rs("Item No_"), 2)) >= 10 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
                    ' 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
        Else
            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
        
                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
                    ' 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
        
          
        End If
        
        End If
       
         
         
        
         
rs.MoveNext
Loop
rs.Close

Set rs = Nothing
End Sub

Sub Sincro()
    
End Sub

Deseo que de la referencia 880 aparezcan únicamente los valores "100T" y "100K" y no lo logro ya que no carga dicha referencia (llega hasta la anterior, la 840).  

 

¿Alguna idea?

 

Gracias!

publicado

Parece estar bien, pero entre tanto If, Else End If, se hace complicado seguirlo, yo sustituiría esta estructura por un Select Case:

Select Case rs("Global Dimension 2 Code")

   Case "503"
      'Código VBA para rs("Global Dimension 2 Code")="503"
   
   Case "880"
       'Código VBA para rs("Global Dimension 2 Code")="880"

   Case Else
      'Código VBA para rs("Global Dimension 2 Code")= Resto valores

End Select

 

publicado

Hola Macro Antonio,

Primeramente, muchas gracias por contestar y de una forma tan rápida. 

He realizado el Select Case como me has comentado pero me da error de compilación, ¿te puedo enseñar el código y me dices si estoy yendo por buen camino?

        Select Case rs("Global Dimension 2 Code")

   Case "503"
      If rs("Global Dimension 2 Code") = "503" Then
            If Val(Right(rs("Item No_"), 2)) >= 10 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
                    ' si el producte és el mateix, no el carrega.
                     Range("N" & fila) = rs("STOCKCALCULADO")
                    fila = fila + 1
               
                    
                    End If
                    
        
        Select Case rs("Global Dimension 2 Code")
   
   Case "880"
       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
        
                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
                    ' si el producte és el mateix, no el carrega.
                     Range("N" & fila) = rs("STOCKCALCULADO")
                    fila = fila + 1
                    
                    End If
                    
                    
    Select Case rs("Global Dimension 2 Code")
                

   Case Else
        If Range("A" & fila, "z" & fila).EntireRow.Insert(xlShiftDown) Then
                            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


        
        
       
     
         
        
         
rs.MoveNext
Loop
rs.Close

Set rs = Nothing
End Sub

El error que me aparece es "Error de compilación: Case sin select case" o "Loop sin Do"

 

Gracias!

publicado

La condició hauria de quedar així.

 

   Select Case rs("Global Dimension 2 Code")
   
      Case "503"
         If Val(Right(rs("Item No_"), 2)) >= 10 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
               ' si el producte és el mateix, no el carrega.
               Range("N" & fila) = rs("STOCKCALCULADO")
               fila = fila + 1
            End If
         End If
      
      Case "880"
         If Right(CStr(rs.Fields("Item No_").Value), 4) = "100T" Or _
            Right(CStr(rs.Fields("Item No_").Value), 4) = "100K" 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
               ' si el producte és el mateix, no el carrega.
               Range("N" & fila) = rs("STOCKCALCULADO")
               fila = fila + 1
            End If
         End If
      
      Case Else
         If Range("A" & fila, "z" & fila).EntireRow.Insert(xlShiftDown) Then
            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 Select

 

Sort

publicado

Gràcies de nou per contestar d'una forma tant ràpida! Un plaer parlar amb un català (pensava que eres gallec). He provat el codi tal qual m'has posat i no em carrega ni la referència 503 ni la 880, ¿què pot ser?

publicado

Asegúrate que la Select te devuelve esos valores, pon un punto de interrupción en el Select Case y sigue el proceso paso a paso (F8), para ver por donde sale.

publicado
Select Case CStr(rs("Global Dimension 2 Code"))
   
      Case "503"
         If Val(Right(rs("Item No_"), 2)) >= 10 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
               ' si el producte és el mateix, no el carrega.
               Range("N" & fila) = rs("STOCKCALCULADO")
               fila = fila + 1
            End If
         End If
         
          Case "880"
         If Right(CStr(rs.Fields("Item No_").Value), 4) = "100T" Or _
            Right(CStr(rs.Fields("Item No_").Value), 4) = "100K" 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
               ' si el producte és el mateix, no el carrega.
               Range("N" & fila) = rs("STOCKCALCULADO")
               fila = fila + 1
            End If
         End If
      
      Case Else
         If Range("A" & fila, "z" & fila).EntireRow.Insert(xlShiftDown) Then
            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 Select

Creo que todo está correcto, ¿verdad? 

  • Silvia bloqueó este tema

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      28

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    1    1

  • Crear macros Excel

  • Mensajes

    • Buenos días con todo, espero se encuentren bien de salud!. Favor quisiera ver si me pueden ayudar con lo siguiente. Tengo una data en excel con los siguiente criterios FECHAS DIFERENTES , CODIGO Y NOMBRE DEL PRODUCTO. Lo que quiero realizar es que si en la fecha 17-02  tienes cantidad x de códigos y si estos no se repite el día siguiente 18-02 que automáticamente se borre, esto con la finalidad de tener un control de a partir del 18 al 19  se repite 2 veces y no me considere 3 desde fecha 17-02  teniendo en cuenta que el producto en el 18-02 no aparece. Lo sombreado son los que se repiten .   TABLA ELIMINAR.xlsx
    • Vale mil gracias, en vdd se agradece todo el apoyo y comentarios
    • Hola nuevamente. Por eso la importancia de lo que mencionas tú como "ruta relativa". Tal cual comentas, y aún sin llegar a algunos detalles importantes para ayudarte, en realidad tal cual te comenté le día miércoles, pues sí podías hacer como comentabas, era cosa de obtener los Id de Windows (como tú los llamas) y la ruta de OneDrive en casa usuario y eso sí se puede obtener con VBA y luego pasarlo a PQ, pero medio que te cerraste en que "PQ no puede trabajar con rutas relativas", cosa cierta pero siempre hay formas. Si SAP puede o no guardar en OneDrive o SharePoint, pues si está mapeado en la PC ¡claro que se puede! Pero bueno, creo que si te es útil tu propia propuesta ¡avanza con eso!
    • Perdona @Abraham Valencia pero he estado liado estos días. En realidad todo el problema se reduce a estos dos problemas: Problema 1: El script que "fabrica" SAP y que luego "pego" en la macro, no es capaz de  guardar archivos en SharePoint. He estado buscando, y en realidad muchas personas tienen ese problema (no poder guardar un Excel en SAP a través de VBA). Eso muy probablemente sean problemas de permisos, que no puedo cambiar (no soy administrador de nada). Como no puedo solucionarlo así, paso al plan B, que es guardar en Excel que me genera SAP en el ordenador de cada usuario que ejecute la plantilla (y que sí está guardada en SharePoint), para después con PowerQuery llamar a ese Excel (el export). Para ello, pretendo guardar el export, en la ruta relativa "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" donde los \..\..\..\ saltan las rutas personales de cada usuario (tipo C:\users\IDusuario\). Eso lo hace bien, y el archivo se guarda en la ruta de cada usuario que lo usa, pero surge el problema 2 Problema 2: PowerQuery no trabaja con rutas relativas del tipo  "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" necesita que sea del tipo fija "C:\users\IDusuario\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" pero claro, IDusuario es diferente para cada usuario.   Pero escribiendo todo esto, creo que he dado con una posible solución, no grabar el export en una ruta de usuario, sino en una en la raiz de C:, que siempre será igual para todos los usuarios, del tipo C:\Sap\export.xlsx que seria igual en todos los ordenadores. Asi sí podría decirle a PowerQuery que vaya siempre a la ruta C:\Sap\ que existirá en todos los ordenadores. Mañana intentaré hacer pruebas, aunque mi solución ideal seria que se pudiera guardar en el SharePoint. Saludos.
    • Hola La opción brindada por @torquemada es correcta, funciona, pero hay algunos inconvenientes que (desde mi punto de vista) no la convierten en mi primera elección. Los inconvenientes son: Tendrías que ir columna por columna haciendo los reemplazos, claro que no se harían a mano sino que utilizarías la opción reemplazar o la opción texto en columnas, aun asi demorará un poquito y será trabajoso. Cada vez que descargues otro listado, tendrás que volver a realizar los reemplazos. Me parece una mejor propuesta lo siguiente: Descarga los movimientos a un archivo de Excel Desde tu control de pagos (otro archivo) cargas los movimientos del archivo descargado mediante Power Query Power Query hará los reemplazos y reconocerá todo correctamente (sin que tengas que hacer nada especial) Cuando descargues los movimientos un día posterior, solamente tendrás que hacer clic en "Actualizar" y todo funcionará en automático
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.