TABLA DINÁMICA

07/04/2006 - 20:36 por fredy | Informe spam
Hola a todos, resulta que tengo unas tablas dinámicas agrupadas por mes y
dia en una hoja de Excel que pueden coger diferentes rangos de otra hoja de
excel que se encuentra en
otro libro.
He programado que se actualice el rango de las pivottable mediante vba
(metodo PivotTableWizard) pero resulta que el campo agrupado 'fecha' me lo
desordena.
He intentado hacerlo de todas las maneras posibles pero no hay manera.
Alguien se ha encontrado con lo mismo problema?, es un fallo del Excel?
Hago servir la siguiente funcion, la 'hojaOrig' es donde estan las tablas
dinamicas
y 'HojaDesti' es una hoja exterior desde donde capturo el rango q alimenta
las T.Dinámicas:

Public Sub Refrescar(hojaOrig As Worksheet, HojaDesti As Worksheet)

Dim i As Integer
Dim pt As PivotTable
Dim r As Range
Dim Fila As Long
Dim colFin As Integer

i = 1
Do While HojaDesti.Cells(1, i) <> ""
i = i + 1
Loop
colFin = i - 1

i = 1
Do While HojaDesti.Cells(i, 1) <> ""
i = i + 1
Loop
Fila = i - 1
DoEvents
If Fila < 2 Then Exit Sub

hojaOrig.PivotTableWizard SourceType:=xlDatabase,
SourceData:=HojaDesti.Range(HojaDesti.Cells(1, 1), HojaDesti.Cells(Fila,
colFin))
For i = 1 To hojaOrig.PivotTables.Count
Set pt = hojaOrig.PivotTables(i)
pt.RefreshTable
Next
End Sub

Cualquier ayuda se lo agradeceré.

Preguntas similare

Leer las respuestas

#6 fredy
11/04/2006 - 09:13 | Informe spam
usu excel 2000.
No se si tendrá que ver que la funcion la tengo en un modulo (.bas). Me he
asegurado de que el procedimiento sea público.
He probado poniendole en vez de 'hojaOrig.Range("a1")' -->
'hojaOrig.Range("a1")' pero también me da error, en este caso
'error en el método range del objeto _worksheet'.

"Héctor Miguel" escribió en el mensaje
news:u%
hola, fredy !

he probado asignarle el SourceDate con la siguiente instruccion:
.PivotTables(Sig).SourceData =
hojaOrig.Range("a1").CurrentRegion.Address(1, 1, xlR1C1, 1)
(solo he remplazado 'Worksheets("hoja2")' por 'hojaOrig') y me da el
error 'La referencia no es valida'.
Por cierto he mirado en la ayuda y pone que la propiedad SourceData es de
solo lectura ??



-> 'dependiendo' due 'que tipo de datos/variable/objeto/...' sea tu
expresion... -> hojaOrig -???-

a) suponiendo que se trata de una variable de tipo 'worksheet' que hara
referencia a otro libro [ABIERTO en la sesion]
y que estableces su referencia por una instruccion del tipo -> Set
hojaOrig = ...
el siguiente codigo 'debiera' funcionar si errores ;)
Sub Modificar_TD_Source()
Dim hojaOrig As Worksheet, Sig As Byte
Set hojaOrig = Workbooks("nombre del otro libro.xls").Worksheets("hoja1")
With Worksheets("hoja1")
For Sig = 1 To .PivotTables.Count
.PivotTables(Sig).SourceData = _
hojaOrig.Range("a1").CurrentRegion.Address(1, 1, xlR1C1, 1)
Next
End With
Set hojaOrig = Nothing
End Sub

b) si el caso es que la expreson -> hojaOrig se refiere al 'CodeName'
de [alg]una hoja -> EN OTRO LIBRO...
no puedes usar de manera 'compartida' las variables de un proyecto de
macros de un libro... EN el proyecto de macros -> de otro libro :-((
a menos que los vincules [a nivel de proyectos] en el editor de vba a
traves del menu: herramientas / referencias :))

c) con referencia a que la propiedad 'sourcedata' sea de solo lectura
[segun la ayuda en linea]...
- cual es la version de excel que estas usando ?
- bajo que 'contexto' has consultado acerca de la propiedad
'sourcedata' ?

comentas [si hubiera] algun detalle adicional ?
saludos,
hector.


Respuesta Responder a este mensaje
#7 Héctor Miguel
11/04/2006 - 22:55 | Informe spam
hola, fredy !

No se si tendra que ver que la funcion la tengo en un modulo (.bas).
Me he asegurado de que el procedimiento sea publico.
He probado poniendole en vez de 'hojaOrig.Range("a1")' --> 'hojaOrig.Range("a1")' pero tambien me da error
en este caso 'error en el metodo range del objeto _worksheet'.



como te comentaba en el mensaje anterior...
-> 'dependiendo' due 'que tipo de datos/variable/objeto/...' sea tu expresion... -> hojaOrig -???-





1) 'que es'... -> hojaOrig ??? [una variable de objeto ?... una variable 'string' ?... ???
2) donde la 'declaras' ?
3) donde y como le estableces su contenido o referencia ?
4) hacia donde 'apunta' dicha referencia ?
5) como 'se la pasas' al procedimiento:
-> Public Sub Refrescar(hojaOrig As Worksheet, HojaDesti As Worksheet)

comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#8 fredy
12/04/2006 - 00:56 | Informe spam
Hola de nuevo,
En el libro (workbook) que contiene las tablas dinamicas tengo un módulo
general (.bas) donde me defino las variables globales
de tipo worksheet que apuntan a las hojas de otro libro desde el cual leo
los datos que me sirven como fuente de datos para el libro
actual (el de las T.D.).
Al abrir el libro actual inicializo esas variables i cuando clico en cada
una de las hojas de este libro le paso a una funcion los
parametros de dos hojas, la origen (variable del modulo) i el activesheet.
Las varianles de la funcion son de tipo worksheet.

te copio algunas partes del código para clarificar:
Private Sub Workbook_Open()
Dim orig As Workbook

Set orig = Workbooks.Open(Application.ActiveWorkbook.Path & "\ASMV
AUTOCONTROL SEMANAL.xls")
doevents
Set Aut = orig.Worksheets("Hoja Autocontrol")-->la var. Aut está
definida en mod. general así: Public Aut As Worksheet
.


Private Sub Worksheet_Activate()
Modif_TD_Source Aut, ActiveSheet

Public Sub Modif_TD_Source(hojaOrig As Worksheet, HojaDesti As
Worksheet)
Dim Sig As Byte

With HojaDesti
For Sig = 1 To .PivotTables.Count
.PivotTables(Sig).SourceData =
hojaOrig.Range("a1").CurrentRegion.Address(1, 1, xlR1C1, 1)
Next
End With
End Sub

Gracias de antemano.




Al abrir el libro que contiene las tablas dinamicas
"Héctor Miguel" escribió en el mensaje
news:OqTv$
hola, fredy !

No se si tendra que ver que la funcion la tengo en un modulo (.bas).
Me he asegurado de que el procedimiento sea publico.
He probado poniendole en vez de 'hojaOrig.Range("a1")' -->
'hojaOrig.Range("a1")' pero tambien me da error
en este caso 'error en el metodo range del objeto _worksheet'.



como te comentaba en el mensaje anterior...
-> 'dependiendo' due 'que tipo de datos/variable/objeto/...' sea tu
expresion... -> hojaOrig -???-





1) 'que es'... -> hojaOrig ??? [una variable de objeto ?... una
variable 'string' ?... ???
2) donde la 'declaras' ?
3) donde y como le estableces su contenido o referencia ?
4) hacia donde 'apunta' dicha referencia ?
5) como 'se la pasas' al procedimiento:
-> Public Sub Refrescar(hojaOrig As Worksheet, HojaDesti As Worksheet)

comentas ?
saludos,
hector.


Respuesta Responder a este mensaje
#9 Héctor Miguel
12/04/2006 - 05:06 | Informe spam
hola, fredy !

en la/s parte/s del codigo QUE NO has 'expuesto' [probablemente] existen otras circunstancias como 'causa del error' -?-
[hasta ahora] la unica forma en que he podido 'provocar' un error... es cuando cierro el libro del cual se actualizan los datos -?-

te paso los procedimientos empleados ;)

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

en el modulo de codigo del libro...
Private Sub Workbook_Open()
Dim orig As Workbook
Set orig = Workbooks("libro2")
Set Aut = orig.Worksheets("hoja1")
End Sub

en el modulo de codigo de la hoja...
Private Sub Worksheet_Activate()
Modif_TD_Source Aut, ActiveSheet
End Su

en un modulo de codigo normal...
Public Aut As Worksheet
Sub Modif_TD_Source(hojaOrig As Worksheet, hojaDesti As Worksheet)
Dim Sig As Byte
With hojaDesti
For Sig = 1 To .PivotTables.Count
.PivotTables(Sig).SourceData = _
hojaOrig.Range("a1").CurrentRegion.Address(1, 1, xlR1C1, 1)
Next
End With
End Sub

___ la consulta 'original' ___
En el libro... que contiene las tablas dinamicas... un modulo general... defino las variables globales de tipo worksheet
... apuntan a las hojas de otro libro desde el cual leo los datos que me sirven como fuente de datos para el libro actual (el de las T.D.).
Al abrir el libro actual inicializo esas variables i cuando clico en cada una de las hojas de este libro
le paso a una funcion los parametros de dos hojas, la origen (variable del modulo) i el activesheet.
Las varianles de la funcion son de tipo worksheet.
te copio algunas partes del codigo para clarificar:
Private Sub Workbook_Open()
Dim orig As Workbook
Set orig = Workbooks.Open(Application.ActiveWorkbook.Path & "\ASMV AUTOCONTROL SEMANAL.xls")
doevents
Set Aut = orig.Worksheets("Hoja Autocontrol")-->la var. Aut esta definida en mod. general así: Public Aut As Worksheet
.

Private Sub Worksheet_Activate()
Modif_TD_Source Aut, ActiveSheet
Public Sub Modif_TD_Source(hojaOrig As Worksheet, HojaDesti As Worksheet)
Dim Sig As Byte
With HojaDesti
For Sig = 1 To .PivotTables.Count
.PivotTables(Sig).SourceData = hojaOrig.Range("a1").CurrentRegion.Address(1, 1, xlR1C1, 1)
Next
End With
End Sub
Respuesta Responder a este mensaje
#10 Luis Garcia
12/04/2006 - 13:44 | Informe spam
Hola:

No he seguido mucho la conversacion pero si lo que quieres es tener una
tabla dinamica que se refiere a datos de otro libro, la mejor solucion que
yo he encontrado es:

Crea en el libro de datos un NOMBRE con todo el rango de datos de la tabla
dinamica.

Crea la tabla dinamica haciendo referencia a ese NOMBRE, no a las celdas de
datos.

Y ya esta!!! Siempre que actualizes los datos, comprueba que el NOMBRE se
refiere a todos los datos. Y cuando actualizes la tabla dinamica, no tendras
que hacer nada, ni macros ni nada, simplemente ACTUALIZAR!!!

Respecto a 'desordenar' las fechas, ni idea, lo unico que se me ocurre es
que REALMENTE sean fechas, a lo mejor están como texto.

Saludos

"fredy" escribió en el mensaje
news:
Hola a todos, resulta que tengo unas tablas dinámicas agrupadas por mes y
dia en una hoja de Excel que pueden coger diferentes rangos de otra hoja


de
excel que se encuentra en
otro libro.
He programado que se actualice el rango de las pivottable mediante vba
(metodo PivotTableWizard) pero resulta que el campo agrupado 'fecha' me lo
desordena.
He intentado hacerlo de todas las maneras posibles pero no hay manera.
Alguien se ha encontrado con lo mismo problema?, es un fallo del Excel?
Hago servir la siguiente funcion, la 'hojaOrig' es donde estan las tablas
dinamicas
y 'HojaDesti' es una hoja exterior desde donde capturo el rango q alimenta
las T.Dinámicas:

Public Sub Refrescar(hojaOrig As Worksheet, HojaDesti As Worksheet)

Dim i As Integer
Dim pt As PivotTable
Dim r As Range
Dim Fila As Long
Dim colFin As Integer

i = 1
Do While HojaDesti.Cells(1, i) <> ""
i = i + 1
Loop
colFin = i - 1

i = 1
Do While HojaDesti.Cells(i, 1) <> ""
i = i + 1
Loop
Fila = i - 1
DoEvents
If Fila < 2 Then Exit Sub

hojaOrig.PivotTableWizard SourceType:=xlDatabase,
SourceData:=HojaDesti.Range(HojaDesti.Cells(1, 1), HojaDesti.Cells(Fila,
colFin))
For i = 1 To hojaOrig.PivotTables.Count
Set pt = hojaOrig.PivotTables(i)
pt.RefreshTable
Next
End Sub

Cualquier ayuda se lo agradeceré.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida