Foros del Web » Soporte técnico » Ofimática »

Función o macro para encontrar y copiar

Estas en el tema de Función o macro para encontrar y copiar en el foro de Ofimática en Foros del Web. Estimado, tengo 2 archivos en excel: 1.) "midirectorio.xls" este contiene 15 hojas y cada una de ellas 4 registros, cada registro posee 7 campos. 2.) ...
  #1 (permalink)  
Antiguo 26/04/2007, 12:45
 
Fecha de Ingreso: abril-2007
Mensajes: 2
Antigüedad: 17 años
Puntos: 0
Pregunta Función o macro para encontrar y copiar

Estimado, tengo 2 archivos en excel:

1.) "midirectorio.xls" este contiene 15 hojas y cada una de ellas 4 registros, cada registro posee 7 campos.

2.) "companias.xls", este archivo solo contiene registros en una sola hoja, son 16 registros, un solo campo, que es RAZSOC, y que es comun para ambos archivos.

3) Necesito que desde un nuevo archivo.XLS, buscar el RAZSOC de "companias.xls", en las 15 Hojas del archivo "midirectorio.xls", al encontrarlo, que copie los 7 campos al nuevo archivo y que siga buscando y copiando.

Será posible?

Gracias por su valioso apoyo
  #2 (permalink)  
Antiguo 29/04/2007, 21:30
Avatar de mrocf  
Fecha de Ingreso: marzo-2007
Ubicación: Bs.As.
Mensajes: 1.103
Antigüedad: 17 años
Puntos: 88
Sonrisa Función o macro para encontrar y copiar

Hola Frank!
En realidad tuve que adoptar más suposiciones de las que me hubiesen gustado. A saber:
a) Que en "companias.xls" los 16 datos están en la columna A y a partir de la fila 2, reservándose la fila 1 para: "RAZSOC".

b) Que el número de razones sociales puede cambiar.

c) Que el número de hojas de "midirectorio.xls" puede cambiar (diferir de 15).

d) Que dentro de los 4 registros de cada una de las 15 hojas la razón social se puede repetir

e) Que el número de registros pueden cambiar (diferir de 4).

Luego de lo anterior, resultó el siguiente código:
Código:
Sub BuscaEn15()
Dim CeldaRes As Range, RangoRazSoc As Range, CeldaEnc As Range
Dim FileRazSoc As String, FileDatos As String
Dim SheetCounter As Integer, ii As Integer

    Application.ScreenUpdating = False
    FileRazSoc = "companias.xls"
    FileDatos = "midirectorio.xls"
    
    Set CeldaRes = [A65536]
    CeldaRes.End(xlUp).Offset(0, 7) = "Origen"
    Windows(FileRazSoc).Activate
    Set RangoRazSoc = Range([A2], [A65536].End(xlUp))
    Windows(FileDatos).Activate
    Do
        SheetCounter = SheetCounter + 1
        For ii = 1 To RangoRazSoc.Rows.Count
            Application.Goto Sheets(SheetCounter).[A1]
OtroRegistroEnLaHoja:
            On Error Resume Next
            Set CeldaEnc = _
                Cells.Find(What:=RangoRazSoc.Cells(ii), _
                After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
                SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False)
            On Error GoTo 0
            If CeldaEnc Is Nothing Then GoTo OtraRazSoc
            If CeldaEnc.Address = ActiveCell.Address Then GoTo OtraRazSoc
            If CeldaEnc.Row < ActiveCell.Row Then GoTo OtraRazSoc
            CeldaEnc.Select
            Set CeldaEnc = Selection.Offset(0, 1 - CeldaEnc.Column)
            Range(CeldaEnc, CeldaEnc.Offset(0, 6)).Copy _
                Destination:=CeldaRes.End(xlUp).Offset(1, 0)
            CeldaRes.End(xlUp).Offset(0, 7) = ActiveSheet.Name
            GoTo OtroRegistroEnLaHoja
OtraRazSoc:
        Next ii
    Loop While ActiveSheet.Name <> Sheets(Sheets.Count).Name
    
    Application.Goto CeldaRes.Offset(-65535, 0)
    Application.ScreenUpdating = True
    Cells.Columns.AutoFit
    Set CeldaEnc = Nothing
    Set RangoRazSoc = Nothing
    Set CeldaRes = Nothing
End Sub
Uso:
1) Tener abiertos los archivos "companias.xls" y "midirectorio.xls".

2) Tener abierto el archivo resumen (no interesa su nombre) en la hoja en la que se copiará la información.
Esta hoja deberá estar "en blanco", a excepción de su primera fila en la que tú le habrás puesto los nombres de los 7 campos.

3) En este mismo "archivo resumen" deberá residir el código de macro que acompaño.

4) Finalmente al correr el código "BuscaEn15" y luego de unos instantes: puede ser que tengas suerte... (je je je).

5) Notar que el nombre de los archivos "companias.xls" y "midirectorio.xls" se puede parametrizar dentro del código.

Prueba con lo anterior y luego cuéntanos como te fue.
Saludos.
  #3 (permalink)  
Antiguo 09/06/2008, 21:40
 
Fecha de Ingreso: junio-2008
Mensajes: 7
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Función o macro para encontrar y copiar

Hola,

Yo estaba tratando de hacer una macro similar pero no tengo ningun conosimiento de visual basic ni programacion ni nada y la verdad se me esta complicnado mucho.

Lo que necesito es:
Tengo datos guardados en muchos libros de excel que se llaman mydata001.csv mydata002.csv mydata003.csv ...... mydata400.csv (en estos archivos el problema que he tenido es cuando copio la columna A en realidad ocupa hasta la columna D en algunas filas y aveces me da error por ser distinta la superficie donde intento pegarlos) Dentro de cada uno de estos hay datos como estos:

30 Sonda espía 0 Reciclador *|*|*12 *|*442 *|*planet_18_small *|*22 *|*1 *|*
lixpoBUXHIN
(YEIDEN)*|*0 *|*lixpoBUXHIN*|*01:102:01 *|*
Propietario YEIDEN
Puntos 28,722
Posición 0,112511574
Temperatura -58 ° C
Alianza UNION PLANETARIA
Situación Hostil
*|* 0 *|*4814 *|*110 *|*442 *|*0*|*1617 *|**|*|*151 *|*515 *|*planet_19_small *|*22 *|*2 *|*

de esto hay entre 14 a 16 en cada libro y necesito traspasar Nombre del Propietario, Puntos, Alianza y aislar las coordenadas que en este caso son 01:102:01
La idea era pasar esos datos para que en otro libro me quede todo ordenado

Ej:
A | B | C | D | E |
1 Propietario | Puntos | Alianza |Situacion | Coord |
2 YEIDEN | 28,722 | UNION PLANETARIA | Hostil | 01:102:01 |

Vi el codigo en esta respuesta y funciona, talvez me puedan ayudar a hacer uno como el que necesito.

Gracias
  #4 (permalink)  
Antiguo 10/06/2008, 12:55
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Pregunta Respuesta: Función o macro para encontrar y copiar

Cita:
30 Sonda espía 0 Reciclador *|*|*12 *|*442 *|*planet_18_small *|*22 *|*1 *|*
lixpoBUXHIN
(YEIDEN)*|*0 *|*lixpoBUXHIN*|*01:102:01 *|*
Propietario YEIDEN
Puntos 28,722
Posición 0,112511574
Temperatura -58 ° C
Alianza UNION PLANETARIA
Situación Hostil
*|* 0 *|*4814 *|*110 *|*442 *|*0*|*1617 *|**|*|*151 *|*515 *|*planet_19_small *|*22 *|*2 *|*
No entendí, ¿cómo tienes los datos en la hoja excel? Podrías pasarnos una captura de pantalla para saber exactamente cómo ayudarte...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 10/06/2008, 20:53
 
Fecha de Ingreso: junio-2008
Mensajes: 7
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Función o macro para encontrar y copiar


http://choda125.bizhat.com/mydata100csv.jpg

para no fallar tambien te dejo el original

http://choda125.bizhat.com/mydata100.CSV

Bueno, estos archivos van del mydata001.csv hasta el mydata400.csv

Los datos que hay dentro en la fila 1 la columna A ocupa varias columnas (osea son 4 columnas juntas) despues son 9 filas con columnas normales y otra vez una columna que ocupa varias.

Sacar datos de todos esos libros distintos y ponerlos en otro libro que me sirva de base de datos es posible?


http://choda125.bizhat.com/ej.jpg
algo como esto (en el ejemplo solo estan los datos del archivo mydata100 faltarian tomar los datos de otros 399

Teniendo esto ya con algun formulario podria facilmente (no tan facilmente para mi claro) buscar por Propietario o por Alianza o a los que figuren como inactivos.
  #6 (permalink)  
Antiguo 11/06/2008, 10:55
 
Fecha de Ingreso: junio-2008
Mensajes: 4
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Función o macro para encontrar y copiar

Cita:
Iniciado por David el Grande Ver Mensaje
No entendí, ¿cómo tienes los datos en la hoja excel? Podrías pasarnos una captura de pantalla para saber exactamente cómo ayudarte...
HOLA DAVID EL GRANDE

Me gustaria ver si me podrias ayudar, tengo el siguiente problema: “n” gentes llenan un reporte en excel (un archivo por cada gente), el cual contiene la siguiente información.

Numero de empleado
Numero de proyecto
Horas trabajadas a cada proyecto

Organizado de la siguiente manera

Numero de empleado xxx1

NOMBRE DE PROYECTO HH trabajadas
Proyecto1 5
Proyecto2 10
Proyecto3 0
Proyecto4 8
..
..
Proyecto x 22


Quiero realizar una macro que me copie esta información de cada gente a otro archivo cuya estructura es la siguiente:

Numero de empleado Proyecto1 Proyecto2 Proyecto3 Proyecto4 ..Proyecto x
xxx1 5 10 0 8 22
xxx2
xxx3
xxx4
..
..
xxxn


Agradecere mucho tu ayuda. Saludos
  #7 (permalink)  
Antiguo 11/06/2008, 11:48
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo Respuesta: Función o macro para encontrar y copiar

Estimado hectorm1980.
Te recomiendo que abras un nuevo tema con tu duda, así podrán ayudarte más usuarios...
Saludos
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #8 (permalink)  
Antiguo 11/06/2008, 12:00
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Función o macro para encontrar y copiar

Sí es posible hacerlo, debes hacer un bucle For que recorra todas las filas y vaya extrayendo los datos, ya que son datos que están juntos en la misma columna puedes extraerlo con Mid o con Split. No obstante, no he logrado leer el archivo http://choda125.bizhat.com/mydata100.CSV de la manera como se muestra en la imagen, lo he abierto con Office 2003. Me muestra algunos datos diferentes al comienzo, solo me muestra los datos que se muestran en tu imagen más o menos por la línea 30. Pero aún así es posible extraer los datos, solo que tendrás algo de trabajo para armar el código (cualquier duda con For, Mid, Split, etc., puedes preguntar).
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #9 (permalink)  
Antiguo 11/06/2008, 21:02
 
Fecha de Ingreso: junio-2008
Mensajes: 7
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Función o macro para encontrar y copiar

Es ese mi problema no tengo la mas minima idea de como se hace.

Yo tengo el office 2000 y baje el archivo y lo pude abrir lo mas bien. Le cambio la extencion a .xls a ver si lo podes abrir.
http://choda125.bizhat.com/mydata100.xls

mira uno de mis mejores codigos (no te vas a reir ... acordate que es mi primer intento de solo haber visto algunos ejemplos)

Cita:
Private Sub CommandButton1_Click()
Dim Rango As Range
Sheets("mydata163").Select

For Each Rango In ActiveSheet.Range("A1:A150")
If Rango = "Propietario" Then
Rango.EntireRow.Copy
Sheets("Propietario").Activate
Range("a65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste

ElseIf Rango = "Puntos" Then
Rango.EntireRow.Copy
Sheets("Puntos").Activate
Range("a65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste

ElseIf Rango = "Alianza" Then
Rango.EntireRow.Copy
Sheets("Alianza").Activate
Range("a65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste

End If
Next
End Sub
Trato de hacer lo del for pero necesito saber como remplazo donde dice "Sheets("mydata163").Select" y cambiar el 163 por una variable para ir abriendo distintos todos los archivos.
Y mi otro problema es que cuando encuentra el rango indicado copia toda la fila, como reemplazo Rango.EntireRow.Copy y solo copiar la columna B del rango indicado ?
  #10 (permalink)  
Antiguo 12/06/2008, 09:07
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Función o macro para encontrar y copiar

No está mal la macro que has hecho. Bueno, mi idea es esta:
Código:
 
Function ExportData(ByVal FileName As String, ByVal DataFile As String, Optional ByVal Count As Integer = 2) As Integer
Dim NewXLS As Excel.Application
Dim NewBook As Workbook
Dim NewSheet As Worksheet
Set NewXLS = New Excel.Application
Set NewBook = NewXLS.Workbooks.Open(FileName)
Set NewSheet = NewBook.Worksheets(1)
'Agregamos los encabezados
NewSheet.Range("A1") = "Propietario"
NewSheet.Range("B1") = "Puntos"
NewSheet.Range("C1") = "Alianza"
NewSheet.Range("D1") = "Coordenadas"
NewSheet.Range("E1") = "Situación"
Dim dataXLS As Workbook
Set dataXLS = NewXLS.Workbooks.Open(DataFile)
Dim dataSheet As Worksheet
Set dataSheet = dataXLS.Worksheets(1)
Dim Looping As Byte
'Recorremos desde la primera fila hasta la fila 150
For Looping = 1 To 150
    If dataSheet.Range("A" & Looping) = "Propietario" Then
        'Extraemos propietario
        NewSheet.Range("A" & Count) = dataSheet.Range("B" & Looping)
        'Extraemos Puntos
        NewSheet.Range("B" & Count) = dataSheet.Range("B" & (Looping + 1))
        'Extraemos Alianza
        NewSheet.Range("C" & Count) = dataSheet.Range("B" & (Looping + 4))
        'Extraemos Coordenadas
        NewSheet.Range("D" & Count) = dataSheet.Range("B" & (Looping + 2))
        'Extraemos Situación
        NewSheet.Range("E" & Count) = dataSheet.Range("B" & (Looping + 5))
        'Saltamos los datos extraídos
        Looping = Looping + 6
        Count = Count + 1
    End If
Next Looping
dataXLS.Close False
NewBook.Close True
NewXLS.Quit
Set dataXLS = Nothing
Set NewBook = Nothing
Set NewXLS = Nothing
ExportData = Count
End Function
Los parámetros son:
FileName: archivo donde se guardarán los datos
DataFile: archivo desde donde se extraerán los datos
Count: En qué rango empezará a escribir los datos

La función devuelve un entero con el valor de la primera celda vacía en el archivo de salida.

Con esa función ya te será fácil hacer el For que recorra todos los archivos y guarde los datos...

Espero que te sirva. Saludos
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #11 (permalink)  
Antiguo 12/06/2008, 22:27
 
Fecha de Ingreso: junio-2008
Mensajes: 7
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Función o macro para encontrar y copiar

Perdona la pregunta, es que de verdad no se nada de esto.

Ese codigo lo puse dentro de un modulo pero le doy play y no pasa nada, Trate dentro de un comand button y tampoco. Los ejemplos de function que vi la ejecutan desde una celda pero tampoco me funciono de esa forma.
Otra cosa es donde y como pongo los parámetros FileName: DataFile: Count: (ejemplo Set FileName = "C:\Documents and Settings\Choda\Escritorio\Nueva\mydata100.CSV") me fallo tambien eso.

Tratando de analizar las cosas que va haciendo la funcion parece que tendria que andar de 10 .... pero denuevo pregunta en ninguna parte veo el comando copy ni paste ni nada parecido.

De verdad gracias por la ayuda que me estas dando,
Saludos
  #12 (permalink)  
Antiguo 13/06/2008, 11:59
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo Respuesta: Función o macro para encontrar y copiar

Cita:
Iniciado por choda125 Ver Mensaje
Perdona la pregunta, es que de verdad no se nada de esto.

Ese codigo lo puse dentro de un modulo pero le doy play y no pasa nada, Trate dentro de un comand button y tampoco. Los ejemplos de function que vi la ejecutan desde una celda pero tampoco me funciono de esa forma.
Otra cosa es donde y como pongo los parámetros FileName: DataFile: Count: (ejemplo Set FileName = "C:\Documents and Settings\Choda\Escritorio\Nueva\mydata100.CSV") me fallo tambien eso.

Tratando de analizar las cosas que va haciendo la funcion parece que tendria que andar de 10 .... pero denuevo pregunta en ninguna parte veo el comando copy ni paste ni nada parecido.

De verdad gracias por la ayuda que me estas dando,
Saludos
Pues bien, para llamar a la función haces lo siguiente en un botón, o donde quieras (hasta puede ser en la ventana inmediato):
Código:
 
ExportData FileName, DataFile, Count
Ejemplo:
Código:
 
ExportData "C:\Datos.xls", "C:\mydata100.xls", 2
Con ese ejemplo guardamos en Datos.xls (desde la fila 2) los datos extraídos de mydata100.xls.

Saludos
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #13 (permalink)  
Antiguo 13/06/2008, 23:59
 
Fecha de Ingreso: junio-2008
Mensajes: 7
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Función o macro para encontrar y copiar

Seee por fin, la hice andar y funciona barbaro !!!

Estoy tratando de ponerle algun detector de ultima fila para que no me sobreescriba los datos guardados. Alguna idea? Le saque algunas cosas al encabezado donde decia Count = 2 pero no puedo hacer que busque la ultima fila.

Gracias por la paciencia jeje
  #14 (permalink)  
Antiguo 16/06/2008, 21:15
 
Fecha de Ingreso: junio-2008
Mensajes: 7
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Función o macro para encontrar y copiar

Hola David,
Todavia estas por aca??
Bueno te cuento que esta andando pero me parece que es un desastre y tarda muchisimo.
Me gustaria si pudieras revisar como funciona para que me puedas corregir, ya que seguramente no empleo el mejor camino para llegar a lo que necesito.
Formulario:
Código:
Private Sub CommandButton1_Click()
Extencion = ".CSV"
Dim i As Integer
For i = 1 To 400
ExportData "C:\Documents and Settings\Choda\Escritorio\Nueva\Datos.xls", "C:\Documents and Settings\Choda\Escritorio\Nueva\G4\mydata" & i
TraspasoDatos
Next
End Sub
Modulo1 aca esta tu funcion :
Código:
Function ExportData(ByVal FileName As String, ByVal DataFile As String, Optional ByVal Count As Integer = 2) As Integer
Dim NewXLS As Excel.Application
Dim NewBook As Workbook
Dim NewSheet As Worksheet
Set NewXLS = New Excel.Application
Set NewBook = NewXLS.Workbooks.Open(FileName)
Set NewSheet = NewBook.Worksheets(1)
'Agregamos los encabezados
NewSheet.Range("A1") = "Propietario"
NewSheet.Range("B1") = "Puntos"
NewSheet.Range("C1") = "Alianza"
NewSheet.Range("D1") = "Coordenadas"
NewSheet.Range("E1") = "Situación"
Dim dataXLS As Workbook
Set dataXLS = NewXLS.Workbooks.Open(DataFile)
Dim dataSheet As Worksheet
Set dataSheet = dataXLS.Worksheets(1)
Dim Looping As Byte
'Recorremos desde la primera fila hasta la fila 150
For Looping = 1 To 150
If dataSheet.Range("A" & Looping) = "Propietario" Then
'Extraemos propietario
NewSheet.Range("A" & Count) = dataSheet.Range("B" & Looping)
'Extraemos Puntos
NewSheet.Range("B" & Count) = dataSheet.Range("B" & (Looping + 1))
'Extraemos Alianza
NewSheet.Range("C" & Count) = dataSheet.Range("B" & (Looping + 4))
'Extraemos Coordenadas
NewSheet.Range("I" & Count) = dataSheet.Range("A" & (Looping - 1))
'Extraemos Situación
NewSheet.Range("E" & Count) = dataSheet.Range("B" & (Looping + 5))
'Saltamos los datos extraídos
Looping = Looping + 6
Count = Count + 1
End If
Next Looping
dataXLS.Close False
NewBook.Close True
NewXLS.Quit
Set dataXLS = Nothing
Set NewBook = Nothing
Set NewXLS = Nothing
ExportData = Count
End Function
Modulo2:
Código:
Function TraspasoDatos()
Workbooks.Open FileName:= _
"C:\Documents and Settings\Choda\Escritorio\Nueva\Datos.xls"
Windows("Datos.xls").Activate
Range("A2:E18").Select
Selection.Copy
Windows("David.xls").Activate
Sheets("Hoja1").Select
Range("a65536").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
Windows("Datos.xls").Activate
Range("A2:C18").ClearContents
Range("E2:E18").ClearContents
Range("I2:I18").ClearContents
ActiveWindow.Close SaveChanges:=True
End Function
Asique tengo un boton que solo puedo ejecutarlo en el archivo David.xls ejecuta las 2 funciones, la primera guarda temporalmente los datos que tiene mydataXXX.csv en Datos.xls y la 2da funcion abre el archivo Datos.xls y copia los datos en el archivo David.xls y cierra Datos.xls para que la 1re funcion pueda abrir el proximo mydataXXX.csv
Son 400 mydata osea mydata1.csv, mydata2.csv ...... mydata400.csv
Te dejo un rar con una mustra de los archivos como para que puedas ver mejor lo que estoy tratando de hacer. Y tambien sobre el archivo con los datos organizados necesito hacer un formulario de busqueda (pense que esa era la parte facil jaja pero tampoco)
http://choda125.bizhat.com/muestra.rar

Muchas gracias y saludos
Andres
  #15 (permalink)  
Antiguo 17/06/2008, 08:12
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: Función o macro para encontrar y copiar

En vez de hacer una función de para transpasar datos puedes modificar el código que te puse para que te guarde directamente en el libro actual. Así, para guardar en la primera celda vacía podrás utilizar el valor de retorno de la función ExportData...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:44.