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

#16 Francisco
29/09/2006 - 17:17 | Informe spam
Iván:

En primer lugar quiero que me perdones mi intromisión en el hilo que tenías
con Santi, no se porqué pensé que habías terminado y me metí por medio,
perdona.

He probado el código y funciona a las mil maravillas, no puedo poner ningún
'pero' porque no los hay.

Iván no seas modesto, eres una "Máquina" y a parte de lo que sabes te honra
mas tu interés por ayudar a los que estamos aprendiendo, llevo poco tiempo
en el foro y veo que en las cuestiones más complicadas estás aportando tu
saber. SIGUE COMO HASTA AHORA.

GRACIAS.. Ivan

Paco

"Ivan" escribió en el mensaje
news:
Hola Paco

gracias por tus palabras, pero en esto soy un simple aprendiz que
intento (me temo que con demasiada precipitacion, y poca fortuna en
ocasiones) echar una mano en el foro con lo poco que se, lo cual lo he
aprendido aqui gracias a sus verdaderos maestros y a sus consultantes.

En cuanto al nuevo registro quizas puedas hacer esto ( aunque te
recomiendo que tambien indagues con lo que se te halla ocurrido) ->

añades un 4º commandbutton que tomara el caption "Nuevo", en el
solamente borras los textbox y adjudica un nuevo Id para el nuevo
registro. Inhbilita el combo y el propio boton4 para evitar
interferencias, y una vez rellenos los datos se actualiza con
'Actualizar'.

sustituye los codigos del boton1 y del initialice y añade el del
boton4 (y añade el boton al formulario, je,je..)

Private Sub CommandButton1_Click()
Dim Col As Byte, Ltr As String
With ComboBox1
If .MatchFound = False Or .ListIndex = -1 Then
If CommandButton4.Enabled = True Then
MsgBox ("La entrada no coincide o esta vacia")
' AQUI tu decides lo que haces
Exit Sub
Else
MsgBox ("El nuevo registro se ha actualizado correctamente")
End If
End If
End With
For Col = 1 To 7
Ltr = Chr(64 + Col)
With Worksheets("Hoja1").Range(Ltr & Fila)
.Value = Me.Controls("TextBox" & Col)
If IsNumeric(.Value) Then .Value = _
Val(.Value)
End With
Next
With ComboBox1
.Clear
.List = Worksheets("Hoja1").Range("b2:b" & _
Worksheets("Hoja1").Range("a65536") _
.End(xlUp).Row).Value
.ListIndex = Fila - 2
End With
ComboBox1.Enabled = True
CommandButton4.Enabled = True
End Sub

Private Sub CommandButton4_Click()
Dim nTxt As Byte, NuevoIt As Long, Celda As Range
For nTxt = 1 To 7
Me.Controls("TextBox" & nTxt).Text = ""
Next
With Worksheets("Hoja1")
If .Range("a2") = "" Then
TextBox1 = 1: Fila = 2
Else
.Range("a1:g" & .[a65536].End(xlUp).Row).Sort _
key1:=.[a2], order1:=xlAscending, Header:=xlYes
TextBox1 = .[a65536].End(xlUp).Value + 1
Fila = .[a65536].End(xlUp).Row + 1
End If
End With
ComboBox1.Enabled = False
CommandButton4.Enabled = False
TextBox2.setfocus
End Sub

Private Sub UserForm_Initialize()
With Worksheets("Hoja1")
If .Range("a2") <> "" Then _
ComboBox1.List = .Range("b2:b" & _
.[a65536].End(xlUp).Row).Value
End With
TextBox1.Enabled = False
CommandButton1.Caption = "Actualizar"
CommandButton2.Caption = "Eliminar"
CommandButton3.Caption = "Cancelar"
CommandButton4.Caption = "Nuevo"
End Sub

Si quieres que halla campos obligatorios podrias poner en el
commandbutton1 -> en el "Else" de 'If CommandButton4=True' y antes del
msgbox ->algo parecido a esto-->

for ntxt=1 to 7
If Me.Controls("TextBox" & Col).text="" then
msgbox("El campo es obligatotio")
Me.Controls("TextBox" & Col).setfocus
exit sub
end if
next

esto haria obligatorios los 7, pero si quieres que sean menos, puedes
poner los obligados al principio y hacer el bucle solo hasta el nº de
obligados. Tambien lo puedes hacer textbox a textbox

seguro que surge alguna pega, pero a mi parece funcionarme. Adaptalo a
tus necesidades.
Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#17 Ivan
30/09/2006 - 00:16 | Informe spam
Hola Paco (y Santi, y compañia)

como me ha dicho a mi hace un rato Vinchenzo, pienso que no ha lugar a
pedir disculpas (y te lo dice uno que no para de pedirlas) por entrar
en un dialogo del foro. Al menos mientras se siga el mismo tema. De
hecho estoy (casi)seguro que a Santi tambien le ha interesado tu
consulta.

por otro lado, y sin animo de prolongar este tema, me temo (mas
quisiera) que no voy de modesto (ni con falsa modestia) al asegurar que
mi nivel es bastante bajo. De hecho en los codigos expuestos seguia( y
seguramente sigue) habiendo marras que podrian desencadenar algun
error. Aparte de crear alguna situacion sin una salida comoda (pej:
cancelar el añadir sin cerrar el formulario)

te mando un ultimo codigo, sobre todo para que compares(si quieres) con
los anteriores y saques tus propias conclusiones (las mias suelen
cambiar a cada linea que escribo). En el, como novedad principal, te
permite asignar a un boton(o...) la macro "VerForm" que abre el
formulario con el registro activo cargado. El resto creo que lo iras
viendo sobre la marcha. No te confies demasiado, pues no puedo
asegurarte que este libre de errores. Si tienes muchos registros
deberas pensar en añadir algunos application.screenupdating. Y
seguramente sea bastante mejorable, pero yo tambien he ido aprendiendo
con el.

Un saludo y hasta pronto
Ivan

PD: si quieres aprender VBA en excel, (en mi opinion) este es el mejor
sitio.

En un modulo normal:

Option Explicit
Public Fila As Long

Sub VerForm()
With ActiveCell
If Worksheets("Hoja1").Range("a" & .Row) <> "" Then _
Fila = .Row Else Fila = 1
End With
UserForm1.Show
End Sub

En el modulo del formulario:

Option Explicit
Dim fiVolver As Long

Private Sub ComboBox1_Change()
Dim Col As Byte, Ltr As String
With ComboBox1
If .ListIndex = -1 Then
For Col = 1 To 7
Me.Controls("TextBox" & Col) = ""
Next
Exit Sub
End If
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
With ComboBox1
If .MatchFound = False Or .ListIndex = -1 Then
If CommandButton4.Enabled = True Then
MsgBox ("La entrada no coincide o esta vacia")
ComboBox1.SetFocus
Exit Sub
Else
For Col = 1 To 7
If Me.Controls("TextBox" & Col) = "" Then
MsgBox "El campo es obligatorio."
Me.Controls("TextBox" & Col).SetFocus
Exit Sub
End If
Next
If MsgBox("El registro esta a punto de añadirse." & _
Chr(13) & "¿Desea continuar?", vbCritical + vbYesNo, _
"Confirmar nuevo registro") = vbNo Then
With ComboBox1: .Enabled = True
.ListIndex = VolverAlUltimo(fiVolver): End With
CommandButton2.Caption = "Eliminar"
CommandButton4.Enabled = True
Exit Sub
End If
End If
End If
End With
For Col = 1 To 7
Ltr = Chr(64 + Col)
With Worksheets("Hoja1").Range(Ltr & Fila)
.Value = Me.Controls("TextBox" & Col)
If IsNumeric(.Value) Then .Value = _
Val(.Value)
End With
Next
CommandButton4.Enabled = True
CommandButton2.Caption = "Eliminar"
LlenarCombo
With ComboBox1
.ListIndex = Fila - 2
.Enabled = True
.SetFocus
End With
End Sub

Private Sub CommandButton2_Click()
If CommandButton2.Caption = "No añadir" Then
If MsgBox("Está seguro de no añadir el registro.", _
vbCritical + vbYesNo, _
"Cancelar nuevo registro") = vbYes Then
With ComboBox1: .Enabled = True
.ListIndex = VolverAlUltimo(fiVolver): End With
CommandButton2.Caption = "Eliminar"
CommandButton4.Enabled = True
Exit Sub
End If
End If
With ComboBox1
If .MatchFound = False Or .ListIndex = -1 Then
MsgBox ("La entrada no coincide o esta vacia")
Exit Sub
End If
End With
If MsgBox("Esta seguro de querer eliminar el registro actual.", _
vbCritical + vbYesNo, "Confirmar eliminación") = vbNo Then Exit
Sub
Worksheets("Hoja1").Range("a" & Fila).EntireRow.Delete
LlenarCombo
ComboBox1.ListIndex = -1
End Sub

Private Sub CommandButton3_Click()
Unload Me
End Sub

Private Sub CommandButton4_Click()
fiVolver = Val(TextBox1)
With ComboBox1
.ListIndex = -1: .Enabled = False
End With
With Worksheets("Hoja1")
If .Range("a2") = "" Then
TextBox1 = 1: Fila = 2
Else
.Range("a1:g" & .[a65536].End(xlUp).Row).Sort _
key1:=.[a2], order1:=xlAscending, Header:=xlYes
TextBox1 = .[a65536].End(xlUp).Value + 1
Fila = .[a65536].End(xlUp).Row + 1
End If
End With
CommandButton2.Caption = "No añadir"
CommandButton4.Enabled = False
TextBox2.SetFocus
End Sub

Private Function VolverAlUltimo(ByVal fi As Long) As Double
Dim CeldaId As Range
With Worksheets("Hoja1")
For Each CeldaId In .Range("a2:a" & .[a65536].End(xlUp).Row)
If CeldaId = fi Then
VolverAlUltimo = CeldaId.Row - 2
Exit Function
End If
Next
VolverAlUltimo = -1
End With
End Function

Private Sub LlenarCombo()
Dim fiU As Long
ComboBox1.Clear
With Worksheets("Hoja1")
If .[a2] = "" Then Exit Sub
fiU = .[a65536].End(xlUp).Row
ComboBox1.List = .Range("b2:b" & fiU).Value
End With
End Sub

Private Sub UserForm_Initialize()
LlenarCombo
TextBox1.Enabled = False
CommandButton1.Caption = "Actualizar"
CommandButton2.Caption = "Eliminar"
CommandButton3.Caption = "Cancelar"
CommandButton4.Caption = "Nuevo"
With ComboBox1
.ListIndex = Fila - 2: .SetFocus
End With
End Sub
Respuesta Responder a este mensaje
#18 Ivan
30/09/2006 - 00:26 | Informe spam
para no variar:

cambia en el codigo del CommandButton2 el 1er Exit Sub y metelo entre
los dos End If >

CommandButton2.Caption = "Eliminar"
CommandButton4.Enabled = True
-esto--> Exit Sub
End If
End If

como te decia...
Respuesta Responder a este mensaje
#19 Francisco
30/09/2006 - 11:52 | Informe spam
Ivan:

Gracias, hoy probaré este nuevo código.

Un saludo

Paco


"Ivan" escribió en el mensaje
news:
para no variar:

cambia en el codigo del CommandButton2 el 1er Exit Sub y metelo entre
los dos End If >

CommandButton2.Caption = "Eliminar"
CommandButton4.Enabled = True
-esto--> Exit Sub
End If
End If

como te decia...

Respuesta Responder a este mensaje
#20 Francisco
30/09/2006 - 18:18 | Informe spam
Iván:

Ya lo he probado es más de lo que yo quería, pero mejor, funciona muy bien,
en lugar de poner un botón en la hoja he puesto para ver el formulario las
teclas CONTROL+F, creo que es mejor que un botón bailando por la hoja.

Yo abría el formulario al <Workbook_Open>, en principio me ha dado un
error, puesto que al abrir no hay ninguna celda seleccionada, pero lo he
solucionado poniendo esto:

En UserForm_Initialize()

donde pone:

With ComboBox1
.ListIndex = Fila - 2: .SetFocus
End With

He puesto esto:

If Fila > 0 Then
With ComboBox1
.ListIndex = Fila - 2: .SetFocus
End With
End If

Así se cuando inicio voy directamente al formulario (sin ningún registro
seleccionado) y cuando cierro el formulario y estoy en la hoja vuelvo al
formulario con el registro o fila activa, muy bien.

Gracias Iván

Ahora tengo que rematarlo, no es un listado simple de clientes que son datos
personales sin complicaciones, lo que estoy haciendo es algo mas complicado,
tengo celdas con formulas, celdas condicionales y también imprimir un Rtf
con marcadores en el que se tomen los datos del formulario ¿Creo que se
puede hacer?

Un Saludo Iván
"Ivan" escribió en el mensaje
news:
para no variar:

cambia en el codigo del CommandButton2 el 1er Exit Sub y metelo entre
los dos End If >

CommandButton2.Caption = "Eliminar"
CommandButton4.Enabled = True
-esto--> Exit Sub
End If
End If

como te decia...

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida