Best Practices > Diskussionen zu Best Practices

COM-Schnittstelle MS Excel

(1/8) > >>

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