AtNotes Übersicht Willkommen Gast. Bitte einloggen oder registrieren.
30.03.20 - 03:28:52
Übersicht Hilfe Regeln Glossar Suche Einloggen Registrieren
News:
Schnellsuche:
+  Das Notes Forum
|-+  Best Practices
| |-+  Diskussionen zu Best Practices (Moderatoren: Axel, MartinG, animate, koehlerbv)
| | |-+  COM-Schnittstelle MS Excel
« vorheriges nächstes »
Seiten: 1 [2] Nach unten Drucken
Autor Thema: COM-Schnittstelle MS Excel  (Gelesen 98348 mal)
ata
Freund des Hauses!
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 5092


drenaiondrufflos


WWW
« Antworten #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 » Gespeichert

Grüßle Toni Smiley
ata
Freund des Hauses!
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 5092


drenaiondrufflos


WWW
« Antworten #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  Tongue

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 » Gespeichert

Grüßle Toni Smiley
ata
Freund des Hauses!
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 5092


drenaiondrufflos


WWW
« Antworten #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 » Gespeichert

Grüßle Toni Smiley
jBubbleBoy
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1158



« Antworten #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 Wink

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
Gespeichert

Gruss Erik :: Freelancer :: Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.9
--
Nur ein toter Bug, ist ein guter Bug!
ata
Freund des Hauses!
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 5092


drenaiondrufflos


WWW
« Antworten #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
Gespeichert

Grüßle Toni Smiley
ata
Freund des Hauses!
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 5092


drenaiondrufflos


WWW
« Antworten #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
Gespeichert

Grüßle Toni Smiley
ata
Freund des Hauses!
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 5092


drenaiondrufflos


WWW
« Antworten #26 am: 06.06.08 - 12:09:57 »

... 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 » Gespeichert

Grüßle Toni Smiley
WildVirus
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 655



« Antworten #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.
Gespeichert
ata
Freund des Hauses!
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 5092


drenaiondrufflos


WWW
« Antworten #28 am: 08.07.08 - 08:40:24 »

... danke - ich schau mir das die Tage mal an und werde es mit einbauen...

Toni
Gespeichert

Grüßle Toni Smiley
bikerboy
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1154



« Antworten #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.

Gespeichert

Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"
Axel
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 8658


It's not a bug, it's Notes


« Antworten #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
Gespeichert

Ohne Computer wären wir noch lange nicht hinterm Mond!
Fedaykin
Aktives Mitglied
***
Offline Offline

Geschlecht: Männlich
Beiträge: 229


Ya Hya Chouhada!


« Antworten #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
Gespeichert

Ich sage Euch: "Man muss noch Chaos in sich haben, um einen tanzenden Stern gebären zu können."
Performance
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1096


I love YaBB 1G - SP1!


« Antworten #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
Gespeichert

Wir können alles außer hochdeutsch !

Alles ist möglich, es ist nur eine Frage der Zeit oder des Geldes!
ata
Freund des Hauses!
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 5092


drenaiondrufflos


WWW
« Antworten #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...
Gespeichert

Grüßle Toni Smiley
Performance
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 1096


I love YaBB 1G - SP1!


« Antworten #34 am: 20.10.11 - 13:25:11 »

aus dem blauen  Grin

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

danke für den Tip

cu
Gespeichert

Wir können alles außer hochdeutsch !

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

Geschlecht: Männlich
Beiträge: 23



« Antworten #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
   
Gespeichert
ata
Freund des Hauses!
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 5092


drenaiondrufflos


WWW
« Antworten #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 Wink

Toni
« Letzte Änderung: 06.05.13 - 18:15:32 von ata » Gespeichert

Grüßle Toni Smiley
Seiten: 1 [2] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS
Impressum Atnotes.de - Powered by Syslords Solutions - Datenschutz | Partner: