Duda con macro!

Hola, soy nuevo en macros y no tengo mucho conocimiento de la sintaxis de VBA, pues algunas cosas que se de VB las he intentado implementar pero no funcionan; te cuento mi asunto, tengo un user form que al ingresar datos en un text box, digamos algo a si como la clave de un producto, este que es un numero de 4 dígitos y por lo mismo el textbox debe validar que sean exclusivamente números, esa cadena sirve de referencia para hacer una búsqueda de todos los productos que tengan esa clave, esto se activa por un commandbutton; el resultado de esa búsqueda se debe ver en una hoja de calculo de un nuevo libro B, los datos vienen de dos libros A y C por tal debe buscarlos de ambos; una ves insertados en el nuevo libro, se debe hacer una sumatoria con la columna que tiene los valores (digamos columna C, ya que en la columna A deberá aparecer el nombre o clave del producto y en la B la fecha).
Te paso mi raquítico código para ver si me puedes ayudar; de antemano muchas gracias por tu tiempo y atención.
Cuando ingreso los datos en el textbox, valida que en efecto no haya letras, pero si por error ingreso alguna, me manda un mensaje que dice error y que solo acepta números, cuando pulso aceptar en la caja de dialogo, esta se cierra y escribe el numero 1 dentro del textbox, cosa que quiero evitar que suceda.
Textbox:
Private Sub TextBox1_Change()
letra = Right(TextBox1.Text, 1)
    If (letra <> "") Then
     If Not (Asc(letra) >= 44 And Asc(letra) <= 57) Then 'Si la letra está entre el 0 y el 9
            If (Len(TextBox1.Text) = 1) Then 'Cuando sólo hay 1 letra
                TextBox1.Text = ""
                TextBox1.Text = MsgBox("SOLO ACEPTA NUMEROS", vbOKOnly, "ERROR")
            Else
                TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1) 'Cuando hay varias letras, borra el último carácter
            End If
        End If
    End If
If Len(TextBox1.Value) > 4 Then
TextBox1 = MsgBox("SOLO 4 DIGITOS", vbOKOnly, "ERROR")
TextBox1 = Empty
End If
End Sub
Por el momento solo puedo hacer que los datos de un solo libro sean los que me muestre y solo me los envía a la hoja 2 del mismo libro, es aquí donde debe "jalar" los del libro C, a la columna A que seria la clave, B el nombre y el C a la cantidad, hasta el momento es el código que tengo del
commandbutton:
Private Sub CommandButton2_Click()
valorbuscado = Val(TextBox1.Value)
For Each celda In Sheets(1).Range("A2", Range("A65000").End(xlUp))
valorcelda = celda.Value
celdavalor = celda.Address
If valorbuscado = valorcelda Then
Range(celdavalor).Offset(0, 8).Copy
Sheets(2).Range("a65000").End(xlUp).Offset(1, 0).PasteSpecial
ActiveCell.Formula = "=SUM(C:C)"
End If
Next celda
End Sub

1 respuesta

Respuesta
Por lo que creo, quieres que no importe que entres letras o números.
La búsqueda de esa clave, parece que te funciona bien, pero te ha de trasladar esa relación de productos, con la clave, nombre y fecha de la acción, más la cantidad, que por fin ha de ser sumada.
Todo este rastreo lo haces en dos libros diferentes y por fin el resultado del informe lo hace en el último libro.
Quiero saber, si esto es lo que quieres y es tu pregunta.
Hola, soy nuevo en macros y no tengo mucho conocimiento de la sintaxis de VBA, pues algunas cosas que se de VB las he intentado implementar pero no funcionan; te cuento mi asunto, tengo un user form que al ingresar datos en un text box, digamos algo a si como la clave de un producto, este que es un numero de 4 dígitos y por lo mismo el textbox debe validar que sean exclusivamente números, esa cadena sirve de referencia para hacer una búsqueda de todos los productos que tengan esa clave, esto se activa por un commandbutton; el resultado de esa búsqueda se debe ver en una hoja de calculo de un nuevo libro B, los datos vienen de dos libros A y C por tal debe buscarlos de ambos; una ves insertados en el nuevo libro, se debe hacer una sumatoria con la columna que tiene los valores (digamos columna C, ya que en la columna A deberá aparecer el nombre o clave del producto y en la B la fecha).
Te paso mi raquítico código para ver si me puedes ayudar; de antemano muchas gracias por tu tiempo y atención.
Cuando ingreso los datos en el textbox, valida que en efecto no haya letras, pero si por error ingreso alguna, me manda un mensaje que dice error y que solo acepta números, cuando pulso aceptar en la caja de dialogo, esta se cierra y escribe el numero 1 dentro del textbox, cosa que quiero evitar que suceda.
Textbox:
Private Sub TextBox1_Change()
letra = Right(TextBox1.Text, 1)
    If (letra <> "") Then
     If Not (Asc(letra) >= 44 And Asc(letra) <= 57) Then 'Si la letra está entre el 0 y el 9
            If (Len(TextBox1.Text) = 1) Then 'Cuando sólo hay 1 letra
                TextBox1.Text = ""
                TextBox1.Text = MsgBox("SOLO ACEPTA NUMEROS", vbOKOnly, "ERROR")
            Else
                TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1) 'Cuando hay varias letras, borra el último carácter
            End If
        End If
    End If
If Len(TextBox1.Value) > 4 Then
TextBox1 = MsgBox("SOLO 4 DIGITOS", vbOKOnly, "ERROR")
TextBox1 = Empty
End If
End Sub
Por el momento solo puedo hacer que los datos de un solo libro sean los que me muestre y solo me los envía a la hoja 2 del mismo libro, es aquí donde debe "jalar" los del libro C, a la columna A que seria la clave, B el nombre y el C a la cantidad, hasta el momento es el código que tengo del
commandbutton:
Private Sub CommandButton2_Click()
valorbuscado = Val(TextBox1.Value)
For Each celda In Sheets(1).Range("A2", Range("A65000").End(xlUp))
valorcelda = celda.Value
celdavalor = celda.Address
If valorbuscado = valorcelda Then
Range(celdavalor).Offset(0, 8).Copy
Sheets(2).Range("a65000").End(xlUp).Offset(1, 0).PasteSpecial
ActiveCell.Formula = "=SUM(C:C)"
End If
Next celda
End Sub
En efecto es eso; pero el resultado que supuestamente me tiene que mostrar en el ultimo libro, seria un rango de columnas que esta discontinuo, pues el nombre del producto esta en la columna A, la clave en la B, y la fecha en la DE, y el total digamos se encuentra en la E; la columna C no la voy a ocupar, pues me dice la cantidad disponible y solo me interesa la cantidad económica, por tal no la incluyo, intente meter en el FOR todos los rangos de esta forma pero no me funciono y me devolvía error:
For Each celda In Sheets(1).Range(Cells("A2"), Range,(Cells("A65000"),Range(Cells("B2"),Range(Cells("B65000").End(xlUp))For Each celda In Sheets(1).Range("A2", Range("A65000").End(xlUp))
Por lo que entiendo, el total de datos del producto lo extraes de dos libros diferentes y pretendes uni¡Ficar en el 3er. Libro los datos que necesitas para tu informe. ¿Es así?
Por lo que veo, tienes pocas columnas, quizás 4/5, y sin saber cuantas filas, por muchas que sean, aunque sean 1.000, creo que lo buscas es pasar todo a un libro nuevo, el B y descartar las partes repetidas de ambos libros, por eso realizas una resta.
También que tienes las columnas iguales e igualmente ordenadas.
¿Es así?
Si solo quieres esto es muy sencillo, tanto como copiar y pegar todo el conjunto del libro A al B y a continucaión en la última fila añadir el Libro C, y realizar ese sumatorio.
Si la idea es otra, dímela, hay muchas posibles respuestas en función de lo que necesites.
Es muy diferente si cada día has de ir trasladando datos.
A si es, es que es para comparar digamos el archivo antiguo con una actualización o un nuevo archivo; por ejemplo del libro Ha necesito las columnas A, B y DE, y este tiene fecha del 3 de mayo y en especifico buscare el producto 1, del libro C que es digamos la nueva version del libro A, del cual necesito las mismas columnas, entonces esta mezcla me tiene que salir en el tercer libro que es el B, de donde haré una sumatoria del total por cada fecha(una del perteneciente al A y otra al C) una ves que tenga dichas sumatorias las voy a restar.
Otra cosa es que necesito también que las respectivas celdas A1, B1 y D1, aparezcan con el nombre de clave, producto y cantidad o algo a si, como se busca digamos automatizar lo más posible es necesario que se nombren desde el macro una vez que se crea el nuevo libro. Muchas gracias
Aja digamos que es como que pase solo los datos que necesito, pero también seria idóneo que mostrara de otros productos y los dejara de esta forma:
       A B C
1 clave nombre total
2     01         dfdfgdf     2                                ***las primeras 3 son ref al libro A las
3 01 dfdfgdf 1 siguientes al libro C.
4 total 3
5
6 01 dfdfgdf 4
7 01 dfdfgdf 2
8 total 6
9 gran total 3
10
11 03 ertee 2
12 03 ertee 1
Entiendo que vas a pasar todos los datos, pero vas a restar los repetidos.
Todavía no me has dicho si es una tarea que has de hacer una sola vez para descartar los libros A y C definitivamente.
Esto último es importante, pues si vas a descartar los libros A y C, deberás pasar toda la información del resto de columnas si es que va a ser un libro definitivo o bien se trata de solo un informe que debas realizar por ejemplo cada semana o cada mes.
Hasta ahora
Es un informe que se realiza cada semana, de hecho la idea original era que después de hacer eso, se eliminara el libro A, y el C pasara al lugar del A, para que la nueva actualización fuera el nuevo C y a si, pero da más problemas, por tal mejor decidí que se eliminen y se les cambie el nombre de forma manual y no por una macro
Estoy de acuerdo contigo, las macros suelen ser la suma de varias funciones y cualquier pequeño error no permite el funcionamiento global.
Bien, así creo que lo primero es crear como dices, un nuevo libro, el B, en donde resumir y de momento todo lo que hay en A y en B.
Debes preparar las columnas al menos en el mismo orden en A y en C.
Como te decía antes, copia A y pégalo en C, el total de filas y columnas. Colorea el fondo, por ejemplo de color verde
A continuación, añade B y colorea de color naranja.
Selecciona toda la hoja desde la esquina superior izquierda, clika en el recuadro que hace esquina entre 1 y A. Se pondrá toda la pantalla seleccionada.
En Datos, que suele encontrarse al lado de Herramientas, pulsa ordenar.
Podrás restar fácil los verdes de los naranjas. Para mayor claridad puedes insertar una fila en cada cambio de color y producto para los totales parciales.
El resultado te será bastante sencillo. A partir de aquí, dime qué informe has de hacer cada semana.
Hasta ahora
Ok, pero resulta que la columna del nombre esta mucho antes que la de la clave, lo ejemplifique a si por que primero lo estoy probando en una simulación muy pequeña en cuanto a los datos y la ubicación de las columnas
No sé en qué afecta eso, el orden lo eliges tu, es decir, eliges según la columna que vaya ordenado.
Ok, ¿no tienes digamos un macro que se pareciera? ¿Qué me pudieras prestar?
Con lo que te he explicado tienes resuelto el problema, haciendo función por función no tendrás fallos. Si te parece bien lo que te he indicado es bastante sencillo, a partir de ahí dime cómo quieres el informe semanal y podré seguirte ayudando.
Que me muestre los resultados como te los puse en el ejemplo, por que igual puede ser que en algún momento solo se busque un solo producto o quizás más de dos
Pues una vez que tengas en el libro C todos los datos recogidos, para hacer el informe semanal, debes abrir en una hoja aparte que puede ser en el mismo libro C.
Lo más sencillo es incorporar los datos según vayan llegando y mantener el orden de la columna de los productos.
Copia y pega todo el bloque de cada producto a la hoja 2, seleccionando previamente y pegando en la primera celda a partir de la cual quieras quede idéntico.
Repite por tantos productos que quieras figuren el informe.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas