Drag und Drop aus VB.NET nach Excel

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Der flotte Johann.

    Drag und Drop aus VB.NET nach Excel

    Beim Drag und Drop eines Textobjektes aus meiner VB.NET Anwendung würde ich sehr gerne das Zellenformat- insbesondere das Format des Textes (oder Datum oder Zahlenformat) - "mitgeben".

    Wenn der Anwender dann eine Spalte mit einem Datum aus der VB.NET Anwendung nach Excel dragged wäre es gut, wenn diese direkt dort als Datum erscheint.
    Wenn der Anwender einen Betrag mit der Formatierung 1.234,56 EUR nach Excel zieht, dann sollte dies auch dort direkt so formatiert sein.

    Bisher sieht mein Code wie folgt aus:

    VB.NET-Quellcode

    1. Dim Data As New DataObject
    2. Data.SetText(cNoNull(Me.Value), TextDataFormat.Text)
    3. DoDragDrop(Data, DragDropEffects.Copy)


    Eine sehr schlechte Version habe ich hinbekommen, indem ich den formatierten Text (und/oder Datum) mit führenden Hochkomma übergebe.
    Dann schaut das zwar zuerst optisch gut ausd, aber der Zellinhalt in Excel ist -und bleibt- dann Text.
    Der Anwender kann dann keine Funktionen wie Summe etc. ausführen.

    Daher suche ich einen Weg das Format direkt mit zu übergeben.
    Das Format kann man IMHO nicht direkt übergeben.
    Was ich gefunden habe ist ein Umweg mit dem Worksheet_Change-Event in Excel. (Entweder mit zusätzlichem Addin oder Makro.)
    How to specify data types when dragging content to Excel
    Adding Drag-and-Drop Functionality using the .NET Framework and Visual Studio 2005 Tools for Office Second Edition

    Du übergibst deinen String mit einer eindeutigen Identifikation z.B. <DragDrop:Currency>1.25</Currency> und konvertierst diesen dann im Worksheet_Change-Event um.

    In der VB.NET Anwendung:

    VB.NET-Quellcode

    1. Private Sub Label_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Label.MouseDown
    2. '<DragDrop:Double>100</Double>
    3. '<DragDrop:String>Hello</String>
    4. '<DragDrop:Currency>1.25</Currency>
    5. '<DragDrop:Date>24.12.2022</Date>
    6. Dim data As New DataObject
    7. Dim textToExcel As String = "<DragDrop:Currency>1.25</Currency>"
    8. data.SetData(DataFormats.Text, textToExcel)
    9. DoDragDrop(data, DragDropEffects.Copy)
    10. End Sub

    In Excel:

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Dim NewText As String
    3. Dim c As Range
    4. For Each c In Target
    5. If InStr(1, c.Value, "<DragDrop:") = 1 Then
    6. NewText = Mid(c.Value, 11, Len(c.Value))
    7. Select Case True
    8. Case InStr(1, NewText, "String>") = 1
    9. NewText = Mid(NewText, InStr(1, NewText, ">") + 1, InStr(1, NewText, "</") - InStr(1, NewText, ">") - 1)
    10. c.Value = NewText
    11. c.NumberFormat = "@"
    12. Case InStr(1, NewText, "Currency>") = 1
    13. NewText = Mid(NewText, InStr(1, NewText, ">") + 1, InStr(1, NewText, "</") - InStr(1, NewText, ">") - 1)
    14. c.Value = NewText
    15. c.NumberFormat = "_-* #,##0.00 [$€-de-DE]_-;-* #,##0.00 [$€-de-DE]_-;_-* ""-""?? [$€-de-DE]_-;_-@_-"
    16. Case InStr(1, NewText, "Date>") = 1
    17. NewText = Mid(NewText, InStr(1, NewText, ">") + 1, InStr(1, NewText, "</") - InStr(1, NewText, ">") - 1)
    18. c.Value = NewText
    19. c.NumberFormat = "m/d/yyyy"
    20. Case InStr(1, NewText, "Double>") = 1
    21. NewText = Mid(NewText, InStr(1, NewText, ">") + 1, InStr(1, NewText, "</") - InStr(1, NewText, ">") - 1)
    22. c.Value = NewText
    23. c.NumberFormat = "0.00"
    24. Case Else
    25. End Select
    26. End If
    27. Next
    28. End Sub
    Ja, Danke, das wäre eine Notlösung.

    Wenn der Auslöser des DragDrop Vorgangs den Empfänger (das Ziel) des DragDrop Vorgangs mitgeteilt bekommt und erkennt, dass es sich um eine Excel Anwendung handelt, könnte die Absende Anwendung auch einen entsprechenden Sendkeys Anweisung zur Formatierung der Zelle senden.
    Ich werde mal versuchen da was hinzubekommen.