manipulacion de BD

23/09/2006 - 01:12 por SantiRv | Informe spam
Dirijo mi inquietud nuevamente a ustedes puesto que en anteriores
ocasiones he recibido su valiosa ayuda.

Partimos que se trabaja en un libro en la cual una de sus hojas
("clientes") es utilizada como base de datos conteniendo los sig campos
-id (codigo)
-nombre
-direccion
-localidad
-caracteristica
-telefono
-email

Lo que pretendo es que mediante un formulario vba yo seleccione desde
un "combobox" (el cual me captura de la mencionada bd el nombre del
cliente) y me muestre en tantos textbox o labels (tantos como campos
existen en la tabla) los datos de ella.
Una vez hecho ello, el enfoque esta en elaborar 2 macros

1) me permita modificar los datos desde el formulario
2) me elimine por completo la fila del cliente que he selecionado


Espero la explicaion les haya sido util, y si quieren me pasan su mail
para amndarles el archivo para que les resulte mas facil aun la
explicaion

gracias

Preguntas similare

Leer las respuestas

#1 Ivan
23/09/2006 - 02:55 | Informe spam
Hola Santi

Yo hago algo parecido a esto:

suponiendo que:

a.- los titulos de campo/columna son exactamente los que expones, y
estan situados como los expones

b.- a los nombres de los textbox (si quieres editarlos creo que no te
valen los Labels) les antepones (pej:) txt al nombre del campo
correspondiente(yo lo hago asi para aclararme en el codigo), es decir,
al campo 'Nombre' le corresponde el textbox 'txtNombre', a 'Direccion'
el 'txtDireccion', etc

c.- el combobox (llamemosle cmbClientes) contiene todos los registros
de la hoja, no solo los unicos

d.- la hoja con la lista se llama pej: "Lista Clientes"

Al principio del modulo del formulario declaras :->

Dim Fila as Long

1.-Para llenar los TextBox->

Private Sub cmbClientes_Change()
Dim Col as Byte
For Col = 1 to 7
With cmbClientes
If .ListIndex < 0 Then Exit Sub
Fila = .ListIndex + 2
With WorkSheets("Lista Clientes")
Me.Controls("txt" & .Range("a1")(1,Col).Value).Text = _
.Range("a" & Fila)(1,Col).Value
End With
End With
Next
End Sub

2.-Para eliminar el registro. En un comandButton (pej: cmdEliminar):->

Private Sub cmdEliminar_Click()
Worksheets("Lista Clientes") _
.Range("a" & Fila).EntireRow.Delete
Exit Sub

3.-Para actualizar los cambios realizados en el registro veo (al menos)
dos opciones:

a.-segun escribes:->

Private Sub txtNombre_Change()
Worksheets("Lista Clientes").Range("b" & Fila) = txtNombre
End Sub

''Nota: lo tendrias que poner en cada textbox y cambiando los datos de
campo

b.- desde un comandButton (pej: cmdActualizar)

Private Sub cmdActualizar_Click()
Dim Celda as Range
With Worksheets("Lista Clientes")
For Each Celda in .Range("a1:g1")
With Celda
.Offset(Fila - 1,0).Value = _
Me.Controls("txt" & .Value)
End With
Next
End With
End Sub



Ten mucho ojo, porque no lo he escrito en el editor de VBA
y puede haber errores de escritura, aparte de que creo que funcionara,
pero no estpy seguro. Prueba con copias.

Espero que te sirva. Me cuentas

Un saludo y hasta pronto
Ivan


SantiRv ha escrito:

Dirijo mi inquietud nuevamente a ustedes puesto que en anteriores
ocasiones he recibido su valiosa ayuda.

Partimos que se trabaja en un libro en la cual una de sus hojas
("clientes") es utilizada como base de datos conteniendo los sig campos
-id (codigo)
-nombre
-direccion
-localidad
-caracteristica
-telefono
-email

Lo que pretendo es que mediante un formulario vba yo seleccione desde
un "combobox" (el cual me captura de la mencionada bd el nombre del
cliente) y me muestre en tantos textbox o labels (tantos como campos
existen en la tabla) los datos de ella.
Una vez hecho ello, el enfoque esta en elaborar 2 macros

1) me permita modificar los datos desde el formulario
2) me elimine por completo la fila del cliente que he selecionado


Espero la explicaion les haya sido util, y si quieren me pasan su mail
para amndarles el archivo para que les resulte mas facil aun la
explicaion

gracias
Respuesta Responder a este mensaje
#2 Ivan
23/09/2006 - 03:20 | Informe spam
Hola Santi

hay al menos un error y se me ha olvidado una (como poco) cosa:

El error-> sustituye al final del procedimiento de eliminar ->"Exit
Sub" por "End Sub"

El olvido->

al eliminar un registro, si vas a seguir trabajando en el formulario,
deberias actualizar el combobox en cmdEliminar_Change despues de
elimnar el registro. O sea limpiarlo y volver a llenarlo.

Private Sub cmdEliminar_Click()
Worksheets("Lista Clientes") _
.Range("a" & Fila).EntireRow.Delete
with cmdEliminar
.Clear
.List = .. ' o la forma que hayas usado para llenarlo
end with
End Sub

disculpa los fallos
un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#3 Ivan
23/09/2006 - 03:38 | Informe spam
Hola Santi, no hay dos sin tres

releyendo tu mensaje no estoy seguro de si 'ya' has rellenado el combo
(en mi 1ª lectura entendi que si)

por si acaso, y siguiendocon las condiciones y ejs anteriores->

confirmando que el titulo: "Nombres" lo tienes en B1, pones en el
evento Initialice del formulario:

cmbClientes.List = Worksheets("Lista Clientes").Range("b2:b" &
.[b65536] _
.End(xlUp).Row).Value

NOTA: tienes que tener al menos un registro/nombre

a ver si es la vencida

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#4 Ivan
23/09/2006 - 03:47 | Informe spam
Hola Santi, con un poco de verguenza, pero para evitarte errores cambia
el ultimo codigo (el del combo) por este otro =>

With Worksheets("Lista Clientes")
cmbClientes.List =.Range("b2:b" & .[b65536].End(xlUp).Row).Value
End With
Respuesta Responder a este mensaje
#5 Ivan
25/09/2006 - 01:11 | Informe spam
Hola Santi,

no es que sea pesado (que tambien), pero como supongo que has estado
descansando el fin de semana y hoy retomas el tema, te mando otra
propuesta, quizas mas completa y sencilla

Option Explicit
Dim Fila As Long

Private Sub ComboBox1_Change()
Dim Col As Byte, Ltr As String
With ComboBox1
If .ListIndex = -1 Then Exit Sub
Fila = .ListIndex + 2
End With
For Col = 1 To 7
Ltr = Chr(64 + Col)
Me.Controls("TextBox" & Col) = Worksheets("Hoja1") _
.Range(Ltr & Fila).Value
Next
End Sub

Private Sub CommandButton1_Click()
Dim Col As Byte, Ltr As String
For Col = 1 To 7
Ltr = Chr(64 + Col)
Worksheets("Hoja1").Range(Ltr & Fila) _
.Value = Me.Controls("TextBox" & Col)
Next
With ComboBox1
.Clear
.List = Worksheets("Hoja1").Range("a2:b" & _
Worksheets("Hoja1").Range("a65536") _
.End(xlUp).Row).Value
.ListIndex = Fila - 2
End With
End Sub

Private Sub CommandButton2_Click()
With Worksheets("Hoja1")
.Range("a" & Fila).EntireRow.Delete
ComboBox1.Clear
ComboBox1.List = .Range("a2:b" & _
.[a65536].End(xlUp).Row).Value
End With
End Sub

Private Sub CommandButton3_Click()
Unload Me
End Sub

Private Sub UserForm_Initialize()
With ComboBox1
.ColumnCount = 2
.BoundColumn = 1
.TextColumn = 2
.ColumnWidths = "0;" & .Width - 10
End With
With Worksheets("Hoja1")
If .Range("a2") <> "" Then _
ComboBox1.List = .Range("a2:b" & _
.[a65536].End(xlUp).Row).Value
End With
CommandButton1.Caption = "Actualizar"
CommandButton2.Caption = "Eliminar"
CommandButton3.Caption = "Cancelar"
End Sub


En este caso el formulario tiene:

La hoja se llama "Hoja1" - no me he dado cuenta de poner "Clientes",
puedes hacerlo tu cuando creas conveniente

Siete textbox a los que no se les cambia el nombre, es decir se llaman
TextBox1, TexTBox2, etc

Un Combobox -> nombre : ComboBox1

tres CommandButton-> CommandButton1, CommandButton2, etc

La opcion de actualizar mientras escribes no te la recomiendo. Pero te
vale mas o menos la que te comente antes.
Incluye en el combo el campo Id, que supongo sera unico mientras que el
nombre podria repetirse. (aunque ahora que lo pienso en este caso da lo
mismo, pues vamos a buscar no por coincidencia en la lista sino por el
nº de fila seleccionado. Bueno de momento lo dejo, pues no molesta y
no me da tiempo a cambiarlo).
En su funcionamiento es parecido al otro. Echale un vistazo y si
quieres comentas.


Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida