# Extraer coordenadas desde una celda cadena



## kratk (Feb 8, 2011)

Estimados:

Lo que necesito es extremadamente simple, pero en la práctica de hacer una macro o ponerlo en código se me ha hecho tremendamente difícil.
Desde AutoCad yo extraigo la siguiente información:

Command:  ID Specify point:  X = 5068.7648     Y = 224.3896     Z = -4063.3161

Esto me queda copiado completo en la celda A1 (excel 2003). Lo que yo necesito es que me queden los valores X,Y & Z en las columnas B1, C1 Y D1 (en cualquier celda si es necesario) lo único que necesito es extraer las coordenadas desde la única celda. Hasta el momento la única forma que he encontrado de separar la información es con el comando Text To Columns.... del menu Data, pero comprenderán que hacerlo para 150 puntos es bastante engorroso. 

Desde ya agradezco cualquier comentario u ayuda que puedan brindarme.


----------



## Marcelo Branco (Feb 9, 2011)

Hola,

con B como una columna de ayuda

(fórmulas en Inglés)

fórmula en B1
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"Command: ID Specify point: X = ","")," ",""),"=","")

fórmula en C1
=MID(B1,1,SEARCH("y",B1)-1)

fórmula en D1
=MID(B1,SEARCH("Y",B1)+1,SEARCH("Z",B1)-SEARCH("Y",B1)-1)

fórmula en E1
=RIGHT(B1,LEN(B1)-SEARCH("Z",B1))

copia a abajo B1, C1, D1 y E1

Espero que esto ayude

M.


----------



## kratk (Feb 14, 2011)

Marcelo:

Una vez mas muchisimas gracias, sirvió de maravilla (igual que cuando me ayudaste con lo de los formatos condicionales) Lo cual me lleva a otra consulta. Hay alguna una forma en la cual yo pueda separar la cantidad de datos a la mitad... te explico.

Las coordenadas que estoy extrayendo corresponden a inicio y final de una linea, es decir:

Command:  ID Specify point:  X = 5068.7648     Y = 224.3896     Z = -4063.3161    corresponde al inicio de una linea.

Yo identifico todos los inicios de linea y los copio al excel, esta sería la primera mitad de la información.  Luego identifico todos los finales de linea y los copio al excel, mi segunda mitad. La idea es generar un archivo de las siguientes características:

inicio X | inicio Y | inicio Z | final X | final Y | final Z | 

Para generar la tabla, la variable de entrada seria la cantidad de lineas a exportar, para que el excel me ordene la tabla que necesito.

Te lo agradecería bastante


----------



## Marcelo Branco (Feb 14, 2011)

Kratk,

Si usted ya tiene las coordenadas de inicio y final en, por ejemplo, Hoja1 c1, d1, e1 (inicio) y i1, j1,k1 (final) creo que podría colocar en Hoja2
A2, B2, C2, D2, E2, F2 (headers na linea 1)

A2 = Hoja1!C1
B2 = Hoja1!D1
......
......

M.


----------



## kratk (Feb 15, 2011)

Marcelo:

Jajajaja, se que ese método es una alternativa, pero la idea es que la tabla se ordene sola ya que son muchos archivos los que tengo que tratar por día (alrededor de 7 archivos, cada uno con 300 lineas a exportar) y lo que yo estoy generando es una plataforma de comunicación con otro programa especializado (algo así como una traducción de archivo para que el otro programa entienda la información).

Si lo hiciera así concatenando los datos de la hoja 1 en la hoja 2 igual tendria que hacerlo manualmente, en cambio si defino una variable de entrada como por ejemplo N° de lineas, yo sabría que la desde la mitad de ese numero (N° de lineas) hacia abajo  corresponderá a los finales de linea y luego seleccionar ese rango y moverlo quizás a la la columna D1, por ejemplo.

Yo entiendo de programación, el problema es que soy nuevo en el lenguaje excel y aun no entiendo toda la sintaxis que debo escribir.

Mi idea:

Sub nombre()

Dim N°lineas as Long, Narchivo As string

Narchivo=Application.InputBox_(Prompt:= "Ingrese nombre de archivo", Type:=2)
' Aqui no se que hacer con la variable de entrada, podrá ser algo así??
Narchivo = String(Narchivo)

Nlineas=Application.InputBox_(Prompt:= "Ingrese Numero de lineas", Type:=1)
If Narchivo < 1 then exit Sub
Nlineas = Cint(Nlineas)

Select.Range(Nlineas/2:Dn) porque son 3 dimensiones y Dn porque no sé la dimensión de la seleccion

Move.Range(Nlineas/2:Dn) to D1................ Me entiendes????

Para que el resultado sea este:

X inicio | Y inicio | Z inicio | X final | Y final | Z final | Nombre archivo | N° de linea
    .            .            .           .           .           .              .                     .
    .            .            .           .           .           .              .                     .
    .            .            .           .           .           .              .                     .

Ojalá puedas ayudarme.

Kratk.


----------



## Marcelo Branco (Feb 15, 2011)

Kratk,

En que colunas de Hoja1 eston los datos a serem copiados
A, B y C ?

Se lo entendi bién quiere copiar de Hoja1 para Hoja2 en el mismo archivo.

En Hoja2 para las colunas A B C D E F G H
X inicio | Y inicio | Z inicio | X final | Y final | Z final | Nombre archivo | N° de linea

Es eso?

M.


----------



## kratk (Feb 15, 2011)

Marcelo:

Si, lo entendiste bien. Lo que yo necesito es lo siguiente:

En la columna A exporto la siguiente información como cadena de texto:

```
A1
| Command: ID Specify point: X = 5068.7648 Y = 224.3896 Z = -4063.3161 |
```
Luego yo separo las coordenadas de la cadena, como me lo indicaste tu en el posteo anterior 


```
A1                     B1          C1          D1
|Command:ID Specify point:...|5068.7648 | 224.3896 | -4063.3161 |
```

y eso lo traslado a la hoja 2 en el siguiente formato:


```
Hoja 2:

    A1          B1         C1         D1        E1         F1             G1              H1
 X inicio | Y inicio | Z inicio | X final | Y final | Z final | Nombre archivo | N° de linea
```
Entonces lo que necesito es que ingresando el N° de lineas se me genere, en la hoja 2 el formato que te copie arriba.


----------



## Marcelo Branco (Feb 15, 2011)

Kratk,

Entonces non esta usando la coluna b como ayuda?

Los datos eston en B, C y D. 

Si es asi prueba esta en un archivo de ensayo.


```
Sub Copia()
    Dim lastRow As Long, i As Long
    Dim nombreArquivo As String
    
    nombreArquivo = Application.InputBox("Ingrese con nombre de archivo", Type:=2)
    
    With ThisWorkbook.Sheets("Hoja1")
        lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
    End With
    
    ActiveSheet.Range("B1" & ":D" & lastRow / 2).Copy _
        Destination:=ThisWorkbook.Sheets("Hoja2").Range("A2")
    
    ActiveSheet.Range("B" & 1 + lastRow / 2 & ":D" & lastRow).Copy _
        Destination:=ThisWorkbook.Sheets("Hoja2").Range("D2")
        
    Sheets("Hoja2").Activate
    With ActiveSheet
        .Range("A1") = "X Inicio"
        .Range("B1") = "Y Inicio"
        .Range("C1") = "Z Inicio"
        .Range("D1") = "X Final"
        .Range("E1") = "Y Final"
        .Range("F1") = "Z Final"
        .Range("G1") = "Nombre Arquivo"
        .Range("H1") = "No de Linea"
    End With
    
    For i = 1 To lastRow / 2
        Range("G" & i + 1) = nombreArquivo
        Range("H" & i + 1) = i
    Next i
    
    Columns("G:H").AutoFit
    
    Application.CutCopyMode = False
End Sub
```
 
M.


----------



## kratk (Feb 15, 2011)

Marcelo:

Funcionó genial, era exactamente lo que buscaba. Ahora me puedo ahorrar una enormidad de tiempo. Una vez mas muchisimas gracias.

Esta é a segunda vez que você me ajuda, te agradeço de coração, você é muito gentil .... Muito obrigado


----------



## Marcelo Branco (Feb 15, 2011)

Obrigado pelas suas palavras gentis.

abraços,

M.


----------



## kratk (Feb 8, 2011)

Estimados:

Lo que necesito es extremadamente simple, pero en la práctica de hacer una macro o ponerlo en código se me ha hecho tremendamente difícil.
Desde AutoCad yo extraigo la siguiente información:

Command:  ID Specify point:  X = 5068.7648     Y = 224.3896     Z = -4063.3161

Esto me queda copiado completo en la celda A1 (excel 2003). Lo que yo necesito es que me queden los valores X,Y & Z en las columnas B1, C1 Y D1 (en cualquier celda si es necesario) lo único que necesito es extraer las coordenadas desde la única celda. Hasta el momento la única forma que he encontrado de separar la información es con el comando Text To Columns.... del menu Data, pero comprenderán que hacerlo para 150 puntos es bastante engorroso. 

Desde ya agradezco cualquier comentario u ayuda que puedan brindarme.


----------



## kratk (Feb 15, 2011)

Marcelo:

Una última consulta, me funciona mejor la combinación de MID & TRIM para extraer las coordenadas. Puedo llenar sistematicamente las celdas con un comando For como te muestro en rojo en la macro???? te lo pregunto porque no me deja hacerlo por un asunto de formato la macro, me molesta por la sintaxis del FIND... me dice Sub or Function not defined y me resalta el comando FIND.


```
Sub Copia()
    Dim lastRow As Long, i As Long
    Dim nombreArquivo As String
    
    nombreArquivo = Application.InputBox("Ingrese con nombre de archivo", Type:=2)
    
    With ThisWorkbook.Sheets("Hoja1")
        lastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
    End With
    For i = 1 To lastRow / 2
    [COLOR="Red"]With ActiveSheet
    Range(Bi) = Mid(Ai, Find("X =", Ai) + 3, Find("Y =", Ai) - Find("X =", Ai) - 4)
    Range(Ci) = Mid(Ai, Find("Y =", Ai) + 3, Find("Z =", Ai) - Find("Y =", Ai) - 4)
    Range(Di) = Trim(Right(Ai, Len(Ai) - Find("Z =", Ai) - 3))
    End With
    Next i[/COLOR]
    ActiveSheet.Range("B1" & ":D" & lastRow / 2).Copy _
        Destination:=ThisWorkbook.Sheets("Hoja2").Range("A2")
    
    ActiveSheet.Range("B" & 1 + lastRow / 2 & ":D" & lastRow).Copy _
        Destination:=ThisWorkbook.Sheets("Hoja2").Range("D2")
        
    Sheets("Hoja2").Activate
    With ActiveSheet
        .Range("A1") = "X Inicio"
        .Range("B1") = "Y Inicio"
        .Range("C1") = "Z Inicio"
        .Range("D1") = "X Final"
        .Range("E1") = "Y Final"
        .Range("F1") = "Z Final"
        .Range("G1") = "Nombre Arquivo"
        .Range("H1") = "No de Linea"
    End With
    
    For i = 1 To lastRow / 2
        Range("G" & i + 1) = nombreArquivo
        Range("H" & i + 1) = i
    Next i
    
    Columns("G:H").AutoFit
    
    Application.CutCopyMode = False
End Sub
```

Funciona perfectamente la macro que hiciste, pero quedaría mucho mejor si los datos origen se llenasen solos, es decir, que del rango A1:LastRow/2 se fueran completando las celdas B , C y D.

Me entiendes????


----------



## Marcelo Branco (Feb 15, 2011)

No compreendo porque quieres utilizar um loop. Pero si lo quiere tiene que corrigir el sintaxis
No Range(Bi)

Range("B"&i)

Ai no ----> "A"&i

....
....

M.


----------

