Sobre concatenar mediante visual en excel

08/12/2008 - 04:21 por Anonimo | Informe spam
Un saludo y gracias de antemano.

Tengo un rango, digamos "a1:p100"

En cada fila de ese rango tengo varias columnas con datos pero de forma
irregular, me explico, igual en la primera fila tengo con datos 4 columnas,
en la fila 2, tengo 8 datos en las columnas

Estoy intentando crear un bucle que recorra todo el rango y me reconozca el
numero de columnas a la izquierda de un determinado valor, en este caso el
"-", y lo mismo para las columnas que este a la izquierda y que no esten
vacias

Ejemplo:

A.D. Cuevas del Castillo 2 - 0 AA.VV. La Marisma
C.D. Saltor Los Ríos 0 - 17 Real Rácing Club B
E.M.F. Santander B 2 - 3 P.A. Gimnástica A
E.M.F. Reocín A 8 - 0 C.D. Tropezón


Yo hago los siguiente: distribuyo el texto en columnas

Despues averiguo en que columna esta el texto "-"
Seguido coloco los equipos mediante el siguiente codigo:

Sub JOSEANGEL()

ultfila = Columns("A:A").Range("A65536").End(xlUp).Row

x = 1
l = 1


For Each rango In Range("a1:p" & ultfila)


DATO = InStr(1, "-", rango, vbBinaryCompare)


If rango <> "" Then

If DATO >= 1 Then

columna = rango.Column
FILA = rango.Row
datos = rango.Address




For I = 1 To columna - 2

Cells(x, 15 + I) = Range(datos).Offset(0, -((columna - I)))





Next I


x = x + 1




For j = 1 To 8


Cells(l, 25 + j) = Range(datos).Offset(0, j + 1)


Next j

l = l + 1

datos = rango.Address

dat = Range(datos).Offset(0, 1)
dat1 = Range(datos).Offset(0, -1)

For nov = 1 To columna - 2

Dim mat(43, 15)

mat(FILA, nov) = Range(datos).Offset(0, -(columna -
nov))


Next nov

For mes = 1 To 8

mat(FILA, mes) = Range(datos).Offset(0, mes + 1)

Next mes

Else: End If

Else: End If

Next rango

End Sub


Como ya me he perdido, lo que me gustaria es que con esos datos distribuidos
en columnas, buscar el caracter "-" que ya se como se hace. Despues me
gustaria que un bucle me recorriese todo los datos y me separese mediante
concatenación los dos equipos.

digamos que asi:

Z1 AA1
AB1
A.D. Cuevas del Castillo AA.VV. La Marisma 2-3
C.D. Saltor Los Ríos Real Rácing Club B 1-2
E.M.F. Santander B P.A. Gimnástica A
E.M.F. Reocín A C.D. Tropezón
Velarde Camargo C.F. S.D. Buelna
Atco. Perines B Peña Revilla


Utilizo excel 2007

Preguntas similare

Leer las respuestas

#6 Anonimo
09/12/2008 - 10:28 | Informe spam
Va perfecto Hector, como siempre solo queda quitarse el sombrero y darte las
gracias

Ahora intentare modificarlo un poco para que no solo lo haga por jornadas,
pero bueno, poco a poco.

Lo único era pedirte un FAVOR enorme. Si pudieras explicarme linea por linea
para que yo comprenda que hace en cada momento el código para mi sería
perfecto, porque comprendiendo lo que hace, puedo aplicarlo para otras
aplicaciones.

Gracias



"Héctor Miguel" escribió en el mensaje de
noticias news:
hola (de nuevo), ???

suponiendo que los datos obtenidos son en una sola columna (+/-
exactamente como en tu exposicion anterior)...
Mira, los datos quedan como estos en la a1 y siguientes:
Jornada 2 el 28/09/2008
Fecha Encuentro Campo
D,28 12:30 AA.VV. La Marisma 6 - 4 S.D. Amistad B Municipal Frajanas
D,28 12:00 Real Rácing Club B 5 - 3 A.D. Cuevas del Castillo Inst. Racing
(4)
D,28 10:00 P.A. Gimnástica A 3 - 1 C.D. Saltor Los Ríos El Malecón (2)
D,28 11:30 C.D. Tropezón 2 - 5 E.M.F. Santander B Tanos (2)
S,27 16:30 S.D. Buelna 1 - 0 E.M.F. Reocín A Los Corrales
D,28 11:00 Peña Revilla 3 - 2 Velarde Camargo C.F. Regimiento
D,28 09:30 C.D. Cervantes 1 - 4 Atco. Perines B Regimiento
S,27 12:30 S.D. Nueva Montaña A 0 - 4 Club Bansander B Nueva Montaña
S,27 11:30 C.D. Liébana 1 - 2 E.M.F. Meruelo Tama



- selecciona alguna celda NO en las dos primeras filas, sino a partir del
primer encuentro (o cualquiera de los siguientes)
y ejecuta una macro +/- como la siguiente (se ve "medio aparatosa", pero
creo que sera rapida y mas efectiva que la que usas)...

Sub Arregla_datos(): Application.ScreenUpdating = False
Dim Jornada As String: Jornada = ActiveCell.CurrentRegion.Cells(1, 1)
ActiveCell.CurrentRegion.Range("a1:a2").ClearContents
ActiveCell.CurrentRegion.TextToColumns _
ActiveCell.CurrentRegion.Cells(1), xlDelimited, , , , , , , 1, "-"
With ActiveCell.CurrentRegion
.Columns(1).Value = Evaluate("transpose(transpose(trim(" &
.Columns(1).Address & ")))")
.Columns(2).Value = Evaluate("transpose(transpose(trim(" &
.Columns(2).Address & ")))")
.Cells.Insert xlToRight
.Offset(, -2).Resize(, 1).Value =
Evaluate("transpose(transpose(trim(left(" & .Columns(1).Address &
",4))))")
.Offset(, -1).Resize(, 1).Value =
Evaluate("transpose(transpose(trim(mid(" & .Columns(1).Address &
",5,6))))")
.Offset(, 2).Resize(, 1).Value =
Evaluate("""'""&transpose(transpose(trim(right(" & _
.Columns(1).Address & ",2))&"" - ""&trim(left(" & .Columns(2).Address
& ",2))))")
.Columns(1).Value = _
Evaluate("transpose(transpose(trim(mid(" & .Columns(1).Address &
",12,len(" & .Columns(1).Address & ")-12))))")
.Columns(2).Value = Evaluate("transpose(transpose(trim(mid(" &
.Columns(2).Address & ",3,100))))")
End With
With ActiveCell.CurrentRegion
.Offset(-1).Resize(1, 5) = Array("Fecha", "Hora", "Equipo Local",
"Equipo Visitante", "GL-GV")
.EntireColumn.AutoFit
.Offset(-2).Resize(1, 1) = Jornada
End With
End Sub

saludos,
hector.

Respuesta Responder a este mensaje
#7 Héctor Miguel
10/12/2008 - 02:10 | Informe spam
hola, !

... intentare modificarlo un poco para que no solo lo haga por jornadas, pero bueno, poco a poco.
Si pudieras explicarme linea por linea para que yo comprenda que hace...
porque comprendiendo lo que hace, puedo aplicarlo para otras aplicaciones...



a ver como sale esta (dizque) explicacion de cada una de las lineas...
si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

en este caso es de suma utilidad emplear el metodo Evaluate("texto") en vba para agilizar el tratamiento de matrices
la combinacion del doble "transpose(transpose(" es necesaria para evitar el uso de bucles For...Next (por leeennnntos)
el (re)llamado al "CurrentRegion" tiene efectos diferentes al hacer modificaciones previas en el anterior "CurrentRegion"
el resto de las funciones utilizadas (creo) seran mas que obvias en cuanto a lo que se persigue al usarlas en vba -?-

Sub Arregla_datos(): Application.ScreenUpdating = False ' suprimimos la actualizacion de la pantalla '
' declaramos la variable "Jorada" y le asignamos el valor de la primer celda del "CurrentRegion" '
Dim Jornada As String: Jornada = ActiveCell.CurrentRegion.Cells(1, 1)
' borramos las dos primeras celdas del "CurrentRegion" actual '
ActiveCell.CurrentRegion.Range("a1:a2").ClearContents
' el siguiente "CurrentRegion" YA NO incluye las celdas borradas y la convertimos en "Texto en columnas" por "-" '
ActiveCell.CurrentRegion.TextToColumns _
ActiveCell.CurrentRegion.Cells(1), xlDelimited, , , , , , , 1, "-"
' este nuevo "CurrentRegion" ya es de dos columnas, por lo tanto ... '
With ActiveCell.CurrentRegion
' primero eliminamos cualquier espacio "de sobra, doble, etc." en ambas columnas '
.Columns(1).Value = Evaluate("transpose(transpose(trim(" & .Columns(1).Address & ")))")
.Columns(2).Value = Evaluate("transpose(transpose(trim(" & .Columns(2).Address & ")))")
' luego insertamos dos columnas a la izquierda (las mismas del actual "CurrentRegion")
.Cells.Insert xlToRight
' en la primer columna insertada, ponemos el identificador de la fecha (4 caracteres a la izquierda de A convertida en C) '
.Offset(, -2).Resize(, 1).Value = Evaluate("transpose(transpose(trim(left(" & .Columns(1).Address & ",4))))")
' en la segunda columna insertada, ponemos le hora del encuentro (6 caracteres a partir del 5to a la izquierda de A <-> C) '
.Offset(, -1).Resize(, 1).Value = Evaluate("transpose(transpose(trim(mid(" & .Columns(1).Address & ",5,6))))")
' ponemos en la siguiente columna (ahora E) los goles tomados del final de la coumna1 y el inicio de la columna2 '
.Offset(, 2).Resize(, 1).Value = Evaluate("""'""&transpose(transpose(trim(right(" & _
.Columns(1).Address & ",2))&"" - ""&trim(left(" & .Columns(2).Address & ",2))))")
' despues eliminamos dichos caracteres (y los goles) de la columna "base" (la que era A y paso a ser C) '
.Columns(1).Value = _
Evaluate("transpose(transpose(trim(mid(" & .Columns(1).Address & ",12,len(" & .Columns(1).Address & ")-12))))")
' despues eliminamos los goles de la columna "base" (la que era B y paso a ser D) '
.Columns(2).Value = Evaluate("transpose(transpose(trim(mid(" & .Columns(2).Address & ",3,100))))")
End With
' el nuevo "CurrentRegion" es ya de 5 columnas (las dos originales -desplazadas-, dos nuevas insertadas y la columna con los goles '
With ActiveCell.CurrentRegion
' ponemos los titulos una fila antes de la conversion de texto en columnas '
.Offset(-1).Resize(1, 5) = Array("Fecha", "Hora", "Equipo Local", "Equipo Visitante", "GL-GV")
' ajustamos el ancho de las columnas (SIN considerar la reposicion del titulo de la "Jornada") '
.EntireColumn.AutoFit
' reponemos el titulo de la "Jornada" '
.Offset(-2).Resize(1, 1) = Jornada
End With
End Sub
Respuesta Responder a este mensaje
#8 Anonimo
10/12/2008 - 11:08 | Informe spam
Un saludo de nuevo Hector y compañia

Gracias por supuesto, y una última duda. (" & .Columns(2).Address & Esta
frase no la entiendo dentro de una fórmula.





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

... intentare modificarlo un poco para que no solo lo haga por jornadas,
pero bueno, poco a poco.
Si pudieras explicarme linea por linea para que yo comprenda que hace...
porque comprendiendo lo que hace, puedo aplicarlo para otras
aplicaciones...



a ver como sale esta (dizque) explicacion de cada una de las lineas...
si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

en este caso es de suma utilidad emplear el metodo Evaluate("texto") en
vba para agilizar el tratamiento de matrices
la combinacion del doble "transpose(transpose(" es necesaria para evitar
el uso de bucles For...Next (por leeennnntos)
el (re)llamado al "CurrentRegion" tiene efectos diferentes al hacer
modificaciones previas en el anterior "CurrentRegion"
el resto de las funciones utilizadas (creo) seran mas que obvias en cuanto
a lo que se persigue al usarlas en vba -?-

Sub Arregla_datos(): Application.ScreenUpdating = False ' suprimimos la
actualizacion de la pantalla '
' declaramos la variable "Jorada" y le asignamos el valor de la primer
celda del "CurrentRegion" '
Dim Jornada As String: Jornada = ActiveCell.CurrentRegion.Cells(1, 1)
' borramos las dos primeras celdas del "CurrentRegion" actual '
ActiveCell.CurrentRegion.Range("a1:a2").ClearContents
' el siguiente "CurrentRegion" YA NO incluye las celdas borradas y la
convertimos en "Texto en columnas" por "-" '
ActiveCell.CurrentRegion.TextToColumns _
ActiveCell.CurrentRegion.Cells(1), xlDelimited, , , , , , , 1, "-"
' este nuevo "CurrentRegion" ya es de dos columnas, por lo tanto ... '
With ActiveCell.CurrentRegion
' primero eliminamos cualquier espacio "de sobra, doble, etc." en ambas
columnas '
.Columns(1).Value = Evaluate("transpose(transpose(trim(" &
.Columns(1).Address & ")))")
.Columns(2).Value = Evaluate("transpose(transpose(trim(" &
.Columns(2).Address & ")))")
' luego insertamos dos columnas a la izquierda (las mismas del actual
"CurrentRegion")
.Cells.Insert xlToRight
' en la primer columna insertada, ponemos el identificador de la fecha
(4 caracteres a la izquierda de A convertida en C) '
.Offset(, -2).Resize(, 1).Value =
Evaluate("transpose(transpose(trim(left(" & .Columns(1).Address &
",4))))")
' en la segunda columna insertada, ponemos le hora del encuentro (6
caracteres a partir del 5to a la izquierda de A <-> C) '
.Offset(, -1).Resize(, 1).Value =
Evaluate("transpose(transpose(trim(mid(" & .Columns(1).Address &
",5,6))))")
' ponemos en la siguiente columna (ahora E) los goles tomados del final
de la coumna1 y el inicio de la columna2 '
.Offset(, 2).Resize(, 1).Value =
Evaluate("""'""&transpose(transpose(trim(right(" & _
.Columns(1).Address & ",2))&"" - ""&trim(left(" & .Columns(2).Address
& ",2))))")
' despues eliminamos dichos caracteres (y los goles) de la columna
"base" (la que era A y paso a ser C) '
.Columns(1).Value = _
Evaluate("transpose(transpose(trim(mid(" & .Columns(1).Address &
",12,len(" & .Columns(1).Address & ")-12))))")
' despues eliminamos los goles de la columna "base" (la que era B y
paso a ser D) '
.Columns(2).Value = Evaluate("transpose(transpose(trim(mid(" &
.Columns(2).Address & ",3,100))))")
End With
' el nuevo "CurrentRegion" es ya de 5 columnas (las dos
originales -desplazadas-, dos nuevas insertadas y la columna con los goles
'
With ActiveCell.CurrentRegion
' ponemos los titulos una fila antes de la conversion de texto en
columnas '
.Offset(-1).Resize(1, 5) = Array("Fecha", "Hora", "Equipo Local",
"Equipo Visitante", "GL-GV")
' ajustamos el ancho de las columnas (SIN considerar la reposicion del
titulo de la "Jornada") '
.EntireColumn.AutoFit
' reponemos el titulo de la "Jornada" '
.Offset(-2).Resize(1, 1) = Jornada
End With
End Sub

Respuesta Responder a este mensaje
#9 Héctor Miguel
10/12/2008 - 19:40 | Informe spam
hola, !

... una ultima duda. (" & .Columns(2).Address & Esta frase no la entiendo dentro de una formula...



- mas que "formula" seria dentro de una instruccion vba
- su objetivo es determinar el rango aplicable de un "CurrentRegion" de dimensiones "desconocidas" (p.e.)

- si conoces el rango exacto de la segunda columna del "CurrentRegion" (digamos, B3:B15)...
puedes cambiar la instruccion a lo siguiente:
[b3:b15].value = [transpose(transpose(trim(b3:b15)))]

- pero, si no conoces hasta donde podria extenderse el rango "apropiado"
(segunda columna de un "CurrentRegion"), entonces usas...
.Columns(2).Value = Evaluate("transpose(transpose(trim(" & .Columns(2).Address & ")))")

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