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

#1 Héctor Miguel
09/04/2006 - 01:19 | Informe spam
hola, fredy !

... tablas dinamicas agrupadas por mes y dia... que pueden coger diferentes rangos de otra hoja... 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.Dinamicas:



1) supongo que al ['regresar' y] usar al asistente de tablas dinamicas para 'actualizar' el rango 'de origen'...
[aunque tu le nombras a la hoja 'hojaDesti']...
-> ES [como] 'empezar desde ceros' con la 'creacion' [mas que 'actualizacion'] de una tabla dinamica
[aunque estas 'aprovechando' una tabla ya creada] -?-

2) del codigo que expones [creo que] podrias ahorrarte los dos bucles 'do while...next' para 'detectar' el rango actual del origen...
si lo unico que necesita es obtener cuales son las filas y columnas NO-vacias partiendo de la celda 'A1' de 'hojaDesti'...
prueba a detectar [y usar] la 'region actual' a partir de dicha celda ['A1'] :)) [p.e.]
elimina [o no uses de momento] los do while...next y cambia la instruccion del asistente a algo +/- como lo siguiente...
-> hojaOrig.PivotTableWizard SourceType:=xlDatabase, SourceData:=HojaDesti.Range("a1").CurrentRegion

3) si lo que necesitas es actualizar un rango de origen que resulta ser un rango 'variable'...
prueba a definir/usar/vincular/... nombres dinamicos que hagan referencia a rangos variables [p.e.]
puedes consultar un ejemplo en la pagina de Debra Dalgleish en:
-> http://www.contextures.com/xlPivot01.html#Dynamic

supongo que habra algunos detalles que pudieran haberse quedado 'en el tintero' -?- asi que...
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ codigo 'original' en la exposicion __
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
Respuesta Responder a este mensaje
#2 fredy
09/04/2006 - 11:30 | Informe spam
Gracias Héctor por la ayuda , como bien dices en tu mensaje:
1) supongo que al ['regresar' y] usar al asistente de tablas dinamicas para
'actualizar' el rango 'de origen'...
[aunque tu le nombras a la hoja 'hojaDesti']...
-> ES [como] 'empezar desde ceros' con la 'creacion' [mas que
'actualizacion'] de una tabla dinamica
[aunque estas 'aprovechando' una tabla ya creada] -?-

como podria hacer para modificar la tabla creada y no volverla a crear
(PivotTableWizard )?
He buscado algun metodo o propiedad q permita solamente modificar el rango
de un pivottable pero no he lograda encontrarlo.





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

... tablas dinamicas agrupadas por mes y dia... que pueden coger
diferentes rangos de otra hoja... 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.Dinamicas:



1) supongo que al ['regresar' y] usar al asistente de tablas dinamicas
para 'actualizar' el rango 'de origen'...
[aunque tu le nombras a la hoja 'hojaDesti']...
-> ES [como] 'empezar desde ceros' con la 'creacion' [mas que
'actualizacion'] de una tabla dinamica
[aunque estas 'aprovechando' una tabla ya creada] -?-

2) del codigo que expones [creo que] podrias ahorrarte los dos bucles 'do
while...next' para 'detectar' el rango actual del origen...
si lo unico que necesita es obtener cuales son las filas y columnas
NO-vacias partiendo de la celda 'A1' de 'hojaDesti'...
prueba a detectar [y usar] la 'region actual' a partir de dicha celda
['A1'] :)) [p.e.]
elimina [o no uses de momento] los do while...next y cambia la
instruccion del asistente a algo +/- como lo siguiente...
-> hojaOrig.PivotTableWizard SourceType:=xlDatabase,
SourceData:=HojaDesti.Range("a1").CurrentRegion

3) si lo que necesitas es actualizar un rango de origen que resulta ser un
rango 'variable'...
prueba a definir/usar/vincular/... nombres dinamicos que hagan
referencia a rangos variables [p.e.]
puedes consultar un ejemplo en la pagina de Debra Dalgleish en:
-> http://www.contextures.com/xlPivot01.html#Dynamic

supongo que habra algunos detalles que pudieran haberse quedado 'en el
tintero' -?- asi que...
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ codigo 'original' en la exposicion __
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




Respuesta Responder a este mensaje
#3 Héctor Miguel
10/04/2006 - 07:56 | Informe spam
hola, fredy !

como podria hacer para modificar la tabla creada y no volverla a crear (PivotTableWizard )?



si quieres presentar el asistente de TD's y modificar 'inter-actuando' [???]
-> el metodo 'PivotTableWizard'... -> CREA una TD [nueva] -> NO 'presenta' el asistente :((
[en este caso] se necesita 'activar' el rango [de la TD 'en concreto'] y 'mostrar' el [dialogo del] asistente de TD's
el siguiente ejemplo 'supone' que tienes activa una seleccion [de varias celdas] y quieres -despues- 'regresar' ahi...
Sub Modificar_TD_Wizard()
Dim Volver_A As String, Activa As String
Volver_A = Selection.Address
Activa = ActiveCell.Address
ActiveSheet.PivotTables(1).TableRange1.Activate
Application.Dialogs(xlDialogPivotTableWizard).Show
Range(Volver_A).Activate
Range(Activa).Activate
End Sub

si quieres modificar el rango de origen de todas las TD de la hoja1 hacia la hoja2
el siguiente ejemplo modifica los rangos de origen de todas las TD de la hoja1
Sub Modificar_TD_Source()
Dim Sig As Byte
With Worksheets("hoja1")
For Sig = 1 To .PivotTables.Count
.PivotTables(Sig).SourceData = _
Worksheets("hoja2").Range("a1").CurrentRegion.Address(1, 1, xlR1C1, 1)
Next
End With
End Sub

o puedes cambiar la instruccion de currentregion al usedrange [p.e.]
Worksheets("hoja2").UsedRange.Address(1, 1, xlR1C1, 1)

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#4 fredy
11/04/2006 - 00:59 | Informe spam
he probado asignarle el SourceDate con la siguiente instrucción:
.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 válida'.

Por cierto he mirado en la ayuda y pone que la propiedad SourceData es de
solo lectura ¿¿??




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

como podria hacer para modificar la tabla creada y no volverla a crear
(PivotTableWizard )?



si quieres presentar el asistente de TD's y modificar 'inter-actuando'
[???]
-> el metodo 'PivotTableWizard'... -> CREA una TD [nueva] -> NO
'presenta' el asistente :((
[en este caso] se necesita 'activar' el rango [de la TD 'en concreto'] y
'mostrar' el [dialogo del] asistente de TD's
el siguiente ejemplo 'supone' que tienes activa una seleccion [de varias
celdas] y quieres -despues- 'regresar' ahi...
Sub Modificar_TD_Wizard()
Dim Volver_A As String, Activa As String
Volver_A = Selection.Address
Activa = ActiveCell.Address
ActiveSheet.PivotTables(1).TableRange1.Activate
Application.Dialogs(xlDialogPivotTableWizard).Show
Range(Volver_A).Activate
Range(Activa).Activate
End Sub

si quieres modificar el rango de origen de todas las TD de la hoja1 hacia
la hoja2
el siguiente ejemplo modifica los rangos de origen de todas las TD de la
hoja1
Sub Modificar_TD_Source()
Dim Sig As Byte
With Worksheets("hoja1")
For Sig = 1 To .PivotTables.Count
.PivotTables(Sig).SourceData = _
Worksheets("hoja2").Range("a1").CurrentRegion.Address(1, 1, xlR1C1,
1)
Next
End With
End Sub

o puedes cambiar la instruccion de currentregion al usedrange [p.e.]
Worksheets("hoja2").UsedRange.Address(1, 1, xlR1C1, 1)

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


Respuesta Responder a este mensaje
#5 Héctor Miguel
11/04/2006 - 03:47 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida