Evento Exit del Textbox2 en VBA Excel Comparar existencia
Para DanteAmor
Dante No voy a interrumpirte el fin de semana, dejalo para lunes.
En la misma plantilla (ultima) Celdas N_T combinadas_formato person en D
Llenado el cuadro de texto, Producto (TextBox2) saliendo de este, si lo escrito en el TextBox2 (producto) ya existe en la hoja columna C11:C46 y N11:N46, darme mensaje = MsgBox "Intenta introducir un renglón ya existente. Puede editar el existente si prefiere" Salir de la macro Exit Sub
1 respuesta
Manejar el exit en un textbox, a veces, se torna complicado. Estoy declarando una variable "saliendo", para cuando estás en el textbox2, pero decides cerrar el userform.
Te anexo todo el código
Const GWL_STYLE = -16 Const WS_CAPTION = &HC00000 Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Dim colTbxs As Collection Dim saliendo ' Private Sub CheckBox1_Click() 'Por Dante amor http://www.todoexpertos.com/preguntas/6gjby9n8rtox64wr/centrar-formulario-excel-en-pantalla Dim i If CheckBox1 Then For i = 2 To 4 Controls("CheckBox" & i).Value = False ComboBox1 = "" ComboBox1.Visible = False frmLista.Height = 192 frmLista.StartUpPosition = 2 'CENTRAR EL FORMULARIO frmLista.Show Next For i = 1 To 5 Controls("TextBox" & i).Visible = False Controls("Label" & i).Visible = False cmbInsertar.Top = 155: cmbCerrar.Top = 155 CheckBox1.Top = 155: CheckBox2.Left = 354: CheckBox2.Top = 155: CheckBox3.Visible = False CheckBox4.Visible = False Next For i = 7 To 12 Controls("TextBox" & i).Visible = True Controls("TextBox" & i).Top = 18 Controls("Label" & i).Visible = True Controls("Label" & i).Top = 6 DTPicker1.Top = 18 DTPicker1.Visible = True TextBox12.Top = 71: Label12.Top = 53: Label13.Top = 53 Label13.Visible = True: Label6.Top = 6: Label6.Visible = True For o = 1 To 2 Controls("OptionButton" & o).Top = 53 Controls("OptionButton" & o).Visible = True Next Next DTPicker1 = Date CheckBox1.Caption = "DESmarca para insertar productos" Else frmLista.Height = 120 frmLista.StartUpPosition = 2 'CENTRAR EL FORMULARIO frmLista.Show ComboBox1.Visible = True CheckBox2.Value = False For i = 1 To 5 Controls("TextBox" & i).Visible = True Controls("TextBox" & i) = "" Controls("label" & i).Visible = True cmbInsertar.Top = 82: cmbCerrar.Top = 82 CheckBox1.Top = 82: CheckBox2.Top = 48: CheckBox2.Left = 154 CheckBox3.Visible = True CheckBox4.Visible = True Next For i = 7 To 12 Controls("TextBox" & i).Visible = False Controls("TextBox" & i) = "" Controls("Label" & i).Visible = False Label13.Visible = False DTPicker1.Visible = False: Label6.Visible = False For o = 1 To 2 Controls("OptionButton" & o) = False Controls("OptionButton" & o).Visible = False Next TextBox1.SetFocus Next CheckBox1.Caption = "Marca para insertar datos finales" End If End Sub Private Sub CheckBox2_Click() 'Act.Por.Dante Amor Dim i ' 'Si está activo el check de datos de identificación, entonces es para 'modificar los datos de identificación If CheckBox1 And CheckBox2 Then If OptionButton1 = False And OptionButton2 = False Then MsgBox "Selecciona una página" CheckBox2 = False Exit Sub End If If OptionButton1 Then DTPicker1 = Range("C8") 'Fecha TextBox7 = Range("E8") 'Nombre Empresa TextBox8 = Range("J8") 'Repuestos para TextBox9 = Range("D9") 'Serial Maq/Mot. TextBox10 = Range("G9") 'Marca TextBox11 = Range("K9") 'Modelo/Ident. TextBox12 = Range("D47") 'Notas Exit Sub Else DTPicker1 = Range("N8") 'Fecha TextBox7 = Range("p8") 'Nombre Empresa TextBox8 = Range("U8") 'Repuestos para TextBox9 = Range("O9") 'Serial Maq/Mot. TextBox10 = Range("R9") 'Marca TextBox11 = Range("V9") 'Modelo/Ident. TextBox12 = Range("O47") 'Notas Exit Sub End If End If ' If CheckBox2 Then '''''''''' Call CargaCombobox2 '''''''''' Else ComboBox1.Enabled = False Call Limpiar ComboBox1 = "" End If End Sub ' Sub CargaCombobox2() With ComboBox1 .Enabled = True 'carga nuevamente el combo con los nuevos registros .Clear For i = 11 To 46 'Range("B" & Rows.Count).End(xlUp).Row 'original ("B" If Cells(i, "B") <> "" Then .AddItem Cells(i, "C") '1ª columna C ComboBox .List(ComboBox1.ListCount - 1, 1) = Cells(i, "D") '2ª columna D ComboBox .List(ComboBox1.ListCount - 1, 2) = i .List(ComboBox1.ListCount - 1, 3) = Columns("B").Column End If Next For i = 11 To 46 If Cells(i, "N") <> "" Then .AddItem Cells(i, "N") .List(ComboBox1.ListCount - 1, 1) = Cells(i, "O") .List(ComboBox1.ListCount - 1, 2) = i .List(ComboBox1.ListCount - 1, 3) = Columns("M").Column End If Next End With End Sub Private Sub CheckBox3_Click() If CheckBox3 Then With TextBox4 .ForeColor = vbRed 'RGB(255, 0, 0) .Font.Bold = True End With Else With TextBox4 .ForeColor = &H80000008 .Font.Bold = False End With End If End Sub Private Sub CheckBox4_Click() Dim i If CheckBox4 Then For i = 1 To 5 With Controls("TextBox" & i) .ForeColor = vbRed 'RGB(255, 0, 0) .Font.Bold = True End With Next i Else For i = 1 To 5 With Controls("TextBox" & i) .ForeColor = &H80000008 .Font.Bold = False End With Next End If End Sub Private Sub cmbCerrar_Click() Unload Me saliendo = True End Sub Private Sub cmbInsertar_Click() 'validar datos insertar End Sub Sub insertar() 'Por.Dante Amor http://www.todoexpertos.com/preguntas/6dfdswlh5iak7bjd/correccion-para-macro-excel-para-insertar-datos-mandando-error 'Obligar a llenar las cajas del 6 al 9 Dim vcs, vtx, LastRow, u ', i Dim i As Double Application.ScreenUpdating = False ActiveSheet.Unprotect Password:="By Jot@" Errores = False 'variable para verificar uno a uno o TODOS A LA VES los TextBox 'Insertar Ultimos datos If CheckBox1 Then 'Mensage sobre TextBox para Datos Finales ' If OptionButton1 = False And OptionButton2 = False Then MsgBox "Selecciona una página" Exit Sub End If ' vcs = Array("DTPicker1", "Textbox7", "Textbox8", "Textbox9", "Textbox10", "Textbox11") vtx = Array("UNA FECHA VALIDA", "EL NOMBRE DE EMPRESA", "REPESTOS PARA", "EL SERIAL MAQ/MOT", "LA MARCA", "EL MODELO/IDENT.") For i = LBound(vcs) To UBound(vcs) If Me.Controls(vcs(i)) = Empty Then MsgBox "DEBES INTRODUCIR: " & vtx(i), vbExclamation, "LLENAR LISTA" Me.Controls(vcs(i)).SetFocus 'Exit Sub 'Colocado este aqui, verifica uno a uno los TextBox. No hace parte de la variable errores Errores = True End If If Errores Then Exit Sub 'Colocado aqui, verifica uno a uno los TextBox Next 'If errores Then Exit Sub 'Colocado aqui, verifica TODOS TextBox a la ves ' 'If Range("c8") = "" Then 'SI LA C8 ESTA VACIA, INSERTA EN LA 1ª PAGINA If OptionButton1 Then Range("C8") = DTPicker1 'Fecha Range("E8") = TextBox7 'Nombre Empresa Range("J8") = TextBox8 'Repuestos para Range("D9") = TextBox9 'Serial Maq/Mot. Range("G9") = TextBox10 'Marca Range("K9") = TextBox11 'Modelo/Ident. Range("D47").Value = Left(TextBox12.Value, 450) 'Notas Else 'Si encuentra la C8 ya llena inserta en la 2ª pagina Range("N8") = DTPicker1 'Fecha Range("P8") = TextBox7 'Nombre Empresa Range("U8") = TextBox8 'Repuestos para Range("O9") = TextBox9 'Serial Maq/Mot. Range("R9") = TextBox10 'Marca Range("V9") = TextBox11 'Modelo/Ident. Range("O47").Value = Left(TextBox12.Value, 450) 'Notas End If TextBox7.SetFocus '''''''''''' Else 'Mensage sobre TextBox para Productos vcs = Array("TextBox1", "Textbox2", "Textbox3", "Textbox4", "Textbox5") vtx = Array("UN ITEM", "EL # DE PRODUCTO", "LA DESCRIPCION DEL PRODUCTO", "LA CANTIDAD", "EL # DE PAGINA") For i = LBound(vcs) To UBound(vcs) If Me.Controls(vcs(i)) = Empty Then MsgBox "DEBES INTRODUCIR: " & vtx(i), vbExclamation, "LLENAR LISTA" 'Exit Sub 'Colocado este aqui, verifica uno a uno los TextBox. No hace parte de la variable errores Me.Controls(vcs(i)).SetFocus Errores = True End If If Errores Then Exit Sub 'Colocado aqui, verifica uno a uno los TextBox Next 'If errores Then Exit Sub 'Colocado aqui, verifica TODOS TextBox a la ves If CheckBox2 Then 'modifica producto fil = Val(ComboBox1.List(ComboBox1.ListIndex, 2)) col = Val(ComboBox1.List(ComboBox1.ListIndex, 3)) Else 'inserta producto fil = 11 col = Columns("B").Column Do While Cells(fil, col) <> "" fil = fil + 1 If fil = 47 Then col = Columns("M").Column: fil = 11 Loop End If ''''' wcolor = vbBlack: wbold = False If CheckBox4 Then wcolor = 3: wbold = True Call Formatear(fil, col, wcolor, wbold, TextBox1.Value) Call Formatear(fil, col + 1, wcolor, wbold, TextBox2.Value) Call Formatear(fil, col + 2, wcolor, wbold, TextBox3.Value) Call Formatear(fil, col + 8, wcolor, wbold, TextBox4.Value) Call Formatear(fil, col + 9, wcolor, wbold, TextBox5.Value) ' wcolor = vbBlack: wbold = False If CheckBox3 Then wcolor = 3: wbold = True Cells(fil, col) = TextBox1 'Item # Cells(fil, col + 1) = TextBox2 'Producto # Cells(fil, col + 2) = TextBox3 'Descripcion del Producto Cells(fil, col + 8) = TextBox4 'Cant. Cells(fil, col + 8).Font.ColorIndex = wcolor Cells(fil, col + 8).Font.Bold = wbold Cells(fil, col + 9) = TextBox5 'Pagina # End If ''''' Call CargaCombobox2 TextBox1.SetFocus End If ActiveSheet.Protect Password:="By Jot@" Application.ScreenUpdating = True Call Limpiar ComboBox1 = "" 'Subir la hoja If Range("C46") = "" Then 'Obtener la última fila con datos de la columna B u = Range("B" & Rows.Count).End(xlUp).Row 'Si la ventana tiene los paneles inmovilizados, entonces n va a ser igual a 10 de lo contrario n =17 If ActiveWindow.FreezePanes = True Then n = 16 Else n = 23 'original es 10 17 'Ahora si la última fila con dato es mayor a 17, significa que tengo que mover los datos de la ventana "scroll" 'Entonces voy a mover la ventana haciendo un scroll hasta la última fila pero le resto las filas que quiero que permanezcan visibles. If u > 23 Then ActiveWindow.ScrollRow = u - n Else 'Obtener la última fila con datos de la columna M u = Range("M" & Rows.Count).End(xlUp).Row If ActiveWindow.FreezePanes = True Then n = 16 Else n = 23 'original es 10 17 Se puede jugar con estos números If u > 23 Then ActiveWindow.ScrollRow = u - n 'Original 17 End If End Sub Sub Formatear(fil, col, wcolor, wbold, wtext) Cells(fil, col) = wtext Cells(fil, col).Font.ColorIndex = wcolor Cells(fil, col).Font.Bold = wbold If CheckBox4 Then Cells(fil, col).Interior.ColorIndex = 43 Else Cells(fil, col).Interior.ColorIndex = 0 End If End Sub Private Sub ComboBox1_Change() 'Por.Dante Amor 'Llenar textbox Dim f If ComboBox1.ListIndex = -1 Then TextBox1 = "" TextBox2 = "" TextBox3 = "" TextBox4 = "" TextBox5 = "" Exit Sub End If f = Val(ComboBox1.List(ComboBox1.ListIndex, 2)) c = Val(ComboBox1.List(ComboBox1.ListIndex, 3)) TextBox1 = Cells(f, c) TextBox2 = Cells(f, c + 1) TextBox3 = Cells(f, c + 2) TextBox4 = Cells(f, c + 8) TextBox5 = Cells(f, c + 9) End Sub Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _ ByVal x As Single, ByVal Y As Single) ComboBox1.DropDown End Sub Private Sub DTPicker1_Change() TextBox7.SetFocus End Sub Private Sub OptionButton1_Click() CheckBox2 = False End Sub Private Sub OptionButton2_Click() CheckBox2 = False End Sub Private Sub TextBox1_Change() TextBox1 = Format(TextBox1, "000") End Sub Private Sub TextBox10_Change() TextBox10.Text = UCase(TextBox10.Text) End Sub Private Sub TextBox12_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then insertar End Sub Private Sub TextBox12_Change() 'Dar propiedades de MaxLength 450 al textBox12 para conteo reversible Label13 = 450 - VBA.Len(TextBox12) If VBA.Len(TextBox12) > 449 Then MsgBox "Llegaste al MAX de caracteres permitidos" & vbCr & vbCr & _ "Trata de ser explicit@ y entendible en tu Nota/Observación", vbInformation, "Información": Exit Sub End Sub Private Sub TextBox2_Change() TextBox2.Text = UCase(TextBox2.Text) End Sub Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) If saliendo Or TextBox2 = "" Then Exit Sub Set r = Range("C11:C46, N11:N46") Set b = r.Find(TextBox2, lookat:=xlWhole) If Not b Is Nothing Then MsgBox "Intenta introducir un renglón ya existente. " & _ "Puede editar el existente si prefiere" Cancel = True End If End Sub Private Sub TextBox3_Change() TextBox3.Text = UCase(TextBox3.Text) End Sub Private Sub TextBox5_Change() TextBox5.Text = UCase(TextBox5.Text) End Sub Private Sub TextBox5_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then insertar End Sub Private Sub TextBox9_Change() TextBox9.Text = UCase(TextBox9.Text) End Sub Private Sub UserForm_Initialize() Dim celda 'Ocutar barra de titulo Dim lngWindow As Long, lFrmHdl As Long frmLista.Height = 116 frmLista.Width = 579.75 lFrmHdl = FindWindowA(vbNullString, Me.Caption) lngWindow = GetWindowLong(lFrmHdl, GWL_STYLE) lngWindow = lngWindow And (Not WS_CAPTION) Call SetWindowLong(lFrmHdl, GWL_STYLE, lngWindow) Call DrawMenuBar(lFrmHdl) 'Cargar combo With ComboBox1 .Clear For Each celda In Range("C11:C" & Range("B" & Rows.Count).End(xlUp).Row) 'original("D11:D" If celda <> Empty Then .AddItem celda.Value '''''''''''' .List(ComboBox1.ListCount - 1, 1) = celda.Offset(0, 1) End If '''''''''''' Next End With 'Cargar textbox Dim ctlLoop As MSForms.Control Dim clsObject As Clase1 'Create New Collection To Store Custom Textboxes Set colTbxs = New Collection 'Bucle a través de controles en Userform For Each ctlLoop In Me.Controls 'Compruebe si el Control es un control Textbox ''If TypeOf ctlLoop Is MSForms.TextBox Then 'PROBAR ACTIVAR este, el Case y el End If Select Case ctlLoop.Name 'agregar los textbox con su nombre propio que sí entran en Tipo Titulo cada palabra de una frase ''Case "TextBox3", "TextBox7", "TextBox8", "TextBox10", "TextBox11" Case "TextBox7", "TextBox8", "TextBox11" 'Crear una nueva instancia de la clase del controlador de eventos minom = ctlLoop.Name If TypeOf ctlLoop Is MSForms.TextBox Then 'Crear una nueva instancia de la clase de controlador de eventos Set clsObject = New Clase1 'Establecer la nueva instancia para controlar los eventos de nuestro cuadro de texto Set clsObject.tbxCustom1 = ctlLoop 'Agregar el controlador de eventos a nuestra colección colTbxs.Add clsObject End If End Select ''End If Next ctlLoop saliendo = False End Sub 'Fin cargar textbox
Lo recomendable es que hagas la validación en el botón insert
Sal u dos
Tu eres el que sabe, yo voy por tu recomendación.
Podía ser en el botón Insertar, pero no cerrar el form para poder continuar, es decir, salir de la macro sin cerrar el form
Perdona mi ignorancia Dante
¿Qué beneficio tengo en este caso?
Me manda mensaje y le doy Aceptar al mensaje, CORRECTO
Pero si decido Cerrar el form no me deja apareciendo siempre el mensaje cada ves que piso CERRAR
¿Cuál el beneficio?
Claro que así, daría para buscar cualquier registro en caso de querer saber si ya esta o no registrado, pero claro está que está echo para que siga registrando.
Puedo hacer que al Aceptar en el MsgBox, limpie el textbox2 y así si deja salir si es el caso.
Voy prueba
- Compartir respuesta