Macro Autoejecutable

Como hago una macro autoejecutable para hacer lo siguiente:
En hoja 1 tengo un valor A1. Al cambiar este valor y pulsar Enter quiero que ese valor se copie en la hoja 2 en la posición A1. Al introducir un nuevo valor en A1 de la hoja 1, lo copie en A1 de hoja 2 pero el valor que ya había en A1 lo desplace hacia abajo. Es decir en la hoja 2 se genere una columna con los datos que voy ingresando en la hoja 1. Pero si el valor ingresado en la hoja 1 ya está en la columna de la hoja 2 que me aparezca una ventana y me diga que ese valor ya existe y me dé la opción si quiero abrir e libro donde está ese valor o no. Cualquiera de las respuestas que detenga la macro y no agregue ese valor a la columna.
Desde ya muchas gracias
Saludos
Gustavo Meeuwes

1 respuesta

Respuesta
1
La macro seria la siguiente
Sub prueba()
On Error Resume Next
Error 1004
n = WorksheetFunction.VLookup(Hoja1.Range("A1").Value, Hoja2.Range("A1:A50000"), 1, 0)
If Hoja1.Range("A1").Value = n Then
Dim Mensaje, Estilo, Título, Ayuda, Ctxt, Respuesta, MiCadena
Mensaje = "El valor ingresado Ya existe. Desea ver la base"
Estilo = vbYesNo + vbCritical + vbDefaultButton2
Título = "ERROR"
Ctxt = 1000
Respuesta = MsgBox(Mensaje, Estilo, Título, Ayuda, Ctxt)
If Respuesta = vbYes Then
Hoja2.Select
Else
Exit Sub
End If
Exit Sub
End If
Hoja2.Range("A1").EntireRow.Insert
Hoja2.Range("A1").Value = Hoja1.Range("A1").Value
End Sub
Saludos
Jose Zapata
[email protected]
Ecuador
Mejore un poco la macro
Para que la macro sea auto ejecutable, tendrías que ingresar la siguiente sentencia en el modulo de la Hoja1
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 1 Then prueba
End Sub
y luego la macro... prueba en un modulo independiente.
Sub prueba()
If Hoja1.Range("A1").Value = "" Then
Exit Sub
End If
On Error Resume Next
Error 1004
n = WorksheetFunction.VLookup(Hoja1.Range("A1").Value, Hoja2.Range("A1:A50000"), 1, 0)
If Hoja1.Range("A1").Value = n Then
Dim Mensaje, Estilo, Título, Ctxt, Respuesta
Mensaje = "El valor ingresado Ya existe. Desea ver la base"
Estilo = vbYesNo + vbCritical + vbDefaultButton2
Título = "ERROR"
Ctxt = 1000
Respuesta = MsgBox(Mensaje, Estilo, Título, Ayuda, Ctxt)
If Respuesta = vbYes Then
Hoja2.Select
Hoja1.Range("A1").Value = ""
Else
Hoja1.Range("A1").Value = ""
Exit Sub
End If
Exit Sub
End If
Hoja2.Range("A1").EntireRow.Insert
Hoja2.Range("A1").Value = Hoja1.Range("A1").Value
Hoja1.Range("A1").Value = ""
MsgBox "El valor se ha ingresado satisfactoriamente"
End Sub
Hola José:
Muchísimas gracias por tu respuesta y ayuda. Es justo lo que buscaba y no tenia idea de como hacerlo.
En el caso de haberle dado nombres a las hojas, reemplazo directamente Hoja1 u Hoja2 por Sheets("Nombre"). Como verás mis conocimientos de macros son nulos. Lo hice en algunos ejemplos y no funcionó.
Gracias
Saludos cordiales
Gustavo
Si podrías hacerlo, pero no hace falta.
Cuando haces referencia a Hoja1, toma el nombre de VBA no el nombre de la hoja de excel, así que en esta puede cambiar sin ningún problema.
Si te das cuenta en las propiedades de la Hoja en VBA tienes
Hoja1(Hoja1) o Hoja1(Base),
y puedes hacer referencia a:
Hoja1. Range(...
O a
Sheets("Base"). Range(...
Intenta probando... de la investigación se aprende
Hola José:
Mi última consulta. Perdona que me aproveche de tu generosidad.
Probé la macro y funciono perfecto, de acuerdo a lo que necesito.
Pero preciso si me das una idea de como modificarla para:
Al escribir un valor en A1 de la "Hoja1" (Le he cambiado el nombre a las hojas), y darle Enter, el proceso se hace pero borra este valor.
Le borré la línea (3ra empezando desde el final)
Hoja1.Range("A1").Value = ""
Y no lo borra pero si marco con el mouse o cursor nuevamente una celda de la columna me ejecuta la macro y me salta el error de que el valor ya existe. Este valor A1 es el primero que ingreso en un formulario extenso y debo consérvalo para después guardar la planilla. Además como dije antes debería poder moverme por toda la hoja. O sea que no lo borre y lo considere una sola vez hasta que ese celda vuelva a estar vacía.
Otra: ¿Al aparecer la ventana se le puede desactivar el sonido?
Cuando hago clic en "Si" se puede hacer que abra automáticamente la planilla cuyo nombre es igual al de la celda A1 y que está guardada en un directorio específico (Distinto al predeterminado) y que tanto al apretar "Si" o "No" no me borre el valor A1 y me ponga el cursor de vuelta en la Hoja1 A1.
Se puede ordernar el listado creado en la Hoja2 de menor a mayor ya que los valores son numéricos.
En que paso y como le agrego una instrucción para que me ejecute otra macro, ¿si es que llega a ser necesario?
Con referencia al nombre de las hojas ya vi que dejando Hoja1 u Hoja2 aunque les cambie el nombre, las toma igual. Sólo es curiosidad de saber como debo cambiarla en la macro y poner el nombre al que las cambié. Como en mi pregunta anterior probé con Sheets("Nombre") en vez de Hoja y no funcionó.
Si consideras que pido demasiado no hay problema. Ya me has ayudado con tu respuesta que agradezco muchísimo.
Nuevamente gracias
Saludos
Gustavo
Que tal de nuevo gustavo.
Sinceramente no te entiendo muy bien voy a intentar explicar de acuerdo a lo que comprendí.
Hoja1. Range("A1").Value = "" es la sentencia que te borra la celda A1
esta clausula esta en la fila 2 en la 17, 19 y en la 26 empezando desde Sub prueba (), en la segunda fila evita que la macro se ejecute si la celda A1 esta vacia, las demas borrar el valor ingresado., asi que si quieres que el valor no se borre tienes que eliminarla de la fila 17, 19 y 26.
Por otro lado. Si deseas ordenar los valores de la columna tendrías que ingresar lo siguiente, después de copiar los valores a la hoja 2 (osea después de Hoja2. Range("A1"). Value = Hoja1. Range("A1"). Value):
Columns("A:A").Select
    Hoja2.Sort.SortFields.Clear
    Hoja2.Sort.SortFields.Add Key:=Range("A1:A50000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Base").Sort
        .SetRange Range("A1:A50000")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With 
Como te dije la investigación es la mejor forma de aprender, te aconsejo que intentes grabando macros con lo que quieres hacer y luego viendo el código que estas generan. (Yo utilizo Excel 2007, y hay clausulas que no las reconoce las versiones anteriores y te salte un error y puede darse el caso en las sentencias que te ordenan los valores).
Para llamar a otra macro la sentencia es la siguiente: Application. Run "prueba" por ejemplo para llamar a la macro prueba.
Con respecto al nombre de las hojas. La sentencia es Sheets("Base").range(... en vez de Hoja2. Range(... (si la hoja se llama Base), tienes que tener cuidado con ingresar el nombre exacto de la hoja de excel.
Por otro lado para poder abrir otro libro, tendría que ingresar el directorio donde se encuentra el libro, luego hacer referencia al nombre del libro que quieres abrir (te aconsejo que abras otra pregunta, está esta fuera del hilo de la pregunta inicial) y aparte no te entiendo muy bien, pero te repito intenta grabando macros, con lo que quieres hacer, y viendo los códigos de las mismas.
Por decirte seria luego de ingresar el directorio....\workbook(workbook("nombre del archivo"). Hoja1. Range("A1"). Value). Open
y por otro lado el sonido es un poco complicado de suspender, se que hay una forma pero lo que hacen en general es con una macro eliminar el sonido del sistema osea poner mute, pero esto no solo te va eliminar el sonido del msgbox sino de todo el sistema, mientras dure la macro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas