Recuperar valores de la hoja 1 en la hoja 2
Para el Sr. Dante Amor:
Tengo una hoja donde recupero datos del SQL con este formato:
Aclaraciones:
- Nunca existirá una fila igual a la otra
- Puede existir el mismo valor en las celdas de la columna Cta, pero variando los valores de las columnas Emp, Organis, Ano, Mes
Es decir podríamos tener distintos valores en la columna Acum en función de la Empresa, Organismo, Año y Mes
Inicialmente la tabla sólo tenía las columnas Emp-Cta-Acum
Por lo que en la hoja 2 utilizaba la siguiente función para recuperar los valores de la columna Acum
Function DameValor(Casilla As String)
i = 1
For Each rw In Worksheets("dataimport").Rows
If Worksheets("DataImport").Cells(i, 1).Value = "" Then
Exit For
End If
If Worksheets("DataImport").Cells(i, 1).Value = Casilla Then
DameValor = Worksheets("DataImport").Cells(i, 2).Value
Exit For
End If
i = i + 1
Next rw
End Function
La idea es poder disponer de varias funciones de ese estilo que funcionen en todas las hojas del libro y que puedan recuperar el valor de la columna Acum para la cuenta deseada (columna Cta) de la Hoja Dataimport, pero teniendo en cuenta las columnas Emp-Organis-Ano-Mes y un botón de calcular para que rellene todas las celdas con sus valores sin tener que hacer Enter en cada casilla.
Las hojas restantes no están predefinidas. Es decir las monta el usuario en base a sus necesidades, por ello entiendo que no se puede crear una macro (en mi humilde opinión) indicando las casilla a actualizar en la hoja 2
Ejemplo de la hoja 2 donde se recuperan los datos
Como se puede apreciar en la imagen en la celda de la fila 68 de la Hoja Balance se aplica la función para recuperar los valores de la columna Acum de la hoja Dataimport en base varios valores de la columna Cta de la misma hoja.
Entonces para resumir las funciones habrán de recuperar un valor en concreto de la columna Acum o la suma/resta/multiplicación o división de varios, teniendo en cuenta las columnas Emp, Organis, Ano, Mes
Por Ejemplo:
Poder llamar a la función DameValor("48000") añadiendo los parámetros adicionales que corresponden a la empresa, Organismo, Ano, Mes. Esto sería lo que el usuario teclearía en cada celda y luego un botón para calcular cada hoja.
1 Respuesta
1. No entiendo cómo es que en un balance vas a "suma/resta/multiplicación o división de varios".
2. Tienes en alguna parte de tu archivo, ¿la relación de cuentas que pertenecen a cada renglón de la hoja "Balance"?
Es decir, el renglón M40 "Ajustes periodificación y provisiones", sus cuentas son: "48000", "48200", "48710" y "48500", esta relación la tienes en alguna parte, ¿la puedes conseguir?
Teniendo la relación de cuentas por renglón, puedes ejecutar una macro y que te haga todas las sumas.
3. Tu función DameValor(), solamente te suma una vez, y por lo que veo en tu hoja "DataImport", tienes que sumar varias veces el valor "48000", entonces esa función no nos ayuda, deberás crear otra macro más completa.
4. Una opción es que utilices la fórmula:
=Sumar.Si.Conjunto
Con esa fórmula puedes sumar todos los valores de la hoja "DataImport" considerando varias condiciones.
Con la fórmula sumar, no tienes que dar enter a cada celda, la fórmula se actualiza en automático.
Por ejemplo, pon la siguiente fórmula en la hoja 2 en la fila 68
=SUMAR.SI.CONJUNTO(dataimport!F:F;dataimport!E:E;48200;dataimport!C:C;2012)+SUMAR.SI.CONJUNTO(dataimport!F:F;dataimport!E:E;48000;dataimport!C:C;2012)
Lo que hace la fórmula es sumar los valores de las cuentas 48200 y 48000 del año 2012.
Tienes que poner un sumar. Si. Conjunto por cada cuenta que quieras sumar.
Veo que no me he explicado bien y mis disculpas por ello
Los saldos de las cuentas (columna Acum) son Acumulativos, es decir, El saldo del mes 2 será la suma del saldo del mes1 + el saldo del mes2 (este dato ya viene en los datos importados) y así sucesivamente hasta el mes 12 que sería el total del año. Por lo tanto no se se suman los saldos de los distintos meses por Cta para obtener un total excepto que tengamos mas de una empresa, si queremos una línea con el saldo consolidado de todas, o mas de una delegación por empresa. si lo que queremos es el saldo total de todas las delegaciones por empresa.
Es decir el saldo total del año 2012 de la empresa1 para la 48200 será el siguiente: (el del mes 12 ya que acumula los otros meses)
Emp Organis Mes Ano Cta Acum
1 1 12 2012 48200 100 Saldo total año 2012 delegación1
Si tuviésemos mas de una delegación(columna Organis) sumaríamos los saldos de todas las delegaciones de esa empresa
Emp Organis Mes Ano Cta Acum
1 1 12 2012 48200 100 Saldo total año 2012 delegación1
1 2 12 2012 48200 100 Saldo total año 2012 delegación2
TOTAL SALDO
Emp Organis Mes Ano Cta Acum
1 1-2 12 2012 48200 200 Saldo total año 2012 empresa1
Por todo ello se deduce que nunca vamos a sumar saldos mensuales(columna Acum de una cuenta en concreto(columna Cta) a no ser que varíe la Empresa(columna Emp) o la delegación (columna Organis)
Respuestas a sus preguntas:
1. No entiendo cómo es que en un balance vas a "suma/resta/multiplicación o división de varios".
Imaginemos que las ventas totales de la empresa1 por un valor 500 y se compone de los siguiente:
Venta de aceite Venta de recambios Venta de acesorios TOTAL VENTAS
Importe 100 300 200 500
Cada tipo de venta va a una cta de venta distinta así como a una de coste por ello tenderé que sumar cada línea individual en una de resultado.
Venta aceite Venta recambios Venta de acesorios TOTAL VENTA
Cta 70000(100) CtA 70001(300) Cta 70002(200) 70000+70001+70002(500)
Coste aceite Coste recambios Coste acesorios TOTAL COSTE
Cta 93600(30) Cta 93601(150) Cta 93602(100) 93600+93601+93602(300)
TOTAL MARGEN: 500-300= 200 este sería el margen bruto pero habría que restar otros costes indirectos como pudiera ser el transporte,descuentos....con lo cual tendría que restar las cuentas que tuviesen esos saldos del TOTAL VENTA
Si quisiera saber el % que representan las ventas de aceite sobre el total de ventas ya tendría que multiplicar y dividir pero bueno esas operaciones las haría sobre las propias celdas por Ejemplo
VENTAS DE ACEITE TOTAL VENTAS %VENTAS ACEITE
CELDA E8 (100) / CELDA E58 (500)*100 = 20%
2. Tienes en alguna parte de tu archivo, la relación de cuentas que pertenecen a cada renglón de la hoja "Balance"?
En este momento no las tengo pero no tendría problema en añadirlas puesto que al igual que importo a la hoja Dataimport los saldos también podría traer todas las cuentas (ya analizaría como hacerlo si fuese necesario)
3. Tu función DameValor(), solamente te suma una vez, y por lo que veo en tu hoja "DataImport", tienes que sumar varias veces el valor "48000", entonces esa función no nos ayuda, deberás crear otra macro más completa.
Es que esta función estaba pensada para una única empresa. Es decir sólo se importaban a la hoja dataimport lo saldos de una única empresa con el siguiente formato
Emp Cta. Acum y las cuentas nunca se repetían, como mucho podrían aparecer nuevas ctas.
por lo tanto la función funcionaba a las mil maravillas, pero ahora por otras necesidades tenemos Emp Organis Ano Mes Cta Acum
El problema me surgió porque no se como adaptar mi función de tal forma que le pueda pedir que me devuelva el saldo(columna Acum) de una cta(columna Cta) de una empresa(columna Emp) y delegación(columna Organis) determinadas o bien el total de una empresa y sus delegaciones o el total de todas las empresas.
No es lo mismo para el usuario teclear
DameValor("70000")+ Empresa+Delegacion) o
DameValor("70000") +Empresa+TodasDelegaciones) o
DameValor("70000") + TodasEmpresas
que poner fórmulas y más formulas en todas las celdas.
Por ello he recurrido a esta buena página de expertos de la que ya tenía referencias y donde estoy aprendiendo un montón de cosas que desconocía sobre excel.
Espero que con esta explicación le haya aclarado un poco más el tema.
Ahora estoy totalmente perdido, ya no entiendo qué es lo que necesitas.
Lo que más o menos entiendo, es que quieres hacer sumatorias de la primera hoja en la segunda hoja, ¿es correcto?
¿Podrías enviarme tu archivo y me explicas con colores qué es lo que quieres sumar?
Tienes una función que se llama: DameValor, es necesario que se siga utilizando esa función o puedo enviarte una solución.
Te anexo la macro para crear balances
Sub CrearBalance() 'Por.Dante Amor Set h1 = Sheets("Dataimport") Set h2 = Sheets("Balance Formato") h2.[K1:L1] = h1.[A1] h2.[M1:N1] = h1.[B1] h2.[O1:P1] = h1.[C1] h2.[Q1:R1] = h1.[D1] h2.[K2] = ">=" & h2.[H5] h2.[L2] = "<=" & h2.[I5] h2.[M2] = ">=" & h2.[H8] h2.[N2] = "<=" & h2.[I8] h2.[O2] = ">=" & h2.[H11] h2.[P2] = "<=" & h2.[I11] h2.[Q2] = ">=" & h2.[H14] h2.[R2] = "<=" & h2.[I14] h2.[AA:AF].ClearContents h1.[A1].CurrentRegion.AdvancedFilter xlFilterCopy, h2.[K1:R2], h2.[AA1:AF1] ' For i = 5 To h2.Range("A" & Rows.Count).End(xlUp).Row Set b = h2.Range("X:X").Find(h2.Cells(i, "B"), lookat:=xlWhole) If Not b Is Nothing Then cuentas = Split(h2.Cells(b.Row, "Y"), "+") For j = LBound(cuentas) To UBound(cuentas) primera = cuentas(j) Set r = h2.Columns("AE") Set b = r.Find(cuentas(j), lookat:=xlWhole) If Not b Is Nothing Then ncell = b.Address Do h2.Cells(i, "E") = h2.Cells(i, "E") + h2.Cells(b.Row, "AF") Set b = r.FindNext(b) Loop While Not b Is Nothing And b.Address <> ncell End If Next End If Next MsgBox "Balance Terimando. Copia el balance a una nueva hoja." End Sub
Saludos.Dante Amor
No olvides valorar la respuesta.
Buenos días Sr. Amor:
He estado probando la macro pero no me funciona o es que no hago los pasos correctos para su ejecución.
Detallo los pasos que realizo:
1.- Importo Datos: como bien sabe tengo la consulta sql ligada a la hoja Dataimport
Por lo tanto realizo un primer filtrado de esos datos seleccionando lo que quiero importar, Empresa, delegación, Ejercicio y Mes. En las propiedades de la definición de la consulta le tengo que actualice y sobreescriba los datos existentes.
2.- Me voy a la hoja Balance Formato y relleno los parámetros de las cuentas.(sólo informo algunas)
3.- Veo que también tengo que rellenar de nuevo los parámetros de actualización Empresa,Organis,Año,Mes no los recoge de la hoja Dataimport
4.- Pincho en el botón Crear balance y aunque los datos en las columnas AA:AF
son correctos, no se me actualizan los valores del balance, siguen manteniendo los valores que tenían previamente
¿Dónde puede estar el problema?
Si lo desea le vuelvo a enviar el archivo.
El cambio que he hecho en el archivo que me ha enviado ha sido modificar en parámetros de cuentas la cuenta 10000 por 11200 y pinchar en el botón crear balance.
El valor no se actualiza para la línea M60 sigue manteniendo -120200 cuando debería ser -138763
Creo que ya he dado con la solución al cambiar esta línea
For i = 5 To h2.Range("A" & Rows.Count).End(xlUp).Row
por esta
For i = 5 To h2.Range("B" & Rows.Count).End(xlUp).Row
B es la columna donde se encuentra M60.
Sólo quedaría un detalle, se pueden poner a 0 los valores de la columna Importe antes de realizar el cálculo?
Si no lo hago, es decir pongo a "0" los valores, suma al valor anterior el valor calculado
Te anexo la macro para limpiar la columna "E"
Sub CrearBalance() 'Por.Dante Amor Set h1 = Sheets("Dataimport") Set h2 = Sheets("Balance Formato") h2.[K1:L1] = h1.[A1] h2.[M1:N1] = h1.[B1] h2.[O1:P1] = h1.[C1] h2.[Q1:R1] = h1.[D1] h2.[K2] = ">=" & h2.[H5] h2.[L2] = "<=" & h2.[I5] h2.[M2] = ">=" & h2.[H8] h2.[N2] = "<=" & h2.[I8] h2.[O2] = ">=" & h2.[H11] h2.[P2] = "<=" & h2.[I11] h2.[Q2] = ">=" & h2.[H14] h2.[R2] = "<=" & h2.[I14] h2.[AA:AF].ClearContents For i = 5 To h2.Range("B" & Rows.Count).End(xlUp).Row If h2.Cells(i, "E") <> "Importe" Then If Not h2.Cells(i, "E").HasFormula Then h2.Cells(i, "E") = 0 End If End If Next h1.[A1].CurrentRegion.AdvancedFilter xlFilterCopy, h2.[K1:R2], h2.[AA1:AF1] ' For i = 5 To h2.Range("B" & Rows.Count).End(xlUp).Row Set b = h2.Range("X:X").Find(h2.Cells(i, "B"), lookat:=xlWhole) If Not b Is Nothing Then cuentas = Split(h2.Cells(b.Row, "Y"), "+") For j = LBound(cuentas) To UBound(cuentas) primera = cuentas(j) Set r = h2.Columns("AE") Set b = r.Find(cuentas(j), lookat:=xlWhole) If Not b Is Nothing Then ncell = b.Address Do h2.Cells(i, "E") = h2.Cells(i, "E") + h2.Cells(b.Row, "AF") Set b = r.FindNext(b) Loop While Not b Is Nothing And b.Address <> ncell End If Next End If Next MsgBox "Balance Terimando. Copia el balance a una nueva hoja." End Sub
Buenos días:
Hasta aquí, todo OK, calcula correctamente.
El problema es que si vuelvo a importar datos a través de la conexión a sql y vuelvo a informar en la hoja Balance Formato el filtro que quiero aplicar en parámetros de actualización las columnas AA:AF se quedan en blanco, o sea no me recupera de la hoja dataimport.
¿Alguna sugerencia?
Buenos días:
Por más que intento adivinar de dónde puede venir el error no consigo localizarlo
¿Podría ser que la actualización machaque algo que impida la recuperación de datos desde el botón Crear Balance?
Le envío imágenes de como queda la hoja Dataimport una vez actualizada y como queda la hoja Balance Formato al pinchar en "Crear Balance".
En la definición de la consulta tengo marcado que actualice al abrir y quitar los datos antes de guardar.
Espero sus comentarios, mientras seguiré intentando ver donde puede estar el problema.
cambia esta l{inea
h1.[A1].CurrentRegion.AdvancedFilter xlFilterCopy, h2.[K1:R2], h2.[AA1:AF1]
por estas
u = h1.Range("A" & Rows.Count).End(xlUp).Row
h1.Range("A1:F" & u).AdvancedFilter xlFilterCopy, h2.[K1:R2], h2.[AA1:AF1]
A partir del momento que actualizo Dataimport, relleno parámetros en Balance Formato pierde los datos al pinchar en el botón "Crear Balance".
Adjunto código completo por si he cometido algún error
Sub CrearBalance() 'Por.Dante Amor Set h1 = Sheets("Dataimport") Set h2 = Sheets("Balance Formato") h2.[K1:L1] = h1.[A1] h2.[M1:N1] = h1.[B1] h2.[O1:P1] = h1.[C1] h2.[Q1:R1] = h1.[D1] h2.[K2] = ">=" & h2.[H5] h2.[L2] = "<=" & h2.[I5] h2.[M2] = ">=" & h2.[H8] h2.[N2] = "<=" & h2.[I8] h2.[O2] = ">=" & h2.[H11] h2.[P2] = "<=" & h2.[I11] h2.[Q2] = ">=" & h2.[H14] h2.[R2] = "<=" & h2.[I14] h2.[AA:AF].ClearContents For i = 5 To h2.Range("B" & Rows.Count).End(xlUp).Row If h2.Cells(i, "E") <> "Importe" Then If Not h2.Cells(i, "E").HasFormula Then h2.Cells(i, "E") = 0 End If End If Next u = h1.Range("A" & Rows.Count).End(xlUp).Row h1.Range("A1:F" & u).AdvancedFilter xlFilterCopy, h2.[K1:R2], h2.[AA1:AF1] ' For i = 5 To h2.Range("B" & Rows.Count).End(xlUp).Row Set b = h2.Range("X:X").Find(h2.Cells(i, "B"), lookat:=xlWhole) If Not b Is Nothing Then cuentas = Split(h2.Cells(b.Row, "Y"), "+") For j = LBound(cuentas) To UBound(cuentas) primera = cuentas(j) Set r = h2.Columns("AE") Set b = r.Find(cuentas(j), lookat:=xlWhole) If Not b Is Nothing Then ncell = b.Address Do h2.Cells(i, "E") = h2.Cells(i, "E") + h2.Cells(b.Row, "AF") Set b = r.FindNext(b) Loop While Not b Is Nothing And b.Address <> ncell End If Next End If Next MsgBox "Balance Terimando. Copia el balance a una nueva hoja." End Sub
Tal vez los datos que estás poniendo como parámetros no corresponden a ninguno de los registros.
Prueba solamente con un año, por ejemplo.
Ya me acordé, tus datos en la hoja datimort son texto y la macro busca números.
Prueba con esto
Sub CrearBalance() 'Por.Dante Amor Set h1 = Sheets("Dataimport") Set h2 = Sheets("Balance Formato") h2.[K1:L1] = h1.[A1] h2.[M1:N1] = h1.[B1] h2.[O1:P1] = h1.[C1] h2.[Q1:R1] = h1.[D1] h2.[K2] = ">=" & h2.[H5] h2.[L2] = "<=" & h2.[I5] h2.[M2] = ">=" & h2.[H8] h2.[N2] = "<=" & h2.[I8] h2.[O2] = ">=" & h2.[H11] h2.[P2] = "<=" & h2.[I11] h2.[Q2] = ">=" & h2.[H14] h2.[R2] = "<=" & h2.[I14] h2.[AA:AF].ClearContents For i = 5 To h2.Range("B" & Rows.Count).End(xlUp).Row If h2.Cells(i, "E") <> "Importe" Then If Not h2.Cells(i, "E").HasFormula Then h2.Cells(i, "E") = 0 End If End If Next h2.[A1] = 1 h2.[A1].Copy h1.Range("A1:F" & u).PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _ SkipBlanks:=False, Transpose:=False u = h1.Range("A" & Rows.Count).End(xlUp).Row h1.Range("A1:F" & u).AdvancedFilter xlFilterCopy, h2.[K1:R2], h2.[AA1:AF1] ' For i = 5 To h2.Range("B" & Rows.Count).End(xlUp).Row Set b = h2.Range("X:X").Find(h2.Cells(i, "B"), lookat:=xlWhole) If Not b Is Nothing Then cuentas = Split(h2.Cells(b.Row, "Y"), "+") For j = LBound(cuentas) To UBound(cuentas) primera = cuentas(j) Set r = h2.Columns("AE") Set b = r.Find(cuentas(j), lookat:=xlWhole) If Not b Is Nothing Then ncell = b.Address Do h2.Cells(i, "E") = h2.Cells(i, "E") + h2.Cells(b.Row, "AF") Set b = r.FindNext(b) Loop While Not b Is Nothing And b.Address <> ncell End If Next End If Next MsgBox "Balance Terimando. Copia el balance a una nueva hoja." End Sub
Buenas tardes:
He comprobado los datos que llegan de sql y todas las celdas tienen formato "general"
He reemplazado con la macro nueva y me da el error:
Se ha producido error 1004 en tiempo de ejecución
Error definido por la aplicación o el objeto
Si le doy a depurar se pone en amarillo la siguiente línea:
h1.Range("A1:F" & u).PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False
Después de esto
h2.[A1].Copy
Pon
h1.select
después de esto
h1.Range("A1:F" & u).AdvancedFilter xlFilterCopy, h2.[K1:R2], h2.[AA1:AF1]
pon
h2.select
Ahora me he perdido
En la anterior consulta esa línea era
h1.Range("A1:F" & u).PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False
¿Prefiere que le envíe el archivo tal cual está para que lo compruebe?
Mis disculpas pero no lo había copiado bien, lo he puesto donde me decía pero sigue dando error
Adjunto imagen
Buenas tardes:
He hecho lo siguiente:
La hoja Dataimport la he dejado con los datos que tenía.
He creado una nueva hoja y la he llamado Datos Iniciales
He lanzado la actualización de datos de SQL en esa hoja
He copiado los datos del renglón A2 : marcandolos y botón derecho "copiar"
He pegado en la Hoja Dataimport y he pegado en A2
Me voy a la Hoja Balance Formato - Relleno parámetros y pincho en Crear Balance
y no recupera la línea pegada en Dataimport, pero sí las restantes
Yo no lo entiendo por más vueltas que le doy.
Solamente revisa que los datos de origen sea números y que estén en un formato numérico, ya que la macro hace el filtro de rangos de 1 a 1, y no puede hacer un filtro de números si tienes texto. En el archivo que me enviaste los datos eran textos, cambiar los datos por número y haz la prueba.
A mí me funciona la macro, las pruebas que hiciste con el archivo que te envié, también funcionaron, el problema está que cuando cargas nueva información viene como texto, solamente cámbiala a número.
Envíame un nuevo archivo con el que estás probando y reviso la macro para que haga la conversión de texto a número.
Recuerda poner tu nombre "antonio ramos" en el asunto del correo
Listo!
Ya quedó, la macro convierte tus datos texto en número. Esta es la definitiva
Sub CrearBalance() 'Por.Dante Amor Set h1 = Sheets("Datos") Set h2 = Sheets("Balance Formato") h2.[K1:L1] = h1.[A1] h2.[M1:N1] = h1.[B1] h2.[O1:P1] = h1.[C1] h2.[Q1:R1] = h1.[D1] h2.[K2] = ">=" & h2.[H5] h2.[L2] = "<=" & h2.[I5] h2.[M2] = ">=" & h2.[H8] h2.[N2] = "<=" & h2.[I8] h2.[O2] = ">=" & h2.[H11] h2.[P2] = "<=" & h2.[I11] h2.[Q2] = ">=" & h2.[H14] h2.[R2] = "<=" & h2.[I14] h2.[AA:AF].ClearContents For i = 5 To h2.Range("B" & Rows.Count).End(xlUp).Row If h2.Cells(i, "E") <> "Importe" Then If Not h2.Cells(i, "E").HasFormula Then h2.Cells(i, "E") = 0 End If End If Next ' u = h1.Range("A" & Rows.Count).End(xlUp).Row h2.[A1] = 1 h2.[A1].Copy h1.Range("A1:F" & u).PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _ SkipBlanks:=False, Transpose:=False h1.Range("A1:F" & u).AdvancedFilter xlFilterCopy, h2.[K1:R2], h2.[AA1:AF1] ' For i = 5 To h2.Range("B" & Rows.Count).End(xlUp).Row Set b = h2.Range("X:X").Find(h2.Cells(i, "B"), lookat:=xlWhole) If Not b Is Nothing Then cuentas = Split(h2.Cells(b.Row, "Y"), "+") For j = LBound(cuentas) To UBound(cuentas) primera = cuentas(j) Set r = h2.Columns("AE") Set b = r.Find(cuentas(j), lookat:=xlWhole) If Not b Is Nothing Then ncell = b.Address Do h2.Cells(i, "E") = h2.Cells(i, "E") + h2.Cells(b.Row, "AF") Set b = r.FindNext(b) Loop While Not b Is Nothing And b.Address <> ncell End If Next End If Next MsgBox "Balance Terimando. Copia el balance a una nueva hoja." End Sub
Saludos.Dante Amor
No olvides valorar la respuesta.
- Compartir respuesta