Avatar billede deducer Nybegynder
09. november 2004 - 08:13 Der er 30 kommentarer og
1 løsning

set numberformat på Field i tabel fra VBA

Hej Eksperter !
Jeg vil gerne kunne sætte det 4-foldige numberformat på Fields i en tabel fra VBA.
Tabellen bliver slettet og gendannet med forskellige kolonnenavne hvergang bruger skifter visnings-periode.
Derfor kan jeg ikke sætte formatet på tabellen.

Under gendannelsen ser koden sådan ud :

Sub updateTabel(re As DAO.Recordset)
  Dim index As Integer
  Dim tbl As TableDef
  Dim prp As Property
  Dim fc As FormatCondition
  CurrentDb.TableDefs.Delete "tblBookingKalender"
 
  Set tbl = CurrentDb.CreateTableDef("tblBookingKalender")
    For index = 0 To re.Fields.Count - 1 Step 1
      If index = 0 Then
        tbl.Fields.Append tbl.CreateField(re.Fields 
        (index).Name, dbDate)
      Else
        tbl.Fields.Append tbl.CreateField(re.Fields
          (index).Name, dbInteger)
      '/* Her vil jeg gerne formatere int
      End If
    Next index
  CurrentDb.TableDefs.Append tbl
re.Close
End Sub

Jeg vil bruge formatet : \"0[Blå];[Rød];[Grøn];[Grøn]0\"
I hjælpfilen har jeg under Format Property set at det burde kunne lade sig gøre :¤}
09. november 2004 - 09:27 #1
I teorien burde dette virke. Jeg kan dog ikke selv få det til at virke!! Men jeg ved at det har virket før. Så måske er det bare min maskine. Prøv det:

Sub updateTabel(re As DAO.Recordset)
  Dim index As Integer
  Dim tbl As TableDef
  Dim prp As Property
  Dim fc As FormatCondition
  CurrentDb.TableDefs.Delete "tblBookingKalender"
 
  Set tbl = CurrentDb.CreateTableDef("tblBookingKalender")
    For index = 0 To re.Fields.Count - 1 Step 1
      If index = 0 Then
        tbl.Fields.Append tbl.CreateField(re.Fields(index).Name, dbDate)
      Else
        tbl.Fields.Append tbl.CreateField(re.Fields(index).Name, dbInteger)
        Set prp = tdef(re.Fields(index).Name).CreateProperty("Format", dbText, "0[blue];[red];[green];[green]0")
        tdef(re.Fields(index).Name).Properties.Append prp
      End If
    Next index
  CurrentDb.TableDefs.Append tbl
re.Close
End Sub


NB: Måske skal semikolon'erne laves om til komma?
Avatar billede deducer Nybegynder
09. november 2004 - 09:54 #2
Hej Thomas

Jeg er i tvivl om denne linie :
Set prp = tdef(re.Fields(index).Name).CreateProperty("Format", dbText, "0[blue];[red];[green];[green]0")

datatypen dbText - feltet er her Integer. Jeg har ændret det til dbLong, da værdierne kommer fra en Count (Long).
Med denne ændring får jeg en datatypekonverteringsfejl.

Hvis jeg kører det som du har skrevet får jeg en "ugyldig handling" på denne linie :
tbl(re.Fields(index).Name).Properties.Append prp

jeg har oss lige et låseproblem, men det er vist et andet spm.
09. november 2004 - 09:58 #3
Hej Deducer,

Jeg mener, at dbtext er god nok, dda den ikke refererer til datatypen på feltet, men til selve egenskaben.

Har jeg ret i, at re.Fields(index).Name indeholder navnet på feltet?

Har feltet allerede en værdi i Format? I Så fald, vil den selvfølgelig ikke kunne tilføje den igen.
Avatar billede deducer Nybegynder
09. november 2004 - 10:11 #4
Hej bigT
Ja du har ret i at re.Fields(index).Name indeholder navnet på det nye felt.
Som nævnt har jeg oss et låseproblem og derfor kan jeg ikke helt køre loden som jeg gerne vil.

men Jeg skal lave en ny tabel, hvor kolonnenavne kan indeholde mellemrum.
Det er CREATE TABLE tblXXX ADD COLUMN ... ikke så glad for - ja her duer mellemrum ikke. I min desperation leder jeg gennem hjælpF og falder over TableDefs.
Her kan jeg lave en ny tabel med de aktuelle kolonnenavne.

tester lige igen
09. november 2004 - 10:13 #5
Ja, hvis tabellen er låst, kan du selvfølgelig ikke få lov at ændre noget i den.

Måske er du nødt til at vente med at ændre formattet til tabellen er gemt. Og det bliver den jo egentlig først i 3. sidste linie med:
CurrentDb.TableDefs.Append tbl

Først herefter kan du muligvis få lov at ændre formattet!?
Avatar billede deducer Nybegynder
09. november 2004 - 10:14 #6
har prøvet med at ændre linien med ugylædig handling :
tbl.Fields(re.Fields(index).Name).Properties.Append prp

Det virker heller ikk, men det ser mere rigtigt ud (syns jeg)
09. november 2004 - 10:18 #7
hov, der var selvfølgelig en fejl i den linie. den bør hedde:

tdef(re.Fields(index).Name).Properties.Append prp

hvilket bør kunne forkortes til:

tbl(re(Index).Name).Properties.Append prp

NB: .Fields kan som regel udelades
Avatar billede deducer Nybegynder
09. november 2004 - 10:30 #8
Har prøvet at flytte property setting til efter tbl er appended.
det giver en anden fejl nu :
Objektet er ugyldigt eller ikke længere angivet

på  linie 'XXX:
Sub updateTabel(re As DAO.Recordset)
  Dim index As Integer
  Dim tbl As TableDef
  Dim prp As Property
  Dim fc As FormatCondition
  CurrentDb.TableDefs.Delete "tblBookingKalender"
 
  Set tbl = CurrentDb.CreateTableDef("tblBookingKalender")
    For index = 0 To re.Fields.Count - 1 Step 1
      If index = 0 Then
        tbl.Fields.Append tbl.CreateField(re.Fields(index).Name, dbDate)
      Else
        tbl.Fields.Append tbl.CreateField(re.Fields(index).Name, dbLong)
        're.Move 0
      Set prp = tbl(re.Fields(index).Name).CreateProperty("Format", dbText, "0[blue];[red];[green];0[green]")
       
      End If
    Next index
    CurrentDb.TableDefs.Append tbl
    Set tbl = CurrentDb.TableDefs("tblBookingKalender")
   
    For index = 0 To re.Fields.Count - 1 Step 1
      If index = 0 Then
      Else
        'XXX Set prp = tbl(re.Fields(index).Name).CreateProperty("Format", dbText, "0[blue];[red];[green];0[green]")
        tbl(re.Fields(index).Name).Properties.Append prp
      End If
    Next index


re.Close
End Sub
Avatar billede deducer Nybegynder
09. november 2004 - 10:33 #9
Angående dbText : Kan Access formatere værdien med den firfoldige numberformat (positiv, negativ nul ??), når typen er text
09. november 2004 - 11:14 #10
dbtext angiver bare, at "0[blue];[red];[green];0[green]" skal håndteres som tekst. Ikke at feltets datatype er tekst. Jeg tror ikke, at du skal spekulere mere på den dbText. Jeg har altid brugt den til både datoer og tal.

Når du får fejlen "Objektet er ugyldigt eller ikke længere angivet" skyldes det, at objektet er blevet lukket tidligere i processen. Jeg tror derfor, at du skal have flyttet linien
Set prp = tbl(re.Fields(index).Name).CreateProperty("Format", dbText, "0[blue];[red];[green];0[green]")

ned sammen med .Append-linien til sidst.
Avatar billede deducer Nybegynder
09. november 2004 - 11:34 #11
Hej BigT
Det viser sig her at være tbl (TableDefs obj) der er "lukket"
Har prøvet at flytte linien som du foreslår.
Den samme fejl (obj ugyldigt)
09. november 2004 - 11:35 #12
hvordan ser koden ud nu?
Avatar billede deducer Nybegynder
09. november 2004 - 11:42 #13
den ser sådan ud :


Sub updateTabel(re As DAO.Recordset)
  Dim index As Integer
  Dim tbl As TableDef
  Dim prp As Property
  Dim fc As FormatCondition
'  CurrentDb.TableDefs.Delete "tblBookingKalender"
 
  Set tbl = CurrentDb.CreateTableDef("tblBookingKalender")
    For index = 0 To re.Fields.Count - 1 Step 1
      If index = 0 Then
        tbl.Fields.Append tbl.CreateField(re.Fields(index).Name, dbDate)
      Else
        tbl.Fields.Append tbl.CreateField(re.Fields(index).Name, dbText)
        're.Move 0
      'Set prp = tbl(re.Fields(index).Name).CreateProperty("Format", dbText, "0[blue];[red];[green];0[green]")
        ' tbl(re.Fields(index).Name).Properties.Append prp
      End If
    Next index
    CurrentDb.TableDefs.Append tbl
    Set tbl = CurrentDb.TableDefs("tblBookingKalender")
  ' Dim s As String
  ' s = tbl.Name
    For index = 0 To re.Fields.Count - 1 Step 1
      If index = 0 Then
      Else
      Set prp = tbl(re.Fields(index).Name).CreateProperty("Format", dbText, "0[blue];[red];[green];0[green]")
        tbl(re.Fields(index).Name).Properties.Append prp
      End If
    Next index
re.Close
End Sub

Jeg har blændet af ved Dim s... og næste linie.
Da jeg testede satte jeg disse to linier ind og fik fejlen ved den anden linie
Avatar billede deducer Nybegynder
09. november 2004 - 11:50 #14
Min låsefejl opstår i Sub updateTabel.
Låsen er på tabellen tblBookingKalender og den låses, når sub'en har kørt een gang.
Ligenu er det ikke det største problem, men det skal virke, når det nuværende problem (forhåbentligt) bliver løst.
09. november 2004 - 11:52 #15
Jeg har skrevet det en smule om. Jeg ved ikke om det gør nogen forskel!?

Sub updateTabel(Byval re As DAO.Recordset)
  Dim db As Database
  Dim index As Integer
  Dim tbl As TableDef
  Dim prp As Property
  Dim fc As FormatCondition
  Set db = Currentdb
'  CurrentDb.TableDefs.Delete "tblBookingKalender"
 
  Set tbl = db.CreateTableDef("tblBookingKalender")
    For index = 0 To re.Fields.Count - 1 Step 1
      If index = 0 Then
        tbl.Fields.Append tbl.CreateField(re.Fields(index).Name, dbDate)
      Else
        tbl.Fields.Append tbl.CreateField(re.Fields(index).Name, dbText)
      End If
    Next index
    db.TableDefs.Append tbl
    tbl.close
    doevents
    Set tbl = db.TableDefs("tblBookingKalender")
    For index = 1 To re.Fields.Count - 1
        Set prp = tbl(re.Fields(index).Name).CreateProperty("Format", dbText, "0[blue];[red];[green];0[green]")
        tbl(re.Fields(index).Name).Properties.Append prp
    Next index
re.Close
End Sub
Avatar billede deducer Nybegynder
09. november 2004 - 12:00 #16
Hej BigT

Jeg får en compile fejl på tbl.close på din kode
(Member or method not found)
Avatar billede deducer Nybegynder
09. november 2004 - 12:04 #17
Det er i øvrigt kreperligt, da den funktionalitet først er blevet indskrevet i projektet nu (efter 5 mdr +) og hele systemet er bundet sammen.
Det er vel typisk, når man (jeg) ikke har holdt brugerne til ilden og forlangt at hele funktionaliteten blev defineret inden jeg gik igang med kodning.
Der er så også tilstødt andre komplikationer, og tid til test har brugerne heller ikke.
(det skal lige nævnes at jeg er i jobtræning og således ikke er ret dyr for kunderne)
09. november 2004 - 12:08 #18
jeg kender hele problematikken ;o)

I stedet for tbl.close kan du så skrive:

Set tbl = Nothing

Men måske er det slet ikke nødvendigt at lukke objektet...
Avatar billede deducer Nybegynder
09. november 2004 - 12:08 #19
Har lige prøvet at lukke tabellen med :
DoCmd.Close acTable, "tblBookingKalender"

den kørte, men gjorde ingen forskel - obj (tbl) er stadigt ugyldigt
Avatar billede deducer Nybegynder
09. november 2004 - 12:13 #20
Hej BigT
JEg er lige kommet i tanke om en mulig anden løsning, da de felter der skal formatteres faktisk sættes (Control) - gives kolonne navn i en stump kode, jeg har arvet fra dig (Dynamisk rapport) - kan man mon her sætte formatteringen ?
Avatar billede deducer Nybegynder
09. november 2004 - 12:19 #21
Middagspause (hovedet er godt overophedet af denne kodeNØD)
09. november 2004 - 12:28 #22
Ja, jeg sad faktisk og tænkte på, at formattet på tabelniveau er jo ikke så relevant. Det er jo på formularen eller i rapporten, at man skal bruge det normalt.

Og hvis du bruger den dynamiske rapport, kan du jo bare sætte alle tekstbokse - undtagen den første - til det aktuelle format.
Avatar billede deducer Nybegynder
09. november 2004 - 12:44 #23
Det lyder godt - men hvordan.
Jeg har prøvet med :
Me("ctrl" & Trim(CStr(n))).Format ("0[Blå];[Rød];[Grøn]0;[Grøn]0")
Det complier godtnok, men vil ikke åbne underformularen (den der har ovenstående kode)
09. november 2004 - 12:49 #24
behøver det, at være dynamisk? Kan du ikke bare gøre det i design og så gemme rapporten? Eller bruger du den samme rapport til flere udtræk?
Avatar billede deducer Nybegynder
09. november 2004 - 12:59 #25
JA det er jo lavet lidt om fra din Dynamiske rapport, og foregår nu i en Formular.
En Formular hvor de aktive arrangementer skal vises udfra valgt periode.
09. november 2004 - 13:02 #26
Denne burde virke (gør det på min):
Me("ctrl" & Trim(CStr(n))).Format = "0[Blue];[red];[green]0;[green]0"
Avatar billede deducer Nybegynder
09. november 2004 - 13:20 #27
Det virker osss, men bare ikke helt rigtigt idet værdierne i felterne nu bliver vist som formatteringskoden (ex. 0[Grøn])
09. november 2004 - 13:22 #28
hmm, det gjorde min ikke. Det gjorde de, da jeg blot skrev "0[Blå];[Rød];[Grøn]0;[Grøn]0", men ikke når jeg skrev det på engelsk....
Avatar billede deducer Nybegynder
09. november 2004 - 13:25 #29
Ups
Det virker som du siger.
Jeg havde skrevet på dansk.
Kunne da os bare have kigget ordentligt ppå din kommentar.
Tusind tak
Avatar billede deducer Nybegynder
09. november 2004 - 13:26 #30
Du får points og tak for hjælpen.
Jeg er godt opkogt i hovedet og venter med mitlåseproblem til imorgen....
09. november 2004 - 13:28 #31
Godt, at vi da kom så langt :o)

tak for point :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester