UniversoExcelForo

Respuesta a consultas.
Fecha de creación: 09.Abril.2012

Fundadores: Wibly,Tyno,Servando,Sakkar,Rosendo2,RMaximo,Railar,Mcoronel,Ioyama,Igtelo,Hugotron,Drochar,Dedos,Alberto,Adolfo

No se pueden hacer consultas de Excel o VBA por mensaje privado.
Utiliza el botón buscar del foro y te ahorras tiempo para obtener "ayuda".

No estás conectado. Conéctate o registrate

Ver el tema anterior Ver el tema siguiente Ir abajo  Mensaje [Página 1 de 1.]

Jhonsi70


Hola Amigos!
Una vez más recurro a Uds. en busca de ayuda.
Tengo un libro con tres hojas: ALBARÁN, VENTAS y PRECIOS.
En la hoja "ALBARÁN", tengo una macro que al pulsar botón pasa los datos a la hoja "VENTAS" y descuenta el peso neto en la hoja "PRECIOS" en la columna de Sctok y por último borra el contenido de la hoja.

La macro funciona bien cuando el código de producto (columa A, hoja ALBARÁN), es númerico, pero ahora necesito que al intruducir código de producto alfanumerico descuente el importe de la columna G de la hoja ALBArÁN, en la columna M de la hoja PRECIOS.
Para saber la fila en la que tiene que descontar el importe, tiene que coger el código alfanúmerico (siempre empieza con las letras OF), y desechar las letras, asi nos queda de nuevo una referencia númerica.

Espero haberme explicado bien, pero si no es así, por favor, diganmelo.
Mil gracias y un saludo
Archivos
VENTAS.xlsm
adjunto archivo
No tienes los permisos para descargar los archivos.
(111 KB)

tyno


Hola Jhonsi.

prueba de modificar la parte del código para DESCONTAR, de esta manera:

'*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*
'DESCONTAR
On Error Resume Next
With Sheets("PRECIOS")
For a = 18 To 57
If Cells(a, 1) <> "" Then
If Left(Cells(a, 1), 2) = "OF" Then
codigo = Replace(Cells(a, 1), "OF", "")
rw = .Range("a15:a65536").Find(CInt(codigo), lookat:=xlWhole).Row
.Cells(rw, 12) = (.Cells(rw, 12) * 1) - (Cells(a, 7) * 1)
Else
codigo = Cells(a, 1)
rw = .Range("a15:a65536").Find(codigo, lookat:=xlWhole).Row
.Cells(rw, 5) = (.Cells(rw, 5) * 1) - (Cells(a, 7) * 1)
End If
End If
Next a
End With
'*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*

Saludos

Jhonsi70


Hola tyno!
Gracias por tu ayuda... Razz,  por lo que he probado parece que funciona como queria, pero voy hacer unas cuantas pruebas más y ya cierro el tema.

No se si es correcto aprovecharme más de tu ayuda, para hacerte una colsulta que no logro resolver.

En un libro que contiene muchas macros,  formularios y userform, he puesto en la celda A13 una formula matricial: {=INDICE(A:A;MAX(SI(A:A<>"";FILA(A:A))))}
La formula funciona correctamente, (busca el ultimo valor de la columna "A"

Lo que pasa es que todo el libro se vuelve loco, o los userform se quedan colgados o las macros dan errores que sin la formula no dan y todo funciona mucho más lento

Me podrías decir si es incompatible una formula matricial con un libro que trabaja con macros?

O puedes ayudarme a crear una macro que al introducir un dato en el rango A18:A57 en la celda A13 aparezca el último valor introducido?

Te agradecería mucho me ayudarás, porque no entiendo porque pasa esto con la formula matricial.

Gracias y un saludo
Pd:sigo probando, para poder cerrar tema cuanto antes

tyno


Hola Jhonsi.
Con respecto a tu consulta sobre la formula matricial y macros te diría  si son compatibles pero efectivamente el proceso de una macro se vuelve lento cuando simultáneamente hay formulas que evalúan grandes rangos de datos porque Excel tiene el doble trabajo de procesar las macros y a su vez calcular las formulas.
Para esto se me ocurre dos opciones:
1 Cuando se ejecute la macro hay que deshabilitar el calculo automático de Excel, con esto liberamos a Excel de estar calculando las formulas mientras se ejecuta la macro y al final el proceso de está se vuelve a habilitar el calculo automático:

Supongamos que quieres que el calculo automático se  se interrumpa cuando ejecutamos un Userform por el motivo que se vuelve muy pesado el archivo, entonces el código quedaría así:

Private Sub UserForm_Initialize()
Application.Calculation = xlCalculationManual


...


End Sub


Luego al cerrar el formulario volvemos a activar el calculo automático de  Excel:

Private Sub UserForm_Terminate()
Application.Calculation = xlCalculationAutomatic
End Sub


Otra alternativa con la instrucción Application.Calculation es que se puede aplicar también en el código de una macro para interrumpir el calculo automático cuando esta empieza a correr, por ejemplo:

Sub mi_macro()


Application.Calculation = xlCalculationManual



....
código de la macro
....




Application.Calculation = xlCalculationAutomatic
End Sub

Hay que tener en cuenta que si nuestra macro interactua con alguna formula en el archivo obviamente no va a funcionar si tenemos el calculo de Excel en "manual"

2 Otra opcion para "desactivar" las formulas matriciales es con un simple SI CONDICIONAL: 

 {=SI(A1="";"";INDICE(A:A;MAX(SI(A:A<>"";FILA(A:A)))))}

En este ejemplo le decimos a la formula que si en la celda A1 no hay nada que no calcule nada, de lo contrario si que efectué el calculo.
Yo puse A1 como ejemplo, desde luego puede ser la celda que mas nos convenga.

Esto  también funcionaria mas o menos con el mismo principio anterior, por ejemplo:

Al iniciar el formulario establecemos que se borre cualquier dato de la celda A1, lo que "desactivara" la o las formulas que dependan de esta celda.

Private Sub UserForm_Initialize()
Range(a1)=""


...


End Sub

Al cerrar el formulario, establecemos ingresar algun tipo de dato en  la celda A1, no importa cual, en este caso yo elegí una "X"

Private Sub UserForm_Terminate()
Range("a1") = "x"
End Sub

Lo mismo si queremos "desactivar" las formulas cuando se ejecuta una  macro:

Sub mi_macro()


Range("a1") = ""



....
código de la macro
....




Range("a1") = "x"

End Sub

O sea que para este caso hay que anidar todas las formulas "pesadas" dentro de la función SI LOGICO y el dato que vamos a usar de referencia para desactivar le ponemos la fuente en color blanco para ocultarlo o bien elegimos una celda que este lejos de la visualización, por ejemplo celda XFD1.

Espero esto resuelva tu inconveniente. Saludos

Jhonsi70


Mil gracias Tyno por la ayuda... Very Happy 

La macro que modificaste funciona perfectamente en mi hoja de calculo.

Gracias de nuevo por la explicación y los ejemplos que me proporcionas para resolver mi problema. Voy ha probar todas las opciones que me comentas y ver cual es la mejor  en mi libro de trabajo.

Un saludo.

Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.