Autor Thema: COM-Schnittstelle MS Excel  (Gelesen 116422 mal)

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Function xlFormatFont( ... )
« Antwort #20 am: 31.01.08 - 12:46:48 »
... eine Funktion zur Schrift-Formattierung eines Bereiches

Ein Aufruf kann wie folgt aussehen:
Call xlFormatFont( xl , xlSheet , "" , "Arial" ) ' # das gesamte Tabellenblatt in Arial
Call xlFormatFont( xl , xlSheet , "" , "Arial => 10" ) ' # das gesamte Tabellenblatt in Arial Größe 10 - verwendet Select
Call xlFormatFont( xl , xlSheet , "" , "Arial => 10 => 3" ) ' # das gesamte Tabellenblatt in Arial Größe 10 in roter Schriftfarbe
Call xlFormatFont( xl , xlSheet , "A1:E1" , "Arial => 14 => 3 => Bold => Italic" )  '# der ausgewiesene Bereich in fetter roter Kursiv-Schrift "Arial in Größe 14
Call xlFormatFont( xl , xlSheet , "A1:E1" , "Arial => 14 => 5 => => Italic" ) '# der ausgewiesene Bereich in blauer Kursiv-Schrift "Arial in Größe 14

Hinweis:
Die Parameter für die Schriftformatierung müssen in dieser Reihenfolge verwendet werden.
Es kann kein Parameter übersprungen werden, er muß zumindest als Leer übergeben werden (s. letztes Beispiel für "Bold"-Bereich des Strings).
Leere Parameter werden nicht beachtet.

Code
Function xlFormatFont( xl As Variant , xlSheet As Variant , vRange As Variant , vParam As Variant ) As Variant
   ' # Formatiert einen Bereich für Schrift, Größe, Farbe
   ' # xlSheet => Variant => das Excel-Arbeitsblatt
   ' # vRange => Variant => z.B. "A:E" für die ersten 5 Spalten - bei Leersting das gesamte Arbeitsblatt
   ' # vParam => Variant => gewünschte Formatierung des Bereiches "Schrift => Größe => Farbnummer => Gewicht => Kursiv" 
   ' # ... => z.B. "Arial => 10 => 3 => Bold => kursiv " für Arial in Größe 10 in fetter roter Kursiv-Schrift 
   ' # ... => z.B. "Arial => 10 => 3 => Normal => kursiv " für Arial in Größe 10 in roter Kursiv-Schrift 
   '
   On Error GoTo GeneralError
   '
   Dim sFont As String
   Dim sSize As String
   Dim sColor As String
   Dim sWeight As String 
   Dim sItalic As String
   '
   Dim Range As Variant
   Dim vValue As Variant
   Dim i As Integer
   Dim sValue As String
   Dim sMsg As String
   '
   ' # Parsen der Übergabeparameter
   ' # ... Fontangaben
   If Instr( Cstr( vParam ) , "=>" ) > 0 Then
      vValue = Split( Trim(Cstr(vParam)) , "=>" )
      sFont =  Trim(Cstr(vValue(0))) 
      sSize =  Trim(Cstr(vValue(1))) 
      If Ubound( vValue ) > 1 Then sColor =  Trim(Cstr(vValue(2))) 
      If Ubound( vValue ) > 2 Then sWeight =  LCase( Trim(Cstr(vValue(3))))
      If Ubound( vValue ) > 3 Then sItalic =  LCase( Trim(Cstr(vValue(4)))) 
   Else
      sFont = Cstr( vParam )
   End If
   '
   ' # Formatieren des Bereiches
   If Trim(Cstr( vRange )) = "" Then
      xlSheet.Cells.Select
      Set Range = xl.Selection
   Else
      Set Range = xlSheet.Range( vRange  )
   End If
   If sFont <> "" Then Range.Font.Name = sFont
   If sSize <> "" Then Range.Font.Size = Cdbl( sSize )
   If sColor <> "" Then Range.Font.ColorIndex = Cdbl( sColor ) 
   If sWeight <> "" Then 
      If sWeight = "bold" Or sWeight = "fett" Then Range.Font.Bold = True
      If sWeight = "normal" Then Range.Font.Bold = False
   End If
   If sItalic <> "" Then 
      If sItalic = "italic" Or sItalic = "kursiv" Then Range.Font.Italic = True
      If sItalic = "normal" Then Range.Font.Italic = False
   End If
   '
   If Trim( Cstr( vRange ) ) = "" Then xlSheet.Range( "A1" ).Select    
  '
WayOut:
   Exit Function
GeneralError:
    xl.Visible = False
    sMsg =  "Fehler (Nr. " & err & ") in Zeile " & Erl & ": " & Error
    sMsg = sMsg & Chr(10) & Chr(10)
    sMsg = sMsg & "Parameter: " & Chr(10)
    sMsg = sMsg & "Bereich = " & Cstr( vRange ) & Chr(10)
    sMsg = sMsg & "Angaben = " & Cstr( vParam ) & Chr(10)
    sMsg = sMsg & "Schriftart = " & Cstr( sFont ) & Chr(10)
    sMsg = sMsg & "Schriftgröße = " & Cstr( sSize ) & Chr(10)
    sMsg = sMsg & "Schriftfarbe = " & Cstr( sColor ) & Chr(10)
    If Err = 213 And Error = "OLE: Automation object error" Then
       sMsg = sMsg & Chr(10) & Chr(10)
       sMsg = sMsg & "Hinweis: " & Chr(10) & "MS Excel meldet einen generellen Fehler." & Chr(10)
       sMsg = sMsg & "Überprüfen sie die Angaben des Bereiches. Sie dürfen nur maximal einen Doppelpunkt enthalten, "
       sMsg = sMsg & "Zeilen- und Reihenangaben müssen plausibel sein." & Chr(10)
       sMsg = sMsg & ""
    End If
    MsgBox sMsg  , 16 ,  "Fehler in Funktion xlFormatFont()"
    xl.Visible = True
    Resume Next
End Function
« Letzte Änderung: 05.02.08 - 07:45:00 von ata »
Grüßle Toni :)

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Function xlSetCell( ... )
« Antwort #21 am: 31.01.08 - 15:17:58 »
... dynamische Funktion zum Beschreiben von Excel-Zellen.

Ein Aufruf kann wie folgt aussehen:
' # Zeile 2, Spalte 1, Erstellungsdatum des Dokumentes im Format "dd.mm.yyyy hh:nn"
Call xlSetCell( xl , xlSheet , 2 , 1 , doc.Created , "TT.MM.JJJJ hh:mm" )

' # Zeile 2, Spalte 2, angenommene Postleitzahl als Text in die Zelle schreiben - um führende Nullen nicht zu verlieren
Call xlSetCell( xl , xlSheet , 2 , 2 , doc.PLZ(0) , "@" )

' # Zeile 2, Spalte 3 , Formel für den Inhalt => A2 + ", " + B2
row = 2
Call xlSetCell( xl , xlSheet , row , 3 , {=VERKETTEN(A} & row & {;", ";B} & row &{)}  , "" ) ' # Formelsprache beachten...


Hinweis:
Es gibt für Excel auch einen Parameter, mit dem man die Formelsprache für englische Formelsprache erzwingen kann - dann dürfen aber nur noch solche verwendet werden. Notwendig wird dies, wenn unterschiedliche Excel-Versionen und Ländereinstellungen vorliegen.

Der Parameter wird später nachgereicht - bin noch am suchen  :P

Zitat
Function xlSetCell( xl As Variant , xlSheet As Variant , row As Long , column As Variant , vValues As Variant , sDataFormat As String ) As Variant
   ' # Einen Wert oder eine Formel in eine Zelle schreiben unter Berücksichtigung eines speziellen Formates.
   ' # xl => Variant => die Excel-Anwendung
   ' # xlSheet => Variant => das Excel-Arbeitsblatt
   ' # row => Zahl => die Zeilennummer
   ' # column => Zahl => die Spaltennummer
   ' # vValue => Text-Array oder TextString => die eigentlichen Werte. Bei einem Array werden alle Elemente mit einem LineFeed (Chr(10)) als Textstring verkettet.
   ' # ... beginnt der Textstring mit einem Gleichheitszeichen, dann wird der String als Formel in die Zelle geschrieben.
   ' # ... bei Formeln muß beachtet werden, daß es bei unterschiedlichen Excel-Versionen zu Abweichungen in der Syntax kommen kann.
   ' # ... die engliche Formlsprache ist vorzuziehen
   ' # sDataFormat => Text-String => das zu verwendende Zell-Format. Bei Leerstring findet keine Formatierung statt.
   ' # ... ACHTUNG: Hier gibt es je nach Länder- und Excel-Version unterschiedliche Formtierungsparameter - gilt für vor allem für Zahlen und Datums-/Zeitformatierungen
   ' # ... "@" => Zelle wird explicit als Text formatiert
   ' # ... "#.##0,00" => Zelle wird als Zahl mit 2 Nachkomma-Stellen und möglichem Tausender-Trennzeichen "." formatiert
   ' # ... "TT.MM.JJJJ hh:mm:ss" => Zelle wird als Datums-/Zeit-Wert formatiert, hier z.B. "31.01.2008 13:54:00" => deutsche Excel-Version 2003
   '
   Dim i As Integer
   Dim sValue As String
   Dim sMsg As String
   '
   On Error GoTo GeneralError
   '
   If IsArray( vValues ) Then
         For i = LBound( vValues ) To Ubound( vValues )
            sValue = sValue + vValues( i ) + Chr(10)
         Next
         sValue = Left( sValue , Len( sValue ) - 1 ) ' # letzten LF bereinigen
         xlSheet.Cells( row , column ).Value = sValue
   Else
      If Left( Cstr( vValues ) , 1 ) = "=" Then
         sValue = Cstr( vValues )
         xlSheet.Cells( row , column ).FormulaLocal = sValue
      Else
         If sDataFormat <> "" Then xlSheet.Cells( row , column ).NumberFormat = sDataFormat
         sValue = Cstr( vValues )
         xlSheet.Cells( row , column ).Value = vValues
      End If
   End If
   '
WayOut:
   Exit Function
GeneralError:
    xl.Visible = False
    sMsg =  "Fehler (Nr. " & err & ") in Zeile " & Erl & ": " & Error
    sMsg = sMsg & Chr(10) & Chr(10)
    sMsg = sMsg & "Parameter: " & Chr(10)
    sMsg = sMsg & "Zeile = " & Cstr( row ) & Chr(10)
    sMsg = sMsg & "Spalte = " & Cstr( column ) & Chr(10)
    sMsg = sMsg & "Werte = " & Cstr( sValue ) & Chr(10)
    sMsg = sMsg & "Format = " & Cstr( sDataFormat ) & Chr(10)
    If Error = "OLE: Automation object error" Then
       sMsg = sMsg & Chr(10) & Chr(10)
       sMsg = sMsg & "Hinweis: " & Chr(10) & "MS Excel meldet einen generellen Fehler." & Chr(10)
       sMsg = sMsg & "Überprüfen sie die oben angegebenen Parameter auf ihre Plausibilität." & Chr(10)
       sMsg = sMsg & ""
    End If
    MsgBox sMsg  , 16 ,  "Fehler in Funktion xlSetCell()"
    xl.Visible = True
    Resume Next
End Function
« Letzte Änderung: 05.02.08 - 07:58:50 von ata »
Grüßle Toni :)

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Function xlAutoFilter( ... )
« Antwort #22 am: 04.02.08 - 21:14:10 »
... aktivieren des Autofilters in einer bestimmten Zeile.

Ein Aufruf kann wie folgt aussehen:
' # 5. Zeile für den Autofilter aktivieren
Call xlAutoFilter( xlSheet , 5 )

Code
Function xlAutoFilter( xlSheet As Variant , row As Long ) As Variant
   ' # Setzt in der angegebenen Zeile den Autofilter
   ' # xlSheet => Variant => das Excel-Arbeitsblatt
   ' # row => Zahl => die Zeilennummer
   '
   xlSheet.Rows( row ).Select
   xl.Selection.AutoFilter
   '
End Function
« Letzte Änderung: 04.02.08 - 22:54:24 von ata »
Grüßle Toni :)

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.274
  • Geschlecht: Männlich
Re: COM-Schnittstelle MS Excel
« Antwort #23 am: 05.02.08 - 06:22:06 »
... meine Funktion zum hochzählen der Spalten, die habe ich in deiner Liste noch nicht gesehen oder machst du das anders ;)

Code
Function getNextColumn( column As String ) as string
      Dim fi$, la$
      If Len(column)>1 Then 
          fi=Left(column,1)
          la = Right(column, 1) 
      Else 
            la = column
      end if
      If Asc( la ) = 90 Then
            If fi<>"" Then
                  getNextColumn = Chr( Asc( fi  ) +1 )      + "A"
            Else
                  getNextColumn = "AA"
            End If
      Else
            getNextColumn = fi & Chr( Asc( la ) +1 )
      End If
End Function
Gruss Erik :: Freelancer :: Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16
--
Nur ein toter Bug, ist ein guter Bug!

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: COM-Schnittstelle MS Excel
« Antwort #24 am: 05.02.08 - 07:11:31 »
... es gibt ja bekanntlich immer viele Wege nach Rom - ich mach es über Evaluate, Permutation und ein Array - kommt noch im Laufe des Tages...


Toni
Grüßle Toni :)

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Function xlGetColumnNames( )
« Antwort #25 am: 05.02.08 - 08:54:38 »
... Funktion zum Ermitteln der Spaltennamen.  Die Funktion gibt ein Text-Array zurück. Erstes Element ist der Buchstabe "A"

Eine Verwendung kann wie folgt aussehen:
Dim vColName As Variant
vColName = xlGetColumnNames( )

Print "Die fünfte Spalte hat den Buchstaben " & vColName( 5 )



Code
Function xlGetColumnNames( ) As Variant
   ' # übergibt die möglichen 256 Excel-Spalten-Namen als Array
   Dim vCol As Variant
   Dim sDummy( 0 ) As String
   vCol = Evaluate( |vA := "A":"B":"C":"D":"E":"F":"G":"H":"I":"J":"K":"L":"M":"N":"O":"P":"Q":"R":"S":"T":"U":"V":"W":"X":"Y":"Z";@Subset(("" :vA) *+ vA;256)|)
   xlGetColumnNames = ArrayAppend( sDummy , vCol )
End Function
Grüßle Toni :)

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... Funktion zum Speichern einer Excel-Datei.

Eine Verwendung kann wie folgt aussehen:

Call xlSaveAs( xlWbk , "C:\Temp\demo.xls" )


Code
Function xlSaveAs( xlWbk As Variant , sFilePath As String ) As Variant
   If sFilePath <> "" Then Call xlWbk.SaveAs( sFilePath )
End Function
« Letzte Änderung: 22.01.09 - 12:03:05 von ata »
Grüßle Toni :)

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
Re: COM-Schnittstelle MS Excel
« Antwort #27 am: 07.07.08 - 22:41:26 »
Interessant dürfte auch die Funktion pagesetup sein:

Code
	'#######################
	'	Seiteneinstellungen
	'#######################
	With xl.ActiveSheet.PageSetup
		'Variablen
		'&A - Gesamtseitenzahl
		'&B - Blattname
		'&D - Datum
		'&I - Bild
		'&N - Dateiname
		'&P - Speicherort
		'&S - Seite
		'&U - Uhrzeit
		.Orientation = 2
		.LeftHeader = ""
		.CenterHeader = "&""Arial,Bold""&18"+db.Title
		.RightHeader = ""
		.LeftFooter = "&""Arial""&8&P-&N"
		.CenterFooter = "&""Arial""&8Seite &S von &A"
		.RightFooter = "&""Arial""&8&D - &U"
		.PrintArea = ("A1:H5")
		.PaperSize = 9
		.CenterHorizontally = True          
		.FitToPagesTall =False
		.zoom = False
		.FitToPagesWide=1 
		.PrintTitleRows=xl.Rows("1:1").Address
	End With

Was mir noch nicht gelingen will, ist der Zeilenumbruch innerhalb eines Feldes, z.B. CenterFooter, aber wahrscheinlich bin ich nur zu müde.

Der Excel-Makrorekorder nimmt chr(10), gebe ich das aus LN mit, kommt es als Text an.

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: COM-Schnittstelle MS Excel
« Antwort #28 am: 08.07.08 - 08:40:24 »
... danke - ich schau mir das die Tage mal an und werde es mit einbauen...

Toni
Grüßle Toni :)

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: COM-Schnittstelle MS Excel
« Antwort #29 am: 27.04.10 - 16:35:57 »
Habe die ganzen Funktionen mal in einer Klasse zusammengefasst. Hoffe ich kann damit jemanden Weiterhelfen und ich hoffe ich gewinne das Fleisskärtchen.

Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: COM-Schnittstelle MS Excel
« Antwort #30 am: 27.04.10 - 18:59:10 »
Erstmal vielen Dank für deine Mühen. Ich werde mir das bei Gelegenheit mal genauer anschauen. Überflugmäßig sieht's ganz gut aus.

Ich hoffe, dass ich irgendwann mal die Zeit finde mal ein BP-Artikel draus zumachen.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Fedaykin

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • Geschlecht: Männlich
  • Ya Hya Chouhada!
Re: COM-Schnittstelle MS Excel
« Antwort #31 am: 22.06.10 - 11:52:46 »
Hallo zusammen

Wäre besser Select zu vermeiden (nur verwenden wo wirklich was angesprungen werden muss). Vorteile sind dabei es wird schneller und nerviges rumgehüpfe verschwindet.

Zum Beispiel besser so:
Code
With objSheet.Cells
   .Columns.AutoFit
   .Rows.AutoFit
End With

Als:
Code
objSheet.Cells.Select
Selection.Columns.AutoFit
Selection.Rows.AutoFit

Gruss
Remo
Ich sage Euch: "Man muss noch Chaos in sich haben, um einen tanzenden Stern gebären zu können."

Offline Performance

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.096
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
Details bei einer Gruppierung verstecken
« Antwort #32 am: 18.10.11 - 13:17:34 »

die Funktion in Excel "ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1"
kann ich aus Notes nicht übergeben, bzw. ich habe googleweit nichts gefunden.

ich habs dann über "hide" gemacht, nicht ganz elegant aber es funktioniert
z.B:

Excel.Range("A1:E1").Select
With Excel.application.Selection
   .Columns.Group
   .Columns.Hidden = True
End With


cu
Wir können alles außer hochdeutsch !

Alles ist möglich, es ist nur eine Frage der Zeit oder des Geldes!

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: COM-Schnittstelle MS Excel
« Antwort #33 am: 18.10.11 - 16:53:49 »
... mal kurz ins blaue - um auf Remo's Anregung einzugehen - hast du es auch ohne Selection versucht?

Also ungefähr so:

With Excel.Range("A1:E1")
   .Columns.Group
   .Columns.Hidden = True
End With

Das müsste besser sein für die Performance...
Grüßle Toni :)

Offline Performance

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.096
  • Geschlecht: Männlich
  • I love YaBB 1G - SP1!
Re: COM-Schnittstelle MS Excel
« Antwort #34 am: 20.10.11 - 13:25:11 »
aus dem blauen  ;D

ohne selection geht es ..... ???  , perfomance spielt hier keine Rolle, hatte in altem Code ein Paar Änderungen vorgenommen

danke für den Tip

cu
Wir können alles außer hochdeutsch !

Alles ist möglich, es ist nur eine Frage der Zeit oder des Geldes!

Offline StefanP1962

  • Frischling
  • *
  • Beiträge: 23
  • Geschlecht: Männlich
Re: COM-Schnittstelle MS Excel
« Antwort #35 am: 06.05.13 - 16:44:08 »
Hab da noch was gefunden ...

Suchte nach einer Funktion, um die benannten Zellen (Einfügen - Name) in einer Exceltabelle auszulesen.

' Felder holen
   Set excelwb = objExcel.activeworkbook
   
   Forall nn In excelwb.Names
      
      Redim Preserve excelField( en ) As String
      excelField( en ) = nn.Name
      en = en + 1
      
   End Forall
   

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: COM-Schnittstelle MS Excel
« Antwort #36 am: 06.05.13 - 17:07:20 »
... danke für die Routine - werde ich mal nach dem obigen Muster einarbeiten. Hatte ich bislang noch nicht benötigt - aber man weiß ja nie ;)

Toni
« Letzte Änderung: 06.05.13 - 18:15:32 von ata »
Grüßle Toni :)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz