Informacion sobre Excel

Hola Fernando, muchas gracias por la atención prestada a mi pregunta y por tu tiempo y dedicación.
A continuación te aclaro mi situación para que visualices mejor mi pregunta:
Yo trabajo en el área de auditorias a proveedores de mi compañía, y estoy tratando de crear una base de datos que se alimente, a través de lo que tu llamas una "mascara". Entiendo por eso una hoja cualquiera que simplemente "Decoro" indicándole a los usuarios cuales son las celdas que deben rellenar y con que tipo de datos.
Muy parecido a los formatos cuando uno se suscribe a un correo electrónico y le piden a uno sus datos. Para este fin muchas veces utilizo la herramienta de Validación de Datos e incluyo una lista.
Pero no tengo ni la menor idea de como hacer una especie de "Submit" de manera de que los usuarios solo ingresen los datos en las celdas predeterminadas para ello, pulsen el botón "submit" y esos datos estén vinculados de algún modo a una base de datos de categorías por columnas. Más que todo los datos que recojo son una evaluación que va del 1 al 100, el nombre del proveedor, la fecha de realización, nombre de quienes realizaron la auditoria y comentarios u observaciones.
Espero me puedas ayudar con esto, ya que sería una excelente oportunidad de mejora.
Gracias una vez más.

1 Respuesta

Respuesta
1
Insisto: Cuánto tiempo ahorraríamos si se plantearan todas las alternativas de movida...
Tu "pequeña duda" implica un cambio importante a la macro anterior.
Pensé que habías organizado la carga de datos en forma continua pero veo que no fue así. También es posible que algunos datos estén en grupo y otros en celdas separadas o que todas las celda de carga estén dispersas.
La macro siguiente, prevé éste último caso que es el más general, a costa de multiplicar líneas de código en el procedimiento.
Puedes reemplazar la macro anterior por esta:
Public CeldaIni
Sub FormCarga()
'================== Modificar de acuerdo a tus datos reales
HojaDest = "Hoja2"
Firstcell = "B2"
'==================
Valida = MsgBox("Confirma paso a Base de Datos?" & Chr(10) & "Luego serán borrados los datos de las celdas de carga", vbQuestion + vbOKCancel, "Macro de transferencia")
If Valida = vbOK Then
Application.ScreenUpdating = False
Set CeldaIni = Sheets(HojaDest).Range(Firstcell)
'Determina próxima celda disponible
If IsEmpty(CeldaIni) Then
drow = CeldaIni.Row
ElseIf CeldaIni.End(xlDown).Row > 50000 Then
drow = CeldaIni.Offset(1).Row
Else
drow = CeldaIni.End(xlDown).Offset(1).Row
End If
'Copiado 1ra celda
FilaOrigen = 2 'fila donde se ingresan los datos en hoja de carga
ColOrigen = 2 '<- columna (de la Hoja de carga ) donde está la celda con datos.
ColDestin = 1 '<- columna (dentro de la base de datos) donde debe dejar los datos (en hoja de Base)
Call Pasadat(FilaOrigen, ColOrigen, drow, ColDestin)
'Copiado 2da celda
FilaOrigen = 2 'fila donde se ingresan los datos en hoja de carga
ColOrigen = 4 '<- columna (de la Hoja de carga ) donde está la celda con datos.
ColDestin = 2 '<- columna (dentro de la base de datos) donde debe dejar los datos (en hoja de Base)
Call Pasadat(FilaOrigen, ColOrigen, drow, ColDestin)
'Copiado 3ra celda
FilaOrigen = 2 'fila donde se ingresan los datos en hoja de carga
ColOrigen = 6 '<- columna (de la Hoja de carga ) donde está la celda con datos.
ColDestin = 3 '<- columna (dentro de la base de datos) donde debe dejar los datos (en hoja de Base)
Call Pasadat(FilaOrigen, ColOrigen, drow, ColDestin)
'Copiado Nº celda
'... Repetir tantos bloques como celdas hay por copiar
'y cambiar los números de columnas respectivos
Set CeldaIni = Nothing
End If
End Sub
Private Sub Pasadat(FilaOrigenX, ColOrigenX, drowX, ColDestinX)
Cells(FilaOrigenX, ColOrigenX).Copy
CeldaIni.Cells(drowX - 1, ColDestinX).PasteSpecial xlPasteValues
CeldaIni.Cells(drowX - 1, ColDestinX).PasteSpecial xlPasteFormats
Application.CutCopyMode = False
Cells(FilaOrigenX, ColOrigenX).ClearContents
End Sub
---
Como verás esta macro prescinde de desplazamientos.
Desde cualquier celda de la hoja de carga puedes disparar el procedimiento.
Le agregué una instancia de control para que cofirmes si realmente quieres pasar los datos o lanzaste la macro por accidente.
Al igual que en la anterior deberás indicarle -dentro del código- cual es la hoja donde está la base y la celda donde se inicia la misma (esquina superior izquierda)
La macro se encarga de determinar cuál es la fila en la base donde debe dejar los datos, mientras que la columna y fila de origen y la columna de destino son datos que podrás indicar para cada caso. Esto te da absoluta libertad para decidir de dónde toma el dato y donde lo debe dejar.
Importante: Al ingresar el número de columna de origen, debes tomar la posiciónque tiene tal columna *en la hoja de carga*. Por ejemplo, si una celda con datos está en la columna "C" el valor de esa variable será 3.
PERO, en la hoja de destino el numero de columna se refiere a la posición *dentro de la base de datos*. Así si la base empieza en B2 y quieres dejar un dato en la columna "C", el valor de la variable de esta columna es 2.
En la macro adjunta, la rutina de copiado se repite para tres celdas. Si tuvieses más celdas que pasar copia uno de esos bloques y pégalo tantas veces como celdas necesites agregar. Luego cambia las referencias de columnas y fila de acuerdo a las posiciones correspondientes.
Notarás que hay una sub rutina al pie que es la encargada del copiado-pegado-borrado de acuerdo a las filas/columnas de origen/destino pasadas desde la macro principal.
Bueno, Oscar, espero que esto sea lo que necesitas.
Un abrazo!
Fernando
Hola Fernando.
Veo que cada vez nos vamos entendiendo más, y de este modo me acerco al objetivo. Muchas gracias por la atención.
Tengo una pequeña duda:
En la parte donde me señalas el Rango de celdas de donde se va a tomar la data. (Range("A2:E2").Copy)
¿Existe la posibilidad de hacerlo con celdas salteadas? Es decir, que no estén seguidas una de la otra.
Y de ser posible, ¿cómo se hace para que la macro cargue los datos en columnas específicas?
Planteado de otro modo: ¿Cómo hago para vincular la información de una sola celda específica con una columna especifica de mi base de datos?
Muchas gracias por tu ayuda, he ido resolviendo y aprendiendo bastante.
Saludos.
Oscar
Afortunadamente, notaste que si cierras una pregunta, me es absolutumente imposible contestarte sobre ella.
De todos modos, había leído tu aclaración (hubiera ayudado que la incluyeras en tu primera consulta) y considero que la misma macro que te sugerí -con algunos cambios- es la respuesta.
En tu pregunta anterior solicitabas que los datos se pasaran *automáticamente* a otra hoja. Por tal razón, asocié la ejecución de la macro a que seleccionaras la última celda de carga.
Desde luego, es posible asociar aquella macro a un botón (Submit) y deshabilitar que se ejecute automáticamente.
Para esto, simplemente borra el código que habías ingresado en el panel de macros de la hoja de carga.
Aquél que decía:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Address(False, False) = "D2" Then FormCarga
End Sub
---
Luego, para asignar la macro que colocaste en el módulo, muestra la barra de herramientas de "Formularios" ("Ver" | "Barras de herramientas" | "Formularios".
De ella, toma el icono de "botón" y dibújalo en tu hoja. Al haber presionado el icono, el cursor del mouse se transformará en una cruz fina. Mantén presionado el botón derecho y arrástralo hasta donde desees dibujando el botón.
Cuando sueltes la tecla, automáticamente aparecerá la lista de macros disponibles de dónde podrás seleccionar la que quieres asociar (FormCarga). Simplemente, dale doble click.
También, puedes cambiar la vinculación de un botón con una macro, dando click derecho sobre él y eligiendo "Asignar macro". Otra vez, la lista de macros disponibles te permitirá realizar tal asignación.
---
Amén de estos cambios, que hacen al modo de disparar la macro, aquella sería similar.
Noto que tienes más celdas que pasar a la base que las que yo había imaginado originalmente.
Así si
Evaluación se ingresa en A2
Nombre del proveedor, en B2
Fecha de realización, en C2
Nombre de quienes realizaron la auditoria, en D2 y comentarios en E2
Simplemente deberías reemplazar la instrucción:
Range("A2:D2"). Copy
Por
Range("A2:E2"). Copy
Como verás, así como planteaste tu situación, la respuesta anterior cubre lo solicitado.
Si hubieras omitido alguna aclaración que invalide aquella solución, no finalices esta pregunta aún y agrega los datos que necesitaría saber para modificar la rutina (recuerda que yo no estoy viendo tu planilla)...
Espero que esto si resuelva tu problema.
Un abrazo!
Fernando

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas