09. november 2004 - 08:13Der 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 :¤}
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
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.
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.
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!?
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
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]")
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
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.
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
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)
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 ?
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.
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)
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.
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.