Access - Visual Basic (Dor Cabeça)

Sim mas se vou buscar o campo a uma tabela e pedir para me escrever no relatório em Data Longa, ele vai-me colocar mal a data :sh) .. Algum modo de dar a vola a isso?[8b]
Vai? Não estou a ver porque é que aparece mal a data. Coloca aqui um exemplo concreto que tenhas testado, para ver se percebo o que queres dizer com colocar mal a data.
 
Vai? Não estou a ver porque é que aparece mal a data. Coloca aqui um exemplo concreto que tenhas testado, para ver se percebo o que queres dizer com colocar mal a data.

:confused: esquece :confused: tens razão.. não sei que se passou ... ontem quando testei deu mal ...agora ia por tudo como tinha antes para te mostrar e deu bem [8b][8b][8b] ... Acho que já me estáa queimar alguns neuronios [:D]


Se não for abuso da minha parte e dado que já vi que percebes disto :sh)

_________________________


Tenho tabela "Alunos" com (Nome, idade, sexo)

Criei Query "Lista Alunos" da respectiva tabela e quero actualiza-la para me forncer idades maiores 20 anos via VBA e estou colocar:

strsql = "Select [Nome], [idade], [sexo] From [Lista Alunos] Where [Idade] > 20 ";
CurrentDb.Execute strsql

Não consigo assim actualizar uma Query?? Estive a ver a instrução Update mas parece só se aplicar a tabelas
PS: a actualização da Query terá de ser feita em VBA
 
Modificar a própria query em "run-time"? Nunca vi uma situação em que isso fosse necessário. Nem me parece boa prática. Imagina uma situação em que estão vários users a utilizar a mesma BD.

Investiga um pouco sobre as queries com parâmetros. Provavelmente é o mais indicado para o que pretendes.

Mas, se quiseres alterar a query em VBA podes usar o objecto QueryDefs:

CurrentDb.QueryDefs("
[Lista Alunos]").SQL = "Select [Nome], [idade], [sexo] From[Alunos] Where [Idade] > 20"
 
Modificar a própria query em "run-time"? Nunca vi uma situação em que isso fosse necessário. Nem me parece boa prática. Imagina uma situação em que estão vários users a utilizar a mesma BD.

Investiga um pouco sobre as queries com parâmetros. Provavelmente é o mais indicado para o que pretendes.

Mas, se quiseres alterar a query em VBA podes usar o objecto QueryDefs:

CurrentDb.QueryDefs("
[Lista Alunos]").SQL = "Select [Nome], [idade], [sexo] From[Alunos] Where [Idade] > 20"

Sim esse problema de estarem vários ultilizadores já pensei ...mas:

Eu tenho um um relatorio que quero imprimir de uma Query.

Os valores que quero seleccionar da query é data de incio e fim mas que é mutável mediante o dia que se quer o relatorio (é necessário alguns calculos para saber os dias)

Por isso querer fazer um query ''mutável" por VBA

mas vou tentar o QueryDefs (nao conhecia essa instrução)

Quer dizer posso sempre enviar esses valores para duas textbox invisiveis no form e fazer a consulta com os dados dessas Textbox :S ... mas tava a tentar evitar isso

Mais uma vez obrigadão [;)]
 
Last edited:
Modificar a própria query em "run-time"? Nunca vi uma situação em que isso fosse necessário. Nem me parece boa prática. Imagina uma situação em que estão vários users a utilizar a mesma BD.

Investiga um pouco sobre as queries com parâmetros. Provavelmente é o mais indicado para o que pretendes.

Mas, se quiseres alterar a query em VBA podes usar o objecto QueryDefs:

CurrentDb.QueryDefs("
[Lista Alunos]").SQL = "Select [Nome], [idade], [sexo] From[Alunos] Where [Idade] > 20"

essa instrução deu perfeitamente apr:)apr:)apr:) ...

Quando tiver mais algum duvida ... venho aqui te "chatear" um pouco :sh)

Obrigado
 
Blink graças a tua preciosa ajuda jáconsegui terminar um dos programas apr:) ...

Estou agora a meio de outro e surgiu-me outro problema.

Tenho de importar uma folha de excel para uma tabela do meu programa de access.

Programa: Main.mdb
Ficheiro Excel: L:\Alarmes.xls
Tabela Access que vai recolher dados: ListaAlarmes

Estou a usar o seguinte código:
____________________________________________
Private Sub Command2_Click()

Dim strPathFile As String, strFile As String, strPath As String
Dim strTable As String
Dim blnHasFieldNames As Boolean

blnHasFieldNames = True
strPath = "L:"
strTable = "ListaAlarmes"
strFile = Dir(strPath & "Alarmes.xls")
Do While Len(strFile) > 0
strPathFile = strPath & strFile
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
strTable, strPathFile, blnHasFieldNames
strFile = Dir()
Loop

End Sub
__________________________________________

Quando chega à instrução
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9,_
strTable, strPathFile, blnHasFieldNames
Dá erro dizendo

RunTime error 2391
Field'F1' doesn't exist in destination table 'ListaAlarmes'

Qual a formatação que deve ter a minha tabela se não tiver um numero certo de colunas e linhas da folha de excel a importar [s)]:confused:
 
Com o parâmetro "blnHasFieldNames = True" estás a indicar que o ficheiro excel tem cabeçalhos. Ou seja, nas células da primeira linha estão os nomes dos campos. E isto tem de corresponder com os nomes dos campos da tabela de destino.

Se houver algum nome de coluna no excel que não tenha correspondência com o nome do campo da tabela... vai dar esse erro.

Se o ficheiro excel tiver colunas que não queres importar para a tabela, podes tentar definir o parâmetro "range" do TransferSpreadsheet. por exemplo se só quiseres importar as 3 primeiras colunas do excel (colunas a,b,c):

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
strTable, strPathFile, blnHasFieldNames, "A:C"
 
Com o parâmetro "blnHasFieldNames = True" estás a indicar que o ficheiro excel tem cabeçalhos. Ou seja, nas células da primeira linha estão os nomes dos campos. E isto tem de corresponder com os nomes dos campos da tabela de destino.

Se houver algum nome de coluna no excel que não tenha correspondência com o nome do campo da tabela... vai dar esse erro.

Se o ficheiro excel tiver colunas que não queres importar para a tabela, podes tentar definir o parâmetro "range" do TransferSpreadsheet. por exemplo se só quiseres importar as 3 primeiras colunas do excel (colunas a,b,c):

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
strTable, strPathFile, blnHasFieldNames, "A:C"

Depois de teres dito isso ainda pensei que o meu problema era não ter criado as colunas na Tabela, mas agora ...

Criei a tabela no Access com as colunas A,B,C,D,E,F,G do tipo numero.
No ficheiro excel preenchi da coluna A até G com numeros, e até linha 24.

ao fazer o comando:

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
strTable, strPathFile, blnHasFieldNames, "A:G"

voltou a dar o erro
Field'F1' doesn't exist in destination table 'ListaAlarmes'

Existe aqui algumas coisas que não percebo:

1)porque se refere sempre campo F1 :confused: (se já delimitei as colunas da A > G)
2) O meu formato da Tabela Access tem de já ter numero colunas quero importar? Poderei ter isto mutável consoantes as colunas do ficheiro Excel Preenchido?
3)como é que ele (Access) sabe quantas linhas do meu Excel estão preenchidas e deve importar?
 
Não é bem assim...

Se a tabela no access tiver, por exemplo 3 campos: "Numero","Nome" e "Morada", o excel tem de ter esta estrutura:

excel1.JPG

O "F1" do erro significa "Field 1". Deu erro logo no primeiro campo.
 
Não é bem assim...

Se a tabela no access tiver, por exemplo 3 campos: "Numero","Nome" e "Morada", o excel tem de ter esta estrutura:

View attachment 95432

O "F1" do erro significa "Field 1". Deu erro logo no primeiro campo.


Pois estava-me a faltar essa particularidade ... [:blush:]
Obrigado pela ajuda [;)]


De qualquer das maneiras se tiver blnHasFieldNames = False deveria funcionar ...certo? estou a indicar que não tenho cabeçalhos :S
 
Last edited:
Se definires blnHasFieldNames = False, então os campos da tabela em access têm de se chamar "F1", "F2", "F3",.....

Com este formato, normalmente cria-se uma tabela "temporária" para importação rápida, depois validam-se os dados, e se estiver tudo ok, copiam-se os dados para a(s) tabela(s) definitiva(s) ...
 
Se definires blnHasFieldNames = False, então os campos da tabela em access têm de se chamar "F1", "F2", "F3",.....

Com este formato, normalmente cria-se uma tabela "temporária" para importação rápida, depois validam-se os dados, e se estiver tudo ok, copiam-se os dados para a(s) tabela(s) definitiva(s) ...

Com as tuas explicações [kiss] acho que daqui a uns anos já vou perceber umas coisitas de Access [;)]

Thanks
 
Blink ... aqui vamos nós outra vez com as minhas duvidas existênciais de VBA [8b][:D]

Encontro-me com uma duvida na elaboração do programa.
Tenho uma tabela de nome "Alarmes" que tem diversas colunas (F1, F2, F3) e quero-a ir percorrendo testando umas determinadas condições.
Até aqui tudo bem ...

Set rst = CurrentDb.OpenRecordset("Alarmes") 'Nome da tabela
If rst.RecordCount = 0 Then
MsgBox "Não há registos na Tabela"
End If
rst.MoveFirst
Do While Not rst.EOF
MsgBox rst.Fields("F2") 'Campo data
rst.MoveNext
Loop

A minha dificuldade é que quero testar em cada campo da linha da tabela(que pode ter uma pequena frase) uma condição, p.e.:

> Saber que o campo (a frase) contem uma determinada sequência de letras ou numeros. Testar por exemplo se tem a sequência '*prot*'.

Não sei se consegui ser explicito
Muito obrigado ajuda.
 
Usas a função InStr() que te procura uma sequência de caracteres numa string e retorna a posição (zero se não encontrou).

Code:
[COLOR=Green]If InStr(1, rst.Fields("F2"), "prot") <> 0 Then
    MsgBox rst.Fields("F2") 'Campo data
End if[/COLOR]
No teu código tens um pequeno problema. Se o recordset não tiver registos, dá a mensagem e depois tenta mover para o primeiro registo (MoveFirst). Isto dá erro. Podes usar a instrução "Exit Sub" para terminar o procedimento e não executar mais linhas de código:

Code:
If rst.RecordCount = 0 Then
   MsgBox "Não há registos na Tabela"
   [COLOR=Green]Exit Sub[/COLOR]
End If
 
Usas a função InStr() que te procura uma sequência de caracteres numa string e retorna a posição (zero se não encontrou).

Code:
[COLOR=green]If InStr(1, rst.Fields("F2"), "prot") <> 0 Then[/COLOR]
[COLOR=green]   MsgBox rst.Fields("F2") 'Campo data[/COLOR]
[COLOR=green]End if[/COLOR]
No teu código tens um pequeno problema. Se o recordset não tiver registos, dá a mensagem e depois tenta mover para o primeiro registo (MoveFirst). Isto dá erro. Podes usar a instrução "Exit Sub" para terminar o procedimento e não executar mais linhas de código:

Code:
If rst.RecordCount = 0 Then
   MsgBox "Não há registos na Tabela"
   [COLOR=green]Exit Sub[/COLOR]
End If

Perfect [;)]

One more time ... Thanks

És uma enciclopédia de Access[kiss].

Se um dia for Administrador da empresa ficas desde já contratado para Director do sector informático [;)][:D]
 
CurrentDb.Execute ("ALTER TABLE Alarmes DROP COLUMN Departamento Text;")
Tenho fazer algum '' fecho '' de tabela ... :S para executar esta instrução ... é que me dá seguinte erro.
 

Attachments

  • Sem título.JPG
    Sem título.JPG
    13.4 KB · Views: 0
Last edited:
CurrentDb.Execute ("ALTER TABLE Alarmes DROP COLUMN Departamento Text;")
Tenho fazer algum '' fecho '' de tabela ... :S para executar esta instrução ... é que me dá seguinte erro.
Não é boa prática andares a alterar a estrutura de tabelas em "run-time". Os comandos DDL necessitam de condições especiais para correrem. Apagar uma coluna julgo que exige que a tabela não esteja em uso.

Deves tentar arranjar outra solução em que não seja necessário apagar colunas de tabelas. Mas, se tiver mesmo de ser, tens de garantir que não há nenhum form, query ou mesmo a própria tabela abertos. Tipo:

docmd.Close acTable, "Alarmes"
docmd.Close acQuery, "MinhaQuery"
docmd.Close acForm, "FormXpto"
....
CurrentDb.Execute ("ALTER TABLE Alarmes DROP COLUMN Departamento Text;")
 
Não é boa prática andares a alterar a estrutura de tabelas em "run-time". Os comandos DDL necessitam de condições especiais para correrem. Apagar uma coluna julgo que exige que a tabela não esteja em uso.

Deves tentar arranjar outra solução em que não seja necessário apagar colunas de tabelas. Mas, se tiver mesmo de ser, tens de garantir que não há nenhum form, query ou mesmo a própria tabela abertos. Tipo:

docmd.Close acTable, "Alarmes"
docmd.Close acQuery, "MinhaQuery"
docmd.Close acForm, "FormXpto"
....
CurrentDb.Execute ("ALTER TABLE Alarmes DROP COLUMN Departamento Text;")

Blink realmente mesmocom as instruções do DoCmd.Close não está a funcionar grande coisa ...

não tem problema que eu dou a volta por outro lado :)


Mais umas informação desta vez pouco mais complicada :).

Quais as possibilidades de na exportação de umadterminada tabela em para excel poder atraves do meu programa Access fazer configurações nessa folha de Excel para a qual exportei a tabela? (ou seja p.e. imaginemos que após exportar a tabela para uma folha de excel queria colorir de vermelho as primeiras duas linhas ou qq coisa parecida)

É possivel mudar configuração de folha num ficheiro de Excel atraves do código no access?
 
Back
Top