# Access Tabellen Inhalt ändern



## werner_sg (2. September 2014)

Hallo, habe nach längerem mal wieder eine Frage  ich habe eine Access Tabelle in welcher sich in einer Spalte nicht fortlaufende Zahlen befinden. Diese müssen jetzt fortlaufend Nummeriert werden wobei aber doppelte Zahlen auch wieder die gleichen Nummern bekommen müssen. Als Beispiel: vorhandene Nummern 2, 5, 7, 7, 8, 9, 9, 9, 13 müssen zu 1, 2, 3, 3, 4, 5, 5, 5, 6 werden.
Derzeit erledige ich das per Hand die Tabelle enthält aber rund 3000 Einträge, wäre daher aber über jede Lösung Dankbar.

Werner


----------



## Yaslaw (2. September 2014)

Hab rasch auf die Schnelle eine VBA-Methode geschreiben.
Du musst natürlich noch die Tabellen/Spaltennamen anpassen

```
Public Sub TestW()
    'SQL um die Tabelle nach id Sortiert auszulesen
    Dim sql As String: sql = "SELECT [old_id], [new_id] FROM [t_werner_sg] ORDER BY [old_id]"
    'Tabelle öffnen
    Dim rs As DAO.Recordset: Set rs = CurrentDb.OpenRecordset(sql)
    
    'Ids merken
    Dim newId As Long: newId = 0
    Dim lastId As Long: lastId = 0
    
    rs.MoveFirst
    'Alle Datensätze durchgehen
    Do While Not rs.EOF
        'Prüfen, ob die id der Tabelle grösser als die letzte Id war. Wenn ja, neue ID um 1 erhöhen
        If rs!old_id > lastId Then newId = newId + 1
        'id für den nächsten Lauf merken
        lastId = rs!old_id
        'Zeile editieren
        rs.Edit
        rs!new_id = newId
        rs.Update
        'Nächster Datensatz
        rs.MoveNext
    Loop
    rs.Close
End Sub
```


----------



## werner_sg (2. September 2014)

Access und VBA voll nicht meine Welt  bei t_werner_sg kommt der Spalten Name rein schätze ich mal, und wie wende ich das Script auf die Tabelle an?

Auf jeden Fall schon mal ein dickes Danke


----------



## Yaslaw (2. September 2014)

Nope [t_werner_sg] ist die Tabelle

Wenn ich deine Tabellen/Feldernamen wüsste, würde ich das Script anpassen


----------



## werner_sg (2. September 2014)

Hallo Yaslaw,

Tabellenname = Buchungen
Spaltenname = Buchungsnummer

Danke


----------



## Yaslaw (3. September 2014)

Ich rate dir eine weitere Spalte anzulegen. Diese wird mit der neuen ID abgefüllt. Und wenn du siehst das es so richtig ist, kannst du die alte Spalte löschen und die neue umbenennen. So bist du auf der sicheren Seite
Ich habe die neue Spalte mal new_Buchungsnummer genannt.

```
Public Sub TestW()
    'SQL um die Tabelle nach id Sortiert auszulesen
    Dim sql As String: sql = "SELECT [Buchungsnummer], [new_Buchungsnummer] FROM [Buchungen] ORDER BY [old_id]"
    'Tabelle öffnen
    Dim rs As DAO.Recordset: Set rs = CurrentDb.OpenRecordset(sql)
    
    'Ids merken
    Dim newId As Long: newId = 0
    Dim lastId As Long: lastId = 0
    
    rs.MoveFirst
    'Alle Datensätze durchgehen
    Do While Not rs.EOF
        'Prüfen, ob die id der Tabelle grösser als die letzte Id war. Wenn ja, neue ID um 1 erhöhen
        If rs!Buchungsnummer > lastId Then newId = newId + 1
        'id für den nächsten Lauf merken
        lastId = rs!Buchungsnummer
        'Zeile editieren
        rs.Edit
        rs!new_Buchungsnummer = newId
        rs.Update
        'Nächster Datensatz
        rs.MoveNext
    Loop
    rs.Close
End Sub
```


----------



## werner_sg (3. September 2014)

Ok den Code habe ich dann nun verstanden, wie kann ich denn nun in Access einbauen, sagte ja das die Kombi Access und VB nicht so gamz meine Welt sind, muss da aber ja durch. Habe gerade maö gegoogelt aber nicht die passende Läsung gefunden.


----------



## Zvoni (3. September 2014)

In Access neues "Modul" erstellen, und Yaslaw's Code in das Modul kopieren.
Irgendwo in Access gibts dann den Befehl "Makro ausführen" oder sowas


----------



## werner_sg (3. September 2014)

ja soweit war ich schon, gehe ich dann auf Makro ausführen wird mir das Modul aber nicht angezeigt. Und bei Macro erstellen habe ich nix gefunden wo ich den Code einfügen könnte. Gehe icj über VB und führe dann aus bricht er ab mit einem Laufzeitfehler


----------



## Yaslaw (4. September 2014)

@Zvoni Mit Macro Asuführen kannst du noch keine Funktion ausführen. Dazu muss man zuerst ein Macro erstellen, das die Funktion ausführt

Dazu geht man folgendermasen vor:
*1) Ändere im Code die Sub in eine Funktion*
Einfach im Modul in der ersten Zeile des eingefügten Codes das Wort Sub durch Function ersetzen

```
Public Function TestW()
```

*2) Erstellen ein Makro*
Erstelle ein neues Makro. Dort wählst du RunCode als Aktion aus (ist möglich, dass das im deutschen Access anderst heisst). Dann hast due den Parameter [Funktion Name]. In dieses Feld schreibst du "TestW()". Also den Funktionsnamen inkl. den Klammern für einen AUfruf ohne Argumente




> Gehe icj über VB und führe dann aus bricht er ab mit einem Laufzeitfehler


Den Code aus meiner ersten Antwort habe ich mit einem Testbeispiel bei mir getestet. Der Funktioniert.
Du bekommst ein Laufzeitfehler. Im Laufzeitfehler hat es ein Fehlercode und eine Fehlertext. Diese helfen dem Programmierer das Problem zu finden. Darum kann ich nur sagen, ohne Code und Fehlertext können wir dir nicht helfen


----------



## werner_sg (4. September 2014)

Ja soweit war ich schon, ein ganz kleines bissel blick ich da doch sxhon durch, nachdem ich gestern abend mal etwas ruhe hatte, ist mir dann aufgefallen das im Script bei Order by noch old_id stand. Danach lief alles wunderbar.
Also besten Dank für die großartige Hilfe.
Werner


----------



## Zvoni (4. September 2014)

Yaslaw hat gesagt.:


> @Zvoni Mit Macro Asuführen kannst du noch keine Funktion ausführen. Dazu muss man zuerst ein Macro erstellen, das die Funktion ausführt
> *schnipp*




Arggg. GRML
Ich vergess dauernd, dass es da bei Access einen Unterschied gibt, da ich meist eher in Excel programmiere.
Normalerweise füge ich in Excel ein Modul ein, Schreibe den VBA-Code, und wenn der Cursor innerhalb der Sub steht hau ich einfach auf F5


----------

