# Libnodave und Excel



## Joe (18 Januar 2007)

Hallo,

Ich habe eine kleine Frage zum Aufruf von Makros uner Excel.
Ich will mit Libnodave Werte aus DBs in mehrere Exceldateien kopieren um danach Kurven zu generieren.

Wenn ich Excel nur einmal starte und das Makro anstoße klappt das auch alles wunderbar.
Nur will ich jetzt gerne das Excel mehrmals öffnen und gleichzeitig von anderen DBs auslesen. --> Ich kann kein weiteres Makro starten
gibt es eine Möglichkeit gleichzeitig die Makros aus mehreren Excel-Dateien zu starten?

MfG Joe


----------



## Joe (22 Januar 2007)

Hallo,

ich habe das mit den Makros jetzt soweit unter Kontrolle, bin jetzt dran Strings aus einem DB zu lesen.
Gibt es dafür einen Befehl, der mir einen String mit z.B. 22 Byte ausliest?
Mit daveGetU16, kann ich ja immer nur 2 Byte auslesen.


----------



## Zottel (22 Januar 2007)

JOE schrieb:


> Gibt es dafür einen Befehl, der mir einen String mit z.B. 22 Byte ausliest?


daveReadBytes(dc, daveDB, <DBnummer>, 22, null)
liest die 22 Bytes des Strings, wobei alle Bytes auf einmal aus der CPU geholt werden. Weiß jetzt nicht, wie Siemens-Strings aufgebaut sind, mit Längenangabe am Anfang (wie in Pascal) oder mit 0 Byte am Ende (wie in C), aber eventuell solltest du diese Bytes auch auslesen.


JOE schrieb:


> Mit daveGetU16, kann ich ja immer nur 2 Byte auslesen.


Die Funktionen daveGetU8, daveGetU16 etc. kopieren lediglich Bytes von einem internen Puffer in eine Zielvariable. Sie sind sehr schnell. Um einzelne Bytes (Zeichen eines Strings) zu lesen, ist daveGetU8 zu benutzen. daveGetU16 würde dier ja zwei Zeichen ('A', 'B') zu einem Wort (256*65+66) zusammenfassen. Die Zielvariable dann als Zeichen an einen BASIC-String anhängen.
Dies ist der "sichere" Weg. Ich kenne die interne Datenstruktur eines BASIC-Strings nicht. In C könnte man z.B. einen String (char[maxlen] str als Puffer an daveReadBytes übergeben:
daveReadBytes(dc, daveDB, <DBnummer>, 22, &str);
und dann die 0 zum Abschluß dranhängen:
str[22]=0;


----------



## Joe (22 Januar 2007)

Super, Dankeschön.
Habe es jetzt so realisiert:


```
Cells(1, 1) = StringAuslesen(leng = 30, DB = 200, start = 2)
```
 

```
[COLOR=blue]Private Function[/COLOR] StringAuslesen([COLOR=blue]ByRef[/COLOR] leng [COLOR=blue]As Integer[/COLOR], [COLOR=blue]ByRef[/COLOR] DB [COLOR=blue]As Integer[/COLOR], [COLOR=blue]ByRef[/COLOR] start [COLOR=blue]As Integer[/COLOR]) [COLOR=blue]As String[/COLOR]
res2 = daveReadBytes(dc, daveDB, DB, start, leng, 0)
V4 = ""
up = 0
On Error Resume Next
Do While up < laenge
DoEvents
V4 = V4 & String(1, daveGetU8(dc))  [COLOR=seagreen]'Die Funktion String schreibt mir das richtige Zeichen, abhängig vom ausgelesenen Wert[/COLOR]
up = up + 1
Loop
StringAuslesen = V4
[COLOR=blue]End Function[/COLOR]
```
 
Ich habe zwar noch kleine Probleme mit dem Aufruf, da schmiert mir Excel immer ab, wenn ich den Code ohne die Funktion einfüge geht es super.


----------



## Rainer Hönle (23 Januar 2007)

Zottel schrieb:


> Weiß jetzt nicht, wie Siemens-Strings aufgebaut sind, mit Längenangabe am Anfang (wie in Pascal) oder mit 0 Byte am Ende (wie in C), aber eventuell solltest du diese Bytes auch auslesen.


Das erste Byte enthält die maximale Länge
Das zweite Byte enthält die belegte Länge
Danach kommen dioe "Nutzdaten"


----------



## Rainer Hönle (23 Januar 2007)

JOE schrieb:


> Ich habe zwar noch kleine Probleme mit dem Aufruf, da schmiert mir Excel immer ab, wenn ich den Code ohne die Funktion einfüge geht es super.


In der Funktion wird die Variable "laenge" verwendet. Wo wird die definiert? Wo und wie ist "daveDB" definiert? Sollten die Werte nicht daraus statt aus "dc" gelesen werden? Was passiert bei der Einzelschrittbearbeitung? Wo klemmt es da?


----------



## Zottel (23 Januar 2007)

Rainer Hönle schrieb:


> In der Funktion wird die Variable "laenge" verwendet. Wo wird die definiert?


"Laenge" sollte wohl besser iniatialisiert oder durch "leng" ersetzt werden.


Rainer Hönle schrieb:


> Wo und wie ist "daveDB" definiert?


Das gehört zum Interface der Bibliothek (Speicherbereich=Datenbausteine, Konstante 132)


Rainer Hönle schrieb:


> Sollten die Werte nicht daraus statt aus "dc" gelesen werden?


Nein. dc verweist auf eine Datenstruktur, die einen Zwischenspeicher besitzt, der die gelesenen Daten enthält.


----------



## Joe (23 Januar 2007)

Hallo,

a, das mit der Variable "laenge" ist mir später auch noch aufgefallen, die habe ich vergessen zu ändern - sollte auch "leng" heissen (also die länge des String enthalten)

Ich weiss nicht, ob ich "dc" und "DaveDB" auch übergeben muss, wenn ich die Funktion aufrufe. Der Aufruf geschieht in 'readFromPLC', da sind sie bereits definiert.
Ich bin bisher davon ausgegangen, dass meine Function beim Aufruf abgearbeitet hat und dass das Programm wieder kurz nach die Stelle des Aufrufes springt.
Das mit dem lesen der Werte aud "DaveDB" verstehe ich nicht. sonst lese ich ja auch alle Werte aus "dc". daveDB ist, wie ich es verstanden habe da, damit libnodave weiss, dass er von einem DB lesen soll. daveFlags liest z.B. Merker aus.

Gruß Joe


----------

