Jump to content
Sign in to follow this  
DRAMIDOM

[CERRADO]Ayuda con macro para poder terminarlo

Recommended Posts

Respuesta: Ayuda con macro para poder terminarlo

Hola DRAMIDOM

En tus eventos initialize de cada uno de tus forms, borra el anterior código y pega el siguiete código respectivamente:

Código para tu form1

Private Sub UserForm_Initialize()
'Código para el Userform1 "Devoluciones"
Dim AllCells As Range
Dim myAllcells As Range
Dim mysort As Range
Dim sht As Worksheet
Dim ultcel2 As String
Dim matriz() As Variant
Dim i As Long


ThisWorkbook.Activate
' Lista de los valores para combobox
With Sheets("1a")
If .Range("A" & Rows.Count).End(xlUp).Row = 1 Or .Range("A" & Rows.Count).End(xlUp).Row = 2 Then Exit Sub

Set AllCells = .Range("a1:a" & .Range("A" & Rows.Count).End(xlUp).Row)
End With
'Hoja puente para extraer unicos y ordenar valores
Application.ScreenUpdating = False
On Error Resume Next
Set sht = Sheets("HOJAPUENTE")
On Error GoTo 0

If sht Is Nothing Then
Set sht = Sheets.Add
sht.Name = "HOJAPUENTE"
End If
' Elimina los datos duplicados
sht.Cells.ClearContents

AllCells.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=sht.Range("A1"), Unique:=True

With sht
Set mysort = Range("A1", .Cells(Rows.Count, "A").End(xlUp))
mysort.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Set myAllcells = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
End With

ReDim matriz(1 To myAllcells.Cells.Count)

For i = 1 To myAllcells.Cells.Count
matriz(i) = myAllcells.Cells(i)
Next i

Me.Codigo.List() = matriz
Application.DisplayAlerts = False
sht.Delete
Application.DisplayAlerts = True

ultcel2 = Hoja4.Range("A" & Rows.Count).End(xlUp).Address

NoCarta = Worksheets("Devolucion").Range("J2").Value
NoCarta = NoCarta + 1
Fecha.Text = VBA.Date
If ultcel2 = "$A$2" Then
Application.ScreenUpdating = True
Exit Sub
End If
Codigos1.RowSource = "Comentarios!$A$2:" & ultcel2
Codigos2.RowSource = Codigos1.RowSource
Codigos3.RowSource = Codigos1.RowSource
Application.ScreenUpdating = True

Set AllCells = Nothing
Set myAllcells = Nothing
Set sht = Nothing
Set mysort = Nothing
Erase matriz
End Sub[/CODE]

Código para tu form2:

[CODE]Private Sub UserForm_Initialize()
'Código userfomr2 "Busqueda de devoluciones por proveedor"
Dim AllCells As Range
Dim myAllcells As Range
Dim mysort As Range
Dim sht As Worksheet
Dim matriz() As Variant
Dim i As Long
ThisWorkbook.Activate
' Lista de los valores para combobox

With Sheets("1a")
If .Range("A" & Rows.Count).End(xlUp).Row = 1 Or .Range("A" & Rows.Count).End(xlUp).Row = 2 Then Exit Sub

Set AllCells = .Range("a1:a" & .Range("A" & Rows.Count).End(xlUp).Row)
End With
'Hoja puente para extraer unicos y ordenar valores
Application.ScreenUpdating = False
On Error Resume Next
Set sht = Sheets("HOJAPUENTE")
On Error GoTo 0

If sht Is Nothing Then
Set sht = Sheets.Add
sht.Name = "HOJAPUENTE"
End If
' Elimina los datos duplicados
sht.Cells.ClearContents

AllCells.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=sht.Range("A1"), Unique:=True

With sht
Set mysort = Range("A1", .Cells(Rows.Count, "A").End(xlUp))
mysort.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Set myAllcells = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
End With

ReDim matriz(1 To myAllcells.Cells.Count)

For i = 1 To myAllcells.Cells.Count
matriz(i) = myAllcells.Cells(i)
Next i

Me.Codigo.List() = matriz
Application.DisplayAlerts = False
sht.Delete
Application.DisplayAlerts = True


Application.ScreenUpdating = True

Set AllCells = Nothing
Set myAllcells = Nothing
Set sht = Nothing
Set mysort = Nothing
Erase matriz
End Sub[/CODE]

Cambia el código, haz varias pruebas y nos cuentas como te fue, espero ahora si se gane velocidad.

Respecto a tu otra consulta, te recomiendo que busques en los ejemplos del master ioyama, con un filtro avanzado automatizado pues lograr lo que deseas

saludos cordiales

Gracias, ahora voy a realizar los cambios y probar su funcionamiento.

Share this post


Link to post
Share on other sites

Respuesta: Ayuda con macro para poder terminarlo

Ok acabo de probar y funciono excelente, aunque cuando cambie el userform 2 vi que aparecen todos los codigos y que al escojer sino tienen devoluciones me informa de que no tienen y que ademas me informa de que hay valores que estan repetidos, en esa parte dejare el archivo igual ya que solo quiero que me presente aquellos codigos que le haya realizado devoluciones.

Share this post


Link to post
Share on other sites

Respuesta: Ayuda con macro para poder terminarlo

Perdon, algo mas que olvide solicitar, como mostrar la hoja aun cuando este ejecutando el macro, ya que para poder ver algun dato que se encuentre en alguna hoja tengo que salir, hay alguna forma de hacerlo, vi que hay una opcion llamada mostrar hojas pero no se como ejecutarla.

Share this post


Link to post
Share on other sites

Respuesta: Ayuda con macro para poder terminarlo

Hola

Ok, para el form 2 utiliza el siguiente código (para que solo muestre los codigos de los que hay devoluciones, asi como lo tenias antes)

En la medida que vaya creciendo tu base de datos notarás que a la hora de cargar el form, con este código se ahorrará velocidad, ya que el autofiltro de MS Excel es rapidisimo.

Private Sub UserForm_Initialize()
'Código userfomr2 "Busqueda de devoluciones por proveedor"
Dim AllCells As Range
Dim myAllcells As Range
Dim mysort As Range
Dim sht As Worksheet
Dim matriz() As Variant
Dim i As Long
ThisWorkbook.Activate
' Lista de los valores para combobox

With Sheets("Relacion")
If .Range("A" & Rows.Count).End(xlUp).Row = 1 Or .Range("A" & Rows.Count).End(xlUp).Row = 2 Then Exit Sub

Set AllCells = .Range("a1:a" & .Range("A" & Rows.Count).End(xlUp).Row)
End With
'Hoja puente para extraer unicos y ordenar valores
Application.ScreenUpdating = False
On Error Resume Next
Set sht = Sheets("HOJAPUENTE")
On Error GoTo 0

If sht Is Nothing Then
Set sht = Sheets.Add
sht.Name = "HOJAPUENTE"
End If
' Elimina los datos duplicados
sht.Cells.ClearContents

AllCells.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=sht.Range("A1"), Unique:=True

With sht
Set mysort = Range("A1", .Cells(Rows.Count, "A").End(xlUp))
mysort.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Set myAllcells = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
End With

ReDim matriz(1 To myAllcells.Cells.Count)

For i = 1 To myAllcells.Cells.Count
matriz(i) = myAllcells.Cells(i)
Next i

Me.Codigo.List() = matriz
Application.DisplayAlerts = False
sht.Delete
Application.DisplayAlerts = True


Application.ScreenUpdating = True

Set AllCells = Nothing
Set myAllcells = Nothing
Set sht = Nothing
Set mysort = Nothing
Erase matriz
End Sub[/CODE]

Para poder ocultar el form tienes dos alternativas, una es ocultar el form (con un boton, mediante programacion y con otro boton o una asignacion de teclas mostrarlo), y la otra alternativa es cambiar la prodiedad ShowModal=False, con este ultimo debes tener cuidado, ya que cuando inicias el form se activa el libro y si por ejemplo cambias de libro (activas otro libro manualmente) y encuentra un nombre de hoja similar, podria hacerte cambios que no deseeas

Saludos

Share this post


Link to post
Share on other sites

Respuesta: Ayuda con macro para poder terminarlo

Hola

Ok, para el form 2 utiliza el siguiente código (para que solo muestre los codigos de los que hay devoluciones, asi como lo tenias antes)

En la medida que vaya creciendo tu base de datos notarás que a la hora de cargar el form, con este código se ahorrará velocidad, ya que el autofiltro de MS Excel es rapidisimo.

Private Sub UserForm_Initialize()
'Código userfomr2 "Busqueda de devoluciones por proveedor"
Dim AllCells As Range
Dim myAllcells As Range
Dim mysort As Range
Dim sht As Worksheet
Dim matriz() As Variant
Dim i As Long
ThisWorkbook.Activate
' Lista de los valores para combobox

With Sheets("Relacion")
If .Range("A" & Rows.Count).End(xlUp).Row = 1 Or .Range("A" & Rows.Count).End(xlUp).Row = 2 Then Exit Sub

Set AllCells = .Range("a1:a" & .Range("A" & Rows.Count).End(xlUp).Row)
End With
'Hoja puente para extraer unicos y ordenar valores
Application.ScreenUpdating = False
On Error Resume Next
Set sht = Sheets("HOJAPUENTE")
On Error GoTo 0

If sht Is Nothing Then
Set sht = Sheets.Add
sht.Name = "HOJAPUENTE"
End If
' Elimina los datos duplicados
sht.Cells.ClearContents

AllCells.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=sht.Range("A1"), Unique:=True

With sht
Set mysort = Range("A1", .Cells(Rows.Count, "A").End(xlUp))
mysort.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Set myAllcells = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
End With

ReDim matriz(1 To myAllcells.Cells.Count)

For i = 1 To myAllcells.Cells.Count
matriz(i) = myAllcells.Cells(i)
Next i

Me.Codigo.List() = matriz
Application.DisplayAlerts = False
sht.Delete
Application.DisplayAlerts = True


Application.ScreenUpdating = True

Set AllCells = Nothing
Set myAllcells = Nothing
Set sht = Nothing
Set mysort = Nothing
Erase matriz
End Sub[/CODE]

Para poder ocultar el form tienes dos alternativas, una es ocultar el form (con un boton, mediante programacion y con otro boton o una asignacion de teclas mostrarlo), y la otra alternativa es cambiar la prodiedad ShowModal=False, con este ultimo debes tener cuidado, ya que cuando inicias el form se activa el libro y si por ejemplo cambias de libro (activas otro libro manualmente) y encuentra un nombre de hoja similar, podria hacerte cambios que no deseeas

Saludos

Ok, gracias intentare ver que pueda hacer ya que me gustaria poder ver los libros aun cuando tenga el form abierto.

Share this post


Link to post
Share on other sites

Respuesta: Ayuda con macro para poder terminarlo

Hola

La ShowModal es propiedad de los form, selecciona el form1, luego en el menú ver ventana de propiedades, en esa ventana buscas la propiedad showModal y cambias el valor de True a false y listo, (ojo para que se salga la ventana de las propiedades del form, debes seleccionar unicamente el form y no los controles que contiene, notaras que tienes seleccionada esa ventana porque en el Name te aprarecera Userform1 o Userform2 respectivamente).

En cuanto al código, habria que ver que esta sucediendo, en el archivo de muestra si me funciona, quizas hayas cambiado alguna variable, nombre de hoja, etc.

saludos

Share this post


Link to post
Share on other sites

Respuesta: Ayuda con macro para poder terminarlo

Hola

La ShowModal es propiedad de los form, selecciona el form1, luego en el menú ver ventana de propiedades, en esa ventana buscas la propiedad showModal y cambias el valor de True a false y listo, (ojo para que se salga la ventana de las propiedades del form, debes seleccionar unicamente el form y no los controles que contiene, notaras que tienes seleccionada esa ventana porque en el Name te aprarecera Userform1 o Userform2 respectivamente).

En cuanto al código, habria que ver que esta sucediendo, en el archivo de muestra si me funciona, quizas hayas cambiado alguna variable, nombre de hoja, etc.

saludos

Ok, bueno probare aunque estoy pensando dejar algunas cosas como estaban, ya que utilizo tres cartas dependiendo el tipo de proveedor y donde me daba mas problema es en una donde tengo mas de cinco mil, y note que en al cambiar por el codigo nuevo, anteriormente podia digitar el numero pero ahora tendre que buscarlo seleccionando hacia abajo hasta encontrarlo, mientras que antes solo digitaba el numero y aparecia, tendre que usar esto solo para la hoja donde tarda mucho en cargar.

Share this post


Link to post
Share on other sites

Respuesta: Ayuda con macro para poder terminarlo

Hola

Lo que sucede es que el combo esta funcionando como una lista desplegable (con ello se evitan errores de tecleo) si deseas puedes cambiar la propiedad del combo para que te funcione como antes (y poder escribir directamente dentro de el), selecciona el combo en tu form (el combo codigo) y en cuadro de propiedades busca la propiedad style y modifica fmStyleDropDownList por fmStyleDropDownCombo, cuando estes ejecutando la macro, para que se produzca le evento change, tecleas por ejemplo el codigo 2000 y luego pulsas la tecla de flecha hacia abajo y con ello se provocara el evento para que traiga los datos

Deberas tener presente que al introducir cualquier caracter se producira el evento change, por ejemplo digamos que buscas el codigo 2000 entonces al introucir el primer 2 la macro buscara ese codigo si no lo encuentra te lo indicara, al introducir el siguiente cero 20 buscara ese codigo y asi ira buscanca conforme vayas introduciendo caracteres, mediante la porpiedad MatchEntry puedes elegir el modo en el que trabajara tu combo

Si pudieses subir el ultimo archivo (con pocos datos, aunque no sean reales solo que se conserve la estructura) seria estupendo, ya que asi seria más facil trabajar, ya que quizas el archivo que tengo como muestra ya difiere del archivo real.

saludos

Share this post


Link to post
Share on other sites

Respuesta: Ayuda con macro para poder terminarlo

Hola

Lo que sucede es que el combo esta funcionando como una lista desplegable (con ello se evitan errores de tecleo) si deseas puedes cambiar la propiedad del combo para que te funcione como antes (y poder escribir directamente dentro de el), selecciona el combo en tu form (el combo codigo) y en cuadro de propiedades busca la propiedad style y modifica fmStyleDropDownList por fmStyleDropDownCombo, cuando estes ejecutando la macro, para que se produzca le evento change, tecleas por ejemplo el codigo 2000 y luego pulsas la tecla de flecha hacia abajo y con ello se provocara el evento para que traiga los datos

Deberas tener presente que al introducir cualquier caracter se producira el evento change, por ejemplo digamos que buscas el codigo 2000 entonces al introucir el primer 2 la macro buscara ese codigo si no lo encuentra te lo indicara, al introducir el siguiente cero 20 buscara ese codigo y asi ira buscanca conforme vayas introduciendo caracteres, mediante la porpiedad MatchEntry puedes elegir el modo en el que trabajara tu combo

Si pudieses subir el ultimo archivo (con pocos datos, aunque no sean reales solo que se conserve la estructura) seria estupendo, ya que asi seria más facil trabajar, ya que quizas el archivo que tengo como muestra ya difiere del archivo real.

saludos

Ya probe el cambio y todo bien, aunque cuando digito un codigo de mas de cuatro caracteres aunque exista por ejemplo 1505 cuando voy digitando 150 como no existe me lo advierte pero luego puedo continuar, pero por lo menos eso no me preocupa, pero seria tener que recorrer 4000 numeros para poder llegar al 4001.

De veras gracias por tu ayuda me ha servido bastante, el archivo que he preparado esta bien modificado que subirlo aca tendria que modificar muchas cosas para poder subirlo y me tomaria mas tiempo hacerlo y como guardo informacion de asuntos de la empresa no puedo subir esos datos aca, sino con todo el gusto lo haria.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

×
×
  • Create New...

Important Information

Privacy Policy