Rahmen in Excel-Zelle einfügen - Diagonale

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von dbx8.

    Rahmen in Excel-Zelle einfügen - Diagonale

    Hallo,

    ich möchte über vb.NET einen Rahmen in eine Excel-Zelle einfügen.
    Ich benötige aber lediglich den Diagonalen Rahmen innerhalb der Zelle!

    Den Rahmen um eine Zelle herum funktioniert schonmal so:

    VB.NET-Quellcode

    1. With xlSheet.Range("Y12").Borders
    2. .LineStyle = xlContinuous
    3. .ColorIndex = 0
    4. End With


    Was jetzt fehlt ist aber eben die Diagonale (DiagonalUp)

    Über Excel-VBA funktioniert es so:

    VB.NET-Quellcode

    1. Option Explicit
    2. Sub x()
    3. With Range("E4")
    4. .Borders(xlDiagonalDown).LineStyle = xlNone
    5. .Borders(xlDiagonalUp).LineStyle = xlContinuous
    6. End With
    7. End Sub

    Aber wie mach ich das in vb.NET ??

    Habe schon vieles probiert, hoffe mir kann hier jemand helfen!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dbx8“ ()

    Das hab ich schon so probiert, funktioniert aber leider nicht! In der Excel Datei tut sich da nichts.

    VB.NET-Quellcode

    1. With xlSheet.Range("Y13")
    2. .Borders(xlDiagonalDown).LineStyle = xlNone
    3. .Borders(xlDiagonalUp).LineStyle = xlContinuous
    4. End With
    Ich hoffe du hast "Option Strict On" und "Option Explicit" aktiviert ;)

    Allenfalls könnte es sein, dass du nicht merkst, wenn die xl-Konstanten nicht definiert ist.
    Es könnte durchaus sein, dass die im Interop.Excel-Modul leicht anders definiert werden.

    Wenn du die Werte im Debugger verfolgst, müssten folgende Werte gesetzt sein:
    xlNone = -4142
    xlContinuous = 1
    xlDiagonalDown = 5
    xlDiagonalUp = 6

    Falls du sie in den Interop-Definitionen nicht findest, kannst du sie auch hart codieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    "Option Explicit" ist aktiviert
    "Option Strict On" nicht, dabei kommen Fehlermeldungen:
    "Option Strict On" lässt keine impliziten Konvertierungen von String in Date zu.
    "Option Strict On" lässt keine impliziten Konvertierungen von String in Integer zu.
    "Option Strict On" lässt spätes Binden nicht zu.

    die xl - Variablen werden so definiert:
    Private Property xlNone As Object
    Private Property xlContinuous As Object
    Private Property xlDiagonalUp As Object
    Private Property xlDiagonalDown As Object


    Beim Debugging werden die Werte als Nothing angegeben bzw. es kommt gar nicht erst soweit. Bei Erreichen von "xlSheet.Range("Y13").Borders(xlDiagonalDown).LineStyle = xlNone" oder xlContinuous springt er zur Exception


    Ich weiss nicht ob das eine Rolle spielt, aber die "Imports Microsoft.Office.Interop.Excel" benutzte ich garnicht, da sie den Fehler ausgibt:
    "Warnung 1 Der in Imports "Microsoft.Office.Interop.Excel" angegebene Namespace oder Typ enthält keine öffentlichen Member oder kann nicht gefunden werden. Stellen Sie sicher, dass der Namespace oder der Typ definiert ist und mindestens einen öffentlichen Member enthält und dass der importierte Elementname keine weiteren Aliase enthält. "

    Alle anderen Excel Funktionen die ich nutze, wie auslesen und schreiben in Zellen oder Zellenformatierungen wie Farbhinterlegungen oder Schriftarten, etc. funktionieren ja einwandfrei... ;)

    dbx8 schrieb:

    "Option Strict On" nicht, dabei kommen Fehlermeldungen:
    "Option Strict On" lässt keine impliziten Konvertierungen von String in Date zu.
    "Option Strict On" lässt keine impliziten Konvertierungen von String in Integer zu.
    "Option Strict On" lässt spätes Binden nicht zu.
    Die ersten beiden Fehlermeldungen bekommst du durch saubere Programmierung weg.
    Das Late-Binding kannst du verhindern, indem du die Excel-Library richtig einbindest und Excel als Objekt instantiierst anstatt CreateObject zu verwenden.

    die xl - Variablen werden so definiert:
    Private Property xlNone As Object
    Private Property xlContinuous As Object
    Private Property xlDiagonalUp As Object
    Private Property xlDiagonalDown As Object


    Beim Debugging werden die Werte als Nothing angegeben
    Logisch. Was erwartest du, welchen Wert die Objects haben sollten, wenn du nichts angibst.
    Das sind Konstanten. In der Interop-DLL sind die vordefiniert.
    Wenn du Late Binding verwendest, dann definier sie von Hand auch als solche.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ok Vielen Dank schonmal!

    Das mit der "Imports Microsoft.Office.Interop.Excel" hab ich übrigens doch noch hinbekommen, indem ich da einen Verweis hingefügt habe.

    Aber wie mach ich das mit dem Late-Binding?

    Dim objExcel As New Microsoft.Office.Interop.Excel.Application
    Dim objBook As Microsoft.Office.Interop.Excel.Workbook
    Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet

    oder

    Dim objExcel As Object ?


    Und wie funktioniert das mit den anderen beiden Fehlermeldungen?

    habe z.B. Funktionen wie diese, die jetzt durch "Option Strict On" verhindert werden
    heute = System.DateTime.Now.ToString("dd.MM.yyyy")

    dbx8 schrieb:

    Dim objExcel As New Microsoft.Office.Interop.Excel.Application
    Dim objBook As Microsoft.Office.Interop.Excel.Workbook
    Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet
    Ja


    heute = System.DateTime.Now.ToString("dd.MM.yyyy")
    Definier "heute" als String
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,
    leider funktioniert es immernoch nicht den Diagonalen Rahmen in die Excelzelle zu bekommen!


    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Option Infer On
    4. Imports System
    5. Imports System.IO
    6. Imports System.Collections
    7. Imports Microsoft.Office.Interop.Excel
    8. Public Class Form1
    9. Private Property Excel As New Microsoft.Office.Interop.Excel.Application
    10. Private Property xlDiagonalUp As Object
    11. Private Property xlNone As Object
    12. Private Property xlDiagonalDown As Object
    13. Private Property xlContinuous As Object
    14. Private Property xlLineStyle As Object
    15. Sub Bericht()
    16. Dim objExcel As New Microsoft.Office.Interop.Excel.Application
    17. Dim objBook As Microsoft.Office.Interop.Excel.Workbook
    18. Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet
    19. objBook = objExcel.Workbooks.Open("C:\test\test1.xlsx")
    20. xlSheet = CType(objBook.Worksheets("Übersicht"), Worksheet)
    21. 'Rahmen um die Zelle herum einfügen
    22. With xlSheet.Range("C3").Borders
    23. .LineStyle = xlContinuous
    24. .ColorIndex = 0
    25. End With
    26. ' Diagonalen Rahmen einfügen
    27. xlSheet.Range("B5").Borders.Item(CType(xlDiagonalUp, Microsoft.Office.Interop.Excel.XlBordersIndex)).LineStyle = xlContinuous
    28. objBook.Close(True)
    29. objExcel.Quit()
    30. objBook = Nothing
    31. objExcel = Nothing
    32. GC.Collect()
    33. GC.WaitForFullGCComplete()
    34. End Sub
    35. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    36. Bericht()
    37. Me.Close() 'Form1 schließen
    38. End Sub
    39. End Class


    Es funktioniert alles, bis auf

    VB.NET-Quellcode

    1. xlSheet.Range("B5").Borders.Item(CType(xlDiagonalUp, Microsoft.Office.Interop.Excel.XlBordersIndex)).LineStyle = xlContinuous

    Hat jemand noch einen Idee?
    Hoffe, es bedarf kein weiteres Kommentar ...

    VB.NET-Quellcode

    1. Imports xls = Microsoft.Office.Interop.Excel
    2. Public Class TestForm
    3. Private Sub TestExcel()
    4. Dim xlApp As New xls.Application
    5. xlApp.Visible = True
    6. Dim xlWorkbook = xlApp.Workbooks.Open(IO.Path.Combine(IO.Path.GetTempPath, "test.xlsx"))
    7. Dim xlSheet = CType(xlWorkbook.Worksheets(1), xls.Worksheet)
    8. Dim startCell = CType(xlSheet.Range("A2"), xls.Range)
    9. For rowOffset = 0 To 10
    10. For colOffset = 0 To 5
    11. Dim currentCell = startCell.Offset(rowOffset, colOffset)
    12. If rowOffset Mod 2 = 0 Then
    13. currentCell.Borders(xls.XlBordersIndex.xlDiagonalDown).LineStyle = xls.XlLineStyle.xlContinuous
    14. Else
    15. currentCell.Borders(xls.XlBordersIndex.xlDiagonalUp).LineStyle = xls.XlLineStyle.xlContinuous
    16. End If
    17. Next
    18. Next
    19. End Sub
    20. Private Sub TestForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    21. Me.TestExcel()
    22. End Sub
    23. End Class

    dbx8 schrieb:

    ich denke es liegt an der Zuweisung
    Private Property xlDiagonalUp As Object = ???
    Habe ich doch schon in Post 6 geschrieben, dass die Definition als Property Blödsinn ist.
    Du brauchst sie nicht definieren, wenn du Interop-Excel verwendest.

    Schau dir das obige Beispiel von xtts02 an.
    So wird's gemacht.

    Ich hatte eigentlich Hoffnung, dass du es ohne C&P lernst, aber jetzt ist es schon so.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ah super Dankeschön!! Jetzt funktioniert! :)
    war aber am Ende gar nicht mehr soweit von entfernt, hatte nur einiges durcheinander gebracht - aber da muss man ja erstmal drauf kommen...

    falsch:

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop.Excel
    2. xlSheet.Range("B10").Borders.Item(CType(xlDiagonalUp, Microsoft.Office.Interop.Excel.XlBordersIndex)).LineStyle = xlContinuous


    richtig:

    VB.NET-Quellcode

    1. Imports xls = Microsoft.Office.Interop.Excel
    2. xlSheet.Range("B10").Borders(xls.XlBordersIndex.xlDiagonalUp).LineStyle = xls.XlLineStyle.xlContinuous



    Also Vielen Dank!!