Saltar al contenido

SUBTOTALES 103, IGNORA HIDDEN ROWS, pero yo necesito IGNORAR COLUMNAS OCULTAS


patriciomates

Recommended Posts

publicado

Hola, compañeros, buenas tardes desde España.

Osa traigo una consulta, según la captura que se ve a continuación:

image.png.323ed44adfc86cc1b4fea8940637fddd.png

 

Cuando ocultamos una fila del rango A1:A6 nos cuenta solo 5 valores, pero esto no sucede con columnas, como podréis apreciar en la siguiente captura

image.png.7d8375927892a813492ec9d5ada58fab.png

 

Una solución posible habría sido usar =SI(CELDA("ancho";C:C)<>0;1;0) y una fila (row) de apoyatura (helper) pero en esta versión de office 365 me produce desbordamiento, ¿Cómo puedo evitar ese desbordamiento? La finalidad es CONTAR con SUMAPRODUCTO(C1:H1;$C$2:$H$2), PERO EL DESBORDAMIENTO NO ME PERMITE APOYARME CON LOS 1.

 image.thumb.png.2c25c2dc72528a2a536c39c42d39d081.png

No sé si alguien conoce alguna manera os lo agradecería mucho. Gracias

image.png

Subtotales de izquierda a derecha.xlsx

publicado

Buenas,

La ayuda de excel indica:

Cita
  • La función SUBTOTALES está diseñada para columnas de datos o rangos verticales. No está diseñada para filas de datos ni rangos horizontales. Por ejemplo, cuando desea calcular el subtotal de un rango horizontal mediante un núm_función de 101 o superior, como SUBTOTALES(109,B2:G2), si oculta una columna no afecta al subtotal. Sin embargo, si oculta una fila en un subtotal de un rango vertical, sí afectará al subtotal.

Respecto al desbordamiento, has probado con:

Cita

=SI(@CELDA("ancho";C:C)<>0;1;0)

Saludos

publicado
Hace 1 hora, njnsp dijo:

Buenas,

La ayuda de excel indica:

Respecto al desbordamiento, has probado con:

Saludos

Hola, si conozco que subtotales funciona en vertical. Solamente quería saber si habría una forma de hacer lo mismo en horizontal con formulación sin tener que recurrir a VBA. Ahora que la @ me quita el desbordamiento puedo apoyarme en una fila helper auxiliar y contar los 1. Aun así, creo que si no encuentro un contar.si ,  si al menos match un valor de un array de valores. voy a tener que hacerlo con VBA, que es de la única manera que se.  Ya que el ejemplo que he puesto es mucho más simple que el archivo que llevará esa función.

 

Te muestro:

image.thumb.png.0f6289a85e84a1495442dfee6af0a8e6.png

Quiero totalizar una serie de valores, pero si hidden false las columnas y muestro todo el año pues que se cuente toda la fila de valores.

Voy a tener que tirar de MACRO:

image.thumb.png.e219fd2e5ed2b3ffa45f56d48b556629.png

Yo tenía entendido que todas estas cosas se podían hacer con la nueva función LAMBDA y las nuevas funciones matrices de EXCEL sin tener que recurrir a MACROS, hasta hoy en varias ayudas que he pedido  no he encontrado sugerencia de uso, yo con fórmulas me llevo mal jejeje igualmente muchas gracias.

publicado

Hola, @patriciomates,

Esta es la fórmula que se me ha ocurrido:

=SUMA(BYCOL(C1:H1;LAMBDA(c;ELEGIRCOLS(SI(CELDA("ancho";c)>0;1;0);1))))

Como bien dices, LAMBDA es la ideal para este tipo de cálculo. Al usar la función CELDA, que solo permite evaluar una celda cada vez, hay que usar la función BYCOL para que compruebe todas las celdas de forma individual.

Espero que te sirva.

publicado
hace 7 horas, Sergio dijo:

Hola, @patriciomates,

Esta es la fórmula que se me ha ocurrido:

=SUMA(BYCOL(C1:H1;LAMBDA(c;ELEGIRCOLS(SI(CELDA("ancho";c)>0;1;0);1))))

Como bien dices, LAMBDA es la ideal para este tipo de cálculo. Al usar la función CELDA, que solo permite evaluar una celda cada vez, hay que usar la función BYCOL para que compruebe todas las celdas de forma individual.

Espero que te sirva.

Me gusta pq elimino la fila helper, voy a investigar en esa línea ... a ver si consigo resultado similar con contar.si (rango; "coincide un array de valores")

publicado

CONTAR.SI es una opción que estuve barajando pero al final no la pude implementar porque el resto de la fórmula devuelve una matriz de números y CONTAR.SI se alimenta de un rango.

¿Qué necesitas exactamente? 

publicado

Hasta ahora consigo este resultado de la siguiente manera:

image.thumb.png.d43dd37660a53f1accfe525b2ef84628.png

image.thumb.png.ff01c3687b919da1220b55a1db36fe7f.png

Macro:

Private Function CONTAR_LUN_SAB(Rg As Range) As Double

    Dim xCell         As Range
    Dim xRg           As Range
    Dim xOutRg        As Range
    Dim ResultArray() As Variant
    Dim wr            As Worksheet

    Set wr = Sheets("Configuración")
    ResultArray = getAR(wr.ListObjects("R_1_R_6").ListColumns(1).Range)

    On Error Resume Next
    Application.Volatile
    Set xRg = Application.Intersect(Rg, Rg.Worksheet.UsedRange)
    If Not (xRg Is Nothing) Then
        For Each xCell In xRg
            If (xCell.EntireRow.Hidden = False) And _
               (xCell.EntireColumn.Hidden = False) Then
                If xOutRg Is Nothing Then
                    Set xOutRg = xCell
                Else
                    Set xOutRg = Application.Union(xCell, xOutRg)
                End If
            End If
        Next
    End If

With ThisWorkbook

    Dim Keywords()  As Variant
    Dim iVal        As Long
    Dim myRange     As Range
    Dim myCell      As Range
    Dim bCount      As Boolean
    Dim myVal       As Variant

    Keywords = ResultArray

    Set myRange = xOutRg

    For Each myCell In myRange
        bCount = False

        For Each myVal In Keywords
            If InStr(1, myCell, myVal, vbBinaryCompare) And Len(myCell) = Len(myVal) Then bCount = True
        Next myVal

        If bCount Then iVal = iVal + 1
    Next myCell

        Debug.Print iVal
End With

    If Not xOutRg Is Nothing Then
        CONTAR_LUN_SAB = iVal
    Else
        CONTAR_LUN_SAB = 0
    End If

End Function

Public Function getAR(c1 As Range) As Variant
    Dim s As String, arrTemp() As Variant, arr() As Variant, j As Integer, someRange As Range
    Set someRange = c1
    With someRange
        If .Cells.Count = 1 Then
            ReDim arrTemp(1 To 1)
            arrTemp(1) = someRange.value
        ElseIf .Rows.Count = 1 Then
            arrTemp = Application.Transpose(Application.Transpose(someRange.value))
        ElseIf .Columns.Count = 1 Then
            arrTemp = Application.Transpose(someRange.value)
        Else
            MsgBox "someRange is mutil-dimensional"
        End If
        For Each X In arrTemp
            If Not X = "" Then
                ReDim Preserve arr(j)
                arr(j) = X
                j = j + 1
            End If
        Next
    End With
    getAR = arr
End Function

PERO TENGO PROBLEMAS CON EL CALULATION AUTOMATICO

publicado
hace 1 minuto , Sergio dijo:

CONTAR.SI es una opción que estuve barajando pero al final no la pude implementar porque el resto de la fórmula devuelve una matriz de números y CONTAR.SI se alimenta de un rango.

¿Qué necesitas exactamente? 

A veces algunas functions que hago corren cuando por sí solas cuando no deberían, he gestionado esto desactivando el cálculo automático del libro y calculando cuando yo lo necesito de manera focalizada en una hoja determinada ... me falta experiencia en todo esto debe haber maneras más limpias.

publicado

Patricio, es normal que hayas decidido calcular la hoja manualmente. Si tienes una celda por día del año y cada una tiene su propia fórmula, no me quiero imaginar qué infierno debe ser la espera...

Cuando me solicitan un desarrollo de este tipo, suelo generar un calendario dinámico que solo muestra los días del mes que se seleccionan mediante una barra de desplazamiento. De esa forma se evitan calcular miles de fórmulas. Tienes un sencillo ejemplo muy similar en este enlace:

https://www.contextures.com/excelscrollbarselectdate.html

 

publicado
hace 40 minutos , Sergio dijo:

Patricio, es normal que hayas decidido calcular la hoja manualmente. Si tienes una celda por día del año y cada una tiene su propia fórmula, no me quiero imaginar qué infierno debe ser la espera...

Cuando me solicitan un desarrollo de este tipo, suelo generar un calendario dinámico que solo muestra los días del mes que se seleccionan mediante una barra de desplazamiento. De esa forma se evitan calcular miles de fórmulas. Tienes un sencillo ejemplo muy similar en este enlace:

https://www.contextures.com/excelscrollbarselectdate.html

 

Me da muy buena vibra la página que me has recomendado, no conocía a Debra, estoy seguro de que voy a pasar buenos ratos estudiando el trabajo de ella. 

Por otra parte, las celdas están sin fórmulas ni formatos condicionales, si escribes una letra en pronóstico se lanza un event que formatea la celda, este pronóstico de traslada a la base de datos una vez ha pasado el día y se confirma la asistencia del trabajador.

image.thumb.png.fa7621a42479196152f220edd41e1a3a.png

Cada celda es independiente el código solo corre en la celda que ha sufrido un cambio. Y está segmentado en trocitos por fila, para tenerlo más separado y controlado.

image.thumb.png.2c46712962256ca78d283bcaceb44f69.png

además, no te permite pronosticar más días de los permitidos por la normativa de tráfico ... tacógrafo etc...

En otros posts de consultas se ven otras partes del archivo.  La gestión de personal, horarios, vacaciones, ausencias, bajas, festivos .... era algo que no había trabajado anteriormente, pero a pesar de que no es cosa fácil he disfrutado mucho haciéndolo, he estudiado mucho esto durante este año, te estoy muy agradecido por el archivo que me facilitaste con el cual inicie esta andadura he aprendido muchísimo de él. Ahora me siento preparado para afrontar la gestion de personal para el año 2023 con mucha seguridad y firmeza.

 

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.