Jump to content

Antoni

Members
  • Content Count

    9,966
  • Joined

  • Last visited

  • Days Won

    513

Everything posted by Antoni

  1. Documéntate acerca del método Getrows del objeto Recordset que permite dejar una consulta SQL en un Array. Consulta cualquier tutorial de ADO en la red.
  2. Para empezar modifica el diseño de tus hojas como están en el adjunto. Los adornos y las macros no se llevan bien. Libro1 (4).xlsx
  3. Vaya Leopoldo, con lo bien que lo habías hecho aquí:
  4. Sub CopiarEnBASE() Application.ScreenUpdating = False For Each hoja In Sheets(Array("VALE 1", "VALE 2")) With hoja x = Sheets("BASE").Range("A" & Rows.Count).End(xlUp).Row + 1 For fila = 10 To 52 Step 3 If .Range("B" & fila) <> "" Then For y = 0 To 2 If .Range("D" & fila + y) <> "" Then Sheets("BASE").Range("A" & x) = WorksheetFunction.Max(Sheets("BASE").Columns("A")) + 1 Sheets("BASE").Range("B" & x) = CDate(.Range("D7")) Sheets("BASE").Range("C" & x) = .Range("C6") Sheets("BASE").Range("D" & x) = .Range("J4") Sheets("BASE").Range("E" & x) = .Range("K7") Sheets("BASE").Range("F" & x) = .Range("D8") Sheets("BASE").Range("G" & x) = .Range("B" & fila) Sheets("BASE").Range("H" & x) = .Range("C" & fila) Sheets("BASE").Range("I" & x) = .Range("D" & fila + y) Sheets("BASE").Range("J" & x) = .Range("E" & fila + y) x = x + 1 End If Next End If Next For fila = 10 To 52 Step 3 If .Range("H" & fila) <> "" Then For y = 0 To 2 If .Range("J" & fila + y) <> "" Then Sheets("BASE").Range("A" & x) = WorksheetFunction.Max(Sheets("BASE").Columns("A")) + 1 Sheets("BASE").Range("B" & x) = CDate(.Range("D7")) Sheets("BASE").Range("C" & x) = .Range("C6") Sheets("BASE").Range("D" & x) = .Range("J4") Sheets("BASE").Range("E" & x) = .Range("K7") Sheets("BASE").Range("F" & x) = .Range("D8") Sheets("BASE").Range("G" & x) = .Range("H" & fila) Sheets("BASE").Range("H" & x) = .Range("I" & fila) Sheets("BASE").Range("I" & x) = .Range("J" & fila + y) Sheets("BASE").Range("J" & x) = .Range("K" & fila + y) x = x + 1 End If Next End If Next End With Next End Sub
  5. No explicas de que tablas de la BD salen los datos correspondientes a las hojas REGCAJA y REGPRODUCTOS, para otra vez se más concreto ya que ha sido un poco complicado averiguarlo. Sustituye el procedimiento de búsqueda por este: Private Sub cargar_Click() Dim cn As Object Dim rs As Object Dim x As Long Dim Anterior As String Dim BD As String Application.ScreenUpdating = False Set cn = CreateObject("ADODB.Connection") BD = ThisWorkbook.Path & "\Buscador de Precios 64 bits 9-4-19 nuevas tablas.accdb" '<------ Conexion = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & BD cn.Open Conexion Set rs = New ADODB.Recordset With rs .CursorLocation = adUseClient .CursorType = adOpenStatic .LockType = adLockOptimistic End With If turno.ListIndex > -1 Then whereturno = "UCASE(caja.Turno)='" & UCase(turno) & "' AND " If txt_Buscar.ListIndex > -1 Then wheretipo = "UCASE(caja.[Tipo comprobante])='" & UCase(txt_Buscar) & "' AND " Sql = "SELECT caja.Fecha, caja.Turno, caja.[Nº Comprobante], caja.[Tipo comprobante], " Sql = Sql & "caja.Observacion, caja.Dirección, caja.[Obs Pago],salidas.Cantidad, salidas.Cod, salidas.Descripción " Sql = Sql & "FROM caja INNER JOIN salidas ON caja.[Nº Comprobante] = salidas.Factura " Sql = Sql & " WHERE " & whereturno & wheretipo & "caja.Fecha=#" & CDate(fecha) & "# " rs.Open Sql, Conexion Sheets.Add ActiveSheet.Cells.Clear ActiveSheet.Range("A1").CopyFromRecordset rs rs.Close Set rs = Nothing cn.Close Set cn = Nothing '---- x = 1 With ActiveSheet Do Until .Range("A" & x) = "" If .Range("C" & x) <> Anterior Then ListBox1.AddItem .Range("C" & x) ListBox1.List(ListBox1.ListCount - 1, 1) = .Range("D" & x) ListBox1.List(ListBox1.ListCount - 1, 2) = .Range("E" & x) ListBox1.List(ListBox1.ListCount - 1, 3) = .Range("F" & x) ListBox1.List(ListBox1.ListCount - 1, 4) = .Range("G" & x) Anterior = .Range("C" & x) End If ListBox1.List(ListBox1.ListCount - 1, 5) = ListBox1.List(ListBox1.ListCount - 1, 5) & _ .Range("H" & x) & ") " & .Range("I" & x) & "-" & .Range("J" & x) & vbCrLf x = x + 1 Loop End With Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True End Sub
  6. Esta macro traspasa los datos de la hoja activa a la hoja BASE: Sub CopiarEnBASE() Application.ScreenUpdating = False With ActiveSheet x = Sheets("BASE").Range("A" & Rows.Count).End(xlUp).Row + 1 For FILA = 10 To 52 Step 3 If .Range("B" & FILA) <> "" Then Sheets("BASE").Range("A" & x) = WorksheetFunction.Max(Sheets("BASE").Columns("A")) + 1 Sheets("BASE").Range("B" & x) = CDate(.Range("D7")) Sheets("BASE").Range("C" & x) = .Range("C6") Sheets("BASE").Range("D" & x) = .Range("J4") Sheets("BASE").Range("E" & x) = .Range("K7") Sheets("BASE").Range("F" & x) = .Range("D8") Sheets("BASE").Range("G" & x) = .Range("B" & FILA) Sheets("BASE").Range("H" & x) = .Range("C" & FILA) Sheets("BASE").Range("I" & x) = .Range("D" & FILA) Sheets("BASE").Range("J" & x) = .Range("E" & FILA) x = x + 1 End If Next For FILA = 10 To 52 Step 3 If .Range("H" & FILA) <> "" Then Sheets("BASE").Range("A" & x) = WorksheetFunction.Max(Sheets("BASE").Columns("A")) + 1 Sheets("BASE").Range("B" & x) = CDate(.Range("D7")) Sheets("BASE").Range("C" & x) = .Range("C6") Sheets("BASE").Range("D" & x) = .Range("J4") Sheets("BASE").Range("E" & x) = .Range("K7") Sheets("BASE").Range("F" & x) = .Range("D8") Sheets("BASE").Range("G" & x) = .Range("H" & FILA) Sheets("BASE").Range("H" & x) = .Range("I" & FILA) Sheets("BASE").Range("I" & x) = .Range("J" & FILA) Sheets("BASE").Range("J" & x) = .Range("K" & FILA) x = x + 1 End If Next Sheets("BASE").Select End With End Sub
  7. Cambia tu código por este: Private Sub ComboBox1_Change() If ComboBox1 = "cero" Then CommandButton1.Enabled = False Else CommandButton1.Enabled = True End If End Sub Private Sub TextBox1_Change(): Calcular: End Sub Private Sub TextBox2_Change(): Calcular: End Sub Private Sub Calcular() TextBox3 = "" If IsNumeric(TextBox1) And IsNumeric(TextBox2) Then If CDbl(TextBox1) > 0 Then TextBox3 = Round(CDbl(TextBox2) / CDbl(TextBox1) * 100, 1) End If End If End Sub
  8. Prueba el adjunto. TABLA HORARIOS.xlsm
  9. ¿Sigues interesado e el tema?
  10. Prueba así: SELECT cod AS Código, MAX(Descripción) AS Denominación, SUM(cantidad) AS Existencia FROM (SELECT Entradas.Cod, MAX(entradas.descripción) AS Descripción, SUM(Entradas.Cantidad) AS Cantidad FROM Entradas GROUP BY Entradas.Cod UNION SELECT salidas.Cod, MAX(salidas.descripción) AS Descripción, SUM(salidas.Cantidad) * -1 AS Cantidad FROM salidas GROUP BY salidas.Cod) GROUP BY cod HAVING SUM(cantidad)>0 ORDER BY cod;
  11. Lo siento, pero no está claro lo que pides Para empezar, en todas las filas, el valor de la columna E es superior al valor de la columna F, por lo que siempre se cumple el punto 2.1 Pon un ejemplo sin tantos registros y explica más detalladamente lo de:
  12. Set, encender auto, Nothing, apagar auto. 😂
  13. Prueba esta consulta: SELECT Entradas.Cod, Max(Entradas.descripción) AS Dedescripción, Sum(entradas.cantidad-salidas.cantidad) AS Existencia FROM Entradas LEFT JOIN salidas ON Entradas.Cod = salidas.Cod GROUP BY Entradas.Cod;
  14. Resumiendo, crea el objeto(Set) antes de usarlo la primera vez y descárgalo(Nothing) cuando ya no vayas a usarlo más.
  15. El mensaje no se trata de un error se trata de una alerta que ocurre cuando intentas guardar un archivo con macros como xlsx. O guardas el archivo como xlsm o aplicas este código: Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:=Ruta & nombre & ".xlsx", FileFormat:=xlOpenXMLWorkbook
  16. Contradiciendo un poco al amigo Abraham 😉, yo he usado el formato de INSERT que utilizas, es decir, sin utilizar los nombres de las columnas. Yo me inclino más a creer que el formato de los datos no son los correctos, intuyo, ya que no lo especificas, que las columnas a las que van a parar las variables Cod_Prod, Nombre y Existencia, están definidas en la BD como número, texto y número respectivamente. Recuerda que las columnas definidas como texto deben ir encerradas entre comillas simples. Prueba así: SQL = "insert into productos values('" & Cod_Prod & "',''" & Nombre & "'" & Existencia);"
  17. Deja tus macros así: Option Explicit Sub Macro1() Dim Fila As Long, H1 As Worksheet, H2 As Worksheet '-- Application.ScreenUpdating = False 'Evita el parpadeo Set H1 = Sheets("Sheet1") Set H2 = Sheets("Sheet2") '-- Fila = H2.Range("A" & Rows.Count).End(xlUp).Row + 1 H2.Range("A" & Fila) = H1.Range("B4") H2.Range("B" & Fila) = H1.Range("B5") H2.Range("C" & Fila) = H1.Range("B6") H2.Range("D" & Fila) = H1.Range("B7") H2.Range("A4:K" & Fila).Sort Key1:=H2.Columns("A") H1.Range("B4:B7").ClearContents H1.Range("B4").Select End Sub Sub Macro2() Dim Fila As Long, H1 As Worksheet, H2 As Worksheet '-- Application.ScreenUpdating = False 'Evita el parpadeo Set H1 = Sheets("Sheet1") Set H2 = Sheets("Sheet2") '-- Fila = H2.Range("F" & Rows.Count).End(xlUp).Row + 1 H2.Range("F" & Fila) = H1.Range("E4") H2.Range("G" & Fila) = H1.Range("G4") H2.Range("H" & Fila) = H1.Range("I4") H2.Range("I" & Fila) = H1.Range("E5") H2.Range("J" & Fila) = H1.Range("G5") H2.Range("K" & Fila) = H1.Range("I5") H2.Range("F4:K" & Fila).Sort Key1:=H2.Columns("F") H1.Range("E4:E5,G4:G5,I4:I5").ClearContents H1.Range("E4").Select End Sub
  18. Prueba con esta macro. Sub BuscarCoincidencias() Application.ScreenUpdating = False Range(Range("M3"), Range("M3").End(xlDown)) = "" For x1 = 3 To Range("B3").End(xlDown).Row For x2 = 3 To Range("J3").End(xlDown).Row c = 0 For y = 10 To 12 Set n = Range("B" & x1 & ":G" & x1).Find(Cells(x2, y), , , xlWhole) If Not n Is Nothing Then c = c + 1 Next If c = 3 Then Range("M" & x2) = Range("M" & x2) + 1 Next Next End Sub
  19. Sub PseudoGráfico() Dim Verde, Amarillo, Rojo, Morado '-- Application.ScreenUpdating = False Verde = Range("A2").Font.Color Amarillo = Range("B2").Font.Color Rojo = Range("C2").Font.Color Morado = Range("D2").Font.Color '-- Columns("E").Font.Name = "Stencil" Columns("E").Font.Size = 11 Columns("E").Font.Bold = True '-- For x = 2 To Range("L" & Rows.Count).End(xlUp).Row With Range("E" & x) .Value = String(100, "|") .Font.Color = Morado If Range("L" & x) > 0 Then .Characters(1, Range("L" & x)).Font.Color = Verde If Range("M" & x) > 0 Then .Characters(Range("L" & x) + 1, Range("M" & x)).Font.Color = Amarillo If Range("N" & x) > 0 Then .Characters(Range("L" & x) + Range("M" & x) + 1, Range("N" & x)).Font.Color = Rojo End With Next End Sub
  20. Había un error en la macro, la vuelvo a subir. Sub PseudoGráfico() Dim Verde, Amarillo, Rojo '-- Application.ScreenUpdating = False Verde = Range("A2").Font.Color Amarillo = Range("B2").Font.Color Rojo = Range("C2").Font.Color '-- Columns("D:D").Font.Name = "Stencil" Columns("D:D").Font.Size = 11 Columns("D:D").Font.Bold = True '-- For x = 2 To Range("L" & Rows.Count).End(xlUp).Row With Range("D" & x) .Value = String(100, "|") .Font.Color = Rojo If Range("L" & x) > 0 Then .Characters(1, Range("L" & x)).Font.Color = Verde If Range("M" & x) > 0 Then .Characters(Range("L" & x) + 1, Range("M" & x)).Font.Color = Amarillo End With Next End Sub
  21. Esta macro hace lo que pides: Sub PseudoGráfico() Dim Verde, Amarillo, Rojo '-- Application.ScreenUpdating = False Verde = Range("A2").Font.Color Amarillo = Range("B2").Font.Color Rojo = Range("C2").Font.Color '-- Columns("D:D").Font.Name = "Stencil" Columns("D:D").Font.Size = 11 Columns("D:D").Font.Bold = True '-- For x = 2 To Range("L" & Rows.Count).End(xlUp).Row With Range("D" & x) .Value = String(100, "|") .Font.Color = Rojo .Characters(1, Range("L" & x)).Font.Color = Verde .Characters(Range("L" & x) + 1, Range("M" & x)).Font.Color = Amarillo End With Next End Sub
  22. Suponiendo que quieras cambiar el color de 3 formas con los nombres PERA, NARANJA y MANZANA: ActiveSheet.Shapes.Range(Array("PERA", "NARANJA", "MANZANA")).Select Selection.ShapeRange.Fill.ForeColor.RGB = RGB(255, 0, 0) ActiveCell.Select
  23. No me había fijado, con una dirección fija, me da error a la sexta. (Windows 10, 32 bits)
  24. A mi ya me da error la primera vez. 🙁
×
×
  • Create New...

Important Information

Privacy Policy

Ayuda Excel - Madrid, Madrid, ES - Valorada por 6254 personas - Aprender Excel - Total: 4.7 / 5