Perfectament explicat a:
Es mostren els missatges amb l'etiqueta de comentaris ACCESS-VBA. Mostrar tots els missatges
Es mostren els missatges amb l'etiqueta de comentaris ACCESS-VBA. Mostrar tots els missatges
dissabte, 7 d’octubre del 2023
dissabte, 9 de setembre del 2023
Nul o cadena buida en Access
És de pre-escolar en Access, però mai m'havia trobat.
Parteixo d'aquesta taula amb 18 registres:
Si hagués fet el mateix amb criteri = EsNulo em sortirien altres, però no els 18.
El problema és que en uns casos és una cadena buida i en altres és un camp Null. Ho puc evidenciar amb una consulta de longitud del camp Rebut:
Els que són null no tenen longitud; els que són buits, tenen longitud 0.
Com ho puc resoldre?
Dos opcions.
a) A la consulta de selecció escric Es nulo o ""
b) Amb una consulta d'actualització converteixo els null en una cadena buida amb la funció Nz. La funció Nz converteix un tipus a un valor. En aquest cas, passem de tipus null al valor ""
Es nulo o cadena vacía en Access.
IsNull or empty string in Access.
dimecres, 21 d’octubre del 2015
Insertar un retorno de carro o salto de línea en una función Access
Trobat a
http://www.todoexpertos.com/categorias/tecnologia-e-internet/bases-de-datos/microsoft-access/respuestas/460171/introducir-un-retorno-de-carro
Carlosflan pregunta:
Como puedo insertar un retorno de carro entre dos valores que inserto en un campo "memo".
Es decir, ahora mismo tengo este campo "memo" de cada registro, con una línea super larga.
Utilizo macros, en concreto la de "EstablerValor".
[campo_memo]= ahora()&"TEXTO"&[campo_memo]
Me gustaría meter un retorno de carro después del TEXTO.
Así tengo un "histórico del cambio de este registro.
Es a dir, vol, a partir de
21/10/2015 Barcelona Finalizado
obtenir
21/10/2015 Barcelona
Finalizado
on Barcelona sería el texto i Finalizado el camp memo
Asturcon3 li contesta
=ahora() & texto" & chr(13) & chr(10) & [memo]
I efectivament funciona
Totalment d'acord amb l'agraiment de carlosflan:
http://www.todoexpertos.com/categorias/tecnologia-e-internet/bases-de-datos/microsoft-access/respuestas/460171/introducir-un-retorno-de-carro
Carlosflan pregunta:
Como puedo insertar un retorno de carro entre dos valores que inserto en un campo "memo".
Es decir, ahora mismo tengo este campo "memo" de cada registro, con una línea super larga.
Utilizo macros, en concreto la de "EstablerValor".
[campo_memo]= ahora()&"TEXTO"&[campo_memo]
Me gustaría meter un retorno de carro después del TEXTO.
Así tengo un "histórico del cambio de este registro.
Es a dir, vol, a partir de
21/10/2015 Barcelona Finalizado
obtenir
21/10/2015 Barcelona
Finalizado
on Barcelona sería el texto i Finalizado el camp memo
Asturcon3 li contesta
=ahora() & texto" & chr(13) & chr(10) & [memo]
I efectivament funciona
Totalment d'acord amb l'agraiment de carlosflan:
Eres un MONSTRUO! Parece una tontería, pero uso estos históricos desde hace cinco años y no había conseguido que nadie me respondiera, es más, yo creo que no entendían siquiera lo quería hacer.
dimecres, 18 de març del 2015
Renomenar un camp en Access amb VBA
Renomenar un camp en Access amb VBA
Renombrar un campo en Access con VBA
Change field name in Access with VBA
Tenim una taula TablaAlfa que conté un camp anomenat Id
Canviarem el nom d'aquest camp per IdAccess
We've got a table named TablaAlfa which contains a field named Id
We'll change its name by IdAccess
Tenemos una tabla llamada TablaAlfa que contiene un campo llamado Id
Le cambiaremos el nombre a IdAccess
Public Function CanviaNomCamp()
Dim db As DAO.Database
Dim tb As DAO.TableDef
Dim fd As DAO.Field
Set db = CurrentDb()
Set tb = db.TableDefs("TablaAlfa")
Set fd = tb.Fields("Id")
fd.Name = "IdAccess"
tb.Fields.Refresh
End Function
Renombrar un campo en Access con VBA
Change field name in Access with VBA
Tenim una taula TablaAlfa que conté un camp anomenat Id
Canviarem el nom d'aquest camp per IdAccess
We've got a table named TablaAlfa which contains a field named Id
We'll change its name by IdAccess
Tenemos una tabla llamada TablaAlfa que contiene un campo llamado Id
Le cambiaremos el nombre a IdAccess
Public Function CanviaNomCamp()
Dim db As DAO.Database
Dim tb As DAO.TableDef
Dim fd As DAO.Field
Set db = CurrentDb()
Set tb = db.TableDefs("TablaAlfa")
Set fd = tb.Fields("Id")
fd.Name = "IdAccess"
tb.Fields.Refresh
End Function
dilluns, 22 de desembre del 2014
dbOpenDynaset DAO
Feia temps que no veia unes explicacions tan clarificadores:
Sobre dbOpenDynaset
http://allenbrowne.com/ser-29.html
Sobre dbOpenDynaset
http://allenbrowne.com/ser-29.html
Microsoft Access Tips for Serious Users
Provided by Allen Browne. Last updated April 2010.
Contents:
VBA Traps: Working with Recordsets
This article highlights ten common traps with DAO recordsets in VBA code.
Most of the traps yield no syntax error; they are bugs lying dormant in your code until particular conditions are met. Your program then fails, or returns inaccurate results.
1. DAO versus ADO
The DAO and ADO libraries both have a Recordset object, but with different methods, properties, and options.
DAO is the native Access library (what Access itself uses), whereas ADO is a more generic library (now superseded by the vastly different ADO.NET library.)
Different versions of Access default to different libraries. See Solving Problems with Library References for details.
This article assumes DAO recordsets.
Solution:
To ensure your code works reliably:
- Set your references to use just the library you want.
- If you must use both, list your main one first.
- Disambiguate by specifying which library's recordset you want. Use:
Dim rs As DAO.Recordset
not:
Dim rs As Recordset
2. Recordset types
There are different types of DAO recordset, with different methods.
When you OpenRecordset() on a query or attached table, Access defaults to a Dynaset type (dbOpenDynaset). When you OpenRecordset() on a local table, it defaults to a Table type (dbOpenTable.)
The Table type has different methods (e.g. Seek instead of FindFirst), but it cannot be used with attached tables. So if you later split your database so the tables are attached, the code fails when you use a method that no longer applies.
Solution:
Always specify the type you want. Dynaset guarantees your code will work for all queries and tables, local and attached. Example:
Set rs = db.OpenRecordset("Table1", dbOpenDynaset)
Sobre dbSeeChanges
https://www.microsoftaccessexpert.com/Microsoft-Access-Code-dbSeeChanges.aspx
While working with a Microsoft Access database using linked Microsoft SQL Server tables, you may receive the following error message:
You must use the dbSeeChanges option with OpenRecordSet when accessing a SQL Server table that has an IDENTITY column
Solution: Set rst = CurrentDb.OpenRecordset("SELECT * From tblName", dbOpenDynaset, dbSeeChanges)
dissabte, 20 de setembre del 2014
dimarts, 5 d’agost del 2014
Is Null in VBA
If you are an absolute beginner -like me- in VBA the most normal is you try to use IS NULL to find a cell without values:
While Not rs.EOF
If rs![Resp] is null Then
z = z + 1
Else
i = i + 1
End If
rs.MoveNext
Wend
You can solve it by using IF IS NULL ( ) THEN like in this sample
While Not rs.EOF
If IsNull(rs![Resp]) Then
z = z + 1
Else
i = i + 1
End If
rs.MoveNext
Wend
dissabte, 19 d’abril del 2014
Eliminar una taula si existeix en VBA
Com ja és habitual, comences a buscar solucions per una cosa que ha de ser força freqüent i et trobes un munt de solucions complexes. Pot ser d'aquí a un temps canviaré la meva opinió però, de moment, si veig una solució simple no veig perquè complicar-me la vida.
En aquest cas vull eliminar la taula EstadosX sols si existeix i que no passi res si no existeix.
Faig un botó, en aquest cas Comando197 i a l'event click l'asocio aquest codi:
Private Sub Comando197_Click()
On Error GoTo BorraTaules_Err
If CurrentDb.TableDefs("EstadosX").Name = "EstadosX" Then
CurrentDb.TableDefs.Delete "EstadosX"
End If
BorraTaules_Exit:
Exit Sub
BorraTaules_Err:
Resume BorraTaules_Exit
End Sub
No hi ha segona part en el if perquè no és resol. Si no existeix dona error. Per tant, ho gestionem amb un error. Si vols, per comprovar-ho, pots possar un debug.print sota BorraTaules_Err: Veuràs que en cas de no existència, el codi s'en va cap a aquest subprocediment.
Tags:
Eliminate table if exists
Eliminar una tabla si existe
Comprobar que una tabla existe
Comprovació que una taula existeix
Verify if a table exists and delete
Basat en:
http://www.todoexpertos.com/categorias/tecnologia-e-internet/bases-de-datos/microsoft-access/respuestas/900406/macro-condicion
En aquest cas vull eliminar la taula EstadosX sols si existeix i que no passi res si no existeix.
Faig un botó, en aquest cas Comando197 i a l'event click l'asocio aquest codi:
Private Sub Comando197_Click()
On Error GoTo BorraTaules_Err
If CurrentDb.TableDefs("EstadosX").Name = "EstadosX" Then
CurrentDb.TableDefs.Delete "EstadosX"
End If
BorraTaules_Exit:
Exit Sub
BorraTaules_Err:
Resume BorraTaules_Exit
End Sub
No hi ha segona part en el if perquè no és resol. Si no existeix dona error. Per tant, ho gestionem amb un error. Si vols, per comprovar-ho, pots possar un debug.print sota BorraTaules_Err: Veuràs que en cas de no existència, el codi s'en va cap a aquest subprocediment.
Tags:
Eliminate table if exists
Eliminar una tabla si existe
Comprobar que una tabla existe
Comprovació que una taula existeix
Verify if a table exists and delete
Basat en:
http://www.todoexpertos.com/categorias/tecnologia-e-internet/bases-de-datos/microsoft-access/respuestas/900406/macro-condicion
dissabte, 12 d’abril del 2014
Capturar text d'un msgbox
A vegades voldriem capturar alguna part d'un msgbox per poder lliurar-ho o per copiar-ho i pegar-ho en alguna altra part. Sovint llegim i ens ho apuntem a ma o simplement ho recordem.
Hi ha una solució tan pràctica que sobta el poc coneguda que és.
Polsem simultàniament les dues tecles
CTRL C
(es a dir, un copy normal i corrent) tenint el focus sobre el msgbox. El resultat es va al portapapers. Obrim el portapapers i alli fem un cutypaste de la part que volguem.
Simple!.
Trobat a:
http://www.propiedadprivada.com/copiar-el-texto-de-un-alert-o-msgbox/820/
Tags:
Copy text from msgbox
Copiar texto de un msgbox
Copiar text d'un msgbox
Hi ha una solució tan pràctica que sobta el poc coneguda que és.
Polsem simultàniament les dues tecles
CTRL C
(es a dir, un copy normal i corrent) tenint el focus sobre el msgbox. El resultat es va al portapapers. Obrim el portapapers i alli fem un cutypaste de la part que volguem.
Simple!.
Trobat a:
http://www.propiedadprivada.com/copiar-el-texto-de-un-alert-o-msgbox/820/
Tags:
Copy text from msgbox
Copiar texto de un msgbox
Copiar text d'un msgbox
dimecres, 9 d’abril del 2014
Taules buides. Recordset buit. Access VBA
Les taules buides són una mica un maldecap.
El primer és que no les pots actualitzar.
Sembla que tenen un registre en blanc però, en realitat, no en tenen cap.Per això, si vols afegir dades cal fer una consulta d'annexió de dades. De fet és lògic.
Però quan la cosa encara és més fastidiosa és quan les converteixes en recordset. Per la mateixa raó, es a dir, perquè en realitat no tenen cap línia, si intentes fer un rs.movefirst, el programa petarà.
Conforme, però com puc saber si hi ha un o més d'un registre o, pel contrari, no hi ha cap?
Una bona solució seria "If rs.EOF And rs.BOF Then":
El que fem es validar que, en un recordset (en aquest cas anomenat rs) el principi [Begining Of File] i el final [End Of File] es troben en la mateixa línia. Per tant, te zero registres!!!
Un exemple de codi:
Private Sub subSumatori()
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("tempDedicacion")
Dim mbsumatori As String
If rs.EOF And rs.BOF Then
MsgBox "No hi ha registres de temps imputats aquest dia"
Usuaria = ""
lblUsuaria.Caption = Usuaria
rs.Close
End
Else
rs.MoveFirst
While Not rs.EOF
mbsumatori = mbsumatori & "Dia " & data....
rs.MoveNext
Wend
rs.Close
MsgBox mbsumatori
End If
End sub
Tags:
Empty table. Empty recordset
Tablas vacías. Recordset vacio
Taules buides. Recordset buit.
VBA Access
Error recordset vacío
Error recordset buit
El primer és que no les pots actualitzar.
Sembla que tenen un registre en blanc però, en realitat, no en tenen cap.Per això, si vols afegir dades cal fer una consulta d'annexió de dades. De fet és lògic.
Però quan la cosa encara és més fastidiosa és quan les converteixes en recordset. Per la mateixa raó, es a dir, perquè en realitat no tenen cap línia, si intentes fer un rs.movefirst, el programa petarà.
Conforme, però com puc saber si hi ha un o més d'un registre o, pel contrari, no hi ha cap?
Una bona solució seria "If rs.EOF And rs.BOF Then":
El que fem es validar que, en un recordset (en aquest cas anomenat rs) el principi [Begining Of File] i el final [End Of File] es troben en la mateixa línia. Per tant, te zero registres!!!
Un exemple de codi:
Private Sub subSumatori()
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("tempDedicacion")
Dim mbsumatori As String
If rs.EOF And rs.BOF Then
MsgBox "No hi ha registres de temps imputats aquest dia"
Usuaria = ""
lblUsuaria.Caption = Usuaria
rs.Close
End
Else
rs.MoveFirst
While Not rs.EOF
mbsumatori = mbsumatori & "Dia " & data....
rs.MoveNext
Wend
rs.Close
MsgBox mbsumatori
End If
End sub
Tags:
Empty table. Empty recordset
Tablas vacías. Recordset vacio
Taules buides. Recordset buit.
VBA Access
Error recordset vacío
Error recordset buit
dimarts, 8 d’abril del 2014
Crear una taula en access amb VBA
En general hom fa servir sistemes de tipus DAO o ADO que, personalment, encara trobo bastant complicats.
Pels que simplement volem crear una taula temporal amb VBA, aquesta seria una solució.
Creem una taula tempTaula amb quatre camps:
Font: http://www.access-programmers.co.uk/forums/showthread.php?t=149613
El codi (es recomana pasar-ho a Notepad++ amb llenguatge vb)
Option Compare Database
Option Explicit
Private Sub Form_Load()
DoCmd.SetWarnings False
End Sub
Private Sub cmdCreaTaula_Click()
crearTaula
subqryPersonatges
End Sub
Private Sub crearTaula()
'Font: http://www.access-programmers.co.uk/forums/showthread.php?t=149613
Dim qryCrearTaula As String
qryCrearTaula = "CREATE TABLE tempTaula (ID integer, Nom text (10), Cognom text (20), Anys integer )"
DoCmd.RunSQL qryCrearTaula
End Sub
Private Sub subqryPersonatges()
Dim qryPersonatges As String
qryPersonatges = "INSERT INTO tempTaula ( ID, Nom, Cognom, Anys )" _
& "SELECT 1 AS Expr1, ""Pepe"" AS Expr2, ""Gotera"" AS Expr3, 50 AS Expr4;"
DoCmd.RunSQL qryPersonatges
End Sub
Tags:
Make a table with VBA in Access
Crear una tabla con VBA en Access
Crear una taual amb VBA en Access
Pels que simplement volem crear una taula temporal amb VBA, aquesta seria una solució.
Creem una taula tempTaula amb quatre camps:
- ID de tipus integer
- Nom de tipus text amb longitud 10
- Cognom de tipus text amb longitud 20
- Anys de tipus integer
Un cop creada la taula, l'omplim -amb una taula d'annexió- amb els valors 1,Pepe, Gotera i 50
Tot ho fem polsant un botó.
Font: http://www.access-programmers.co.uk/forums/showthread.php?t=149613
El codi (es recomana pasar-ho a Notepad++ amb llenguatge vb)
Option Compare Database
Option Explicit
Private Sub Form_Load()
DoCmd.SetWarnings False
End Sub
Private Sub cmdCreaTaula_Click()
crearTaula
subqryPersonatges
End Sub
Private Sub crearTaula()
'Font: http://www.access-programmers.co.uk/forums/showthread.php?t=149613
Dim qryCrearTaula As String
qryCrearTaula = "CREATE TABLE tempTaula (ID integer, Nom text (10), Cognom text (20), Anys integer )"
DoCmd.RunSQL qryCrearTaula
End Sub
Private Sub subqryPersonatges()
Dim qryPersonatges As String
qryPersonatges = "INSERT INTO tempTaula ( ID, Nom, Cognom, Anys )" _
& "SELECT 1 AS Expr1, ""Pepe"" AS Expr2, ""Gotera"" AS Expr3, 50 AS Expr4;"
DoCmd.RunSQL qryPersonatges
End Sub
Tags:
Make a table with VBA in Access
Crear una tabla con VBA en Access
Crear una taual amb VBA en Access
divendres, 4 d’abril del 2014
Format DATA europeu i americà en Acces VBA
Capto una data d'un control ActiveX de tipus calendari:
data = calendari.value
fico aquesta variable dins una select:
...
'WHERE (((OCUPACION.FECHA)= #" & data & "# )
...
funciona fantàsticament pel dia 31 de març però el dia 03 d'abril me'l considera com a 4 de març.
Se que la data la capta en format americà, però fent un debug aparentment està bé...
Busco una mica i dins
http://www.lawebdelprogramador.com/foros/Access/1304492-Formato_de_fechas_Europeo_-_Americano.html
trobo la solució:
WHERE (((OCUPACION.FECHA)= #" & Format([data], "mm/dd/yyyy") & "# )
Ara funciona perfectament
data = calendari.value
fico aquesta variable dins una select:
...
'WHERE (((OCUPACION.FECHA)= #" & data & "# )
...
funciona fantàsticament pel dia 31 de març però el dia 03 d'abril me'l considera com a 4 de març.
Se que la data la capta en format americà, però fent un debug aparentment està bé...
Busco una mica i dins
http://www.lawebdelprogramador.com/foros/Access/1304492-Formato_de_fechas_Europeo_-_Americano.html
trobo la solució:
WHERE (((OCUPACION.FECHA)= #" & Format([data], "mm/dd/yyyy") & "# )
Ara funciona perfectament
dijous, 13 de febrer del 2014
Consulta amb comodins en VBA Access
Tenim una taula (FIN) amb uns quants bitxos i volem annexar en una nova taula (FIN2) sols els registres que continguin aquestes cadenes.
PATO
GA*
*TO
*AT*
La taula podria ser aquesta:
La primera querie ens donaria sols PATO
La segona querie ens donaria sols els registres amb el camp BICHO igual a GATO
La tercera ens donaria PATO i GATO
La quarta PATO, RATA i GATO
Per consultes amb comodins no val copiar directament el SQL, cal retocar-ho una mica.
El codi (comentat perquè cal escollir una de les opcions) seria:
Private Sub Comando0_Click()
Dim ALFA As String
'ALFA = "INSERT INTO FIN2 ( BICHO )SELECT FIN.BICHO FROM FIN WHERE (((FIN.BICHO)=""PATO""));"
'ALFA = "INSERT INTO FIN2 ( BICHO ) SELECT FIN.BICHO FROM FIN WHERE (((FIN.BICHO) Like 'GA*'));"
'ALFA = "INSERT INTO FIN2 ( BICHO ) SELECT FIN.BICHO FROM FIN WHERE (((FIN.BICHO) Like '*TO'));"
'ALFA = "INSERT INTO FIN2 ( BICHO ) SELECT FIN.BICHO FROM FIN WHERE (((FIN.BICHO) Like '*AT*'));"
DoCmd.RunSQL (ALFA)
End Sub
Es a dir, el tema està en:
Like 'GA*'
Like '*TO'
Like '*AT*'
PATO
GA*
*TO
*AT*
La taula podria ser aquesta:
La primera querie ens donaria sols PATO
La segona querie ens donaria sols els registres amb el camp BICHO igual a GATO
La tercera ens donaria PATO i GATO
La quarta PATO, RATA i GATO
Per consultes amb comodins no val copiar directament el SQL, cal retocar-ho una mica.
El codi (comentat perquè cal escollir una de les opcions) seria:
Private Sub Comando0_Click()
Dim ALFA As String
'ALFA = "INSERT INTO FIN2 ( BICHO )SELECT FIN.BICHO FROM FIN WHERE (((FIN.BICHO)=""PATO""));"
'ALFA = "INSERT INTO FIN2 ( BICHO ) SELECT FIN.BICHO FROM FIN WHERE (((FIN.BICHO) Like 'GA*'));"
'ALFA = "INSERT INTO FIN2 ( BICHO ) SELECT FIN.BICHO FROM FIN WHERE (((FIN.BICHO) Like '*TO'));"
'ALFA = "INSERT INTO FIN2 ( BICHO ) SELECT FIN.BICHO FROM FIN WHERE (((FIN.BICHO) Like '*AT*'));"
DoCmd.RunSQL (ALFA)
End Sub
Es a dir, el tema està en:
Like 'GA*'
Like '*TO'
Like '*AT*'
dimecres, 20 de març del 2013
Afegir un text en cada línia
L'objectiu seria afegir a cada linia d'un txt el seu nom de fitxer. Exemple:
Es a dir, volem que cada linia del fitxer de Barcelona (08019) afegeixi, al principi de línia, aquest codi INE. Les dades es troben en una carpeta D:\addINE
El codi en VBA (es recomana llegir-ho amb Notepad++). S'ha fet en un formulari amb un únic botó.
Option Compare Database
Option Explicit
Dim dbs As Database
Dim rs As Recordset
Private Sub cmdCarregaINE_Click()
Dim qryTblINE As String 'Creem una variable per una query que funcionarà com a recordset
Dim strFitxer, strFitxerEscript As String 'Creem les variable pel fitxer origen i pel fitxer provisional on escriurem
Dim intFitxer, intFitxerEscript As Long 'Creem les variables per donar un número d'ordre al fitxer -origen i provisional-
Dim linFitxer, linFitxerEscript As String 'Creem les variables on desarem el que llegim i escribim
qryTblINE = "SELECT tblINE.INE FROM tblINE ORDER BY tblINE.INE;"
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset(qryTblINE) 'Al cridar a una variable no possem les cometes. Si cridessim a una taula si caldria que fos amb cometes ("tblINE")
While Not rs.EOF
intFitxer = FreeFile 'obtenim un número de gestor de fitxer lliure per gestionar l'opertura de fitxer inicial
strFitxer = "D:\addINE\" & rs![ine] & ".txt" 'Obtenim la ruta origen
strFitxerEscript = "D:\addINE\" & rs![ine] & "Escript.txt" 'Obtenim la ruta destí provisional
Open strFitxer For Input As #intFitxer 'Obrim el fitxer original per lectura donant-li un gestor ordenat
While Not EOF(intFitxer) 'Mentre no arribem al final del fitxer. Fem servir un gestor ordenat, no el propi fitxer
Line Input #intFitxer, linFitxer 'Escribim el contingut de la linia tractada en una variable
linFitxer = rs![ine] & ";" & linFitxer 'Afegim el valor del rs![INE] + ; al principi de la linia tractada
intFitxerEscript = FreeFile 'Obtenim un nou número de gestor de fitxer lliure pel fitxer provisional
Open strFitxerEscript For Append As #intFitxerEscript 'Obrim el fitxer provisional en mode escriptura amb el gestor
Print #intFitxerEscript, linFitxer 'Escribim dins el fitxer provisional,amb un gestor, la variable que hem llegit
Close #intFitxerEscript 'Tanquem el fitxer provisional. Cada vegada tindrà una linia més
Wend
Close #intFitxer 'Tanquem el fitxer inicial
Kill strFitxer 'Matem físicament el fitxer inicial
Name strFitxerEscript As strFitxer 'Canviem el nom del fitxer provisional pel nom del inicial
rs.MoveNext 'anem al següent registre del recordset
Wend
MsgBox "Ja he acabat"
End Sub
Es a dir, volem que cada linia del fitxer de Barcelona (08019) afegeixi, al principi de línia, aquest codi INE. Les dades es troben en una carpeta D:\addINE
El codi en VBA (es recomana llegir-ho amb Notepad++). S'ha fet en un formulari amb un únic botó.
Option Compare Database
Option Explicit
Dim dbs As Database
Dim rs As Recordset
Private Sub cmdCarregaINE_Click()
Dim qryTblINE As String 'Creem una variable per una query que funcionarà com a recordset
Dim strFitxer, strFitxerEscript As String 'Creem les variable pel fitxer origen i pel fitxer provisional on escriurem
Dim intFitxer, intFitxerEscript As Long 'Creem les variables per donar un número d'ordre al fitxer -origen i provisional-
Dim linFitxer, linFitxerEscript As String 'Creem les variables on desarem el que llegim i escribim
qryTblINE = "SELECT tblINE.INE FROM tblINE ORDER BY tblINE.INE;"
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset(qryTblINE) 'Al cridar a una variable no possem les cometes. Si cridessim a una taula si caldria que fos amb cometes ("tblINE")
While Not rs.EOF
intFitxer = FreeFile 'obtenim un número de gestor de fitxer lliure per gestionar l'opertura de fitxer inicial
strFitxer = "D:\addINE\" & rs![ine] & ".txt" 'Obtenim la ruta origen
strFitxerEscript = "D:\addINE\" & rs![ine] & "Escript.txt" 'Obtenim la ruta destí provisional
Open strFitxer For Input As #intFitxer 'Obrim el fitxer original per lectura donant-li un gestor ordenat
While Not EOF(intFitxer) 'Mentre no arribem al final del fitxer. Fem servir un gestor ordenat, no el propi fitxer
Line Input #intFitxer, linFitxer 'Escribim el contingut de la linia tractada en una variable
linFitxer = rs![ine] & ";" & linFitxer 'Afegim el valor del rs![INE] + ; al principi de la linia tractada
intFitxerEscript = FreeFile 'Obtenim un nou número de gestor de fitxer lliure pel fitxer provisional
Open strFitxerEscript For Append As #intFitxerEscript 'Obrim el fitxer provisional en mode escriptura amb el gestor
Print #intFitxerEscript, linFitxer 'Escribim dins el fitxer provisional,amb un gestor, la variable que hem llegit
Close #intFitxerEscript 'Tanquem el fitxer provisional. Cada vegada tindrà una linia més
Wend
Close #intFitxer 'Tanquem el fitxer inicial
Kill strFitxer 'Matem físicament el fitxer inicial
Name strFitxerEscript As strFitxer 'Canviem el nom del fitxer provisional pel nom del inicial
rs.MoveNext 'anem al següent registre del recordset
Wend
MsgBox "Ja he acabat"
End Sub
dijous, 7 de febrer del 2013
dilluns, 7 de gener del 2013
Fecha corta en Access amb namedformat
Si tenim un data amb aquest aspecte:
7-1-13 10:05
i ens cal que es vegi en format curt, es a dir:
7-1-13
hi ha una expressió que ho fa dins el grup CONVERSION. Es FormatoFechaHora
L'expressió queda així:
FormatoFechaHora («expresiónCadena»; «namedformat»)
El problema es que, pel que fa al namedformat, l'ajuda de MicroSoft no ajuda gaire -com és habitual-.
Si tenim una mica de paciència trobarem aquest alta pàgina on veiem quin ha de ser el valor:
http://office.microsoft.com/es-es/access-help/formatdatetime-funcion-HA001228841.aspx?CTT=1
Exemple:
Data: FormatoFechaHora([DEDICACION]![FECHA_MOD];2)
7-1-13 10:05
i ens cal que es vegi en format curt, es a dir:
7-1-13
hi ha una expressió que ho fa dins el grup CONVERSION. Es FormatoFechaHora
L'expressió queda així:
FormatoFechaHora («expresiónCadena»; «namedformat»)
El problema es que, pel que fa al namedformat, l'ajuda de MicroSoft no ajuda gaire -com és habitual-.
Si tenim una mica de paciència trobarem aquest alta pàgina on veiem quin ha de ser el valor:
http://office.microsoft.com/es-es/access-help/formatdatetime-funcion-HA001228841.aspx?CTT=1
Exemple:
Data: FormatoFechaHora([DEDICACION]![FECHA_MOD];2)
dilluns, 24 de desembre del 2012
Formulari editable amb botons en VBA
Creem un formulari que llegeix una consulta que afecta a dues taules.
Es pot editar el contingut.
Presenta dos botons i gestiona quan arriba al principi i al final
Fa una comparativa marcant en vermell les diferencies entre la casella superior i la inferior.
Aspecte de les taules i la consulta. La consulta connecta pel nom de municipi i sols afecta als que tenen l'estat Activo. El recordset apunta a aquesta consulta.
Aspecte del formulari:
El codi (es pot veure amb colorins amb Notepad++):
Dim dbs As Database
Dim rs As Recordset
Private Sub cmdSortir_Click()
rs.Close
Set rs = Nothing
DoCmd.Close
End Sub
Private Sub Form_Load()
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("Qry01")
Correccio
End Sub
Private Sub cmdPrev_Click()
rs.MovePrevious
If rs.BOF Then
rs.MoveFirst
End If
Correccio
End Sub
Private Sub cmdNext_Click()
rs.MoveNext
If rs.EOF Then
rs.MoveLast
End If
Correccio
End Sub
Private Sub Correccio()
Me!txtM = rs![municipio]
Me!txtSA = rs![SuperficieA]
Me!txtSB = rs![SuperficieB]
Me!txtSC = rs![SuperficieC]
Me!txtTA = rs![TotalA]
Me!txtTB = rs![TotalB]
Me!txtTC = rs![TotalC]
Validacio
End Sub
Private Sub txtM_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![municipio] = Me!txtM
rs.Update
End Sub
Private Sub txtSA_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![SuperficieA] = Me!txtSA
rs.Update
End Sub
Private Sub txtSB_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![SuperficieB] = Me!txtSB
rs.Update
End Sub
Private Sub txtSC_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![SuperficieC] = Me!txtSC
rs.Update
End Sub
Private Sub txtTA_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![TotalA] = Me!txtTA
rs.Update
End Sub
Private Sub txtTB_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![TotalB] = Me!txtTB
rs.Update
End Sub
Private Sub txtTC_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![TotalC] = Me!txtTC
rs.Update
End Sub
Private Sub Validacio()
If rs![SuperficieA] = rs![TotalA] Then
Me!txtValidA.ForeColor = RGB(0, 0, 0)
Me!txtValidA = "OK"
Else
Me!txtValidA.ForeColor = RGB(255, 0, 0)
Me!txtValidA = "Error"
End If
End Sub
Es pot editar el contingut.
Presenta dos botons i gestiona quan arriba al principi i al final
Fa una comparativa marcant en vermell les diferencies entre la casella superior i la inferior.
Aspecte de les taules i la consulta. La consulta connecta pel nom de municipi i sols afecta als que tenen l'estat Activo. El recordset apunta a aquesta consulta.
Aspecte del formulari:
El codi (es pot veure amb colorins amb Notepad++):
Dim dbs As Database
Dim rs As Recordset
Private Sub cmdSortir_Click()
rs.Close
Set rs = Nothing
DoCmd.Close
End Sub
Private Sub Form_Load()
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("Qry01")
Correccio
End Sub
Private Sub cmdPrev_Click()
rs.MovePrevious
If rs.BOF Then
rs.MoveFirst
End If
Correccio
End Sub
Private Sub cmdNext_Click()
rs.MoveNext
If rs.EOF Then
rs.MoveLast
End If
Correccio
End Sub
Private Sub Correccio()
Me!txtM = rs![municipio]
Me!txtSA = rs![SuperficieA]
Me!txtSB = rs![SuperficieB]
Me!txtSC = rs![SuperficieC]
Me!txtTA = rs![TotalA]
Me!txtTB = rs![TotalB]
Me!txtTC = rs![TotalC]
Validacio
End Sub
Private Sub txtM_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![municipio] = Me!txtM
rs.Update
End Sub
Private Sub txtSA_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![SuperficieA] = Me!txtSA
rs.Update
End Sub
Private Sub txtSB_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![SuperficieB] = Me!txtSB
rs.Update
End Sub
Private Sub txtSC_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![SuperficieC] = Me!txtSC
rs.Update
End Sub
Private Sub txtTA_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![TotalA] = Me!txtTA
rs.Update
End Sub
Private Sub txtTB_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![TotalB] = Me!txtTB
rs.Update
End Sub
Private Sub txtTC_BeforeUpdate(Cancel As Integer)
rs.Edit
rs![TotalC] = Me!txtTC
rs.Update
End Sub
Private Sub Validacio()
If rs![SuperficieA] = rs![TotalA] Then
Me!txtValidA.ForeColor = RGB(0, 0, 0)
Me!txtValidA = "OK"
Else
Me!txtValidA.ForeColor = RGB(255, 0, 0)
Me!txtValidA = "Error"
End If
End Sub
dilluns, 17 de desembre del 2012
Crear una carpeta amb data d'avui
Avui és 18 de desembre de 2012.
Volem crear una carpeta dins E:\DATOS\Empresa que es digui Entrega20121218. La idea es que l'aplicació calculi cada dia la data:
Fem un botó que anomenarem cmdMkdir
Private Sub cmdMkDir_Click()
Dim Avui
Dim AquestAny, AquestMes, AquestDia, AquestLliurament As String
Avui = Now
AquestAny = Year(Avui)
AquestMes = Month(Avui)
AquestDia = Day(Avui)
AquestLliurament = "Entrega" & AquestAny & AquestMes & AquestDia & "\"
MkDir "E:\DATOS\Empresa\" & AquestLliurament
End Sub
Volem crear una carpeta dins E:\DATOS\Empresa que es digui Entrega20121218. La idea es que l'aplicació calculi cada dia la data:
Fem un botó que anomenarem cmdMkdir
Private Sub cmdMkDir_Click()
Dim Avui
Dim AquestAny, AquestMes, AquestDia, AquestLliurament As String
Avui = Now
AquestAny = Year(Avui)
AquestMes = Month(Avui)
AquestDia = Day(Avui)
AquestLliurament = "Entrega" & AquestAny & AquestMes & AquestDia & "\"
MkDir "E:\DATOS\Empresa\" & AquestLliurament
End Sub
divendres, 14 de desembre del 2012
Obrir PDF des de Acces amb VBA
Queda explicat a http://www.mvp-access.com/buho/ficheros/abrirfichero.txt :
Hola a todos y gracias de antemano. Mi duda es la siguiente:
resulta q tengo un manual de mi aplicacion hecho en acrobat (pdf) y queria
que al apretar un command button se abriera. Es posible?? como??
BUHO
====
Para abrir un fichero (Del tipo que sea...Bmp, Jpg, Pdf) desde Access,
Windows guarda la asociacion de la extension de dicho fichero con un
ejecutable con lo cual .....
esto puede servirte como orientacion:
http://personal.telefonica.terra.es/web/medicofamilia/asociada.txt
http://www.iespana.es/mcpegasus/faqs/basEjecutarAplicacion.txt
o esto...
'esto en un modulo bas de tu aplicacion, por ejemplo
'en una sola linea
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Const SW_SHOW = 1
'***********************************
'Esto en cualquier boton de comando de tu formulario
ShellExecute Me.hwnd, "open", "C:\Carpeta\Manual.pdf", "", "", SW_SHOW
Jo ho he provat amb un parell de modificacions:
en el mòdul, en lloc de SW_SHOW= 1 he fet servir 3. A banda, li he fet obrir uns quants fitxers simultàniamente
La font per canviar de 1 a 3 ha estat
Si el valor 1 implica normal
SW_SHOWNORMAL (1)
Activates and displays a window. If the window is minimized or maximized, Windows restores it to its original size and position. An application should specify this flag when displaying the window for the first time.
entenc que el valor 3 implicarà maximització:
SW_SHOWMAXIMIZED (3)
Activates the window and displays it as a maximized window.
I ha funcionat!!!
El meu codi en un botó:
Private Sub Comando0_Click()
ShellExecute Me.hwnd, "open", "E:\DATOS\Empresa\python-excel.pdf", "", "", SW_SHOW
ShellExecute Me.hwnd, "open", "E:\DATOS\Empresa\vbasic60.pdf", "", "", SW_SHOW
ShellExecute Me.hwnd, "open", "E:\DATOS\Empresa\vb.pdf", "", "", SW_SHOW
ShellExecute Me.hwnd, "open", "E:\DATOS\Empresa\Prestamos.pdf", "", "", SW_SHOW
End Sub
i el codi en el mòdul:
Option Compare Database
Option Explicit
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Const SW_SHOW = 3
Ara provaré que el codi del botó ataqui a un recordset on tingui els PDF que vull obrir i d'aquesta manera estalviaré el anar obrint-los d'un en un des de l'explorador (que trist)
dimarts, 11 de desembre del 2012
While en Recordset i Actualitzar registres en un Recordset
Fem un recordset que recull les dades d'una consulta.
Tractarem tots els registres del camp Obra. De moment, simplement els escriurem.
Farem servir el While not rs.EOF per recorrer el recordset des del principi fins al final.
Per modificar els registres primer entrarem en mode edició, aplicarem el canvi i farem un update:
Interesant: Recordsets for Beginners
http://www.utteraccess.com/wiki/index.php/Recordsets_for_Beginners
Atenció: en aquest cas HEM ACTUALITZAT. Si hem d'afegir registres, fem servir rs.AddNew. El fet d'afegir implica que no cal el rs.movenext. Exemple per escriure en una taula PDF amb un camp FicheroPDF:
Private Sub Llistat()
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("PDF")
EscriptorPDF
'Tanquem el recordset i el desasignem
rs.Close
Set rs = Nothing
End Sub
Private Sub EscriptorPDF()
Dim MiRuta As String
Dim MiNombre As String
MiRuta = "C:\temp\CompCQFinal\*.pdf"
MiNombre = Dir(MiRuta) ' Recupera la primera entrada.
While MiNombre <>; "" ' Inicia el bucle.
If MiNombre <> "." And MiNombre <> ".." Then
rs.AddNew
rs![FicheroPDF] = MiNombre
rs.Update
End If
MiNombre = Dir ' Obtiene siguiente entrada.
Wend
End Sub
Tractarem tots els registres del camp Obra. De moment, simplement els escriurem.
Farem servir el While not rs.EOF per recorrer el recordset des del principi fins al final.
Per modificar els registres primer entrarem en mode edició, aplicarem el canvi i farem un update:
Interesant: Recordsets for Beginners
http://www.utteraccess.com/wiki/index.php/Recordsets_for_Beginners
Atenció: en aquest cas HEM ACTUALITZAT. Si hem d'afegir registres, fem servir rs.AddNew. El fet d'afegir implica que no cal el rs.movenext. Exemple per escriure en una taula PDF amb un camp FicheroPDF:
Private Sub Llistat()
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("PDF")
EscriptorPDF
'Tanquem el recordset i el desasignem
rs.Close
Set rs = Nothing
End Sub
Private Sub EscriptorPDF()
Dim MiRuta As String
Dim MiNombre As String
MiRuta = "C:\temp\CompCQFinal\*.pdf"
MiNombre = Dir(MiRuta) ' Recupera la primera entrada.
While MiNombre <>; "" ' Inicia el bucle.
If MiNombre <> "." And MiNombre <> ".." Then
rs.AddNew
rs![FicheroPDF] = MiNombre
rs.Update
End If
MiNombre = Dir ' Obtiene siguiente entrada.
Wend
End Sub
Subscriure's a:
Missatges (Atom)