# Excel-Tabellen und Diagramme in Visual Basic 6 erstellen. Wie?



## Hammel_b (12. Mai 2007)

Hallo liebe Mitprogrammierer und Mitprogrammiererinnen, liebe Helfer und Helferinnen


Ich hätte da mal eine Frage  bezüglich der Tabellen- und Diagrammerstellung in VB6:

Ich würde gerne wissen, wie der Code für die Erstellung einer Tabelle und daraus resultierenden Diagramm aussieht in Visual Basic 6.


Bitte um den generellen Code-Aufbau. Habe das Internet durchforstet und bisher nichts gescheites gefunden.

Danke schon mal an alle, die sich die Mühe machen mir zu helfen.

Liebe Grüße
Hammel


----------



## DrSoong (12. Mai 2007)

Reden wir jetzt hier über die Möglichkeit, von VB aus auf eine Excel-Datei zurückzugreifen und dort Tabellen zu erstellen/füllen und Diagramme zu erstellen oder von der Variante, dies auf einer VB-Form mithilfe von eigenen Steuerelementen zu tun?


Der Doc!


----------



## Hammel_b (13. Mai 2007)

Ich würde gern wissen, wie ich in VB eine Excel Tabelle aus eingegebenen Werten im VB-Programm erstellen kann und diese dann in einem Diagramm ausgeben kann.

Also:

VB-Programm: Werte eingeben

Dann klickt man auf einen Button "Tabelle anzeigen" (o.ä.) und er gibt die Werte, die ich zuvor eingegeben habe, in einer Tabelle aus.

Zudem gibt es noch einen Button "Diagramm anzeigen", welcher dann halt aus der erstellten Tabelle ein Diagramm erzeugt.

Dazu würd ich gerne wissen, wie der Quelltext aussieht

Vielen Dank im voraus

Grüße
Hammel_b


----------



## DrSoong (13. Mai 2007)

Also, eine Excel-Datei spricht man aus VB so wie hier beschrieben an. Im Prinzip kannst du in VB sämtliche Excel-VBA-Anweisungen über das Objekt nutzen, zeichne doch mal in Excel die Erstellung eines Diagramms mit dem Makrorecorder auf und schau dir den Code an. Du kannst ihn dann fast 1:1 in dein VB-Programm einbauen.


Der Doc!


----------



## Hammel_b (14. Mai 2007)

Ich werds im Laufe der Woche testen. Vielen Dank schonmal


----------



## Hammel_b (23. Mai 2007)

Dann hätte ich jetzt noch eine Frage:

Wie kann ich überprüfen, ob in der geschriebenen Excel-Tabelle schon Daten sind und kann ich da dann auch auslesen, wieviel vorhanden sind,

so dass ich z.B. neue Daten in der Tabelle einfügen kann.

In dem Beispiel steht leider nur eine statische Methode, geht das auch irgendwie dynamisch?
Gibt es dazu zufällig irgendwelchen Quelltext?

Vielen Dank schonmal


----------



## DrSoong (23. Mai 2007)

Inwiefern dynamisch? Meinst du, dass du in Schleifen auf die Zellen zugreifen kannst? Dann verwende die *.Cells(Row, Column)*-Variante, da kannst du über Zahlen auf die Zellen zugreifen.

Um herauszufinden, ob eine Tabelle Daten enthält fällt mir mal so schnell nichts ein, irgendwo hab ich mal eine Möglichkeit gehabt, das letzte Element einer Tabelle zu bestimmen. Ansonsten müsstest du auslesen, ob die Zellen, die normalerweise Daten beinhalten, gefüllt sind.


Der Doc!


----------



## ronaldh (24. Mai 2007)

Die Anzahl der Zeilen bekommst Du auf folgende Weise heraus:


```
Public Function Test(xlDsn As String, SheetNr As Integer) As Long
Set xlApp = New Excel.Application
Set xlBook = xlApp.Workbooks.Open(xlDsn)
If SheetNr > xlBook.Sheets.Count Then
      MsgBox "Sheet" + Str(SheetNr) + " gibt es nicht!", vbInformation
      Exit Function
End If
Set xlSheet = xlApp.ActiveWorkbook.Sheets(SheetNr)
Test= xlSheet.UsedRange.Rows.Count
End Sub
```

Viele Grüsse
ronaldh


----------



## Alex F. (24. Mai 2007)

Ich würde es nicht mit der *UsedRange.Rows.Count * Eigenschaft machen, da es reicht wenn du einmal in der letzten zeile und oder letzten Spalte des Blattes aus versehen ein leerzeichen drin hattest, damit sich excel da verzählt.
Ich würde über die rows schleifen und dann das cellvalue einer vordefinierten Spalte überprüfen.


```
while not abbruch 
      i = i +1
       abbruch = (len ( activeSheet.Cells(1,i).Cellvalue)=0) 
   wend
   call msgbox ("Anzahl genutzte Reihen " & i )
```
Grüsse bb


----------



## ronaldh (24. Mai 2007)

Das Durchschleifen durch eine große Exceldatei von VB aus dauert leider sehr lange, und das bei hoher Prozessorlast. 

Wenn jemand in die 65000. Zeile springt und dort ein Leerzeichen eingibt, hat man mit UsedRange.Rows.Count Methode sicherlich ein kleines Problem.

Jedoch bekommt man bei der Längenprüfung Probleme, wenn Zeilen innerhalb des Sheets leer sind.

Ich lese mit VB viele Abrechnungstabellen ein, die teilweise mehrere MB groß sind. Diese bestehen manchmal auch aus unterschiedlichen Blöcken, die durch eine oder viele Leerzeilen getrennt sind. Natürlich darf das Programm dann nicht abbrechen.

Aber um allein 200 Zeilen zu lesen, ist der Rechner schon eine bemerkenswerte Zeit beschäftigt. 

Deshalb ist in den meisten Fällen die Rows.Count-Methode wesentlich sicherer.

Grüsse
ronaldh


----------



## maybebaby (31. Mai 2007)

hierzu eine weitere frage:


ich durchlaufe alle zellen in meinem excel sheet und merke mir die spalte und die zeile aus der ich was addieren möchte, was wie folgt aussieht:

For xRows = 1 To 4 'Anzahl Zeilen
For xCols = 1 To 17 'Anzahl Spalten
sWert = .Cells(xRows, xCols)
If sWert = "P1" Then
Zeile = z
Spalte = 5
Do While Spalte < 17
temp = .Cells(Zeile, Spalte) '?wie greife ich auf die zelle zu, deren Zeile und Spalte ich weiss ?
MsgBox ("Temp : " & temp)
ergebnis = ergebnis + temp
MsgBox ("ergebnis lautet : " & ergebnis)
Spalte = Spalte + 3
Loop
'Dreisatz um Prozentsatz pro Woche zu berechnen :
prozentsatzwoche = 100 / 500 * ergebnis
MsgBox ("Die Auslastung betraegt " & prozentsatzwoche)
End If
s = s + 1
Next xCols
z = z + 1
Next xRows



nun würde ich in temp gerne den inhalt der zelle schreiben, von der ich mir spalte und zeile gemerkt hab... ? an dieser stelle funktioniert es quasi nicht : temp = .Cells(Zeile, Spalte) 

kann mir da bitte jemand helfen ich bin der verzweifelung nahe...


----------



## Ein_Freund (31. Mai 2007)

Hallo,

ich verstehe Dein Problem nicht. Du greifst doch schon auf die entsprechende Zelle zu mit _temp = .Cells(Zeile, Spalte)_.

btw. Fremde threads zu missbrauchen um das eigene Problem mit Mehrfach-Postings im Forum streuen, finde ich grenzwertig...

Gruß


----------



## maybebaby (31. Mai 2007)

sorry  

bin neu hier hab kein peil wo ich das sonst hinschreiben soll


----------



## Ein_Freund (31. Mai 2007)

Lass' uns in Deinen thread zurückkehren 

Und nun: back to topic


----------



## Hammel_b (31. Mai 2007)

*Also sollte der Quelltext wie folgt aussehen?*
----------------------------------------------------------------------------------------------------
           Public Function Test(xlDsn As String, SheetNr As Integer) As Long
           Set xlApp = New Excel.Application
           Set xlBook = xlApp.Workbooks.Open(xlDsn)

           while not abbruch
              SheetNr  = SheetNr +1
              abbruch = (len ( activeSheet.Cells(1,SheetNr).Cellvalue)=0)
         wend
        call msgbox ("Anzahl genutzte Reihen " & SheetNr) 


       Set xlSheet = xlApp.ActiveWorkbook.Sheets(SheetNr)
       Test= xlSheet.UsedRange.Rows.Count
     End Sub
------------------------------------------------------------------------------------------------------------
*
wobei xlDsn der Name der Excel-Tabelle ist und (len(active.....=0) die abbruchbedingung?

Was haben denn die letzten beiden Zeilen vor "end sub" zu bedeuten?*
----------------------------------------------------------------------
         Set xlSheet = xlApp.ActiveWorkbook.Sheets(SheetNr)
         Test= xlSheet.UsedRange.Rows.Count
----------------------------------------------------------------------

*Vielen dank für die Hilfe*


----------



## ronaldh (4. Juni 2007)

Der von mir oben genannte Code gibt als Funktionswert die letzte belegte Zeile zurück:

```
Public Function Test(xlDsn As String, SheetNr As Integer) As Long
Set xlApp = New Excel.Application
Set xlBook = xlApp.Workbooks.Open(xlDsn)
If SheetNr > xlBook.Sheets.Count Then
      MsgBox "Sheet" + Str(SheetNr) + " gibt es nicht!", vbInformation
      Exit Function
End If
Set xlSheet = xlApp.ActiveWorkbook.Sheets(SheetNr)
Test= xlSheet.UsedRange.Rows.Count
xlBook.Close
xlApp.Quit
Set xlApp = Nothing
Set xlBook = Nothing
Set xlSheet = Nothing

End Sub
```

Das rufst Du ganz einfach so auf:

```
Msgbox "Anzahl Zeilen:"+Str(Test("C:\Exceldatei.xls",1))
```

Die SheetNr ist das gewünschte Kalkulationsblatt Deiner Exceldatei.

Die von Dir eingefügten Zeilen sind in diesem Fall überflüssig, da die aufgeführte Funktion xlSheet.UsedRange.Rows.Count die Zeilenzahl in den Funktionswert schreibt:


> while not abbruch
> SheetNr = SheetNr +1
> abbruch = (len ( activeSheet.Cells(1,SheetNr).Cellvalue)=0)
> wend
> call msgbox ("Anzahl genutzte Reihen " & SheetNr)



Alles klar?

Grüsse
ronaldh


----------



## Hammel_b (5. Juni 2007)

Ok, vom Grundprinzip hab ichs glaube ich verstanden.

Ich hätte noch ein, zwei Sachen zu klären.


Was genau ein paar Ausdrücke bedeuten und zwar folgende:

Set xlApp = New Excel.Application   <- "Excel" ist die Variable, oder seh ich das falsch?


----- Das ist die Abfrage, ob die Sheet/das Arbeitsblatt vorhanden ist, oder?--------------

If SheetNr > xlBook.Sheets.Count Then
      MsgBox "Sheet" + Str(SheetNr) + " gibt es nicht!", vbInformation
      Exit Function
End If                                                
---------------------------------------------------------------------------------------------------------------------------

Set xlApp = Nothing
Set xlBook = Nothing
Set xlSheet = Nothing        => was haben die genau zu bedeuten?



Vielen Dank für die bisherigen Antworten

Hammel_b


----------



## ronaldh (5. Juni 2007)

> Set xlApp = New Excel.Application <- "Excel" ist die Variable, oder seh ich das falsch?



Excel musst Du als Verweis im VB definieren (Projekt/Verweise/Microsoft Excel x.x Application).



> ----- Das ist die Abfrage, ob die Sheet/das Arbeitsblatt vorhanden ist, oder?--------------
> 
> If SheetNr > xlBook.Sheets.Count Then
> MsgBox "Sheet" + Str(SheetNr) + " gibt es nicht!", vbInformation
> ...


Rrrichtig! Falls Du sicher bist, auf Arbeitsblatt 1 zuzugreifen, kannst Du natürlich auch gleich die 1 als Sheet eingeben.



> Set xlApp = Nothing
> Set xlBook = Nothing
> Set xlSheet = Nothing => was haben die genau zu bedeuten?



Damit werden die Verknüofungen zu Excel in Deinem VB-Programm wieder zerstört, damit das Programm unter allen Umständen korrekt aus dem Hauptspeicher entfernt wird.

So sollte man beispielsweise auch bei ADO Recordsets oder Connections verfahren (wenn man mit Datenbanken arbeitet). 

Wenn man dies nicht macht, kann es vorkommen, dass Du Dein Programm beendest, es aber trotzdem noch im Hintergrund schlummert.

Ich hoffe, Dir hiermit geholfen zu haben.

Viele Grüsse
ronaldh


----------



## DrSoong (5. Juni 2007)

In dem Fall ist Excel keine Variable sondern ein Objekt, damit erstellst du eine neue Instanz. Das Nothing bedeutet, dass offene Objekte und Instanzen geschlossen und gelöscht werden.


Der Doc!


----------

