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

05/06/2009 - 01:09 von Alexander Bierig | Report spam
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
 

Lesen sie die antworten

#1 Andreas Killer
05/06/2009 - 10:41 | Warnen spam
On 5 Jun., 01:09, "Alexander Bierig"
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

Ähnliche fragen