............ Foro Excel
Si no lo has hecho aún: REGISTRATE!!!

Evitar duplicar datos en columnas

Ver el tema anterior Ver el tema siguiente Ir abajo

Evitar duplicar datos en columnas

Mensaje por qwertyu el Miér Oct 07, 2009 11:06 pm

Estimados foreros:
Tengo una planilla donde en la primera columna ingreso la fecha, en la segunda columna igreso el turno que va de 1 a 4, por día, en las siguinte la clase A,B,C...y en la última el Total

FECHA TURNO A B C D TOTAL

01/10/2009 1 34 45 39 45 163
01/10/2009 2 45 41 42 41 169
01/10/2009 3 43 39 37 41 160
01/10/2009 4 41 39 38 43 161
07/10/2009 1 45 41 39 40 165(*)
07/10/2009 1 45 34 39 40 158(*)
07/10/2009 2 39 38 40 41 158
07/10/2009 3 45 39 38 40 162
07/10/2009 4 32 38 40 39 149


Hice una macro que ingresa los datos por formulario, ordena los datos en forma ascendente por Fecha y Turno, y centra todos los datos en cada celda del rango.
Lo que no he podido hacer una rutina para evitar ingresar datos repetidos, como los que se observa en la columna 5 y 6 (*), que se repitió la fecha y el turno,
Como puedo evitar repetir ingresos de datos indexado por fecha y turno simultáneamente, debe ingresarse una vez por dia cada turno.
espero me puedan ayudar.
aqui adjunto todo el código.

Private Sub CommandButton1_Click()
'Si hay errores, que continúe
On Error Resume Next
Range("A10").Select
Selection.EntireRow.Insert
Range("A11") = TextBox1 ' Dato fecha
Range("B11") = TextBox2 * 1 'Dato número
Range("C11") = TextBox3 * 1
Range("D11") = TextBox4 * 1
Range("E11") = TextBox5 * 1
Range("F11") = TextBox6 * 1
Range("P11") = (TextBox3 * 1) + (TextBox4 * 1) + (TextBox5 * 1) + (TextBox6 * 1)
'selecionamos el rango de trabajo
Range("A11:P300").Select
'Ordenamos los datos ascendente por la columna A y B
Selection.Sort Key1:=Range("A11"), Order1:=xlAscending, Key2:=Range("B11" _
), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortTextAsNumbers, _
DataOption2:=xlSortTextAsNumbers
'Centramos los datos en vada celda del rango
Range("A11:P300").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
'posicionamos el cursor en la celda A10
Range("A10").Select
'liberamos el formulario de memoria
Unload UserForm1
Selection.EntireRow.Insert
End Sub

Private Sub Label4_Click()
'Solo permitiremos que se introduzcan números
'para lo cual, si el valor introducido es una letra
'lo omitiremos, y nos quedaremos con el resto de caracteres,
'es decir, con los números
If Not IsNumeric(Right(TextBox4, 1)) And Len(TextBox4) > 1 Then
TextBox4 = Left(TextBox4, Len(TextBox4) - 1)
ElseIf Not IsNumeric(Right(TextBox4, 1)) And Len(TextBox4) = 1 Then
TextBox4 = Clear
End If
End Sub

Private Sub TextBox1_Change()
TextBox1.SetFocus
'si hay errores, que continúe
On Error Resume Next
'impedimos que se introduzca texto
If Not IsNumeric(Right(TextBox1, 1)) And Right(TextBox1, 1) <> "/" Then
TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
End If
'contamos lo que mide de largo
largo_entrada = Len(TextBox1)
'evaluamos la posición de lo que vamos escribiendo
Select Case largo_entrada
'después del 2º carácter, que añada una barra
Case 2
'controlamos algunas manipulaciones de los números
If Right(TextBox1, 1) = "/" Then
TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
Else
TextBox1 = TextBox1 & "/"
End If
'después del 5º carácter, que añada una barra
Case 5
'controlamos algunas manipulaciones de los números
If Right(TextBox1, 1) = "/" Then
TextBox1 = Left(TextBox1, Len(TextBox1) - 1)
Else
TextBox1 = TextBox1 & "/"
End If
End Select
'si el largo ocupa más de 10 caracteres,
'solo nos quedamos con los primeros 10 caracteres
If Len(TextBox1) > 10 Then TextBox1 = Left(TextBox1, 10)
'Deshabilitamos el botón "OK", si la fecha tiene menos de 10 caracteres
If Len(TextBox1) < 10 Then
CommandButton1.Enabled = False
Else
CommandButton1.Enabled = True
End If
'evitamos que haya más de 2 barras en el TextBox
If Len(TextBox1) = 10 And Len(Replace(TextBox1, "/", "")) < 8 Then
TextBox1 = Clear
End If
End Sub

Private Sub TextBox2_Change()
'Solo permitiremos que se introduzcan números
'para lo cual, si el valor introducido es una letra
'lo omitiremos, y nos quedaremos con el resto de caracteres,
'es decir, con los números
If Not IsNumeric(Right(TextBox2, 1)) And Len(TextBox2) > 1 Then
TextBox2 = Left(TextBox2, Len(TextBox2) - 1)
ElseIf Not IsNumeric(Right(TextBox2, 1)) And Len(TextBox2) = 1 Then
TextBox2 = Clear
End If
End Sub

Private Sub TextBox3_Change()
'Solo permitiremos que se introduzcan números
'para lo cual, si el valor introducido es una letra
'lo omitiremos, y nos quedaremos con el resto de caracteres,
'es decir, con los números
If Not IsNumeric(Right(TextBox3, 1)) And Len(TextBox3) > 1 Then
TextBox3 = Left(TextBox3, Len(TextBox3) - 1)
ElseIf Not IsNumeric(Right(TextBox3, 1)) And Len(TextBox3) = 1 Then
TextBox3 = Clear
End If
End Sub

Private Sub TextBox5_Change()
'Solo permitiremos que se introduzcan números
'para lo cual, si el valor introducido es una letra
'lo omitiremos, y nos quedaremos con el resto de caracteres,
'es decir, con los números
If Not IsNumeric(Right(TextBox5, 1)) And Len(TextBox5) > 1 Then
TextBox5 = Left(TextBox5, Len(TextBox5) - 1)
ElseIf Not IsNumeric(Right(TextBox5, 1)) And Len(TextBox5) = 1 Then
TextBox5 = Clear
End If
End Sub

Private Sub TextBox6_Change()
'Solo permitiremos que se introduzcan números
'para lo cual, si el valor introducido es una letra
'lo omitiremos, y nos quedaremos con el resto de caracteres,
'es decir, con los números
If Not IsNumeric(Right(TextBox6, 1)) And Len(TextBox6) > 1 Then
TextBox6 = Left(TextBox6, Len(TextBox6) - 1)
ElseIf Not IsNumeric(Right(TextBox6, 1)) And Len(TextBox6) = 1 Then
TextBox6 = Clear
End If
End Sub

Private Sub UserForm_Click()

End Sub

Sub lanzar_userform1()
'llamamos al userform
UserForm1.Show
End Sub

Saludos cordiales
qwertyu

qwertyu

Masculino Cantidad de envíos : 10
Edad : 63
Ciudad - Pais : Santiago - Chile
Version de Excel : 2003
Fecha de inscripción : 07/10/2009

Volver arriba Ir abajo

Re: Evitar duplicar datos en columnas

Mensaje por GalileoGali el Jue Oct 08, 2009 6:48 am

Sin entrar a tu código yo, en principio utilizaria el Evento CommandButton1_click, dentro de él antes de empezar a cargar todos los TextBox a celdas.
Utilizaría un Objeto Collection, con el Método Add, precedido de una sentencia On error resume Next, para almacenar la totalidad de las siguientes cadenas Fechas & "|" & Turno (a traves de un bucle). Luego terminado el bucle vacio Err.Clear, vuelvo entonces al metodo Add pero ahora, exclusivamente de los dos TextBox del Useform, arreglados en cadena TextBoxFecha & "|" & TextBoxTurno, hecho esto verifico que SI Err.Number <> 0, lo cual querria significar que la cadena estuviera o no repetida de ahi derivo al aceptacion de la carga o no

_________________
GalileoGali
M.A.P. 2010-2013
Microsoft Active Professional
avatar
GalileoGali
Admin

Masculino Cantidad de envíos : 1962
Edad : 61
Ciudad - Pais : QUIROGA, Argentina
Version de Excel : 2000-2003-2007-2010
Fecha de inscripción : 24/01/2008

http://excelgali.mejorforo.net

Volver arriba Ir abajo

Re: Evitar duplicar datos en columnas

Mensaje por qwertyu el Jue Oct 08, 2009 9:08 am

Gracias GalileoGali, por tu pronta respuesta, me olvidé de hacer notar que soy novato en el tema VB y macros excel, toda la planilla la he ido construyendo con manuales y pequeños ejemplos que he encontrado en la Web, probando una y otra ves, corrigiendo una y otra ves.
Evidentemente quiero construir el código dentro del evento CommandButton1_click que he hecho hasta el momento, veré si soy capaz de hacerlo con las indicaciones que me das.

La duda que tengo es si debo hace otro CommandButton1_click para evitar la duplicidad o puedo incluirla dentro de que ya tengo que es éste:

Private Sub CommandButton1_Click()
'Si hay errores, que continúe
On Error Resume Next
Range("A10").Select
Selection.EntireRow.Insert
Range("A11") = TextBox1 ' Dato fecha
Range("B11") = TextBox2 * 1 'Dato número
Range("C11") = TextBox3 * 1
Range("D11") = TextBox4 * 1
Range("E11") = TextBox5 * 1
Range("F11") = TextBox6 * 1
Range("P11") = (TextBox3 * 1) + (TextBox4 * 1) + (TextBox5 * 1) + (TextBox6 * 1)
'selecionamos el rango de trabajo
Range("A11:P300").Select
'Ordenamos los datos ascendente por la columna A y B
Selection.Sort Key1:=Range("A11"), Order1:=xlAscending, Key2:=Range("B11" _
), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortTextAsNumbers, _
DataOption2:=xlSortTextAsNumbers
'Centramos los datos en vada celda del rango
Range("A11:P300").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
'posicionamos el cursor en la celda A10
Range("A10").Select
'liberamos el formulario de memoria
Unload UserForm1
Selection.EntireRow.Insert
End Sub

Saludos cordiales
qwertyu

qwertyu

Masculino Cantidad de envíos : 10
Edad : 63
Ciudad - Pais : Santiago - Chile
Version de Excel : 2003
Fecha de inscripción : 07/10/2009

Volver arriba Ir abajo

Re: Evitar duplicar datos en columnas

Mensaje por GalileoGali el Vie Oct 09, 2009 7:14 pm

Francamente no acostumbro responder estos casos de Macros por Recopilacion, parecen la construcción de una colcha por método de "PatchWork", asi que sólo agrego un poco de código que se corresponde con lo que anticipé, desde ya que requiere ser adaptado a tu caso en particular, pero eso ya corre por cuenta tuya.

Código:
Option Explicit
Option Base 1
Sub cargar()
Dim colA As New Collection
Dim a As Variant
Dim i As Long
a = Range("A1").CurrentRegion
On Error Resume Next
For i = 1 To UBound(a)
colA.Add Item:=a(i, 1) & "|" & a(i, 2), key:=a(i, 1) & "|" & a(i, 2)
Next i
Err.Clear
colA.Add Item:="14/10/2009|2", key:="14/10/2009|2" 'aca simulo cargar los datos procedentes de los TextBox del Userform
If Err.Number <> 0 Then
MsgBox "Se trata de valor duplicado" 'esto deberia ser remplazado por el paso de programa de borrado de datos del Formulario y alertar respecto de la dulicacion incurrida.
Exit Sub
End If
aca deberia empalmarse con la secuela de codigo para la carga del registro Valido

End Sub

_________________
GalileoGali
M.A.P. 2010-2013
Microsoft Active Professional
avatar
GalileoGali
Admin

Masculino Cantidad de envíos : 1962
Edad : 61
Ciudad - Pais : QUIROGA, Argentina
Version de Excel : 2000-2003-2007-2010
Fecha de inscripción : 24/01/2008

http://excelgali.mejorforo.net

Volver arriba Ir abajo

Re: Evitar duplicar datos en columnas

Mensaje por qwertyu el Miér Oct 14, 2009 8:30 am

He solucionado el tema:
Usando un For para recorrer las dos columnas y verificar el ingreso de datos, el código queda así:
Private Sub CommandButton1_Click()
Dim contar As Integer, guion As Integer
Dim celda As String
Dim celda2 As String
For x = 1 To 300
celda = Cells(x, 1).Value
celda2 = Cells(x, 2).Value
contar = contar
For guion = 1 To Len(celda) And Len(celda2) = 1
If Mid(celda, guion) = TextBox1 And Mid(celda2, guion) = TextBox2 Then
'contar = contar + 1
MsgBox "LA FECHA Y TURNO YA FUE INGRESADO"
Exit Sub
End If
Next guion
Next x
'Si hay errores, que continúe
On Error Resume Next
Range("A2").Select
If TextBox1 = "" Then
MsgBox "No debe DEJAR campos en BLANCO"
Exit Sub
End If
Selection.EntireRow.Insert
Range("A11") = TextBox1 ' Dato fecha
Range("B11") = TextBox2 * 1 'Dato número
Range("C11") = TextBox3 * 1
Range("D11") = TextBox4 * 1
Range("E11") = TextBox5 * 1
Range("F11") = TextBox6 * 1
Range("O11") = (TextBox3 * 1) + (TextBox4 * 1) + (TextBox5 * 1) + (TextBox6 * 1)
'selecionamos el rango de trabajo
Range("A11:O300").Select
'Ordenamos los datos ascendente por la columna A y B
Selection.Sort Key1:=Range("A11"), Order1:=xlAscending, Key2:=Range("B11" _
), Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortTextAsNumbers, _
DataOption2:=xlSortTextAsNumbers
'Centramos los datos en vada celda del rango
Range("A11:P300").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
'posicionamos el cursor en la celda A10
Range("A10").Select
'Limpiamos los TextBox para seguir ingresando datos
TextBox1 = "": TextBox1 = "": TextBox2 = "": TextBox3 = "": TextBox4 = "": TextBox5 = "": TextBox6 = ""
seguir:
TextBox1.SetFocus
End Sub

Gracias por las sugerencias
qwerty

qwertyu

Masculino Cantidad de envíos : 10
Edad : 63
Ciudad - Pais : Santiago - Chile
Version de Excel : 2003
Fecha de inscripción : 07/10/2009

Volver arriba Ir abajo

Re: Evitar duplicar datos en columnas

Mensaje por raresmc el Dom Sep 22, 2013 2:21 pm

Hola a todos, he probado el codigo de ariba ya ami no me funcciona.Me gustaria saver por que.Gracias
Archivos
ejemplo.xlsm No tienes los permisos para descargar los archivos.(25 KB) Descargado 12 veces

raresmc

Masculino Cantidad de envíos : 2
Edad : 41
Ciudad - Pais : Vila Real - España
Version de Excel : 2010 x86
Fecha de inscripción : 22/09/2013

Volver arriba Ir abajo

Re: Evitar duplicar datos en columnas

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


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