Discussion:
F: Zelleninhalte in DB speichern bzw. von DB auslesen
(zu alt für eine Antwort)
Gerald Aichholzer
2005-02-01 10:08:39 UTC
Permalink
Hallo NG,

ich würde gerne Daten, die der Anwender in ein Arbeitsblatt eingibt,
in eine Datenbank schreiben bzw. diese beim nächsten Start von Excel
wieder aus der Datenbank auslesen.

Bis jetzt habe ich folgendes realisiert:

- der Anwender gibt die Daten in einer M$-Access-Anwendung ein
- in den Zellen des Arbeitsblattes sind Formeln hinterlegt, die
die Daten aus der DB auslesen


Ich würde jedoch gerne auf die M$-Access-Anwendung verzichten, da-
mit der Anwender sich nur mit einem Frontend beschäftigen muss.

Wie löse ich das Problem, dass bei der Eingabe von Daten diese in
die DB geschrieben werden und die Auslese-Formeln nicht zerstört
werden?
Oder muss man in diesem Fall einen ganz anderen Ansatz wählen?

Ich kenne eine OLAP-Datenbank, die Excel als Frontend verwendet.
Dort werden die Daten aus der DB in einem Arbeitsblatt dargestellt.
Durch Überschreiben der Werte werden diese wieder in der Datenbank
gespeichert. Ich habe aber leider keine Ahnung wie das technisch
realisiert ist. Formeln sehe ich in den Zellen keine, nur die Wer-
te.

Bin für jeden Hinweis dankbar.

schöne Grüße,
Gerald
unknown
2005-02-01 20:55:43 UTC
Permalink
hallo Gerald,
das lässt sich mit VBA-Makros realisieren. Falls du da keine Vorkenntnisse
hast, ist das allerdings recht umfangreich zu erklären.
Eine einfache Möglichkeit, Daten aus einer Datenbank zu lesen, ist über
Daten/Externe Daten importieren (variiert je nach Excelversion).
Starte vorher den Makrorekorder (Extras/Makro/Aufzeichnen), führe den Import
durch und beende abschließend den Rekorder.
Mit Alt+F11 kommst du dann in den VBA-Editor und kannst das augezeichnete
Makro ansehen und auch verändern.
Stichwort zum Thema Datenexport ist ADO http://tinyurl.com/6bgz2

http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q246335

Gruß
stefan
Post by Gerald Aichholzer
Hallo NG,
ich würde gerne Daten, die der Anwender in ein Arbeitsblatt eingibt,
in eine Datenbank schreiben bzw. diese beim nächsten Start von Excel
wieder aus der Datenbank auslesen.
- der Anwender gibt die Daten in einer M$-Access-Anwendung ein
- in den Zellen des Arbeitsblattes sind Formeln hinterlegt, die
die Daten aus der DB auslesen
Ich würde jedoch gerne auf die M$-Access-Anwendung verzichten, da-
mit der Anwender sich nur mit einem Frontend beschäftigen muss.
Wie löse ich das Problem, dass bei der Eingabe von Daten diese in
die DB geschrieben werden und die Auslese-Formeln nicht zerstört
werden?
Oder muss man in diesem Fall einen ganz anderen Ansatz wählen?
Ich kenne eine OLAP-Datenbank, die Excel als Frontend verwendet.
Dort werden die Daten aus der DB in einem Arbeitsblatt dargestellt.
Durch Überschreiben der Werte werden diese wieder in der Datenbank
gespeichert. Ich habe aber leider keine Ahnung wie das technisch
realisiert ist. Formeln sehe ich in den Zellen keine, nur die Wer-
te.
Bin für jeden Hinweis dankbar.
schöne Grüße,
Gerald
Gerald Aichholzer
2005-02-01 23:10:17 UTC
Permalink
Post by unknown
hallo Gerald,
das lässt sich mit VBA-Makros realisieren. Falls du da keine Vorkenntnisse
hast, ist das allerdings recht umfangreich zu erklären.
Eine einfache Möglichkeit, Daten aus einer Datenbank zu lesen, ist über
Daten/Externe Daten importieren (variiert je nach Excelversion).
Starte vorher den Makrorekorder (Extras/Makro/Aufzeichnen), führe den Import
durch und beende abschließend den Rekorder.
Mit Alt+F11 kommst du dann in den VBA-Editor und kannst das augezeichnete
Makro ansehen und auch verändern.
Stichwort zum Thema Datenexport ist ADO http://tinyurl.com/6bgz2
http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q246335
Hallo Stefan,

danke für deine Tipps - ich kenne mich mit VBA sehr gut aus (IMHO),
ich weiß nur nicht, wie/wo ich in Excel den Hebel ansetzen soll,
sodass die folgenden beiden Dinge funktionieren:

- Werte, die der Anwender in eine Zelle schreibt, sollen
sofort in die Datenbank geschrieben werden

- in der Datenbank enthaltene Werte sollen einfach ange-
zeigt werden.

Zweiteres habe ich bereits in einem Projekt realisiert, indem ich
eine relativ allgemein gehaltene VBA-Funktion geschrieben habe, die
mir Werte aus der Datenbank holt - in etwa so:

Public Function getDBValue(ByVal sKey As String) As Variant
...
End Function

und in die entsprechenden Zellen die Formeln wie folgt gestellt
habe:

=getDBValue("KeyX")
=getDBValue("KeyY")
...

Für read-only-Werte kein Problem - sobald der Anwender jedoch auch
Werte eingeben soll werden die Formeln überschrieben.

Ich kenne mich zwar mit Access ziemlich gut aus, mit Excel jedoch
kaum - daher suche ich Hinweise, wie ich mein Vorhaben elegant rea-
lisieren kann.

herzlichen Dank und schöne Grüße,
Gerald
stefan onken
2005-02-02 08:01:01 UTC
Permalink
hallo Gerald,
Post by Gerald Aichholzer
ich weiß nur nicht, wie/wo ich in Excel den Hebel ansetzen soll,
- Werte, die der Anwender in eine Zelle schreibt, sollen
sofort in die Datenbank geschrieben werden
da bietet sich das Ereignis WorkSheet_Change an: im VBA-Editor findest du
oben links den Projekt-Explorer, darin die Einträge DieseArbeitsmappe und die
Tabellennamen. Doppelklicke auf den Namen der Tabelle, in der Änderungen
überwacht werden sollen. Über dem Codefenster findest du dann 2 dropdowns mit
Ereignissen, die Excel für eine Tabelle anbietet.
Mit

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then MsgBox "A1"
End Sub

kannst du zB eine Änderung in der Zelle A1 überwachen, um dann per ADO die
Daten in die Datenbank zu schreiben.
Post by Gerald Aichholzer
- in der Datenbank enthaltene Werte sollen einfach ange-
zeigt werden.
Hier kannst du das Ereignis Workbook_Open im Modul DieseArbeitsmappe verwenden
(es geht aber auch mit Sub auto_open in einem Standard-Modul).
Du könntest die Daten importieren über Daten/Externe Daten. Diese Daten kann
man dann über Daten/Aktualisieren eben aktualisieren, zB mit einem Makro beim
öffnen der Datei:

Private Sub Workbook_Open()
Sheets("Tabelle1").QueryTables(1).Refresh BackgroundQuery:=False
End Sub

Evtl kannst du aber auch deine Funktion einsetzen, zB:
Range("A1") = getDBValue(sKey)
Dann steht in der Zelle der Wert, aber nicht die Formel.

Die Zellen spricht man über Range() oder auch Cells(y,x) an.
Post by Gerald Aichholzer
Zweiteres habe ich bereits in einem Projekt realisiert, indem ich
eine relativ allgemein gehaltene VBA-Funktion geschrieben habe, die
Public Function getDBValue(ByVal sKey As String) As Variant
...
End Function
und in die entsprechenden Zellen die Formeln wie folgt gestellt
=getDBValue("KeyX")
=getDBValue("KeyY")
...
Für read-only-Werte kein Problem - sobald der Anwender jedoch auch
Werte eingeben soll werden die Formeln überschrieben.
Gruß
stefan
Gerald Aichholzer
2005-02-02 21:37:28 UTC
Permalink
Hallo Stefan,
Post by stefan onken
Post by Gerald Aichholzer
ich weiß nur nicht, wie/wo ich in Excel den Hebel ansetzen soll,
- Werte, die der Anwender in eine Zelle schreibt, sollen
sofort in die Datenbank geschrieben werden
da bietet sich das Ereignis WorkSheet_Change an: im VBA-Editor findest du
oben links den Projekt-Explorer, darin die Einträge DieseArbeitsmappe und die
Tabellennamen. Doppelklicke auf den Namen der Tabelle, in der Änderungen
überwacht werden sollen. Über dem Codefenster findest du dann 2 dropdowns mit
Ereignissen, die Excel für eine Tabelle anbietet.
Mit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then MsgBox "A1"
End Sub
das hört sich sehr gut an - ich werde es mir mal näher ansehen.
Das nächste Problem ist, dass ich sehr viele Zellen überwachen
muss, die an unterschiedliche Stellen in die DB geschrieben
werden.

Wichtig wäre, dass bei einer Verschiebung der Koordinaten die
Codeanpassung minimiert wird. Das könnte ich vielleicht mit
benannten Zellen hinkriegen - muss mir das noch genauer durch
überlegen.
Post by stefan onken
kannst du zB eine Änderung in der Zelle A1 überwachen, um dann per ADO die
Daten in die Datenbank zu schreiben.
Post by Gerald Aichholzer
- in der Datenbank enthaltene Werte sollen einfach ange-
zeigt werden.
Hier kannst du das Ereignis Workbook_Open im Modul DieseArbeitsmappe verwenden
(es geht aber auch mit Sub auto_open in einem Standard-Modul).
Du könntest die Daten importieren über Daten/Externe Daten. Diese Daten kann
man dann über Daten/Aktualisieren eben aktualisieren, zB mit einem Makro beim
Private Sub Workbook_Open()
Sheets("Tabelle1").QueryTables(1).Refresh BackgroundQuery:=False
End Sub
Dazu muss ich mir mal die Hilfe durchlesen - auch wieder
etwas Neues für mich :-)
Post by stefan onken
Range("A1") = getDBValue(sKey)
Dann steht in der Zelle der Wert, aber nicht die Formel.
So ähnlich mache ich es zur Zeit, nur steht die Formel direkt
in der Zelle. Ist natürlich nur für die Anzeige gedacht. Die
Werte werden über F9 aktualisiert.


herzlichen Dank und schöne Grüße,
Gerald
Gerald Aichholzer
2005-02-10 10:02:46 UTC
Permalink
Hallo Stefan,

ich hoffe, dass du diesen Thread noch mitliest ;)
Post by stefan onken
Post by Gerald Aichholzer
ich weiß nur nicht, wie/wo ich in Excel den Hebel ansetzen soll,
- Werte, die der Anwender in eine Zelle schreibt, sollen
sofort in die Datenbank geschrieben werden
da bietet sich das Ereignis WorkSheet_Change an: im VBA-Editor findest du
oben links den Projekt-Explorer, darin die Einträge DieseArbeitsmappe und die
Tabellennamen. Doppelklicke auf den Namen der Tabelle, in der Änderungen
überwacht werden sollen. Über dem Codefenster findest du dann 2 dropdowns mit
Ereignissen, die Excel für eine Tabelle anbietet.
Mit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then MsgBox "A1"
End Sub
kannst du zB eine Änderung in der Zelle A1 überwachen, um dann per ADO die
Daten in die Datenbank zu schreiben.
in der Hilfe zum Change-Ereignis steht, dass Target auch mehrere
Zellen umfassen kann. Wie müsste ich in dieesm Fall vorgebehen?
Kann ich feststellen, ob sich eine bestimmte Zelle im Target-Range
befindet? (z.B. ich muss nur die Zellen A1, B4 und D9 behandeln)

Könnte ich auch das SheetChange-Ereignis verwenden, sodass ich
meinen Code für alle Arbeitsblätter (sind nämlich viele) nur an
einer Stelle halten muss?

danke und schöne Grüße,
Gerald
stefan onken
2005-02-10 10:35:03 UTC
Permalink
hallo Gerald,
Post by Gerald Aichholzer
Hallo Stefan,
ich hoffe, dass du diesen Thread noch mitliest ;)
klar, auch wenn mir persönlich dann neue threats lieber sind (ich muss hier
das Webinterface von MS nutzen, dass ist dann schon etwas umständlich)
Post by Gerald Aichholzer
in der Hilfe zum Change-Ereignis steht, dass Target auch mehrere
Zellen umfassen kann. Wie müsste ich in dieesm Fall vorgebehen?
Kann ich feststellen, ob sich eine bestimmte Zelle im Target-Range
befindet? (z.B. ich muss nur die Zellen A1, B4 und D9 behandeln)
Set rng = Application.Union(Range("A1"), Range("B4"), Range("D9"))
If Not Intersect(Target, rng) Is Nothing Then
MsgBox "hallo"
End If
Post by Gerald Aichholzer
Könnte ich auch das SheetChange-Ereignis verwenden, sodass ich
meinen Code für alle Arbeitsblätter (sind nämlich viele) nur an
einer Stelle halten muss?
ja, im Modul DieseArbeitsmappe:

Private Sub Workbook_SheetChange _
(ByVal Sh As Object, ByVal Target As Range)
Set rng = Application.Union(Range("A1"), Range("B4"), Range("D9"))
If Not Intersect(Target, rng) Is Nothing Then
MsgBox "hallo"
End If
End Sub
Post by Gerald Aichholzer
danke und schöne Grüße,
Gerald
bittschön
stefan

Loading...