Saltar al contenido

Número de datos


Recommended Posts

publicado

Tengo archivos con información variable que puede ocupar más de una hoja de trabajo (1, 2, 3,...). Mediante una macro necesito lo siguiente:

1.- El número de filas (registros) que tiene cada archivo (uno a la vez)

2.- Obtener algunos indicadores estadísticos como la media, desviación estandard, el valor mínimo, el valor máximo de todos los datos (trabajado sobre un campo numérico específico)

3.- Mediante la generación de números aleatorios, recuperar la información del registro que corresponda a cada número aleatorio que se obtenga.

Aunque sé que Excel no es la herramienta idónea para este tipo de problemas, la verdad es que no se cuenta con otra aplicación.

Agradeceré cualquier tipo de ayuda.

Saludos al foro.

publicado

El problema es que son archivos que pesan muchísimo pues tienen más de un millón de registros y algunos llegan a màs de 3 millones. ¿Cómo le puedo hacer?

publicado

Y trabajas con millones de registros en Excel?........me temo que tienes un problema.......jejeje

En serio, crea un archivo con la estructura real e incluyes a lo máximo 100 registros ficticios.........junto con la información de lo que quieres realmente (en un cuadro de texto o algo así, por ejemplo....) y a ver si alguien te puede echar una mano, aunque ya te adelanto que no creo que haya muchos que hayan trabajado con esas cantidades de registros tan bestiales de los que hablas.......En Access, hasta yo los he visto.........pero en Excel........:dispirited:

Chao,

Tese

publicado

Tengo archivos con información variable que puede ocupar más de una hoja de trabajo (1, 2, 3,...). Mediante una macro necesito lo siguiente:

1.- El número de filas (registros) que tiene cada archivo (uno a la vez)

2.- Obtener algunos indicadores estadísticos como la media, desviación estandard, el valor mínimo, el valor máximo de todos los datos (trabajado sobre un campo numérico específico)

3.- Mediante la generación de números aleatorios, recuperar la información del registro que corresponda a cada número aleatorio que se obtenga.

Aunque sé que Excel no es la herramienta idónea para este tipo de problemas, la verdad es que no se cuenta con otra aplicación.

Agradeceré cualquier tipo de ayuda.

Concuerdo contigo! Excel no es lo mas optimo para las tareas que deseas realizar! no siendo el caso de VBA!

Trabajar con mas de tres millones de registros en un libro de excel... considero que no es adecuado en lo absoluto mejor hacerlo desde Access.... pero mencionas que solo cuentas con Excel... pero como ya mencione vaciar los registros en hojas seria inadecuado.

Pero tienes VBA... abre los archivos, carga el contenido de estas en una matriz y has los calculos pertinentes! Tese1969 menciona que se trata de una cantidad bestial de registros... veamos si mis conocimientos pueden hacer algun milagro! jajaja

Como dice Tese1969, seria de gran ayuda parte del archivo que necesitas procesar, quiero suponer que se trata de un txt o un csv.

Umm procesar 3 millones de registros sera un buen reto para tratar de hacerlo en el menor posible, asi que sube tu archivo!

publicado

Hola a todos:

Incluso a Access le van a rechinar las bielas con 3 millones de registros. Suponiendo 8 columnas por registro, estamos hablando de 24 millones de columnas, y eso es mucha columna.

Con esos volúmenes mejor MiSql o tadavía mejor SqlServer u Oracle, pero estos dos últimos hay que pagar.

Voy a intentar generar un libro con esas condiciones, y luego pasarlo a Access.

- - - - - Mensaje combinado - - - - -

.

.

.

a las 19:13

Bueno, en Excel, 3 millones de filas de 10 columnas repartidas en 3 hojas a 1 millón de filas por hojas, tarda 3 minutos en abrirse, ocupa 250 Mbytes y tarda otros tres minutos en guardarlo.

Saber el nº de filas de cada hoja es prácticamente instantáneo, calcular el máximo y el mínimo de una columna, 80 segundos por hoja. En cuanto a la desviación standard todavía no lo he mirado, pero me temo que va a ser problemático.

Aquí están las dos macros, el resultado del Máximo/Mínimo, aparece en la barra de estado de Excel.



Sub MaxMin(): On Error GoTo salvmin = 999999999
Inicio = Time


Columna = InputBox("Indicar la columna en letra", , "A")
For x = 1 To ActiveSheet.UsedRange.Rows.Count
If Range(Columna & x) > vmax Then
vmax = Range(Columna & x)
rmax = x
End If
If Range(Columna & x) < vmin Then
vmin = Range(Columna & x)
rmin = x
End If
r = x Mod 10000
If r = 0 Then
Application.ScreenUpdating = True
Debug.Print Time
Application.StatusBar = "Empieza: " & Inicio & " Fila=" & x & " F/V Máximo=" & _
rmax & "/" & vmax & " F/V Mínimo " & rmin & "/" & vmin & " Termina: " & Time
Application.ScreenUpdating = False
End If
Next
sal:
End Sub


Sub Filas()
MsgBox ActiveSheet.UsedRange.Rows.Count
End Sub


[/CODE]

publicado

Jejejeje........Macro Antonio....lástima que no estuvieras en los Juegos de Londres........como cronometrador no tenías precio!!!....jejeje

Y permíteme una maldad.........si tienes 8 columnas, son 8 columnas.........da igual los millones de filas que tengas.....jejeje

Cuidaros todos y por favor, para estos volúmenes diríjanse a otras aplicaciones......que al Excel le tostáis.......jejej

Chao,

Tese

publicado

Incluso a Access le van a rechinar las bielas con 3 millones de registros. Suponiendo 8 columnas por registro, estamos hablando de 24 millones de columnas, y eso es mucha columna.

Respecto a lo de las columnas... Tese ya hizo la maldad!

Con esos volúmenes mejor MiSql o tadavía mejor SqlServer u Oracle, pero estos dos últimos hay que pagar.

La verdad no he tenido el gusto de utilizar ninguno de los tres, pero tengo entendido que MySQL es mejor que SQLServer... eso he oido no me consta. Otra alternativa algo radical a las que propone MacroAntonio es utilizar un gestor de bd NoSQL como MongoDB (dicen que los gestores NoSQL son mas rapidos... habria que probar...)

Bueno, en Excel, 3 millones de filas de 10 columnas repartidas en 3 hojas a 1 millón de filas por hojas, tarda 3 minutos en abrirse, ocupa 250 Mbytes y tarda otros tres minutos en guardarlo.

Veo que te decantaste por implementar la solución en Excel... sigo pensando que abrir el fichero y cargar los datos en memoria es mas rápido! hace tiempo en un tema pasado dije que vba era pésimo para el procesamiento de texto, hoy retiro lo dicho! Por eso el interés de que el compañero suba un archivo con la estructura de los archivos a procesar.

En mi antiguo trabajo... unos compañeros tenían que procesar un csv de 2 gb para poder generarle reporte a P&G... ellos me contaron que trataron de abordar la solución con VBA/Excel pero que resulto ser un fracaso por que era sumamente lento, que no servia y tantas cosas negativas mas... lo ultimo que supe fue que usaron python junto con sqlLite para solucionar el problema. Yo creo que no agotaron las posibilidades de VBA/Excel ademas de que siempre han sido adoradores del software libre y Linux.... es por eso que quisiera restablecer la buena imagen de VBA/Excel.

Saludos!

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
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • 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.