Anónimo
Ayuda en excel
Hola dogduck necesito otra vez tu ayuda, lo que pasa que necesito calcular el promedio mensual y anual de unos datos que son ingresados en diferentes día (del mes) y que se encuentran en la misma celda.
Estaba pensando en utilizar archivos, ¿puede existir otra forma más sencilla para que almacene esos datos diarios y se pueda calcular su promedio?
Saludos
Cari
Estaba pensando en utilizar archivos, ¿puede existir otra forma más sencilla para que almacene esos datos diarios y se pueda calcular su promedio?
Saludos
Cari
1 Respuesta
Respuesta de dogduck
1
1
dogduck, Técnico de Sistemas, comunicaciones y soporte informático
Una vez hice algo parecido de esta manera:
* Cree un fichero csv llamado promedio.csv tal que: (con el notepad sencillamente)
Campo1
0
1
2
3
4
5
6
7
8
9
Y ya sea desde VBA o VBS accedo a el como si de una BBDD (base de datos) se tratase y calculo el promedio mediante una sentencia SQL y la función AVG (promedio).
Por ejemplo, el código de promedio.vbs
' --- promedio.vbs
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
'strPathtoTextFile = "C:\users\mua\desktop\scripts\promedio_csv"
'strPathtoTextFile =\\loto\compartida
' indica el path o camino que uses
strPathtoTextFile = "C:\users\mua\desktop\scripts\promedio_csv"
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
strFile = "promedio.csv"
ObjRecordset. Open "Select AVG(campo1) as promedio FROM promedio.csv", objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
msgbox objRecordset.Fields.Item("promedio")
' aqui podrias escribir en la celda de tu hoja de calculo el valor
objRecordset.MoveNext
Loop
'---fin promedio.vbs
* Cree un fichero csv llamado promedio.csv tal que: (con el notepad sencillamente)
Campo1
0
1
2
3
4
5
6
7
8
9
Y ya sea desde VBA o VBS accedo a el como si de una BBDD (base de datos) se tratase y calculo el promedio mediante una sentencia SQL y la función AVG (promedio).
Por ejemplo, el código de promedio.vbs
' --- promedio.vbs
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
'strPathtoTextFile = "C:\users\mua\desktop\scripts\promedio_csv"
'strPathtoTextFile =\\loto\compartida
' indica el path o camino que uses
strPathtoTextFile = "C:\users\mua\desktop\scripts\promedio_csv"
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
strFile = "promedio.csv"
ObjRecordset. Open "Select AVG(campo1) as promedio FROM promedio.csv", objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
msgbox objRecordset.Fields.Item("promedio")
' aqui podrias escribir en la celda de tu hoja de calculo el valor
objRecordset.MoveNext
Loop
'---fin promedio.vbs
Revisando ejemplos en excel para calcular el promedio, te muestro otro ejemplo:
* Sea la hoja:
PRUEBA 1 PRUEBA 2 MEDIA DATA
10 6 10/08/2005
8 7 11/08/2005
7 1 12/08/2005
9 3 13/08/2005
5 0 14/08/2005
5 1 15/08/2005
4 6 16/08/2005
3 7 17/08/2005
2 0 18/08/2005
1 6 19/08/2005
7 1 20/08/2005
0 6 21/08/2005
2 7 22/08/2005
6 0 23/08/2005
3 8 24/08/2005
9 3 25/08/2005
7 1 26/08/2005
8 2 27/08/2005
5 0 28/08/2005
--------------------
Podriamos calcular el promedio definiendo una macro con:
Sub Loop1()
Do While IsEmpty(ActiveCell.Offset(0, 1)) = False
ActiveCell.FormulaR1C1 = "=Average(RC[-1], RC[-2])"
ActiveCell.Offset(1, 0).Select
Loop
End Sub
------------------
Al ejecutarla te rellena la columna Media, con los promedios
saludos
* Sea la hoja:
PRUEBA 1 PRUEBA 2 MEDIA DATA
10 6 10/08/2005
8 7 11/08/2005
7 1 12/08/2005
9 3 13/08/2005
5 0 14/08/2005
5 1 15/08/2005
4 6 16/08/2005
3 7 17/08/2005
2 0 18/08/2005
1 6 19/08/2005
7 1 20/08/2005
0 6 21/08/2005
2 7 22/08/2005
6 0 23/08/2005
3 8 24/08/2005
9 3 25/08/2005
7 1 26/08/2005
8 2 27/08/2005
5 0 28/08/2005
--------------------
Podriamos calcular el promedio definiendo una macro con:
Sub Loop1()
Do While IsEmpty(ActiveCell.Offset(0, 1)) = False
ActiveCell.FormulaR1C1 = "=Average(RC[-1], RC[-2])"
ActiveCell.Offset(1, 0).Select
Loop
End Sub
------------------
Al ejecutarla te rellena la columna Media, con los promedios
saludos
Hola dogduck, probé el primer ejemplo que me enviaste y me sale error en la siguiente secuencia no se si me podrías ayudar:
strPathtoTextFile = "G:\Macros\promedio_csv"
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
El error que sale es que no encuentra la ruta pero ahí esta el fichero que he creado con el campo1.
Bueno y el segundo ejemplo parece que se aplica cuando los datos se encuentran en una misma hoja de calculo, pero en este caso los datos que quiero sacar promedio son ingresados en diferentes días y son ingresados en la misma celda, es decir van cambiando esos valores diariamente. Agradecería alguna ayuda.
strPathtoTextFile = "G:\Macros\promedio_csv"
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
El error que sale es que no encuentra la ruta pero ahí esta el fichero que he creado con el campo1.
Bueno y el segundo ejemplo parece que se aplica cuando los datos se encuentran en una misma hoja de calculo, pero en este caso los datos que quiero sacar promedio son ingresados en diferentes días y son ingresados en la misma celda, es decir van cambiando esos valores diariamente. Agradecería alguna ayuda.
pues si existe la carpeta G:\Macros\promedio_csv, no debería darte ese error.
Asegurate de los permisos, si fuera una ud remota.
Y asegurate que encuentra el fichero, mira esta es el cambio que te propongo:
--------
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
strPathtoTextFile = "C:\users\mua\desktop\scripts\promedio_csv"
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists("C:\Macros\promedio_csv\promedio.csv") Then
MsgBox "No lo encuentro"
Else
MsgBox "OK, continuamos"
End If
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
strFile = "promedio.csv"
ObjRecordset. Open "Select AVG(campo1) as promedio FROM promedio.csv", objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
msgbox objRecordset.Fields.Item("promedio")
objRecordset.MoveNext
Loop
objRecordset.Close
'tambien se pueden hacer inserciones, updates,... sql
'objRecordset.Open "insert into promedio.csv (campo1) values (4,3)" ,objConnection, adOpenStatic, adLockOptimistic, adCmdText
----------------------------
Asegurate de los permisos, si fuera una ud remota.
Y asegurate que encuentra el fichero, mira esta es el cambio que te propongo:
--------
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
strPathtoTextFile = "C:\users\mua\desktop\scripts\promedio_csv"
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists("C:\Macros\promedio_csv\promedio.csv") Then
MsgBox "No lo encuentro"
Else
MsgBox "OK, continuamos"
End If
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
strFile = "promedio.csv"
ObjRecordset. Open "Select AVG(campo1) as promedio FROM promedio.csv", objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
msgbox objRecordset.Fields.Item("promedio")
objRecordset.MoveNext
Loop
objRecordset.Close
'tambien se pueden hacer inserciones, updates,... sql
'objRecordset.Open "insert into promedio.csv (campo1) values (4,3)" ,objConnection, adOpenStatic, adLockOptimistic, adCmdText
----------------------------
Hola dogduck ya me corre pero quisiera saber como hago para que vaya colocando en el fichero los valores que son ingresados en la hoja excel por ejemplo en la celda d16 y que varían diariamente.. y después como hago para calcular el resultado (promedio) en una celda, por ejemplo en E16.
Hola dogduck tus ejemplos me han sido de mucha ayuda, ya se como colocar el resultado del promedio en una celda... pero no se como colocar los valores que quiero calcular en el fichero porque en si son 6 campos los que quiero colocar en el fichero, es decir necesito hallar 6 promedios.. y como te dije esos valores son ingresados en diferentes días y colocados en la misma celda... Saludos.
Para trabajar con 6 promedios, yo lo haría de la siguiente manera.
1º pondría como separador decimal el punto ( herramientas > opciones > internacional ).
La estructura del fichero promedio. Csv seria: la coma separa los campos
----------
Campo1, campo2, campo3, campo4, campo5, campo6
0.00,0.00,0.00,0.00,0.00,0.00
1.00,1.00,1.00,1.00,1.00,1.00
2.00,2.00,2.00,2.00,2.00,2.00
3.00,3.00,3.00,3.00,3.00,3.00
4.00,4.00,4.00,4.00,4.00,4.00
5.00,5.00,5.00,5.00,5.00,5.00
6.00,6.00,6.00,6.00,6.00,6.00
7.00,7.00,7.00,7.00,7.00,7.00
8.00,8.00,8.00,8.00,8.00,8.00
9.00,18.00,27.00,36.00,45.00,54.00
-----------
Tras esto te pongo otra vez el ejemplo:
------------
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Const divisor = 100
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
strPathtoTextFile = "C:\users\mua\desktop\scripts\promedio_csv"
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists("C:\users\mua\desktop\scripts\promedio_csv\promedio.csv") Then
MsgBox "No lo encuentro"
Else
MsgBox "OK, encontrado, continuamos"
End If
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
strFile = "promedio.csv"
sqlstr = "Select AVG(campo1) as promedio1,AVG(campo2) as promedio2,AVG(campo3) as promedio3,AVG(campo4) as promedio4,AVG(campo5) as promedio5,AVG(campo6) as promedio6 FROM promedio.csv"
objRecordset.Open sqlstr ,objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
msgbox objRecordset.Fields.Item("promedio1")/divisor
msgbox objRecordset.Fields.Item("promedio2")/divisor
msgbox objRecordset.Fields.Item("promedio3")/divisor
msgbox objRecordset.Fields.Item("promedio4")/divisor
msgbox objRecordset.Fields.Item("promedio5")/divisor
msgbox objRecordset.Fields.Item("promedio6")/divisor
objRecordset.MoveNext
Loop
ObjRecordset. Close
-----------------------
Para insertar un nuevo valor puedes usar INSERT:
ObjRecordset. Open "insert into promedio.csv (campo1, campo2, campo3, campo4, campo5, campo6) values ('1.11','2.22','3.33','4.44','5.55','6.66')", objConnection, adOpenStatic, adLockOptimistic, adCmdText
Para cambiar un valor con UPDATE, es SQL.
1º pondría como separador decimal el punto ( herramientas > opciones > internacional ).
La estructura del fichero promedio. Csv seria: la coma separa los campos
----------
Campo1, campo2, campo3, campo4, campo5, campo6
0.00,0.00,0.00,0.00,0.00,0.00
1.00,1.00,1.00,1.00,1.00,1.00
2.00,2.00,2.00,2.00,2.00,2.00
3.00,3.00,3.00,3.00,3.00,3.00
4.00,4.00,4.00,4.00,4.00,4.00
5.00,5.00,5.00,5.00,5.00,5.00
6.00,6.00,6.00,6.00,6.00,6.00
7.00,7.00,7.00,7.00,7.00,7.00
8.00,8.00,8.00,8.00,8.00,8.00
9.00,18.00,27.00,36.00,45.00,54.00
-----------
Tras esto te pongo otra vez el ejemplo:
------------
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Const divisor = 100
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
strPathtoTextFile = "C:\users\mua\desktop\scripts\promedio_csv"
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists("C:\users\mua\desktop\scripts\promedio_csv\promedio.csv") Then
MsgBox "No lo encuentro"
Else
MsgBox "OK, encontrado, continuamos"
End If
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
strFile = "promedio.csv"
sqlstr = "Select AVG(campo1) as promedio1,AVG(campo2) as promedio2,AVG(campo3) as promedio3,AVG(campo4) as promedio4,AVG(campo5) as promedio5,AVG(campo6) as promedio6 FROM promedio.csv"
objRecordset.Open sqlstr ,objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
msgbox objRecordset.Fields.Item("promedio1")/divisor
msgbox objRecordset.Fields.Item("promedio2")/divisor
msgbox objRecordset.Fields.Item("promedio3")/divisor
msgbox objRecordset.Fields.Item("promedio4")/divisor
msgbox objRecordset.Fields.Item("promedio5")/divisor
msgbox objRecordset.Fields.Item("promedio6")/divisor
objRecordset.MoveNext
Loop
ObjRecordset. Close
-----------------------
Para insertar un nuevo valor puedes usar INSERT:
ObjRecordset. Open "insert into promedio.csv (campo1, campo2, campo3, campo4, campo5, campo6) values ('1.11','2.22','3.33','4.44','5.55','6.66')", objConnection, adOpenStatic, adLockOptimistic, adCmdText
Para cambiar un valor con UPDATE, es SQL.
Hola dogduck me sale un error en tiempo de ejecución, sale que no se han especificado valores para algunos de los parámetros requeridos, en la siguiente instrucción:
objRecordset.Open sqlstr, objConnection, adOpenStatic, adLockOptimistic, adCmdText
Saludos
objRecordset.Open sqlstr, objConnection, adOpenStatic, adLockOptimistic, adCmdText
Saludos
Hola dogduck estuve compilando el ultimo ejemplo que me enviaste y me sale el siguiente error en tiempo de ejecución: No se han especificado valores para algunos de los parámetros requeridos en la siguiente instrucción:
objRecordset.Open sqlstr, objConnection, adOpenStatic, adLockOptimistic, adCmdText
Saludos
objRecordset.Open sqlstr, objConnection, adOpenStatic, adLockOptimistic, adCmdText
Saludos
Controla que las constantes estén definidas
Y que la variable sqlstr este bien construida. A mi me funciona.
Así que depura.
-----------------------
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Const divisor = 100
'......
Sqlstr = "Select AVG(campo1) as promedio1, AVG(campo2) as promedio2, AVG(campo3) as promedio3"
sqlstr = sqlstr & ",AVG(campo4) as promedio4,AVG(campo5) as promedio5,AVG(campo6) as promedio6 FROM promedio.csv"
'.......
-----------------------
Y que la variable sqlstr este bien construida. A mi me funciona.
Así que depura.
-----------------------
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Const divisor = 100
'......
Sqlstr = "Select AVG(campo1) as promedio1, AVG(campo2) as promedio2, AVG(campo3) as promedio3"
sqlstr = sqlstr & ",AVG(campo4) as promedio4,AVG(campo5) as promedio5,AVG(campo6) as promedio6 FROM promedio.csv"
'.......
-----------------------
Hola dogduck estuve probando y sigue saliéndome el mismo error, no creo que sea por las variables que están mal definidas porque simplemente he copiado el código que me enviaste... bueno intentare hacerlo de otra forma... Gracias por tu apoyo
Saludos
Saludos
Te pongo mi ejemplo en:
promedio_csv.zip
promedio_csv.zip
Perfecto es justo lo que quería... muchas gracias por tu apoyo... y hasta mi próxima duda... se que lo hago muy seguido... pero tu debes saber que es así como se aprende.
Saludos
Saludos
- Compartir respuesta
- Anónimo
ahora mismo