VB6: Excel-Diagramm ansprechen, Datenquelle ändern

Hallo ihr Wissenden,

ich finde nieregdns Hilfe für mein Problem: Ich möchte aus Visual Basic heraus ein Diagramm ändern, dass sich in einer Excel-Datei, auf einem Arbeitsblatt befindet.
Habe folgenden Code schon zusammengewürfelt, weil ich eigentlich nicht viel Ahnung von dem Thema habe!:

Private Sub Erstellen\_Click()
'öffnen
Dim Excel As Object
Set Excel = CreateObject("Excel.Application") 
Excel.Visible = False
Excel.Workbooks.open "C:/diagramme.xls“

Excel.Sheets("Diagramme").Select
ActiveSheet.Charts("Diagramm 1").Select 'Fehler

ActiveChart.SetSourceData Source:=Excel.Sheets("Daten").Range("A3:A6,C3:C6"), \_
 PlotBy:=xlColumns


'excel schließen
Excel.ActiveWorkbook.Close SAVECHANGES:=True
Excel.Quit
End Sub

Bei „ActiveSheet.Charts(„Diagramm 1“).Select“ kommt dann der Fehler 424 „Objekt erforderlich“. Dass das Digramm so heißt, sagt mir ein aufgenommenes Macro. Ersetze ich den Namen durch den Index, kommt das gleiche.

Bitte um Hilfe
Gruß Simon

Da bin ich noch mal :smile:

Keiner ne Idee?

Wenn ich anstatt

ActiveSheet.Charts("Diagramm 1").Select 'Fehler
ActiveChart.SetSourceData Source:=Excel.Sheets("Daten").Range("A3:A6,C3:C6"), \_
 PlotBy:=xlColumns

das hier

Excel.ActiveSheet.Charts("Diagramm 1").SourceData = ...

schreibe, kommt ein „Anwendungs- oder objektdefinierter Fehler“!

Ich muss doch nur wissen, wie man die Datenquelle ändert, hiiiielfe!!
Gruß Simon

Hi Simon,

Keiner ne Idee?

drängel nicht so, es ist spät Abends und WE, oder hast du den „Antworten in 2 Stunden für 2000€ pro Anfrage“ Tarif gebucht?

Diagramme sind seltsam, habe da oft Probleme mit,
probier mal:

for each C in ActiveSheet.Charts
Msgbox C.name
Next C

und berichte mal was da so erscheint, nur so kann ich mich „rantasten“
Und wenn der Code problemlos durchläuft, okay, nehmen wir halt mal die nächste deiner Codezeilen in Augenschein.
Step by Step.

Ich gebe zu, ein bißchen hinderlich ist es schon an diesem Pc kein Excel zu haben, also nix testen zu können :frowning:

Gruß
Reinhard

Hi Reinhard,
viielen danke schonmal für deine Antwort!!

drängel nicht so, es ist spät Abends und WE, oder hast du den
„Antworten in 2 Stunden für 2000€ pro Anfrage“ Tarif gebucht?

*grins* jaa Tschuldigung, das beschäftigt mich nur garde so sehr ^^

for each C in ActiveSheet.Charts
Msgbox C.name
Next C

Mhm da kommt in der ersten Zeile der selbe Fehler „Objekt erforderlich“…
Das scheint wohl schon der erste Fehler zu sein. Vielleicht muss ich irgendwie erstmal ActiveSheet oder Charts definieren?! (Habe ich mal mit ActiveSheet und Charts als Object probiert, dann kommt aber „Objektvariable oder With-Blockvariable nicht festgelegt“)

Noch ne Ideeee?
Gruß Simon

Hallo Simon,

sitze gerade auch einen Rechner ohne Excel, aber ist Dein Diagramm ein Diagramm, dass in einem Tabellenblatt eingebaut ist oder ein Diagrammblatt?

MfG Georg V.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

sitze gerade auch einen Rechner ohne Excel, aber ist Dein
Diagramm ein Diagramm, dass in einem Tabellenblatt eingebaut
ist oder ein Diagrammblatt?

Hi,
es ist ein Diagramm, welches auf einem Tabellenblatt ist. Darum auch mein
Excel.Sheets(„Diagramme“).Select !

Gruß Simon

Mhm da kommt in der ersten Zeile der selbe Fehler „Objekt
erforderlich“…
Das scheint wohl schon der erste Fehler zu sein. Vielleicht
muss ich irgendwie erstmal ActiveSheet oder Charts
definieren?! (Habe ich mal mit ActiveSheet und Charts als
Object probiert, dann kommt aber „Objektvariable oder
With-Blockvariable nicht festgelegt“)
Noch ne Ideeee?

Hi Simon,
probier mal:

For Each C In ActiveSheet.Shapes
 MsgBox C.Name
Next C
ActiveSheet.Shapes("Chart 2").Select

Gruß
Reinhard

For Each C In ActiveSheet.Shapes
MsgBox C.Name
Next C
ActiveSheet.Shapes(„Chart 2“).Select

Hi und danke Reinhard,
Also da kommt auch sofort „Objekt erforderlich“ sobald etwas mit ActiveSheet kommt!
Hm ich verzweifel so langsam…
Ich geb mal den Programmteil und alles was dazugehört frei, vielleicht, kann sich den mal jemand angucken (vielleicht einer mit VB6 und Excel?)
http://home.arcor.de/simpsons-fun/TestProjekt.zip

Ansonsten hätte ich da ne Lösung von Microsoft, dann würde ich halt ein neues Diagramm erstellen ( http://support.microsoft.com/kb/142387/de )
Aber da kommt sofort ein Fehler, wenn ich den Bereich vom Quelle-Einstellen ändere, aber der Fehler lässt sich bestimmt leichter beheben, oder?
Gruß Simon

For Each C In ActiveSheet.Shapes
MsgBox C.Name
Next C
ActiveSheet.Shapes(„Chart 2“).Select

Also da kommt auch sofort „Objekt erforderlich“ sobald etwas
mit ActiveSheet kommt!

Hi Simon,
ich habe kein Vb, es wurde mit XL2002 getestet und da lief es.
Was mir einfällt, laß mal das Visible=false weg, das führt nur dazu daß man nach dem ersten Versuch die Datei nur noch schreibgeschüützt öffnen kann, oder man schießt die versteckten Excel-Instanzen mit dem Taskmanager ab.
Und, hat mit dem Problem nichts zu tun, aber benutze bitte keine Vba bekannten Namen als Variablennamen, also bitte Excel in objExcel o.ä. abändern.

Hm ich verzweifel so langsam…

Völlig normale Entwicklung bei Umgang mit MS-Produkten :smile:))

Ich geb mal den Programmteil und alles was dazugehört frei,
vielleicht, kann sich den mal jemand angucken (vielleicht
einer mit VB6 und Excel?)
http://home.arcor.de/simpsons-fun/TestProjekt.zip

Entpacken kann ich die zip erst heute Abend.

Ansonsten hätte ich da ne Lösung von Microsoft, dann würde ich
halt ein neues Diagramm erstellen (
http://support.microsoft.com/kb/142387/de )
Aber da kommt sofort ein Fehler, wenn ich den Bereich vom
Quelle-Einstellen ändere, aber der Fehler lässt sich bestimmt
leichter beheben, oder?

Muß ich erst testen um was sagen zu können. Und da ich nur Vba habe besteht dann natürlich immer noch die winzige Möglichkeit, daß sich gleicher Code, in VB oder in Vba gestartet, unterschiedlich verhält.

Gruß
Reinhard

Hi Reinhard

ich habe kein Vb, es wurde mit XL2002 getestet und da lief es.

Hm also du hattest den gleichen Code wie ich (also mit dem ganzen Code vorher, den ich hier gepostet habe?)?

Was mir einfällt, laß mal das Visible=false weg, das führt nur
dazu daß man nach dem ersten Versuch die Datei nur noch
schreibgeschüützt öffnen kann, oder man schießt die
versteckten Excel-Instanzen mit dem Taskmanager ab.

Mhm ja danke, das habe ich so langsam auch bemerkt^^

Und, hat mit dem Problem nichts zu tun, aber benutze bitte
keine Vba bekannten Namen als Variablennamen, also bitte Excel
in objExcel o.ä. abändern.

Ja werde ich machen, habe den Code auch nur von woanders Copiert:smile:

Hm ich verzweifel so langsam…

Völlig normale Entwicklung bei Umgang mit MS-Produkten :smile:))

xD, ja die wollen wohl noch en bissel an neuzukaufenden Tastaturen verdienen!

Vielen Dank auf jeden Fall schonmal
Gruß Simon

Hi Simon,

Hm also du hattest den gleichen Code wie ich (also mit dem
ganzen Code vorher, den ich hier gepostet habe?)?

Nö, aber der existiert nicht mehr.

Nachfolgend ist Code, der durchläuft, allerdings nur mit GetObject, wenn ich CreateObject nehme kann ich select oder Activate bentzen wie ich will, er „hüpft“ nicht in die 2te Excelinstanz in das Blatt Diagramme, was ich an dem Msgbox gut sehen kann.
Warum das Gleiche mal Diagramm 1, mal Chart 1 heißt weiß ich nicht.
Und da mit VBS starten willst, d.h. beim Start existiert noch gar kein Excel, k.A. was du dann machen mußt.

Gruß
Reinhard

Sub Erstellen\_Click()
'öffnen
Dim objExcel As Object
'Set objExcel = CreateObject("Excel.Application")
Set objExcel = GetObject(, "Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Open "C:/Diagramme.xls"
With objExcel.Worksheets("Diagramme")
 .Activate
 .Select
 .Range("A1").Select
 'MsgBox ActiveSheet.Name
 MsgBox ActiveWorkbook.Name
 'For Each C In ActiveSheet.Shapes
 'MsgBox C.Name
 'Next C
 .ChartObjects("Diagramm 1").Activate
 ActiveChart.ChartArea.Select
 ActiveChart.SetSourceData Source:=Sheets("Daten").Range("A1:B8"), PlotBy:=xlColumns

 ' .Shapes("Chart 1").ChartArea.Select
 ' ActiveChart.SetSourceData Source:=objExcel.Sheets("Daten").Range("A3:A6,C3:C6"), PlotBy:=xlColumns
 'excel schließen
End With
objExcel.ActiveWorkbook.Close SAVECHANGES:=True
'objExcel.Quit
End Sub

Was mir einfällt, laß mal das Visible=false weg, das führt nur
dazu daß man nach dem ersten Versuch die Datei nur noch
schreibgeschüützt öffnen kann, oder man schießt die
versteckten Excel-Instanzen mit dem Taskmanager ab.

Mhm ja danke, das habe ich so langsam auch bemerkt^^

Und, hat mit dem Problem nichts zu tun, aber benutze bitte
keine Vba bekannten Namen als Variablennamen, also bitte Excel
in objExcel o.ä. abändern.

Ja werde ich machen, habe den Code auch nur von woanders
Copiert:smile:

Hm ich verzweifel so langsam…

Völlig normale Entwicklung bei Umgang mit MS-Produkten :smile:))

xD, ja die wollen wohl noch en bissel an neuzukaufenden
Tastaturen verdienen!

Vielen Dank auf jeden Fall schonmal
Gruß Simon

Hi Reinhard,
viielen viiielen Dank!!!
Es scheint jetzt zu funktionieren, allerdings nur mit CreateObject, wenn ich GetObject nehme, kommt sofort wieder ein Fehler (bei gleichem Code!)!
Werde jetzt mal sehen, ob auch noch alles funktioniert, wenn ich es ins Programm einbaue.
Naja wie gesagt Danke!
Gruß Simon

Und nochmal Hi Reinhard & Co

hab den Code jetzt „verbaut“ und zwar jetzt doch mit GetObject (da funktioniert wohl alles nach einem sehr komplexen Zufallssystem, aber solang es jetzt funzt!)

Ich müsste jetzt den Quellbereich ändern:

ActiveChart.SetSourceData Source:=Sheets("Daten").Range("A1:B8"), PlotBy:=xlColumns

Da müsste ein …Range(„A3:A6,C3:C6“)… oder so draus werden, aber dann kommt sofort ein „Anwendungs- oder objektdefinierter Fehler“.
Kann mir da auch einer Helfen? Und sorry, wenn ich mich so plöd anstelle :smiley:

Danke und Gruß Simon

Hi Simon,

hab den Code jetzt „verbaut“ und zwar jetzt doch mit GetObject
(da funktioniert wohl alles nach einem sehr komplexen
Zufallssystem, aber solang es jetzt funzt!)

Da müsste ein …Range(„A3:A6,C3:C6“)… oder so draus werden,
aber dann kommt sofort ein „Anwendungs- oder objektdefinierter
Fehler“.

bei Fehlersuche muß man runterschrauben, also alles komplizierte Fehlerträchtige erst mal weg.
Also nicht Range(„A3:A6,C3:C6“) benutzen, sondern von mir aus Range(„A3:A6“)
Weil, vielleicht werden nur zusammengehörige „Ranges“ akzeptiert.

Und zu Getobject, wenn es nur manchmal funktioniert liegt es an deinem Code nicht an Getobject. Getobject bezeichnet die existierende Excelinstanz.
Wenns da Fehler gibt dann läuft kein Excel, ansonsten, dein Code ist fehhlerhaft.
Gruß
Reinhard

Hi Reinhard,

bei Fehlersuche muß man runterschrauben, also alles
komplizierte Fehlerträchtige erst mal weg.
Also nicht Range(„A3:A6,C3:C6“) benutzen, sondern von mir aus
Range(„A3:A6“)
Weil, vielleicht werden nur zusammengehörige „Ranges“
akzeptiert.

Mhm ja („A3:A6“) funktioniert ja, aber muss jetzt irgendwie soetwas („A3:A6,C3:C6“) draus werden, da es halt kein zusammenhöriger Range ist. Und das ist grade mein Problem!

Und zu Getobject, wenn es nur manchmal funktioniert liegt es
an deinem Code nicht an Getobject. Getobject bezeichnet die
existierende Excelinstanz.
Wenns da Fehler gibt dann läuft kein Excel, ansonsten, dein
Code ist fehhlerhaft.

Gut, aber im Moment geht es, also belasse ich es mal dabei, danke.

Gruß Simon

Hi nochmal

Mhm ja („A3:A6“) funktioniert ja, aber muss jetzt irgendwie
soetwas („A3:A6,C3:C6“) draus werden, da es halt kein
zusammenhöriger Range ist. Und das ist grade mein Problem!

Also ich habe jetzt ne Lösung: Ich wähle erst A3:A6 und stelle dann mit
ActiveChart.SeriesCollection(1).Values = „=Daten!R3C3:R“
die Datenreihe neu ein"

Gruß Simon