Visual Basic - Necesito ayuda para adaptar una macro

Life is soft - evento anual de software empresarial
 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 14 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Necesito ayuda para adaptar una macro

Publicado por Valentin (3 intervenciones) el 25/04/2018 11:31:08
De antemano gracias por acudir a mi llamada de ayuda.
Tengo el siguiente código en la hoja8 de un libro de Excel en la que tengo una base de datos de artículos. En la columna J de esta hoja tengo el dato “Precio de compra del artículo”. Lo que realiza la macro que adjunto es, si se modifica el precio de compra de cualquier artículo en la columna J, lo actualiza en todas las hojas de escandallos en las que ese artículo participa. Estas hojas de escandallos se denominan todas iniciando con “E.” seguido del número de escandallo. Luego realiza unos cálculos y los actualiza en otra hoja denominada “ART_VTA”
Lo que necesito es adaptar la macro para que se ejecute y actúe sobre todos los artículos que forman parte de esa base de datos (HOJA8, que es donde está ubicado el código) y no solamente en aquel artículo en el que haya realizado una modificación en el campo de la columna J (precio de compra). Quisiera tener la posibilidad de que se ejecute para todos los artículos que componen el art_comp (hoja8), independientemente de que el precio haya sido modificado o no, y recalcule en art_vta (como ya hace) el consumo, margen bruto, precio teorico y coste unitario.

Private Sub Worksheet_Change(ByVal Target As Range)
'
'Actualiza precio de compra en los escandallos cuando se modifica la columna J

If Not Intersect(Target, Columns("J")) Is Nothing Then
If Target.Count > 1 Then Exit Sub
If Target.Row = 1 Then Exit Sub
res = MsgBox("Ha modifica un precio de compra, desea modificar los escandallos", _
vbQuestion + vbYesNo, "MODIFICAR PRECIO DE COMPRA")
If res = vbNo Then Exit Sub
'
Application.ScreenUpdating = False
Application.StatusBar = False
'descripcion articulo en factura
des_fra = Cells(Target.Row, "E")
pre_uni = Cells(Target.Row, "H")
For Each h In Sheets
Application.StatusBar = "Revisando hoja : " & h.Index & " de : " & Sheets.Count
If Left(h.Name, 2) = "E." Then
Set b = h.Columns("A").Find(des_fra, lookat:=xlWhole)
If Not b Is Nothing Then
fila = b.Row
'modifica precio unitario
h.Cells(fila, "E") = pre_uni
'modifica coste total
h.Cells(fila, "F") = pre_uni * h.Cells(fila, "B")
'Coste total x pax
h.Cells(fila, "G") = h.Cells(fila, "F") / h.Range("B5") 'raciones
'
'% coste total x pasx
u = h.Range("A" & Rows.Count).End(xlUp).Row
With h.Range("H7:H" & u)
.FormulaR1C1 = "=IF(RC[-1]="""","""",RC[-1]/R7C18)"
.Value = .Value
End With
'Actualizar Art_vta
art_vta = h.Range("A3").Value
Set hvta = Sheets("ART_VTA.")
Set c = hvta.Columns("A").Find(art_vta, lookat:=xlWhole)
If Not c Is Nothing Then
'
hvta.Cells(c.Row, "F") = h.Range("N12") 'consumo
hvta.Cells(c.Row, "G") = h.Range("N13") 'margen bruto
hvta.Cells(c.Row, "H") = h.Range("M9") 'coste unit
hvta.Cells(c.Row, "I") = h.Range("M11") 'precio teorico
End If
End If
End If
Next
End If
'
Application.ScreenUpdating = False
Application.StatusBar = False
'MsgBox "Precio de compra actualizado en los escandallos", vbInformation
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.234
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Necesito ayuda para adaptar una macro

Publicado por Antoni Masana (445 intervenciones) el 25/04/2018 12:33:43
Te resalto la parte modificada

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Sub Modificar_Precio()
    Dim Fila as Long
 
    res = MsgBox("Desea modificar los escandallos", vbQuestion + vbYesNo, _
                 "MODIFICAR PRECIO DE COMPRA")
 
    If res = vbNo Then Exit Sub
 
    ' ---&--- Selecciona la Hoja8
 
    Application.screenupdating=False
    Application.calculation=xlCalculationManual
    Application.EnableEvents=False
    ActiveSheet.DisplayPageBreaks = False
 
    Sheets("ART_COMP").Select
    Fila=2
 
    While Cells(Fila, "E") <> ""   ' --- Desde la fila 2 hasta que la celda de la columna E este vacía.
        des_fra = Cells(Fila, "E")
        pre_uni = Cells(Fila, "H")
 
        For Each h In Sheets
            Application.StatusBar = "Revisando hoja : " & h.Index & " de : " & Sheets.Count
            If Left(h.Name, 2) = "E." Then
                Set b = h.Columns("A").Find(des_fra, lookat:=xlWhole)
 
                If Not b Is Nothing Then
                    fila = b.Row
                    ' --- modifica precio unitario
                    h.Cells(fila, "E") = pre_uni
                    ' --- modifica coste total
                    h.Cells(fila, "F") = pre_uni * h.Cells(fila, "B")
                    'Coste total x pax
                    h.Cells(fila, "G") = h.Cells(fila, "F") / h.Range("B5") 'raciones
                    '
                    ' --- % coste total x pasx
                    u = h.Range("A" & Rows.Count).End(xlUp).Row
                    With h.Range("H7:H" & u)
                        .FormulaR1C1 = "=IF(RC[-1]="""","""",RC[-1]/R7C18)"
                        .Value = .Value
                    End With
                    ' --- Actualizar Art_vta
                    art_vta = h.Range("A3").Value
                    Set hvta = Sheets("ART_VTA.")
                    Set c = hvta.Columns("A").Find(art_vta, lookat:=xlWhole)
                    If Not c Is Nothing Then
                        '
                        hvta.Cells(c.Row, "F") = h.Range("N12") 'consumo
                        hvta.Cells(c.Row, "G") = h.Range("N13") 'margen bruto
                        hvta.Cells(c.Row, "H") = h.Range("M9") 'coste unit
                        hvta.Cells(c.Row, "I") = h.Range("M11") 'precio teorico
                    End If
                End If
            End If
        Next
 
        Sheets("ART_COMP").Select
        Fila=Fila+2
    Wend
 
    Application.screenupdating=True
    Application.calculation=xlCalculationAutomatic
    Application.EnableEvents=True
    ActiveSheet.DisplayPageBreaks = True
    Application.CutCopyMode = False
 
    MsgBox "Precio de compra actualizado en los escandallos", vbInformation
End Sub


No está probado. Estos son los cambios para lo que deseas hacer.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 14 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Necesito ayuda para adaptar una macro

Publicado por Valentinbaeza (3 intervenciones) el 25/04/2018 15:02:24
Hola Antoni, ante todo gracias por tu pronta respuesta. No sé si se ha creado un bucle pues lleva ya ejecutándose 58 minutos y sigue. Según veo en el recuento vá a un ritmo muy alto pero no da terminado. Bien es cierto que las hojas de escandallo a revisar son 462 y el número de artículos que hay en la hoja ART_COMP. ronda los 600 artículos. Crees que puede ser normal??
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.234
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Necesito ayuda para adaptar una macro

Publicado por Antoni Masana (445 intervenciones) el 25/04/2018 19:23:39
Puede haber un error en la macro, cómo ya te dije no esta probara.
Suponiendo, que es mucho suponer, que tardase 1 segundo por articulo y hoja:
600 artículos multiplicado por 462 hojas da un total de 277200 segundos que son 77 horas, que a su vez es igual a 3 días y 5 horas.
Se tendría buscar otra forma de hacerlo más rápido.

Opciones:
- Poner en la hoja de escandallos una formula que busque el precio en ART_COMP, la cuestión como y cuando llenas la hoja para poder poner la formula.
- Modificar la Macro para optimizarla. De momento y sin ver el libro y hacer pruebas no se como.
- Esto:
1
Application.StatusBar = "Revisando hoja : " & h.Index & " de : " & Sheets.Count
Consume tiempo y hay que optimizarlo, solo que consuma 1 mili-segundo en escribir ya son 277 segundos, casi 5 minutos.

Tendría que ver el libro y hacer pruebas para bajar el tiempo de proceso y se puede.

NOTA: para que el código te quede como el mio tienes que picar sobre el icono </> saldra un texto entre los símbolos:
[ code ] Reemplace este texto [ /code ]
Los espacios dentro de los corchetes sobra.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 14 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Necesito ayuda para adaptar una macro

Publicado por Valentin (3 intervenciones) el 26/04/2018 09:42:58
Hola Antoni, definitivamente pienso que entra en un bucle pues he reducido (para hacer la prueba) el número de hojas de escandallo a 9 y los artículos del ART_COMP. a 13 y erre que erre, no finaliza.
Me gustaría poder enviarte el archivo para que me ayudaras pero no quisiera hacerlo público y por eso preferiría no adjuntarlo aquí. Hay alguna otra forma de hacértelo llegar?
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.234
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Necesito ayuda para adaptar una macro

Publicado por Antoni Masana (445 intervenciones) el 26/04/2018 12:07:19
Puedes enviarlo a mi correo: amasana@hotmail.com

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar