Macro Automática

Hola. Tengo la hoja1 donde diligenciare datos a partir de la celda A1 hasta A1500. Los datos que debo diligenciar debe ser lo que se encuentran en el rango AA1:AA15 de la misma hoja. Lo que quiero es que cuando digite o copie un valor en unas de las celdas del Rango A1:A1500, sea uno de los valores que se encuentran en el rango AA1:AA15. En el caso que el valor que digite no corresponda a la base (AA1:AA15), se active una macro, notificándome con un mensaje box, que no se puede digitar el valor.
Intente trabajar con validación celda, pero no me sirve en el caso cuando copio los valores de una celda a otra. Solo aplica en el momento que dígito el valor en la celda.
Creo que me sirva:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim RangCtrl As String
Dim EnRango As Variant

6 Respuestas

Respuesta
1
Como dicen, "no tuve tiempo para hacerlo más corto". Pero funciona
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fila1 As Integer, fila2 As Integer
Dim columna As Integer
Dim encontrado As Boolean
encontrado = False
fila1 = 1 'AA1
fila2 = 15 'AA15
columna = 27 'AA
If Not Application.Intersect(Target, Range("A1:A1500")) Is Nothing Then
   If (Target.Value <> "") Then
    While fila1 <= fila2 And encontrado = False
      If Cells(fila1, columna).Value = Target.Value Then
         encontrado = True
      End If
      fila1 = fila1 + 1
    Wend
    If encontrado = False Then
      Target.Value = ""
      Target.Select
      MsgBox ("dato erroneo")
    End If
    End If
End If
End Sub
Eres un genio. Mira Gracias por la macro. Una pregunta, como hago para pagarte el favor, tienes una cuenta de ahorros o corriente donde pueda consignar una pequeña donación. Necesito otro favor, ¿Cuánto me cobrarías por unas clases de Macro?
Jaja, no amigo, lo que hago no lo cobro, es solamente la satisfacción de enseñar o de solucionar problemas lo que me motiva, solo cuando tengas una duda, cuéntamela, y yo te la resolveré si se la respuesta.
Solo da por terminada la pregunta.
Respuesta
1
Me gustaría conocer más detalles sobre tu pregunta.
De A:1 a A:1.500, van variando las celdas que se identifican con AA:1 a AA:¿15 de un proceso a otro?
¿Además quieres que las celdas que no se han modificado en ese proceso (que igual sí lo hicieron en el anterior o puedan modificarse en el siguiente?, ¿Sepas qué no fueron modificadas?
Confírmame esto o específicame exactamente algo más para hacerme una idea de lo que necesitas
Tan solo debo ingresar unos datos en el rango A1:A1500. Pero los datos que debo ingresar deben estar en el rango AA1:AA15. Cuando digite unas de las celdas un valor que no se encuentre en el rango AA1:AA5, se active una macro que eno me permita digitar ese dato y que me salga un mensaje MSBOX que me diga que no se puede ingresar ese registro. Ejemplo: Ingreso nun registro en la celda A2, y el valor que ingreso es 95, el cual cuando lo digite, no me tiene que dejar ingresar mencionado dato y que me salga un msbox que me indique que eno se puede ingresar este dato.
          Columna A Columna AA
1 111
2 132
3 145
4 173
5 184
6 197
7 201
8 215
9 227
10 316
Un experto de esta página me ayudo con el siguiente código:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fila1 As Integer, fila2 As Integer
Dim columna As Integer
Dim encontrado As Boolean
encontrado = False
fila1 = 1 'AA1
fila2 = 15 'AA15
columna = 27 'AA
If Not Application.Intersect(Target, Range("A1:A1500")) Is Nothing Then
   If (Target.Value <> "") Then
    While fila1 <= fila2 And encontrado = False
      If Cells(fila1, columna).Value = Target.Value Then
         encontrado = True
      End If
      fila1 = fila1 + 1
    Wend
    If encontrado = False Then
      Target.Value = ""
      Target.Select
    MsgBox "El código del movimiento de pago que está ingresando, no se encuentra habilitado.", vbCritical, "Error"
    End If
    End If
End If
end sub
La macro funciona bien, pero cuando estaba probándola, presenta un error en los siguientes dos casos:
Caso No.1 : Cuando quiero eliminar los datos de un rango de la columna A (Ejemplo: Quiero Eliminar los datos del rango A2:A500), aparce un error en la linea de la macro If (Target. Value <> "") Then.
Caso No.2: Cuando quiero copiar un dato de la columna A y pegarlo en un rango de la misma columna (Ejemplo: Copio en valor de la celda A2 y quiero pegarlo en el rango A25:A1000), aparce un error en la linea de la macro If (Target. Value <> "") Then.
Por favor ayudame. Gracias
Primero solo quieres que entren datos en A de la columna AA, pero luego efectúas cambios, con lo cual esas celdas no pueden quedar bloqueadas, por eso la macro no puede funcionar.
Tienes que explicarme con más detalle por qué quieres bloquear las celdas que no entran datos de AA y luego las quieres mover con datos cpiados posiblemente de AA desde otra celda de A5 por ejemplo a A200.
Al menos eso es lo que he entendido.
Necesito saber lo que tu necesitas, pues si primero entras datos y luego también modifcas los supuestamente bloqueados, el problema es otro.
Es que archivo que estoy diseñando es para que los clientes lo diligencia. En la columna A1:A1500, los clientes deberán digitar unos códigos de pagos (Mencionados códigos de pagos deberán coincidir con la base de datos que se encuentra aa1:aa15. ). Podrá presentar tres casos de ingreso de datos en la columna A1:A1500: Caso A: Que el cliente lo digite - Caso B: El cliente tendrá otro documento de excel y solo copiara de su documento y pegara los datos en mi documento de excel en unas de las celdas del rango A1:A1500 .- Caso c: Que digite un registro en una de la celda del rango A1:A1500 de mi documento y después copie ese dato y lo pegue en la misma columna. Ejemplo: Digite en la celda A2 el valor 42 (Valor que se encuentra en el rango AA1:AA15) después copie ese dato y lo pegue en el rango A3:A250. El objetivo de la macro es que el cliente solo digite los codigoS de pagos que se encuentre en el rango AA1:AA15. Si digita un código diferente le informe al cliente con un msbox que eno puede ingresar el dato.
Me puedes ayudar
Por lo que entiendo, que no se si es así, solo se pueden entrar los datos de la columna AA:1 a AA:¿15?,
lo que no entiendo es el caso c), por qué le pides al cliente que primero lo escriba en una celda y luego lo copia, ¿qué es aquí cuando te falla la macro?
Claro, te falla porque no solo copia el contenido de la celda, si no también toda la fórmula de la macro, y creas un bucle.
Por tanto le has de indicar en este caso al cliente que solo vuelva a escribir el dato (sin copiar, precisamente), o si lo hace lo haga desde una celda limpia que sea la suya, por ejemplo.
¿Cómo lo hago? Es que esta macro me ayudo un experto, pero no la entiendo
Private Sub Worksheet_Change(ByVal Target As Range)
Dim fila1 As Integer, fila2 As Integer
Dim columna As Integer
Dim encontrado As Boolean
encontrado = False
fila1 = 1 'AA1
fila2 = 15 'AA15
columna = 27 'AA
If Not Application.Intersect(Target, Range("A1:A1500")) Is Nothing Then
   If (Target.Value <> "") Then
    While fila1 <= fila2 And encontrado = False
      If Cells(fila1, columna).Value = Target.Value Then
         encontrado = True
      End If
      fila1 = fila1 + 1
    Wend
    If encontrado = False Then
      Target.Value = ""
      Target.Select
    MsgBox "El código del movimiento de pago que está ingresando, no se encuentra habilitado.", vbCritical, "Error"
    End If
    End If
End If
end sub
Es que no tienes que hacer nada más que solo pedir a tus clientes que no copien de la celda una a la otra, porque entonces arrastran no solo a la parte visible escrita, si no también la función o macro que ampara la celda, es decir, han de escribir lo mismo, pero "nunca copiar de una celda a la otra dentro de la columna A:1 a A:1.500"
Porque si no duplican en la celda 2ª en donde pegan un "completo" y crean lo que se dice "bucle".
Pero tampoco puedo seleccionar toda la columna para eliminar los registros
Solamente tienes que decir a los clientes que no "copien" de una celda de A:1 a A:1.500 a otra de la misma columna, porque si no copian, no tan solo la información visible como también la que no se ve. Es decir, la macro está incluida no en la columna si no en cada una de las celdas de esa columna, por tanto es duplicar la macro que se incorpora con el visible, en otra celda de esa columna, por eso da error, pues al duplicar la información en esa celda en lo que respecta la macro, el sistema no sabe a qué atenerse y da error, no entiende por qué se la da la orden dos veces, aunque sea la misma. Al pegar en una celda el dato, al mismo tiempo estás duplicando la macro en esa celda. Cuendo se copia y se pega, se arrastra toda la información de la celda.
Para que todo vaya bien, el dato de una celda ha de ser escrito de nuevo o bien copiado de cualquier celda virgen, en donde haya sido escrito, pero nunca de otra celda de esa columna afectada por la macro.
Es decir, es el paso C) el que has de modificar, pero no es problema de la macro ni de la hoja de excel, es que Excel funciona así porque cada celda puede albergar una gran extensa información, y se aloja en cada celda individualmente, otra cosa es que para simplificar se puedan informar a todas las celdas a la vez, pues de lo contrrio no acabaríamos nunca.
Por eso a los clientes les debes indicar cómo deben entrar sus datos, pueden escribir en una celda virgen, copiar el contenido que solo será el dato que quieren entrar y pegar en cada celda elegida de la columna A, ya sea en una celda o sea en dos celdas. Los clientes nunca pueden copiar, repito, de una celda de esa columna A a otra celda de esa misma columna.
Respuesta
1
Los datos que tienes en AA1:¿AA15 son numéricos?
¿Son siempre los mismos datos?
Respuesta
1
No me ha tocado manejar las macros, actualmente estoy intentando resolver la duda de un macro de otro usuario, pero como no conozco las sentencias de visual basic apenas estoy investigando un poco, encontré un tutorial muy completo aquí, dame un poco de tiempo para resolver la duda del otro usuario y continuo contigo, si lo necesitas muy rapido, publica la pregunta otra vez sin que la dirijas a ningún experto en especifico para que te atienda el primero que pueda, esto es para no entretenerte mucho tiempo, aunque si me esperas estaré encantado de ayudarte.
Respuesta
1
Bueno puedes encerrar el código en un
On error goto Eh
exit sub
EH:
select case err.number
 case "# Numero de error que te de la macro"
  resume next
 case else:
  msgbox err.number & "-" & err.description
end select
En ese caso se brincara a la siguiente opción en el programa.
Respuesta
1
Pues la verdad no creo que necesites macro, lo puedes hacer con una validación de datos y nombrar tu rango "AA1:AA15", para cuando digites un valor que no se encuentre en este rango te aparezca un mensaje. Para mi seria la solución rápida y donde no te complicas con una macro.
Espero te sirva la respuesta, de no ser así dime en que más te puedo ayudar.
Acuérdate en finalizar tu pregunta
Intente con validación, pero solo funciona cuando dígito el dato. En el caso cuando copio valores y los pega, no funciona la VALIDACIÓN
Tienes toda la razón, pero lo que puedes hacer es, señalar los datos que se encuentran herrados para así poderlos cambiar, esto se hace con validación de datos, rodear con un circulo datos no válidos, y así podrás determinar cuales datos son herrados
¿Cómo se hace? Sera que me puedes dar un ejemplo. Gracias
¿Qué excel tienes?... 2003 o 2007
Excel 2003
Vas a validación de datos, y allí se encuentra una opción que dice rodear los datos no válidos
Ingreso: Datos/Validación/
En la pestaña "configuración":
- No encuentro esa opción
- En el criterio de validación tampoco se encuentra
¿Dónde esta ubicada?
No es una opción de Validación si no de datos, desplegá datos y allí aparece, validadion de datos, rodear datos incorrectos y borrar círculos de validación
¿Cuándo hablas desplegar datos, es ingresar a la venta de Excel Datos, cierto? Y después ir validación Datos
no en datos hay tres opciones... eso es
Disculpa, mero No entiendo.
¿Cuándo hablas de datos, hablas de la ventana datos?
Sera que me puedes enviar un ejemplo a mi correo [email protected]
Gracias
Mejor enviame tu archivo al siguiente correo yo te colaboro [email protected]
Envíe documento.
Que pena el correo [email protected].

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas