Jump to content
Gnrtuga

[Resolvido] Carregar combobox no word através de tabela Access

Recommended Posts

Gnrtuga

Olá pessoal! Depois de muito tempo ausente (não estava chateado com ninguém) cá estou eu com as minhas dúvidas.

A situação é a seguinte, descobri (antes de ontem) que se podem carregar combobox através de uma tabela do access, encontrei um tutorial e funcionou com uma, quando tento com mais dá me o erro (já se torna demasiado irritante) object not found.

este é o meu código:

Sub userform_initialize()
'''' T E S T E S
''' C A R R E G A M E N T O
''' C O M B O  BO X
On Error GoTo UserForm_Initialize_Err
Dim cnn As New ADODB.Connection
Dim rst, dadosComandante, marcaViatura As New ADODB.Recordset
cnn.Open "provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=D:\OFICIOS\Dados Oficios.mdb"
'rst.Open "SELECT DISTINCT [Nome Serviço] FROM Finanças ORDER BY [Nome Serviço];", _
'cnn, adOpenStatic
'rst.MoveFirst
'
'With Me.cbfinancas
'.Clear
'Do
' .AddItem rst![Nome Serviço]
' rst.MoveNext
' Loop Until rst.EOF
' End With
'marcas viaturas
marcaViatura.Open "SELECT DISTINCT [Marca] FROM Marca_Viatura ORDER BY [Marca];", cnn, adOpenStatic
marcaViatura.MoveFirst
With Me.marcaf
.Clear
Do
.AddItem marcaViatura![Marca]
marcaViatura.MoveNext
Loop Until marcaViatura.EOF
End With

'nome comandante
' dadosComandante.Open "SELECT DISTINCT [Comandante]FROM Comando ORDER BY [Comandante];", cnn, adOpenStatic
' dadosComandante.MoveFirst
' With Me.cbnomec
' .Clear
' Do
' .AddItem dadosComandante![comandante]
' dadosComandante.MoveNext
' Loop Until dadosComandante.EOF
' End With
'
' 'posto
' dadosComandante.Open "SELECT DISTINCT [Posto]FROM Comando ORDER BY [Posto];", cnn, adOpenStatic
' dadosComandante.MoveFirst
' With Me.cbcomandante
' .Clear
' Do
' .AddItem dadosComandante![Posto]
' dadosComandante.MoveNext
' Loop Until dadosComandante.EOF
' End With
UserForm_Initialize_Exit:
On Error Resume Next
rst.Close
cnn.Close
dadosComandante.Close
marcaViatura.Close
Set rst = Nothing
Set cnn = Nothing
Set marcaViatura = Nothing
Set dadosComandante = Nothing

Exit Sub
UserForm_Initialize_Err:
MsgBox Err.Number & vbCrLf & Err.Description, vbCritical, "ERRO!"
Resume UserForm_Initialize_Exit

Assim sendo fico com uma data de dúvidas:

principal: o que está mal?

Tenho que abrir uma nova ligação para cada combobox que quero carregar? mesmo que os dados estejam na mesma tabela?

Tenho uma combobox que o valor só muda duas vezes por ano :) como faço para aparecer sempre o valor na combobox sem clicar na seta (uau sou possuidor de um vocabulário técnico que até a mim me espanta..lol)

como faço (não sei se é possível) para quando selecciono um serviço de finanças na combobox enviar a respectiva morada (está na mesma tabela) para uma variável?

obrigado pela ajuda

p.s oferece-se agradecimento (sincero) pela ajuda :)


Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Share this post


Link to post
Share on other sites
Gnrtuga

Olá pessoal, como normalmente, se sou eu a encontrar a resposta venho aqui postar a solução, para quem tiver o mesmo problema saiba como fazer..

Antes de mais isto é para office 2007 em diante, por isso é preciso retirar as referencias ao Microsoft DAO 3.51 (ou 3.6) Object Library e adicionar as referencias ao Microsoft Office 14 (ou 12) Access database engine Object Library.



Sub userform_initialize()

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim NoOfRecords As Long
 'Vai mostrar o caminho para a base de dados a retirar os dados
 Set db = OpenDatabase("D:\OFICIOS\Dados Oficios.mdb")

 'Define os registos a retirar
 Set rs = db.OpenRecordset("SELECT Marca FROM Marca_Viatura")
 Set df = db.OpenRecordset("SELECT Financas FROM Ser_Financas")

 'Determina o numero de registos
 'Marcas Viaturas
 With rs
.MoveLast
NoOfRecords = .RecordCount
.MoveFirst
 End With
 'Define as colunas da ListBox  = numero de campos no registo
 marcaf.ColumnCount = rs.Fields.Count
'marcaf é o nome da minha combobox (funciona com combobox e listbox)
 'carrega os dados
 marcaf.Column = rs.GetRows(NoOfRecords)
 'Cleanup

 'serviços de finanças
 With df
 .MoveLast
 NoOfRecords = .RecordCount
 .MoveFirst
 End With
 cbfinancas.ColumnCount = df.Fields.Count
 cbfinancas.Column = df.GetRows(NoOfRecords)

'aparentemente só é preciso fechar a primeira, independente do numero de queries a realizar

rs.Close
 db.Close

 Set rs = Nothing
 Set db = Nothing

'para fazer uma query, baseada numa query, e para que o primeiro registo fosse sempre o
'escolhido fiz isto:
Private Sub cbfinancas_Change()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim NoOfRecords As Long
On Error Resume Next

 'Vai abrir a base de dados para retirar os dados
 Set db = OpenDatabase("D:\OFICIOS\Dados Oficios.mdb")
 'vai procurar a morada das finanças que for escolhida na combobox
 Set teste = db.OpenRecordset("SELECT Morada1 FROM Ser_Financas WHERE Financas ='" & Me.cbfinancas.Text & "'")
 'aqui vai meter todos os resultados da query numa combobox_
 'que vai ficar oculta
With teste
 .MoveLast
 NoOfRecords = .RecordCount
 .MoveFirst
 End With
 ComboBox1.ColumnCount = teste.Fields.Count
 ComboBox1.Column = teste.GetRows(NoOfRecords)
 'vai escolher o primeiro valor da lista, neste caso a morada das finanças
 ComboBox1.Text = Me.ComboBox1.List(0)

 'vai procurar a 2º parte da da morada
 Set teste2 = db.OpenRecordset("SELECT Morada2 FROM Ser_Financas WHERE Financas ='" & Me.cbfinancas.Text & "'")
 'aqui vai meter todos os resultados da query numa combobox_
 'que vai ficar oculta
With teste2
 .MoveLast
 NoOfRecords = .RecordCount
 .MoveFirst
 End With
 ComboBox2.ColumnCount = teste2.Fields.Count
 ComboBox2.Column = teste2.GetRows(NoOfRecords)
 ComboBox2.Text = Me.ComboBox2.List(0)

 'vai procurar o código postal
 Set teste3 = db.OpenRecordset("SELECT Codigo_Postal FROM Ser_Financas WHERE Financas ='" & Me.cbfinancas.Text & "'")
 'aqui vai meter todos os resultados da query numa combobox_
 'que vai ficar oculta
With teste3
 .MoveLast
 NoOfRecords = .RecordCount
 .MoveFirst
 End With
 ComboBox3.ColumnCount = teste3.Fields.Count
 ComboBox3.Column = teste3.GetRows(NoOfRecords)
 ComboBox3.Text = Me.ComboBox3.List(0)

serfinf.Text = cbfinancas.Text
'vai escolher a 1ª parte da morada
finmor1f.Text = ComboBox1.Text
' vai escolher a 2ª parte da morada
finmor2f.Text = ComboBox2.Text
'vai escolher o código postal
finpostf.Text = ComboBox3.Text


End Sub


Espero que venha a ajudar alguém e que seja perceptível..

Fikem bem.


Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.