Avatar billede efes Nybegynder
03. november 2013 - 21:08 Der er 14 kommentarer

Tabel i Access oprettet pba Excel - max Feltstørrelse 50

Hej Eksperter

Jeg har et lille problem, som jeg håber I kan hjælpe mig med. Jeg har et Excel ark med +180 kolonner og 3 rækker.
Jeg skal bruge en tabel i Access, der afspejler Excel arket.
1 række i Excel skal være overskrift på feltet i Access og de 2 øvrige rækker i Excel bliver indhold i tabellen.

Når jeg anvender standard funktionaliteten i Access til at lave en tabel på baggrund af et Excel ark, så bliver feltstørrelsen på 255. Det betyder, at der ikke er plads til indholdet i felterne i Access databasen.
Så hvis der er nogen, der kan fortælle, hvordan jeg sætter feltstørrelsen til andet end 255, når jeg oprette databasen - eller hvordan jeg ændre feltstørrelsen for mange felter på en gang, så vil jeg blive meget glad.

Umiddelbart vil jeg aldrig selv designe en tabel sådan, men det program der skal læse fra Access databasen forstår kun data såden.

På forhånd tak.

//Efes
Avatar billede MSchlamovitz Mester
03. november 2013 - 22:26 #1
Ved konverteringen ser Access på indholdet i cellerne i regnearket og bestemmer felttypen ud fra det.
Hvis dine celler indeholder tekst, vil Access lave et tekstfelt - max. feltstørrelse for tekstfelter er 255 tegn - Hvis du skal bruge flere tegn, skal felttypen være Notat. Hvis ikke Access selv opretter et notatfelt, hvis den støder på en celle med mere end 255 tegn, er der nok ikke andet for, end at gøre følgende:
Importér Exceltabellen.
De flettyper, der ikke er rigtige, korrigeres (tekstfelter ændres til notatfelter).
Lav en sammenkædning til excelarket (dvs. så arket optræder som en sammenkædet tabel i Accessdatabasen.
Brug en opdateringsforespørgsel til at overføre data fra Excelarket til Accesstabellen.

Måske behøver du ikke importere excelarket - du kan måske nøjes med at lave sammenkædningen ?
Avatar billede supertekst Ekspert
03. november 2013 - 22:53 #2
Hvis VBA er indblandet - lidt inspiration - fra en kode, der beskriver en databasens tabeller i Excel:

    For Each tdef In Db.tabledefs
        If LCase(Left(tdef.Name, 4)) <> "msys" Then
            feltNr = 0
            Cells(rækkeNr, 1).Select
            Selection.Font.Bold = True
            Cells(rækkeNr, 1) = tdef.Name
            For Each felt In tdef.Fields()
                Cells(rækkeNr, 2) = feltNr
                Cells(rækkeNr, 3) = felt.Name
                Cells(rækkeNr, 4) = hentFeltType(felt.Type)
                Cells(rækkeNr, 5) = felt.Size
                rækkeNr = rækkeNr + 1
                feltNr = feltNr + 1
            Next felt
            rækkeNr = rækkeNr + 1
        End If
    Next tdef
Avatar billede efes Nybegynder
04. november 2013 - 12:50 #3
Hej

Tak for svar. Har skrevet til jer hver nedenfor:

@MSchlamovitz - Jeg har ikke behov for mere plads end 255, men mindre. Det jeg gerne vil undgå, er at skulle ændre hvert eneste felt manuelt, da det er lidt et stort arbejde.

@supertekst - Jeg har ikke noget VBA inde over, men det kan være løsningen? Hvis du kan finde noget VBA kode, der kan ændre feltstørrelse for alle felter på en gang, så vil det være en stor hjælp?

//Efes
Avatar billede supertekst Ekspert
04. november 2013 - 14:18 #4
Hvorfor ikke rette feltstørrelsen manuelt i designvisning af tabellen - klik på tegnetrekanten under Vis.

Skal det gøres på anden vis - skal de enkelte felters længde alligevel registreres.

Er det en tilbagevende opgave?
Avatar billede efes Nybegynder
04. november 2013 - 14:24 #5
Hej Supertekst

Jeg skal igennem +180 felter og rette feltstørrelsen på hver enkelt. Og det er en tilbagevendende opgave i en periode, hvor vi er i gang med opstarten af et system. Så hver gang der ændres i regnearket vil jeg skulle igennem samme manuelle øvelse. Og det vil jeg meget gerne undgå.
Da jeg kender den maksimale feltlængde, behøver jeg ikke registrere den enkelte længde - jeg skal bare sikre, at der er plads til den længste. Og den vil aldrig bliver over 50 pga de begræsningser der er i det system data kommer fra.

//Efes
Avatar billede MSchlamovitz Mester
04. november 2013 - 15:17 #6
Jeg forstår ikke helt dit problem:

Hvorfor er det nødvendigt at ændre feltlængden til noget andet end 255?

Du skriver indledningsvist:
"Når jeg anvender standard funktionaliteten i Access til at lave en tabel på baggrund af et Excel ark, så bliver feltstørrelsen på 255. Det betyder, at der ikke er plads til indholdet i felterne i Access databasen."

Er det helt forkert at læse ovenstående som, at 255 tegn er for lidt?

Skal alle felterne være lige lange ?
Avatar billede efes Nybegynder
05. november 2013 - 11:00 #7
Hej MSchlamovitz

Det kan da godt være, at forklaringen kunne være bedre, men som jeg skrev i overskriften, så må feltstørrelse max være 50 - og det er samme feltstørrelse for alle felterne.

Det der sker, er, at når jeg har oprettet tabellen med alle felterne i str 255, så komme data ikke med til alle felterne. Dvs. at en lang række felter bliver blanke, og hvis jeg forsøger at skrive noget deri, får jeg en fejlbesked om, at posten er for stor.

//Efes
Avatar billede fdata Forsker
05. november 2013 - 18:13 #8
Du kunne jo overveje at importere dine data og så bruge VBA til at rette længderne.
Nedenstående løber alle felter i en tabel igennem og retter tekstfelters længde:

Sub RetTekstLængder()
  Const TabelNavn = "Tabel1"
  Const NyLængde = 50
 
  Dim Db As Database
  Dim Tdf As TableDef
  Dim Fld As Field
 
  Set Db = CurrentDb
  For Each Tdf In Db.TableDefs
    If Tdf.Name = TabelNavn Then
        For Each Fld In Tdf.Fields
          If Fld.Type = 10 Then  '10=Tekstfelt
            DoCmd.RunSQL ("ALTER TABLE " & TabelNavn & " ALTER COLUMN " & Fld.Name & " Text(" & NyLængde & ");")
          End If
        Next Fld
    End If
  Next
  Set Tdf = Nothing
  Set Db = Nothing
End Sub
Avatar billede efes Nybegynder
11. november 2013 - 12:21 #9
Hej fdata

Tak for forslaget, tror sagtens VBA kan være en mulig løsning. Jeg har forsøgt mig med det kode eksempel du har lavet, men jeg får en fejl i DoCMD.RunSQL statementet.

Har du en ide om, hvad det går galt?

//Efes
Avatar billede fdata Forsker
11. november 2013 - 19:08 #10
Koden kører helt fint her.

Er du sikker på at du har erstattet tabelnavnet? ("Tabel1" var jo bare en vejledning, du skal indsætte dit eget tabelnavn)
Avatar billede efes Nybegynder
12. november 2013 - 11:10 #11
Hej fdata

Jeg har ændret Const TabelNavn = "Tabel1" til Const TabelNavn = "TabelIndhold" så det passer med navnet på min tabel.

Når jeg så afvikler koden, får jeg en fejlbesked der siger, at der er Run-time error '3293' Der er syntaksfejl i ALTER TABLE-sætningen.

Hjælp modtages gerne?

//Efes
Avatar billede fdata Forsker
12. november 2013 - 13:47 #12
I så fald kunne fejlen ligge i et eller flere af dine feltnavne. De indeholder måske blanktegn?

Prøv en version med kant-paranteser:

DoCmd.RunSQL ("ALTER TABLE [" & TabelNavn & "] ALTER COLUMN [" & Fld.Name & "] Text(" & NyLængde & ");")
Avatar billede efes Nybegynder
13. november 2013 - 10:29 #13
Hej fdata

Det virker - delvist. Jeg får ændret feltlængde på en række af mine felter, men jeg får en ny Run-time error. Jeg får en kode 3190. Teksten hertil er "Der er defineret for mange felter".
I MS hjælpen skriver de følgende: "You tried to perform an operation that involves more than 255 fields. Reduce the number of fields, and then try the operation again." Det kan jeg så ikke få til at give mening, eftersom der er under 200 felter i tabellen?

Har du et bud mere?

//Efes
Avatar billede fdata Forsker
13. november 2013 - 23:33 #14
Hm. Her må jeg nok melde pas.

Vi ændrer jo felterne ét efter ét, så hvis du har færre end 200 felter, giver det jo ingen mening overhovedet.

Lidt søgen på nettet antyder, at et for stort antal index kunne være en forklaring; men du har jo ingen index. Så ...???

Er det helt umuligt for dig at bryde tabellen op i en række mindre tabeller?

Jeg har desværre ikke meget mere intelligent at sige  :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