# useform para capturar



## polboy_mx (Jun 23, 2006)

hola a todos tengo esta hoja donde deseo crear un USEFORM con varios COMBOBOX para ingresar los datos en la misma hoja, uso un "rango" en ROWSOURCE para jalar los datos a seleccionar pero me falta el detalle de como hacer para que "caigan" en la ultima linea de los registros, seria al final del USEFORM on COMMAND BUTTON donde acepte la entrada o pudiera regresar para corregir y generar un USEFORM en blanco


----------



## polboy_mx (Jun 23, 2006)

*la hoja*PRODUCTOS X CLIENTE v 1.01 MAYO 2006.xlsABCDEFGH123IDNOMBRECLIENTEPRODUCTOCANTMN.DLS.DATEFACT450221MANUFACTURERADEROPASALTANI,S.A.DEC.V.ADHESIVATRANSTHERM1.93X1.50BC/I2TCOPPEL[2,000]7.535.0021-Jun-06448860462PRODUCTOSMANUELJOSE,S.A.DEC.V.(CULIACAN)ETIQUETAI.P.S.TRAC21X12BC/IMP"BLANCAS"[1,000]4005.0004-May-06425870927ALUMINIOCONESASA.DECV.ADHESIVATRANSTHERM2.00X4.00BCAC/IAMARILLA[1,000]264.0004-May-06425780234ARTICULOSPOPULARESDELHOGARS.A.DEC.VADHESIVATERMICADIRECTA2.00X1.00BS/I[3,000]6024.2030-Abr-06424890219UNIDADDEENSEANZAEINVESTIGACIONSANJAVIER,A.C.ADHESIVAPOLIESTER3.00X1.00TRANSPBOPP[3,000]10.0030-Abr-064246100219UNIDADDEENSEANZAEINVESTIGACIONSANJAVIER,A.C.RIBBONELTRONCERA110MMS.X74MTS.23.8530-Abr-064246110984PROMEDICAGARCIASA.DECV.ADHESIVATRANSTHERM2.00X1.00BCAS/I[2,000]1022.0028-Abr-064236120984PROMEDICAGARCIASA.DECV.RIBBONELTRONCERA64MMS.X74MTS.52.5028-Abr-064236130039HOSPITALSANJAVIER,S.A.DEC.V.ADHESIVATRANSTHERM1.97X0.59BCAS/I[4,000]843.0028-Abr-064234140039HOSPITALSANJAVIER,S.A.DEC.V.RIBBONELTRONCERA110MMS.X74MTS.23.8528-Abr-064234151063LEMUSRAMIREZMARISAADHESIVATRANSTHERM4.00X5.00BCAS/IC/PREC[500]5185.0028-Abr-064233161063LEMUSRAMIREZMARISARIBBONELTRONCERA110MMS.X91MTS.542.0028-Abr-064233170037GABRIELASKUTSCHDIAZAGUJAMETALICADENISSONSTANDARD1019.0028-Abr-064232180037GABRIELASKUTSCHDIAZPLASTIFLECHA9.00"CANDADOLISO[5,000]1526.8028-Abr-064232190037GABRIELASKUTSCHDIAZPLASTIFLECHADORAGENERICASTDHD-8S(AG/DEN/MET)1120.0028-Abr-064232200803MERBATEXS.A.DEC.V.MAQUILAETIQUETAADHESIVA3065.0027-Abr-064230pxk


----------



## Greg Truby (Jun 26, 2006)

Bueno,

La forma más sencilla es encontrar la última celda y añadir.  Eso no es gran cosa.  La fuerza de usar un UserForm en vez del formulario que Excel ya ofrece en el menú de Datos es la habilidad de programar verificaciones, vínculos, etc. en el userform.  Aquí le doy un ejemplo bien sencillo.  Note que utilizo ENUM pero si los usuarios tienen Excel 97 hay que user CONST en vez de ENUM.  El uso de ENUM (o CONST) no es exigido.  Lo hago porque se hace la vida más fácil si cambia la estructura de la hoja.  Si usted después decide insertar, mover o suprimir una columna es nada más de editar las definiciones de los constantes y ya.  Pero si uno programs números de columnas dentro de los subroutines, hay que ir y buscar cada juepu** de ellos y no es muy divertido. 

_En el UserForm_

```
Private Sub btnOK_Click()
      
    Dim lngNewRow As Long

    lngNewRow = MyLastCell.Row + 1
    With Me
        Cells(lngNewRow, ge_CustColDefs.Nombre) = .tbxNombre
        Cells(lngNewRow, ge_CustColDefs.Producto) = .cbxProducto.Text
        .Hide
    End With
End Sub
```

_En un modulo normal_

```
Option Explicit

Public Enum ge_CustColDefs
    NumID = 1
    Nombre
    Producto
End Enum

Sub ProbarUserForm()
    UserForm1.Show
    Unload UserForm1
End Sub

Public Function MyLastCell(Optional ws As Worksheet) As Range
    Dim LastRow&, LastCol%
    
    ' Error-handling is here in case there is not any
    ' data in the worksheet
    
    On Error Resume Next
    If ws Is Nothing Then Set ws = ActiveSheet
    
    With ws
    
        ' Find the real last row
        LastRow = .Cells.Find(What:="*", _
            SearchDirection:=xlPrevious, _
            SearchOrder:=xlByRows).Row
            
        ' Find the real last column
        LastCol = .Cells.Find(What:="*", _
            SearchDirection:=xlPrevious, _
            SearchOrder:=xlByColumns).Column
            
    End With
    
    Set MyLastCell = ws.Cells(Application.WorksheetFunction.Max(1, LastRow), _
                              Application.WorksheetFunction.Max(1, LastCol))
            
End Function
```
Note que _MyLastCell_ no asegura que _activesheet_ sea un _worksheet._  Si exist la posibilidad de que _activesheet_ sea un _chart sheet_ habrá que programar una verificación de tipo de hoja.


----------



## polboy_mx (Jun 26, 2006)

*Fue demasiado!!*

Greg, muchas gracias por la respuesta pero la verdad fue demasiado para mi, estoy tratando de ligar un combobox para que con el "Id" del cliente me pase los datos "nombre del cliente" a un listbox, creo... hasta ahi me  quede porque no he terminado mi useform , la verdad no manejo Vb a la perfeccion y me detengo a leer en el forum antes de preguntar pero solo vi como hacer que un combobox repita los datos de otro combobox


----------



## polboy_mx (Jun 26, 2006)

Greg:

Private Sub btnOK_Click()
' agrego un comand button llamado OK?   
    Dim lngNewRow As Long

    lngNewRow = MyLastCell.Row + 1
    With Me
        Cells(lngNewRow, ge_CustColDefs.Nombre) = .tbxNombre
         ' agrego un textbox Nombre?
        Cells(lngNewRow, ge_CustColDefs.Producto) = .cbxProducto.Text
         ' agrego un combobox producto?

        .Hide
    End With
End Sub


----------



## Greg Truby (Jun 27, 2006)

Polboy,

Eso que puse fue nada más un ejemplo.  No puedo decirle qué poner o no poner dado que no sé qué es lo que desea hacer exactamente.  Lo bonito de VBA es que usted puede construir el userform mientras aprendre como programar. 

Acerca de los nombres de los controles, por lo general uso una versión de la _Hungarian convention_ que describe Gregory Reddick aquí.  Me parece que usted ya se ha dado cuenta con leer lo que escribí; con usar un sistema para eso se hace mucho más fácil comprender -- usted pudo adivinar qué tipo de control era cada objeto con solo ver el nombre. 

Mientras desarrolla su userform -- especialmente sus primeros mientras anda aprendiendo -- no olvide del dicho sobre como uno come un elefante, «mordisco por mordisco».  No hay que comerlo todo en una sola cena.  Entonces hazlo paso por paso y si choca con algo que no puede resolver solo, pregunte aquí otra vez y uno de nosotros, los miembros, trata de ayudarle.

Saludos,


----------



## polboy_mx (Jun 28, 2006)

*De acuerdo Señor*

Asi es Greg, como dices poco a poco aunque quienes no dominamos a fondo esto de la programacion, pues a veces quisieramos comernos el pastel a una sola mordida com dices, pero comparto tu idea de aprender haciendo lectura y ejercitando, ahora si que me la paso a prueba y error y asi me ha resultado bastante productivo al grado de dedicarle mas minutos cada dia a esto del vb...y gracias a todos los que postean sus preguntas y opiniones aprendemos mas cada vez...respecto a lo que buscaba en el foro y no pude encontrar es sobre como hacer que al seleccionar el ID con un combobox esta accion haga que el NOMBRE se registre en un (textbox o combobox)...seguire buscando...


----------



## josevaldesv (Aug 8, 2006)

*y cómo se pone a funcionar?*

y cómo se hace para que salga la ventanita del user form?


----------



## Greg Truby (Aug 8, 2006)

José,

No entiendo muy bien a qué refiere usted con «ventanita».  ¿Pregunta usted cómo hace el usuario para salir de un control tipo "textbox"? Con una flecha o con teclar "tab".  ¿O pregunta usted cómo hace el usario para cerrar el UserForm en sí?  Con un botón, que generalmente dice "OK" [¿¿«aceptar»??].  Se puede usar código VBA para ver si el usario cerró el formulario con el botón "X" en la esquina superior derecha. O se puede poner otro botón «cancelar».  Los botones diciendo algo como:
	
	
	
	
	
	



```
Private Sub btnOK_Click()
    Me.Hide
    g_booCancelar = False
End Sub

Private Sub btnCancel_Click()
    Me.Hide
    g_booCancelar = True
End Sub
```

Donde _g_booCancelar_ es un variable público de tipo 'boolean' definido en un "standard module".

Atte,


----------



## josevaldesv (Aug 9, 2006)

Greg,

Mi pregunta estuvo mal estipulada.
En realidad es: How do I get to produce a pop-up window (userform) and link it to a macro?
¿Cómo puedo hacer que salga la userform pop-up window ("ventanita"), y que los botones que tenga corran una macro?

Estoy muy perdido aquí..


----------



## polboy_mx (Jun 23, 2006)

hola a todos tengo esta hoja donde deseo crear un USEFORM con varios COMBOBOX para ingresar los datos en la misma hoja, uso un "rango" en ROWSOURCE para jalar los datos a seleccionar pero me falta el detalle de como hacer para que "caigan" en la ultima linea de los registros, seria al final del USEFORM on COMMAND BUTTON donde acepte la entrada o pudiera regresar para corregir y generar un USEFORM en blanco


----------



## Greg Truby (Aug 9, 2006)

Deb tiene una página buena sobre eso en su sitio, Contextures.  ¿Lee usted suficiente inglés para poder usar esto?


----------



## josevaldesv (Aug 11, 2006)

English's not a problem... gracias.. voy a investigar qué tiene.


----------



## josevaldesv (Aug 11, 2006)

quite impressive.... gracias por el link... it's already shown useful


----------



## Greg Truby (Aug 17, 2006)

Con mucho gusto.  Si usted queda con una pregunta haga un «thread» nuevo aquí.  Tarde o temprano la veré.

Cordialmente,


----------



## polboy_mx (Sep 19, 2006)

*saludos greg!*

pasando por aqui me di cuenta que Jose seguia con algunes preguntas que le fueron ya contestadas, aparte de saludarte Greg, tambien ya termine con este tema por ahora...debo poner alguna marca, no se como pregunta contestada, tema cerrado, o algo asi o debe quedar abierto para quien quiera consultarlo??   saludos


----------



## Greg Truby (Sep 20, 2006)

Saludos, Polboy,

Sí, es algo que solamente el iniciador de una hilera se puede hacer.  Vaya a su primer "post" y haz un cliq en el botoncito para editar y edite el sujeto para incluir algo como **Resuelto** en el sujeto y eso aparecerá en el título de la hilera.


----------

