PDA

Vollständige Version anzeigen : mal wieder eine sehr interessante Sache:


Stema
22.06.2001, 00:07
Hallo Leute,

mal wieder eine sehr interessante Sache:
Ich habe per VBA den Inhalt einer A97-Tabelle als Excel97-File abgespeichert. Um den Pfad und den Dateinamen des Excel-Files zu bestimmen, habe ich die GetSaveAsFilename-Methode verwendet, d.h. der Anwender kann den normalen Windows-Browser verwenden.
Wenn man später im Windows-Explorer (NT 4.0) die Datei öffnen will, dann schmiert Excel total ab. Wird jedoch zuerst Excel geöffnet und dann über den Excel-Browser die Datei geöffnet funkts. Und ersteres funkt solange nicht, bis die Datei aus Excel heraus neu abgespeichert wird.
Tja, Excel- oder Access-Problem?
Hat da jemand eine tolle Idee zu?

A.S.
22.06.2001, 04:45
Hallo Stema,

kommt darauf an, mit welchen Objekten Du die XLS-Datei erzeugt hast....

OLE-Automation oder TransferSpreadsheet?

Ersteres verwende ich, wenn ich so etwas mache und habe damit bisher keine Probleme gehabt. Bei letzterem gibt's hier im Forum auch genug Leute die damit arbeiten und - wie's scheint - keine großen Probleme damit hatten.

Liegts vielleicht evtl. an den enthaltenen Daten? Wie sieht das Coding aus?

Gruß

Arno

Stema
22.06.2001, 08:18
Hallo Arno,
hier der Code:

Private Sub cmdPrintREDPal_Click()
Dim Datei As String
Dim Pfad As String
Dim PfadDatei As String
Dim msg As String

Dim i As Integer

On Error GoTo FEHLER

Excel.Application.Visible = True
PfadDatei = Excel.Application.GetSaveAsFilename(Form_frmNAT_PEs.cmbPalNr, _
"Excel-Dateien (*.xls), *.xls", , "Bitte Pfad wählen und Dateinamen eintragen!")
Excel.Application.Quit

Call Form_Didl.PfadOhneDateiname(Pfad, PfadDatei, Datei)

Select Case PfadDatei
Case Is = False
MsgBox "Der Vorgang wurde abgebrochen!"
DoCmd.Hourglass False
Exit Sub
Case Else
DoCmd.Hourglass True
With Application.FileSearch
.NewSearch
.LookIn = Pfad
.SearchSubFolders = False
.FileName = Datei
.MatchTextExactly = True
.Execute msoSortByFileName
For i = 1 To .FoundFiles.Count
If .FoundFiles(i) = PfadDatei Then
msg = MsgBox("Soll die vorhandene Datei überschrieben werden?", _
vbYesNo + vbDefaultButton2 + vbExclamation)
Select Case msg
Case Is = vbNo
DoCmd.Hourglass False
MsgBox "Der Vorgang wurde abgebrochen!"
Exit Sub
Case Is = vbYes
GoTo DateiSpeichern
End Select
End If
Next i
End With
DateiSpeichern:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, "QueryReportREDPal", PfadDatei
DoCmd.OpenReport "ReportREDPal", acViewNormal
DoCmd.OpenQuery "QueryReportREDPalUpdate", acViewNormal
Me.cmbPalNr.Requery
Me.cmbPalNr.Value = ""
Me.cmbPalNr.SetFocus
Me.cmdPrintREDPal.Enabled = False
Excel.Application.Quit
DoCmd.Hourglass False
End Select
Exit Sub

FEHLER:
Excel.Application.Quit
MsgBox "Fehler Nr: " & Err.Number & Chr$(10) & Chr$(10) & Err.Description
End Sub

Ich denke nicht, daß es an den Daten im Query liegen kann. Bis auf eine Spalte "Produktnummer: Trim(Left([ProdNr];11)) & " #" & Right(Left([ProdNr] & String(16;" ");16);4)" greife ich direkt auf Felder der Tabelle zu. In einer Spalte habe ich noch folgende Bedungung: [Forms]![frmNAT_PEs]![cmbPalNr].

A.S.
27.06.2001, 05:27
Hallo Stema,

sorry, habe das Thema gerade erst wieder registriert.....


Private Sub cmdPrintREDPal_Click()
Dim Datei As String
Dim Pfad As String
Dim PfadDatei As String
Dim msg As String

Dim i As Integer

On Error GoTo FEHLER

Excel.Application.Visible = True
PfadDatei = Excel.Application.GetSaveAsFilename(Form_frmNAT_PEs.cmbPalNr, _
"Excel-Dateien (*.xls), *.xls", , "Bitte Pfad wählen und Dateinamen eintragen!")
Excel.Application.Quit
Wo wird das Objekt Excel instanziert?
Call Form_Didl.PfadOhneDateiname(Pfad, PfadDatei, Datei)

Select Case PfadDatei
Case Is = False
MsgBox "Der Vorgang wurde abgebrochen!"
DoCmd.Hourglass False
Exit Sub
Case Else
DoCmd.Hourglass True
With Application.FileSearch
.NewSearch
.LookIn = Pfad
.SearchSubFolders = False
.FileName = Datei
.MatchTextExactly = True
.Execute msoSortByFileName
For i = 1 To .FoundFiles.Count
If .FoundFiles(i) = PfadDatei Then
msg = MsgBox("Soll die vorhandene Datei überschrieben werden?", _
vbYesNo + vbDefaultButton2 + vbExclamation)
Select Case msg
Case Is = vbNo
DoCmd.Hourglass False
MsgBox "Der Vorgang wurde abgebrochen!"
Exit Sub
Case Is = vbYes
GoTo DateiSpeichernDirektes herausspringen aus einer Schleife ist von der Programmierung her IMHO unsauber. Besser: Exit For.
End Select
End If
Next i
End With
Kleine Frage: Du läst Dir oben über den Excel-Dateispeichernunter-Dialog einen eindeutigen Dateinamen übermitteln. Da sollte es IMHO reichen die existenz mittels

If Dir(PfadDatei) = Datei Then....

zu überprüfen.
DateiSpeichern:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, "QueryReportREDPal", PfadDatei
DoCmd.OpenReport "ReportREDPal", acViewNormal
DoCmd.OpenQuery "QueryReportREDPalUpdate", acViewNormal
Me.cmbPalNr.Requery
Me.cmbPalNr.Value = ""
Me.cmbPalNr.SetFocus
Me.cmdPrintREDPal.Enabled = False
Excel.Application.Quit
DoCmd.Hourglass False
End Select
Exit Sub

FEHLER:
Excel.Application.Quit
MsgBox "Fehler Nr: " & Err.Number & Chr$(10) & Chr$(10) & Err.Description
End Sub


Hmm... ansonsten kann ich eigentlich nicht viel auffälliges an Deinem Coding finden. Werde ihne heute einmal in der Firma ausprobieren (NT4SP5) und dann mal sehen ob's Probleme bringt.

Gruß

Arno

PS Was mir gerade noch auffällt: Sprungverarbeitung innerhalb einer Select-Case-Anweisung, noch dazu im selben Zweig? Zugegeben, Exit For ist auch nicht die sauberste Lösung. IMHO aber noch besser als mit GoTo zu arbeiten.

Stema
29.06.2001, 00:38
Hallo Arno,

erstmal vielen Dank für Deine Mühe.

Wo wird das Objekt Excel instanziert?
Soviel ich weiß muß das bei Excel.Application gar nicht explizit geschehen. Funkt auch so. Und mit Excel.Application.GetSaveAsFilename() wird das Excel-Objekt erstellt. Excel.Application.Visible = TRUE hatte ich anfangs nur zur Übersichtlichkeit eingefügt und später nicht gelöscht.

Direktes herausspringen aus einer Schleife ist von der Programmierung her IMHO unsauber. Besser: Exit For.

For i = 1 To .FoundFiles.Count
If .FoundFiles(i) = PfadDatei Then
msg = MsgBox("Soll die vorhandene Datei überschrieben werden?", _
vbYesNo + vbDefaultButton2 + vbExclamation)
Select Case msg
Case Is = vbNo
DoCmd.Hourglass False
MsgBox "Der Vorgang wurde abgebrochen!"
Exit Sub
Case Is = vbYes
Exit For
End Select
End If
Next i
End With
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, "QueryReportREDPal", PfadDatei
DoCmd.OpenReport "ReportREDPal", acViewNormal
DoCmd.OpenQuery "QueryReportREDPalUpdate", acViewNormal
Me.cmbPalNr.Requery
Me.cmbPalNr.Value = ""
Me.cmbPalNr.SetFocus
Me.cmdPrintREDPal.Enabled = False
Excel.Application.Quit
DoCmd.Hourglass False
End Select
Exit Sub


FEHLER:
Excel.Application.Quit
MsgBox "Fehler Nr: " & Err.Number & Chr$(10) & Chr$(10) & Err.Description
End Sub

Ich denke, so ist es wirklich besser. If Dir(PfadDatei) = Datei Then werde ich auch noch einfügen. Guter Tipp! Hatte es vorher anders realisieren wollen, und dann das Vorhandene nicht mehr ersetzt.

Schönen Gruß... Stefan