** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Excel
  Mensajes nuevos Mensajes nuevos RSS - Edición de datos en VBA/Excel
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoEdición de datos en VBA/Excel

 Responder Responder
Autor
Mensaje
chakalido Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 07/Julio/2014
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Tema: Edición de datos en VBA/Excel
    Enviado: 07/Julio/2014 a las 17:26
Hola Amigos! Tengo un reto para vosotros que me está dando un quebradero de cabeza, tengo 15000 datos en excel en un formato igual a este.

numero 1235 date
a 0,730229844 0,824992712 0,8910754 0,207179103 24/01/00
b 0,093533973 0,742954165 0,447543154 0,789561771 25/01/00
c 0,445388599 0,261871006 0,848441355 0,16884017 26/01/00
d 0,939590924 0,054993446 0,270982266 0,401500165 27/01/00
e 0,795077783 0,256192901 0,390648391 0,963056254 28/01/00
f 0,431519688 0,564159749 0,034432887 0,333556217 29/01/00
g 0,146387455 0,872931907 0,38941544 0,159426696 30/01/00
h 0,530462297 0,212115688 0,37363141 0,182392945 31/01/00
i 0,51476049 0,548201772 0,976150845 0,098851525 01/02/00
j 0,711398072 0,067160626 0,687721241 0,027383706 02/02/00
k 0,771788243 0,747426884 0,784247298 0,791044794 03/02/00
l 0,658791236 0,019660898 0,314133383 0,145061327 04/02/00
m 0,193252945 0,583310055 0,968759682 0,31653567 05/02/00
n 0,22068699 0,31030548 0,033796761 0,924544293 06/02/00
ñ 0,362384231 0,991565828 0,481601275 0,956265663 07/02/00
o 0,58239276 0,375942528 0,535784077 0,924493567 08/02/00
p 0,236515935 0,557750311 0,023441762 0,910243847 09/02/00
q 0,606452979 0,76436205 0,320071019 0,161598741 10/02/00
r 0,006850638 0,08709637 0,403407667 0,306409466 11/02/00
s 0,2899103 0,315586138 0,980479148 0,490035707 12/02/00
t 0,650660515 0,295493944 0,878186674 0,970512702 13/02/00
u 0,038610083 0,550579862 0,109856038 0,417289966 14/02/00
- - -
-- total 12345
numero 1234
v 0,562928397 0,122741418 0,246706341 0,236683886 14/02/00
w 0,010844499 0,814120923 0,168504276 0,128929831 15/02/00
x 0,560163389 0,290640133 0,855471821 0,525374957 16/02/00
y 0,050205549 0,853065673 0,164762477 0,085602949 17/02/00
z 0,316254545 0,034471432 0,957811404 0,599870692 18/02/00
 
el tema es que para editar bien los datos y ahorrarnos un gran trabajo que hemos de hacer una vez al mes me ha tocado automatizar esto con una macro de VBA y aunque sé algo de esto, este reto se me escapa de las manos.

El resultado ha de estar así
nombre valor1 valor2 valor3 valor4 date dias desde numero
a 0,96744616 0,207810176 0,969817705 0,449287995 24/01/00 100 1234
b 0,61571615 0,152172898 0,607634065 0,846259443 25/01/00 100 1234
c 0,819513864 0,73445847 0,667510376 0,641227101 26/01/00 100 1234
d 0,945269902 0,393498731 0,613122045 0,056427727 27/01/00 100 1234
e 0,179357625 0,960015045 0,205928795 0,247176989 28/01/00 100 1234
f 0,495035684 0,991283832 0,22786266 0,002721088 29/01/00 100 1234
g 0,343283785 0,988925028 0,566433174 0,589712543 30/01/00 100 1234
h 0,815500627 0,639647602 0,867941599 0,263627223 31/01/00 100 1234
i 0,22523379 0,56421092 0,331017485 0,993942348 01/02/00 100 1234
j 0,304904842 0,327341607 0,365227163 0,755969165 02/02/00 100 1234
k 0,097349737 0,491324378 0,550311631 0,528461748 03/02/00 100 1234
l 0,608801789 0,797105591 0,531012006 0,262051007 04/02/00 100 1234
m 0,74772918 0,294153329 0,222966235 0,578013616 05/02/00 100 1234
n 0,394783281 0,670594187 0,97543812 0,134321771 06/02/00 100 1234
ñ 0,498087609 0,029391032 0,222251698 0,068283039 07/02/00 100 1234
o 0,923981589 0,349491141 0,778659265 0,509704437 08/02/00 100 1234
p 0,914654501 0,015896285 0,92254053 0,381342037 09/02/00 100 1234
q 0,234047584 0,343610951 0,785663513 0,866222469 10/02/00 100 1234
r 0,028946792 0,261428832 0,299741859 0,713603334 11/02/00 100 1234
s 0,591556564 0,7393152 0,687215997 0,087306131 12/02/00 100 1234
t 0,598620672 0,666166765 0,875339028 0,861960226 13/02/00 100 1234
u 0,748634727 0,87394075 0,6401052 0,494120693 14/02/00 100 1234
 
siendo dias desde la diferencia entre la fecha del texto y la fecha de hoy. También ha de desaparecer el numero de encima de las variables y pasar a una columna. los totales han de desaparecer y con ellos los símbolos que estén contenidos alrededor de estos y entre las secuencias de datos. Parece fácil pero me está dando un quebradero de cabeza. Si alguien pudiera orientarme o ayudarme por favor? me haríais un gran favor. Muchas graciasSmileSmileSmile
Arriba
chakalido Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 07/Julio/2014
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 17:34
con una sencilla indicación de las funciones que tendría que utilizar y el orden me bastaría, no me hace falta todo el codigo
Arriba
MexMan70 Ver desplegable
Colaborador
Colaborador


Unido: 17/Julio/2007
Localización: DarkSide
Estado: Sin conexión
Puntos: 9227
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 17:43
Pregunto: 
* Esto es en Access ??

Ademas, no veo relacion de los dias trnscurridos, veo que no importando la fecha en dias desde siempre tienes el mismo valor. Que pasa con el segundo bloque de información ??

Ya comentas !
OneDrive: http://sdrv.ms/Vk6eJd
Arriba
chakalido Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 07/Julio/2014
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 17:58
excel, los bloques de informacion son de numero de filas aleatorio y por eso me están quebrando la cabeza, sé que tengo que montar una booleana, un par de if y un for pero el orden en el que tengo que hacerlo es lo que me marea. Los resultados creo que lo mejor sería dejarlos en otra hoja pero bueno eso ya con una  array y una range se puede hacer, no problemo

Arriba
chakalido Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 07/Julio/2014
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 18:02
en cuanto a los días lo que hay ahi es solo un ejemplo. En excel normal podría hacerlo con la funcion date y restarlo a la fecha que me den ellos pero en VBA estoy buscando y quizás con la Day pero otra vez el problema no son del todo las funciones sino el como estructurarlo. 
me pregunto , ¿una sub con un for para leer y seleccionar los diferentes bloques y luego una funcion para que los pase a la otra pagina?
cómo lo estructuraríais? luego lo de las fechas lo puedo hacer luego con las funciones de excel si nadie sabe al final donde meterlo.
Arriba
MexMan70 Ver desplegable
Colaborador
Colaborador


Unido: 17/Julio/2007
Localización: DarkSide
Estado: Sin conexión
Puntos: 9227
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 19:29
Los pasos serían mas o menos los siguientes:

* Seleccionar todas las celdas de la hoja origen
* Copiar los datos
* Seleccionar la hoja destino
* Pegar los datos
* Crear un ciclo (del 2º renglo hasta el 65530) e indagar en la 2ª columna si esta vacia o empieza con un guión
* En caso de iniciar con un guión, eliminar el renglon
* Si esta vacia la columna, mover al renglon siguiente para ver si esta vacia tambien; esto para incrementar un contador y evitar recorrer hasta ultimo renglon
* Si es distinto a lo indagado, mover a la celda donde se va a poner la formula
* Se regresa a la celda inicial
* Preguntar si el contador es mayor a 3, para salir del cliclo y dar por concluido.


Editado por MexMan70 - 07/Julio/2014 a las 19:29
OneDrive: http://sdrv.ms/Vk6eJd
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 21:12
Hay algunas cosas que están confusas...  

¿Tus datos vienen ya separados en columnas (de la a a la F), o viene todo en una sola columna?

En el resultado que esperas, hay un número 1234...  ¿Este es el número que viene en la primera fila de tus datos?  ¿Es el mismo para todos?


Cordialmente, David
Arriba
chakalido Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 07/Julio/2014
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 21:22
vienen separados, ese numero es el identificador de cada grupo de datos y ha de ir al lado de los datos que le correspondan y no encima. no es el mismo para todos
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 21:35
Ok.

La idea sería que lo hicieras por ti mismo, pero el caso es tan específico, que explicarlo sería casi equivalente a resolverlo.  Prueba con el siguiente código, y revísalo para ver cómo funciona.  Cualquier duda sobre las instrucciones, estamos a la orden...:

Sub CopiarDatos()
    Dim HojaActiva As String, HojaNueva As String
    Dim F1 As Long, F2 As Long, UF As Long, xNumero As Double
    
    UF = Cells(Rows.Count, 1).End(xlUp).Row
    
    HojaActiva = ActiveSheet.Name
    ActiveWorkbook.Sheets.Add after:=Sheets(HojaActiva)
    HojaNueva = ActiveSheet.Name
    Range("A1").Value = "Nombre"
    Range("B1").Value = "Valor1"
    Range("C1").Value = "Valor2"
    Range("D1").Value = "Valor3"
    Range("E1").Value = "Valor4"
    Range("F1").Value = "Date"
    Range("G1").Value = "Días desde"
    Range("H1").Value = "Número"
    F2 = 2
    Sheets(HojaActiva).Activate
    
    For F1 = ActiveCell.Row To UF
        If Cells(F1, 2).Value = "numero" Then
            xNumero = Cells(F1, 3).Value
        Else
            If Len(Cells(F1, 1).Value) > 0 Then
                With Sheets(HojaNueva)
                    .Cells(F2, 1).Value = Cells(F1, 1).Value
                    .Cells(F2, 2).Value = Cells(F1, 2).Value
                    .Cells(F2, 3).Value = Cells(F1, 3).Value
                    .Cells(F2, 4).Value = Cells(F1, 4).Value
                    .Cells(F2, 5).Value = Cells(F1, 5).Value
                    .Cells(F2, 6).Value = Cells(F1, 6).Value
                    .Cells(F2, 7).Value = Now - .Cells(F2, 6).Value
                    .Cells(F2, 8).Value = xNumero
                End With
                F2 = F2 + 1
            End If
        End If
    Next F1
    
End Sub


Saludos!.

Cordialmente, David
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 21:49
Olvidé comentar:

Si observas el código, se requiere que antes de ejecutarlo selecciones la celda que está a la izquierda de la primera aparición del texto "numero".  Por ejemplo, si éste aparece por primera vez en B4, deberías seleccionar A4...


Cordialmente, David
Arriba
MexMan70 Ver desplegable
Colaborador
Colaborador


Unido: 17/Julio/2007
Localización: DarkSide
Estado: Sin conexión
Puntos: 9227
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 23:12
Si deseas analizar los dos bloques o los que sean:

Dim i As Long, nVacios As Integer, txtNum As Variant


Sheets("Hoja1").Select
Cells.Select
Selection.Copy
Sheets("Hoja2").Select
Cells(1, 1).Activate
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Cells.EntireColumn.AutoFit
Range("A1").Select
Selection.EntireRow.Insert
Range("A1").Value = "Nombre"
Range("B1").Value = "Valor1"
Range("C1").Value = "Valor2"
Range("D1").Value = "Valor3"
Range("E1").Value = "Valor4"
Range("F1").Value = "Date"
Range("G1").Value = "Dias Desde"
Range("H1").Value = "Numero"
Range("B1").Select
   For i = 2 To 65500
      ActiveCell.Offset(1, 0).Activate
      If ActiveCell.Value Like "-*" Or ActiveCell.Value = "" Then
         If ActiveCell.Value = "" Then
            ActiveCell.Offset(1, 0).Activate
            If ActiveCell.Value = "" Then nVacios = nVacios + 1
            ActiveCell.Offset(-1, 0).Activate
         End If
         Selection.EntireRow.Delete
         ActiveCell.Offset(-1, 0).Activate
      Else
         If ActiveCell.Value = "numero" Then
            ActiveCell.Offset(0, 1).Activate
            txtNum = ActiveCell.Value
            Selection.EntireRow.Delete
            ActiveCell.Offset(-1, -1).Activate
         Else
            ActiveCell.Offset(0, 5).Activate
            ActiveCell.FormulaR1C1 = "=TODAY()-RC[-1]"
            ActiveCell.NumberFormat = "General"
            ActiveCell.Offset(0, 1).Activate
            ActiveCell.Value = txtNum
            ActiveCell.Offset(0, -6).Activate
         End If
      End If
      DoEvents
      If nVacios > 4 Then Exit For
   Next i


Editado por MexMan70 - 07/Julio/2014 a las 23:13
OneDrive: http://sdrv.ms/Vk6eJd
Arriba
chakalido Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 07/Julio/2014
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 23:25
Muchas gracias David! me has ayudado mucho, entiendo bien el código sólo que no soy un programador experimentado y me cuesta horrores escribir uno que funcione tan bien como este.
voy a borrar un fragmento por que salen los titulos en la pagina inicial y son prescindibles.
por lo demás, si quisiese cambiar la cantidad de variables me imagino que solo tendría que añadir otra linea estilo 
.cells(f2,9).value = cells (f1,7).value y ir probando hasta que encage todo, me equivoco?
gracias! eres un genio!!
 De verdad la próxima vez que me pase algo asi si eso te mando un mensaje y si quieres algo de pasta por paypal por las molestias. 
atentamente,

Dani

Arriba
chakalido Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 07/Julio/2014
Localización: España
Estado: Sin conexión
Puntos: 13
Enlace directo a este mensaje Enviado: 07/Julio/2014 a las 23:27
Hola MexMan,

Gracias por tu mensaje, mañana comprobaré como funciona tu sugerencia y te daré feedback. Muchas gracias de nuevo
Arriba
sdgm Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 21/Abril/2005
Localización: Guatemala
Estado: Sin conexión
Puntos: 906
Enlace directo a este mensaje Enviado: 08/Julio/2014 a las 06:54
¿Molestias?  ¡De ningún modo!  Aprender es el mejor pago...
Me alegra que te haya servido el código, y sí, para agregar nuevas variables debería ser como lo comentas.
 
Saludos...
Cordialmente, David
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable