Best Practices > Diskussionen zu Best Practices
COM-Schnittstelle MS Excel
ata:
Hallo @All,
im Laufe der Zeit steht man immer wieder vor den gleichen Anforderungen. Da ich in der letzten Zeit häufiger auf Excel angesprochen wurde, kam mir der Gedanke hier eine Sammlung von rudimentären Funktionen einzubringen, die man immer wieder im Zusammenhang mit COM-Schnittstellenprogrammierung braucht...
Die Funktionen können dann in einer Library oder auch direkt verwendet werden. Sie basieren auf den aktuellen COM-Klassenobjekten.
Für eine bessere Navigation würde ich pro Funktion eine Antwort erstellen - die Überschrift enthält den Funktionsnamen.
Gibt es daran Interesse?
Toni
*** edit ***
Hier der Beginn einer Auflistung aller bisherigen Funktionen:
Excel als Variant initialisieren
Function xlGet( ... )
Excel im Backend schließen
Function xlClose( ... )
Excel im Frontend anzeigen oder verbergen
Function xlShow( ... )
Zellinhalte auslesen - mit der Möglichkeit mehrere Zellen einer Zeile einzulesen
Function xlGetCellValues( ... )
Werte in eine Excel-Zelle schreiben - mit der Option einer Zellformatierung für Darstellungsformat
Function xlSetCell( ... )
Hilsfunktion zum Initialisieren der möglichen 256 Spaltennamen ( A - IV ) in eine Textliste
Function xlGetColumnNames( )
Importieren einer ASCII-Datei
Function xlDataImport(...)
Einen Tabellenbereich nach einer Spalte sortieren
Function xlSort( ... )
Zellen in Höhe und Breite automatisch anpassen - für gesamtes Tabellenblatt
Function xlAutoFit( ... )
Einen Tabellenbereich in Höhe und Breite anpassen
Function xlFitRange( ... )
Zellen miteinander verbinden
Function xlMergeCells(...)
Schriftformatierung für einen Bereich - Schriftart und -größe, Gewicht und Kursiv
Function xlFormatFont( ... )
Tabellenblatt an einer bestimmten Stelle einfrieren
Function xlFreeze( ... )
... Fortsetzung folgt...
ata:
--- Code: ---Function xlGet( sPath As String , bVisible As Variant , xl As Variant , xlWbk As Variant ) As Variant
' # Initialisierung einer Excel-Anwendung.
' # sPath => String-Variable für die vollständige Pfadangabe einer Excel-Datei oder Leersting
' # bVisible => True oder False für die Sichtbarkeit im Frontend
' # xl => Variant-Variable für das Excel-Objekt
' # xlWbk => Variant-Variable für die Excel-Datei
' # Rückgabe ist xl Als Applikation
'
On Error Resume Next
'
Set xl = GetObject("", "Excel.Application")
'
If Err = 208 Then ' Fehler 208 tritt auf wenn Excel noch nicht läuft
Err = 0
Set xl = CreateObject( "Excel.Application" ) 'Excel wird initialisiert
End If
'
If Not xl Is Nothing Then
XL.Visible = bVisible
If sPath <> "" Then
Set xlWbk = xl.Workbooks.Open( sPath ) ' # bestehende Datei öffnen
Else
Set xlWbk = xl.Workbooks.Add ' # neue Datei verwenden
End If
Print "OK - Excel konnte initialisiert werden"
Set xlGet = xl
Else
Set xlGet = Nothing
End If
End Function
--- Ende Code ---
Eine Validierung, ob eine bestimmte Datei am angegebenen Pfad existiert muß zuvor separat durchgeführt werden...
Toni
Axel:
--- Code: ---'--- Deklaration von API-Funktionen ---
Declare Function SetActiveWindow Lib "user32" Alias "SetActiveWindow" (Byval Hwnd As Long) As Long
Declare Function SetForegroundWindow Lib "user32" (Byval Hwnd As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (Byval ClassName As String, Byval lpWindowName As Long) As Long
Class cExcel
objExcel As Variant
objSheet As Variant
'Konstruktor
Sub New
Set objExcel = Nothing
On Error Resume Next
Set objExcel = GetObject("", "Excel.Application")
If Err = 208 Then ' Fehler 208 tritt auf wenn Excel noch nicht läuft
Err = 0
Set objExcel = CreateObject("Excel.Application") 'Excel wird "unsichtbar" gestartet
End If 'If Err = 208 Then
End Sub
'Destruktor-Prozedur
Sub Delete
Set objExcel = Nothing
End Sub
'Beendet den Excel-Task, es werden alle offenen Arbeitsmappen ohne Speicherung geschlossen
Sub Quit
objExcel.DisplayAlerts = False 'Warnmeldungen ausschalten
Call objExcel.Quit
End Sub
' Macht den Excel-Task sichbar
Sub SetVisible
objExcel.Visible = True 'Excel sichtbar machen
End Sub
'Bringt Word als Vollbild in den Vordergrund
Sub ActivateExcel
Dim hWnd As Long
'Handle für Excel-Application ermittlen
hWnd = FindWindow("XLMAIN", 0)
If hWnd = 0 Then Exit Sub
'Excel aktivieren und in den Vordergrund bringen
Call SetActiveWindow(hWnd)
Call SetForegroundWindow(hWnd)
End Sub
' Erstellt eine neue Arbeitsmappe
Sub NewWorkbook
Call objExcel.Workbooks.Add
Set objSheet = objExcel.Workbooks(1).Worksheets(1)
End Sub
' Öffnet eine Arbeitsmappe
Sub OpenWorkbook(strFileName As String)
Call objExcel.Workbooks.Open (strFileName)
Set objSheet = objExcel.Workbooks(1).Worksheets(1)
End Sub
' Schreibt einen Wert in die angegebene Zelle
' Es werden nur maximal 912 Zeichen übernommen
Sub SetCellValue(sZiel As Variant, varValue As Variant)
Dim sTmp As String
Dim result As Variant
sTmp = Cstr(varValue)
If Len(sTmp) > 912 Then
objSheet.Range(sZiel).Value = Left(sTmp,912)
Else
objSheet.Range(sZiel).Value = sTmp
End If 'If Len(varValue) > 912 Then
End Sub
End Class
--- Ende Code ---
Der Code ist an manchen Ecken noch etwas rudimentär und stellenweise auch noch felxibler gestaltbar. Es fehlt auch noch eine durchgängige Fehlerbehandlung.
Axel
ata:
... zum Ende des Codes sollte die Excel-Datei aufgeräumt werden, damit die Anwendung nicht im Backend erhalten bleibt.
... die Funktion sollte auch in einem Fehlerhandling eingesetzt werden
--- Code: ---Function xlClose( xl As Variant , xlWbk As Variant ) As Variant
' # Excel ohne Speicherdialog schließen
' # xl => Variant => Excal-Applikation
' # xlWbk => Variant => Excel-Datei
' # Rückgabe => True
'
xl.DisplayAlerts = False 'Warnmeldungen ausschalten
'
Call xlWbk.Close( False )
'
Call xl.Quit( )
Set xl = Nothing
'
xlClose = True
'
End Function
--- Ende Code ---
ata:
... alle Spalten und Zeilen eines Arbeitsblattes in der Breite optimieren
--- Code: ---Function xlAutoFit( xl As Variant , xlSheet As Variant )
' # Alle Spalten automatisch optimiert in der Breite formatieren.
' # xl => Variant => Die Excel-Anwendung
' # xlSheet => Variant => das gewünschte Excel-Arbeitsblatt
'
xlSheet.Cells.Select
'
xl.Selection.Columns.AutoFit
xl.Selection.Rows.AutoFit
'
End Function
--- Ende Code ---
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln