Para Hector (u otros voluntarios) de una consulta del 2003

08/06/2006 - 17:09 por miluespe | Informe spam
Tengo una hoja con muchas formulas (con ref. absolutas y relativas que
llaman a otra hoja o la misma) que deseo cambiar la orientación
(convertir las filas en columnas y las columnas en filas) para poderla
usar correctamente como una base de datos. La lógica me dice que
utilice la función "Transpose" dentro del menu "Paste Special". El
problema que tengo es que el menu pegado especial sólo se habilita
para la función "copiar" y no con la función "cortar". Si utilizo
al función copiar, todas las referencias relativas de las celdas se me
mueven, cosa que no ocurre con la función cortar. ¿alguien me puede
ayudar a cambiar la orientación de la tabla sin que se muevan las
referencias de las celdas?.

(una vez hice la misma consulta a la cual me contestó Hector. No me
servía ya que el código que me dio hace sí se muevan las celdas y no
donde yo quiero). En concreto necesito que una celda utiliza la celda
c5 para una fórmual, tras hacer el "Tranpose", si la celda c5 se ha
movido, la fórmula se actualice y localice correctamente la nueva
ubicación dela celda C5

El código que me dio Hector fue el siguiente:
=Sub Invertir_Matriz()
Dim Filas As Integer, Columnas As Integer, _
Fila As Integer, Columna As Integer, _
Matriz() As Variant, Siguiente As Integer
Filas = Selection.Rows.Count
Columnas = Selection.Columns.Count
ReDim Matriz(Filas * Columnas - 1)
For Fila = 1 To Filas
For Columna = 1 To Columnas
Matriz(Siguiente) = Selection.Cells(Fila, Columna).Formula
Siguiente = Siguiente + 1
Next Columna
Next Fila
Siguiente = 0
Selection.ClearContents
ActiveCell.Select
For Columna = 0 To Filas - 1
For Fila = 0 To Columnas - 1
ActiveCell.Offset(Fila, Columna) = Matriz(Siguiente)
Siguiente = Siguiente + 1
Next Fila
Next Columna
End Sub

==> O, si prefieres "mandar" el rango invertido a una nueva hoja...
QUITA "desde" la línea de: "Selection.ClearContents" y
SUSTITUYE por:
= With Worksheets.Add
For Columna = 0 To Filas - 1
For Fila = 0 To Columnas - 1
ActiveCell.Offset(Fila, Columna) = Matriz(Siguiente)
Siguiente = Siguiente + 1
Next Fila
Next Columna
End With



En su momento yo pensaba en un código que una vez calculado el área
repitiera la operación Cortar y Pegar para cada una de las celdas
ubicándolas en la nueva posición. El problema es que no se hacer este
código.
 

Leer las respuestas

#1 Héctor Miguel
09/06/2006 - 06:44 | Informe spam
hola, javier [?] !

... hoja con muchas formulas (con ref. absolutas y relativas que llaman a otra hoja o la misma)
que deseo cambiar la orientacion (convertir las filas en columnas y las columnas en filas)
para poderla usar correctamente como una base de datos.
... la funcion "Transpose" dentro del menu "Paste Special"... solo se habilita para... "copiar" y no con... "cortar".
Si utilizo... copiar, todas las referencias relativas... se me mueven, cosa que no ocurre con... cortar [...]
... pensaba en un codigo que una vez calculado el area repitiera la operacion Cortar y Pegar [...]



prueba -> sobre una copia de tu original -> el siguiente codigo [obviamente -> ajusta los rangos segun 'corresponda'] :))
solo considera que NO podras 'invertir' MAS de 256 filas [porque NO cabrian invertidas en solo 256 columnas] :-((
y [al igual que la vez anterior] no 'pierdas de vista' si en las formulas que se van a 'trasladar'...
-> contienen funciones que 'debieran' ser -tmbien- 'invertidas' [p.e.]
- fila() [que debiera ser 'convertida' a columna() y viceversa] ;)
- buscarv() [que debiera ser 'convertida' a buscarh() y viceversa {+}... ajustar las matrices y fila/columna a devolver] ;)
- otras funciones [como desref(), indice(), etc. etc. etc.] ;)

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

en un modulo de codigo 'normal' ==Sub Invertir_Rango()
Application.ScreenUpdating = False
Dim Fila_2_Col As Byte, Col_2_Fila As Byte, Celda As Range, _
Origen As String, Destino As String
Origen = "a1:e16"
Destino = "g1"
With Range(Origen)
For Fila_2_Col = 1 To .Rows.Count
For Col_2_Fila = 1 To .Columns.Count
.Cells(Fila_2_Col, Col_2_Fila).Cut Destination:= _
Range(Destino).Offset(Col_2_Fila - 1, Fila_2_Col - 1)
Next
Next
Range(Destino).Resize(Columns.Count, .Rows.Count).Cut _
Destination:=.Cells(1, 1)
End With
ActiveSheet.UsedRange
End Sub

Preguntas similares