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
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
0