Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Excel per VBA aus ACCESS-VBA steuern. (Achtung: viel zu lesen)

294 views
Skip to first unread message

Alexander Bierig

unread,
Jun 4, 2009, 7:09:00 PM6/4/09
to
Guten Tag,

ich habe eine Accessanwendung, welche u.A. in dem Klick-event einer
Schaltfl�che eine komplette ExcelSitzung aufmacht. Das klappt auch.
Aber....

der Klick *IM* Access! ruft das Excel folgendermassen auf:

(Access)

Public nx As Excel.Application

Private Sub cmd_insexcel_Click()
...
If Len(str_tmptbl$) > Len(sqlantrag$) Then
'los gehts, im String str_rs steht der recordset...
Call exporttoexcel(str_tmptbl$, Me.lst_gesamtergebnis.ListCount,
Me.txt_prodbis.Value)
....

die aufgerufene Sub ist eine Access-Procedure, keine Excelprocedure. Es
geht darum, das Excel vollst�ndig fremdzusteuern (aus reinen VB-Anwendungen
herraus ist das ja �berhaupt kein Problem...)


Sub exporttoexcel(ByVal sql_anweisg As String, ByVal anz_zeilen As Long,
ByVal eindat As Date)
Dim diedat As String, x As Long, txtantr As String, zwill As String
On Error GoTo scheisse
Me.cmd_rohdaten.SetFocus
Me.cmd_insexcel.Enabled = False

...etwas vorbereitendes wie den Dateinamen und so....

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "BR" &
CStr(Me.cmb_br.Value) & "Rohdatenliste", stamm_dir$ & "\BR" &
CStr(Me.cmb_br.Value) & "\" & diedat$, True
Set nx = New Excel.Application
nx.Visible = True
nx.ScreenUpdating = True
nx.Workbooks.Open Filename:=stamm_dir$ & "\BR" & CStr(Me.cmb_br.Value) &
"\" & diedat$
nx.ActiveWorkbook.ActiveSheet.Cells.Select
nx.Cells.EntireColumn.AutoFit
...und so weiter

dann der Aufruf einer weiteren Sub:

nx.Range("N1").Select
nx.Selection = zwill$ & "_ohne Teile"
'und nun das Diagramm (Via Referenz) mit den Trennungen
Call excel_diag_trennung(nx.ActiveWorkbook, eindat)

f�hrt mit diesem Code in die aufgerufene Sub:
Sub excel_diag_trennung(ByRef einwb As Excel.Workbook, ByVal maxdat As
Date)
'macht den Sternenhimmel mit der trennung nach mit/ohne Teiletauschen.
Dim x As Long, y As Long, ux As Long, uy As Long
ux = einwb.ActiveSheet.Cells(einwb.ActiveSheet.Rows.Count,
4).End(xlUp).Row
>einwb.ActiveSheet.Range("D:D,M:M,N:N").Select
einwb.ActiveSheet.Range("N1").Activate
einwb.Charts.Add

die mit ">" gekennzeichnete Zeile verursacht den ber�hmten 1004-Fehler
(Anwendungs- oder objektorientierter Fehler)

Der Code l�uft, wenn er aus dem Excel herraus gestartet (also als Modul
bereits IM Excel ist) ohne Probleme durch.


Aber es gibt keine Excelvorlage, sondern die Datei wird immer neu erstellt,
daher muss der gesamte Code eben im Access laufen.

Die Frage:

Wie kann ich in der Sub "Sub excel_diag_trennung(ByRef einwb As
Excel.Workbook, ByVal maxdat As Date)" das Rangeobject ansprechen, damit es
die Grafikgrundlage wird?

Im Direktfenster laufen
range("A2").Select
?selection
451
range("A:A").Select
?selection.cells.count
65536
?nx.Name
Microsoft Excel
range("A:B").Select
?selection.cells.count
131072
>range("A:A,M:M").Select
(die letzte Zeile nicht)


Damit kann ich folgende Anweisung
einwb.ActiveChart.SetSourceData
Source:=einwb.Sheets("BR451Rohdatenliste").Range("D1:D" & CStr(ux) & ",M1:N"
& CStr(ux)), PlotBy:=xlColumns
ebenfalls nicht ausf�hren (1004-Fehler).

Die Ursache f�r den Fehler ist die Mehrfachauswahl des Range-Objekts.
Wieso?


--
Mit freundlichen Gr�ssen

Alex. Bierig
(alexander at taxi minus stuttgart dot de)

Ich unterst�tze SQL Pass


Andreas Killer

unread,
Jun 5, 2009, 4:41:11 AM6/5/09
to
On 5 Jun., 01:09, "Alexander Bierig"
<dusollst.keines...@versenden.com> wrote:

> Set nx = New Excel.Application
>     nx.Visible = True
>     nx.ScreenUpdating = True

Das braucht es nicht, ist True bei Default.

>     nx.Workbooks.Open Filename:=stamm_dir$ & "\BR" & CStr(Me.cmb_br.Value) &
> "\" & diedat$
>     nx.ActiveWorkbook.ActiveSheet.Cells.Select

Das Select ist über, hat keine Wirkung

>     nx.Cells.EntireColumn.AutoFit
Das glaube ich nicht, den die Excel.Application hat keine Zellen!

> dann der Aufruf einer weiteren Sub:
>         nx.Range("N1").Select
>         nx.Selection = zwill$ & "_ohne Teile"

Au haua, was ist das denn?

>     >einwb.ActiveSheet.Range("D:D,M:M,N:N").Select
>     einwb.ActiveSheet.Range("N1").Activate
>     einwb.Charts.Add

Auch hier wieder, das Select vor Charts.Add hat keinerlei Wirkung.

> Damit kann ich folgende Anweisung
> einwb.ActiveChart.SetSourceData
> Source:=einwb.Sheets("BR451Rohdatenliste").Range("D1:D" & CStr(ux) & ",M1:N"
> & CStr(ux)), PlotBy:=xlColumns

> ebenfalls nicht ausführen (1004-Fehler).
Hmm, gibt es das Sheet "BR451Rohdatenliste" wirklich? Ein Stück weiter
oben hast Du immer mit ActiveSheet gearbeitet!

Entferne den ganzen Select und Activate-Krams und referenziere die
Objekte direkt, dann hast Du auch keine Probleme.

Andreas.

Sub Makro1()
Dim nx As Excel.Application
Dim einWb As Excel.Workbook
Dim einWs As Excel.Worksheet, einC As Excel.Chart


Dim x As Long, y As Long, ux As Long, uy As Long

Set nx = New Excel.Application
nx.Visible = True
Set einWb = nx.Workbooks.Open(Filename:=stamm_dir$ & "\BR" & _
CStr(Me.cmb_br.Value) & "\" & diedat$)
Set einWs = einWb.ActiveSheet

einWs.Cells.EntireColumn.AutoFit
ux = einWs.Cells(einWs.Rows.Count, 4).End(xlUp).Row

Set einC = nx.Charts.Add
With einC
.ChartType = xlColumnClustered
.SetSourceData _
Source:=einWs.Range("D1:D" & ux & ",M1:N" & ux), _
PlotBy:=xlColumns
End With
End Sub

Alexander Bierig

unread,
Jun 21, 2009, 10:59:59 AM6/21/09
to
Hallo Andreas,

Bitte entschul�dige die versp�tete Antwort - ich wurde relativ kruzfristig
(binnen 12 Std) auf Schulung geschickt...

>Entferne den ganzen Select und Activate-Krams und referenziere die
>Objekte direkt, dann hast Du auch keine Probleme.

Das war der ganz klare entscheidende Tipp und mein ganz klarer Fehler.

Die eindeutigen Referenzen brachtend as gew�nscte Ergebnis - die
Default-Objecte der Application sind ja die der Access-Application.

Vielen Dank.

0 new messages