Organizar datos en columnas

cgcamal

Active Member
Joined
May 2, 2007
Messages
472
Hola a todos,

Tengo datos extraidos en formato de texto de muchos eventos ordenados(Evento 1, 2 ...) hacia abajo en bloques, con varios datos de clientes dentro del cuerpo de cada bloque pero con campos de información iguales en todos los bloques. Esta información al pasarla a Excel me queda más o menos de la forma siguiente:

Evento 1
Datos Cliente
Nombre Juan...
Telefono oficina 1234…

Telefono casa 4321…

Identidad XYZ…

Evento 2
Datos Cliente
Nombre María
Telefono oficina 4566..

Telefono casa 7689..

Identidad TYP…

Arriba muestro sólo dos eventos con la estructura que tengo, pero que deseo ordenar en columnas y filas como sigue:

Evento #, Nombre, Telefono oficina, Telefono casa, Identidad
1 Juan 1234… 4321… XYZ…
2 María 4566.. 7689.. TYP…
. . . . .
. . . . .
. . . . .

Quien me odría ayudar con ideas? se puede hacer con la función BUSCAR o sólo con alguna macro, algún tip por favor para comenzar.

Saludos y gracias de antemano. :-)
 
será más que elegante, más eficiente y veloz en la ejecución.

Pues, por lo <s>menso</s> menos eso es la idea. :wink:

Y pensé en otra sugerencia anoche. Actualmente casi cambio mi mensaje porque puede ser que el siguiente sería mejor como primer paso:
Haz un bucle que va pintando los cuadros que van a representar cada registro/evento (each event record) para asegurarse que tenga un bucle capáz de agarrar cada registro como un rango (que después vamos a pasar a nuestra función). En problemas del tipo suyo, ésto siempre es uno de mis primeros pasos -- usando
Code:
rngTalYTal.interior.colorindex = bytAlgunColor
para verificar que mi bucle está haciendo el SET rngTalYTal = .... correctamente.
 
Last edited:
Upvote 0

Excel Facts

How to find 2nd largest value in a column?
MAX finds the largest value. =LARGE(A:A,2) will find the second largest. =SMALL(A:A,3) will find the third smallest
Greg, qué tal?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Disculpas por el olvido, la estoy trabajando actualmente con Excel 2007 +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Un pequeño chistesito para continuar.

Al inicio me pareció raro que me estuvieras hablando pesado, me sentí ofendido porque pensé que me decías "menso" por lo que escribiste al inicio de tu última respuesta, o sea:

**Pues, por lo "menso" eso es la idea. :-)***

aunque en esto de Excel estoy peligrosamente cerca de serlo jaja.

Pero luego me di cuenta que fue error de dedo nomás y quisiste decir

**Pues, por lo "menos" esa es la idea. ;-)**

Bueno pasando a algo más serio. seguiré tratando de insertar las sugerencias que me diste y la más reciente también, son nuevas para mi. Lo de LBOUND y UBOUND no lo he usado nunca, casi sólo con los loopcitos de For-Next trabajo, pero con tus ideas voy mejorando. Muchas gracias. Pegaré el código que logre escribir para que mirés que como vos te preocupás por compartir conocimientos, yo también trato de tomarlos y practicarlos y no dejarlos caer en pozo ondo.

Saludos de nuevo!! :-D
 
Last edited by a moderator:
Upvote 0
**Pues, por lo "menso" eso es la idea. :-)***

¡Uy! ¡Dios mío! ¡Ni cuenta me di que «menso» era una palabra!

No sé si :rofl: no sé si :cry: pero sí sé que estoy bastante :oops:

Bueno, por lo menos ya aprendí una palabra nueva. Para su referencia futura - cuando hablamos de mi y castellano, siempre tome en cuenta Hanlon´s razor que dice "Never attribute to malice that which can adequately be explained by stupidity" (or in my case error).

Y que buena suerte para mi que por ser moderador tengo la habilidad de corregirlo.
 
Last edited:
Upvote 0
No hay problema, yo sé que tu lengua nativa es inglés. Cualquiera de habla hispana pudo hacer lo mismo, yo sé que no es malicia, ni desconocimiento, sólo escribiste la "s" antes de la "o" y resultó otra palabra que en español resulta chistosa :-D, es como silly o dumb, pero suave y más bien provoca risa, preguntá a tu esposa que según leí es de un país vecino mío, ella sabrá explicarte.

Me decís que no sabés si reir o llorar, jaja. Lo de que me sentí ofendido era broma nada más, el caso es para sonreir y mucho. sorry :-D ,-D ;-D
 
Upvote 0
Bueno Greg, pasito a pasito y voy por estas sugerencias que me diste, pero no estoy claro
en ninguna, no use antes estas funciones y más o menos entiendo tu idea pero no sé como
aplicarla. Please una pequeña ayuda.

Sugerencia 1) :-(
"• mueve su listado al inicio y cambie la a un constante tipo hilera (string) delimitado por comas y cargue su matriz usando SPLIT(). "

Más o menos así? o estoy perdido?
******************************************************
Campos = "MobileTerminatedCall" & "Imsi:" & "Msisdn:" & "CallingNumber: _
" & "LocalTimeStamp:" & "TotalCallEventDuration:" & "RecEntityCode:"

Function matriz(Campos1)

matriz = Split(Campos1) + instrucciones....(aqui no sé como sería la función exactamenente)

End Function
******************************************************

Sugerencia 2):-(
"• Escribe su propia función que recibe un rango, una hilera (que será el elemento de su matriz) y devuelve otra hilera. La función hace la búsqueda dentro del rango y devuelve el valor deseado (no olvide de la función REPLACE(). "

******************************************************
Function matriz(Campos1)

matriz = Split(Campos1) + instrucciones....(aqui no sé como sería la función exactamenente)

¿El Replace cómo se usaría?

End Function
******************************************************


Sugerencia 3) :-(
"• Cambie su bucle interno para que use LBOUND() y UBOUND() "

******************************************************

For j = LBound(matriz) To UBound(matriz)


Cells.Find(What:=matriz(Campos), After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate

Cells(i, j + 9) = ActiveCell.Value

Next j

******************************************************


Saludos :-)
 
Upvote 0
OK - Primer paso. Hacer un bucle para asegurar que podemos agarrar cada rango para cada evento:
Code:
'// key assumptions
'//     1. used range is our target
'//     2. source data is active sheet
'//     3. output on next worksheet
 
Dim m_wsSource As Excel.Worksheet, _
    m_wsTarget As Excel.Worksheet
 
Const mc_intEventRows As Integer = 11
Const mc_intEventCols As Integer = 5
 
Sub Main()
 
Dim i%  '// un variable temporario para uso durante desarollo
    Dim rngAllData As Excel.Range, rngEvento As Excel.Range, _
        rngTopLeftCorner As Excel.Range
    Set m_wsSource = ActiveSheet
    Set m_wsTarget = m_wsSource.Parent.Sheets(m_wsSource.Index + 1)
    Set rngAllData = m_wsSource.UsedRange
    Set rngTopLeftCorner = rngAllData.Range("A1")
 
    '// bucle para ir evento por evento
 
i = 4
 
    Do Until IsEmpty(rngTopLeftCorner)
        Set rngEvento = rngTopLeftCorner.Resize(mc_intEventRows, mc_intEventCols)
        rngEvento.Interior.ColorIndex = i
i = i + 1
        Set rngTopLeftCorner = rngTopLeftCorner.Offset(mc_intEventRows)
    Loop
 
End Sub '// Main()

Obviamente la hoja de prueba tendría unos pocos registros. Este código fallaría si habrá más de 52 registros.
 
Last edited:
Upvote 0
Ahora, pasos número dos y tres: Eso del cargar la matriz usando un constante y SPLIT y hacer un bucle.
Code:
'// key assumptions
'//     1. used range is our target
'//     2. source data is active sheet
'//     3. output on next worksheet
 
 
Const mc_intEventRows As Integer = 11
Const mc_intEventCols As Integer = 5
 
Dim m_wsSource As Excel.Worksheet, _
    m_wsTarget As Excel.Worksheet
 
Sub Main()
 
    Const c_strCampos = "nombre,apellido,identidad,teléfono,residencial"
 
Dim i%  '// un variable temporario para uso durante desarollo
 
    Dim rngAllData As Excel.Range, rngEvento As Excel.Range, _
        rngTopLeftCorner As Excel.Range, rngCampo As Excel.Range
 
    Dim varCampos As Variant    '// la matriz
    Dim intCampo As Integer, strCampo As String
 
    Set m_wsSource = ActiveSheet
    Set m_wsTarget = m_wsSource.Parent.Sheets(m_wsSource.Index + 1)
 
    Set rngAllData = m_wsSource.UsedRange
    Set rngTopLeftCorner = rngAllData.Range("A1")
 
    varCampos = Split(c_strCampos, ",")
 
 
    '// bucle para ir evento por evento
 
    Do Until IsEmpty(rngTopLeftCorner)
        Set rngEvento = rngTopLeftCorner.Resize(mc_intEventRows, mc_intEventCols)
 
i = 4
 
        '// el bucle para cada campo
        '// también un FOR EACH hubiera servido
        For intCampo = LBound(varCampos) To UBound(varCampos)
            strCampo = varCampos(intCampo)
            On Error Resume Next
            Set rngCampo = Nothing
            Set rngCampo = rngEvento.Find(strCampo)
            If Not rngCampo Is Nothing Then
                rngCampo.Interior.ColorIndex = i
            End If
i = i + 1
        Next intCampo
        Set rngTopLeftCorner = rngTopLeftCorner.Offset(mc_intEventRows)
    Loop
 
End Sub '// Main()

Ahora falta eso un la función.
 
Upvote 0
Tercer paso asi: implementar una función para sacar el valor de celdas.
Code:
'// key assumptions
'//     1. used range is our target
'//     2. source data is active sheet
'//     3. output on next worksheet
 
'// Module-level variables
 
'// __constants_____
Const mc_intEventRows As Integer = 11
Const mc_intEventCols As Integer = 5
 
'// __variables_____
Dim m_wsSource As Excel.Worksheet, _
    m_wsTarget As Excel.Worksheet
 
Sub Main()
 
    Const c_strCampos = "nombre,apellido,identidad,teléfono,residencial"
 
    Dim rngAllData As Excel.Range, rngEvento As Excel.Range, _
        rngTopLeftCorner As Excel.Range
    Dim varCampos As Variant    '// la matriz
    Dim intCampo As Integer, strValor As String
    Set m_wsSource = ActiveSheet
    Set m_wsTarget = m_wsSource.Parent.Sheets(m_wsSource.Index + 1)
    Set rngAllData = m_wsSource.UsedRange
    Set rngTopLeftCorner = rngAllData.Range("A1")
    varCampos = Split(c_strCampos, ",")
 
    '// bucle para ir evento por evento
    Do Until IsEmpty(rngTopLeftCorner)
        Set rngEvento = rngTopLeftCorner.Resize(mc_intEventRows, mc_intEventCols)
 
        '// el bucle para cada campo
        '// también un FOR EACH hubiera servido
        For intCampo = LBound(varCampos) To UBound(varCampos)
            strValor = BuscarValor(rngEvento, varCampos(intCampo))
Debug.Print strValor
        Next intCampo
        Set rngTopLeftCorner = rngTopLeftCorner.Offset(mc_intEventRows)
    Loop
 
End Sub '// Main
 
Private Function BuscarValor(rngToSearch As Excel.Range, _
                             ByVal strToFind As String) As String
'// busca un valor dentro de un rango y devuelve el contenido
'// de la celda encontrado menos el valor buscado
 
    Const c_strFieldMarker As String = ": "
    Dim strValor As String, rngCampo As Excel.Range
 
    On Error Resume Next
    Set rngCampo = Nothing
    Set rngCampo = rngToSearch.Find(strToFind)
    If Not rngCampo Is Nothing Then
        strValor = rngCampo.Text
        strValor = Replace(Expression:=strValor, _
                           Find:=strToFind, _
                           Replace:=vbNullString, _
                           Compare:=vbTextCompare)
        strValor = Replace(Expression:=strValor, _
                           Find:=c_strFieldMarker, _
                           Replace:=vbNullString, _
                           Compare:=vbTextCompare)
    Else
        strValor = "No encontrado"
    End If
 
    BuscarValor = strValor
End Function '// BuscarValor
Ahora, voy a dejar que usted hace sus intentos para transferir los datos a wsTarget.
 
Last edited:
Upvote 0

Forum statistics

Threads
1,223,970
Messages
6,175,707
Members
452,667
Latest member
vanessavalentino83

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top