VBA Code in VB anwenden /umwandeln

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    VBA Code in VB anwenden /umwandeln

    Hallo zusammen,

    ich habe folgenden Code in VBA erstellt:

    Quellcode

    1. Dim objDic As Object
    2. Dim vntTmp As Object
    3. Dim vntOut
    4. Dim vntErg
    5. Dim j As Integer
    6. Dim k As Integer
    7. Dim dE#, dM#, dQ#, dV#
    8. objDic = CreateObject("Scripting.Dictionary")
    9. vntTmp = xlWorkSheetNew.Range("A1:O" & LZeile)
    10. ReDim Preserve vntTmp(1 To UBound(vntTmp, 1), 1 To UBound(vntTmp, 2) + 1)
    11. Stop
    12. i = LBound(vntTmp, 1) 'test
    13. Dim ii = UBound(vntTmp, 1) 'test
    14. ' im Dictionary Unikate aus Zusammengefassten Spalten als key und die Zeilennr als Item sammeln
    15. For i = LBound(vntTmp, 1) To UBound(vntTmp, 1)
    16. vntTmp(i, 16) = vntTmp(i, 3) & "#" & vntTmp(i, 6)
    17. If objDic.Contains(vntTmp(i, 16)) Then
    18. objDic(vntTmp(i, 16)) = objDic(vntTmp(i, 16)) & "," & i
    19. Else
    20. objDic.Add(vntTmp(i, 16), i)
    21. End If
    22. Next
    23. ReDim vntErg(0 To objDic.Count, 0 To 15)
    24. vntOut = objDic.Items
    25. For i = 1 To UBound(vntOut)
    26. For j = 0 To UBound(Split(vntOut(i), ","))
    27. dE = dE + vntTmp(Split(vntOut(i), ",")(j), 15) 'Betrag
    28. dM = dM + vntTmp(Split(vntOut(i), ",")(j), 10) 'Gewicht
    29. dQ = dQ + vntTmp(Split(vntOut(i), ",")(j), 8) 'Menge
    30. dV = dV + vntTmp(Split(vntOut(i), ",")(j), 14) 'Fracht
    31. Next
    32. For k = 0 To 15
    33. vntErg(0, k) = vntTmp(1, k + 1)
    34. vntErg(i, k) = vntTmp(Split(vntOut(i), ",")(0), k + 1)
    35. vntErg(i, 14) = dE
    36. vntErg(i, 9) = dM
    37. vntErg(i, 7) = dQ
    38. vntErg(i, 13) = dV
    39. Next
    40. dE = 0
    41. dM = 0
    42. dQ = 0
    43. dV = 0
    44. Next
    45. xlWorkSheetZusammengefasst.Cells(1, 1).Resize(UBound(vntErg, 1), UBound(vntErg, 2)) = vntErg


    Jetzt möchte ich diesen Code in VB einfügen und ausführen können, VB greift dazu auf ein Excel Blatt zurück, was auch ohne Probleme funktioniert.

    Ich bekomme immer in der Zeile:

    Quellcode

    1. ReDim Preserve vntTmp(1 To UBound(vntTmp, 1), 1 To UBound(vntTmp, 2) + 1)

    Eine Fehlermeldung:

    Ein Ausnahmefehler des Typs "System.InvalidCastException" ist in Intrastat.exe aufgetreten.

    Zusätzliche Informationen: Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Klassentyp "System.Array" umgewandelt werden. Instanzen von Typen, die COM-Komponenten repräsentieren, können nicht in andere Typen umgewandelt werden, die keine COM-Komponenten repräsentieren. Eine Umwandlung in Schnittstellen ist jedoch möglich, sofern die zugrunde liegende COM-Komponente QueryInterface-Aufrufe für die IID der Schnittstelle unterstützt.


    Kann mir hierbei jemand helfen?

    Gruß
    Nils,

    Nils89 schrieb:

    Kann mir hierbei jemand helfen?
    Übertragen, nicht aber übersetzen.
    Du schreibst sonst VB6-Ranz.
    Fang an mit Option Strict On, deklariere alle Variablen explizit als genau das, was sie auch tatsächlich sind.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Nils89 schrieb:

    komm die Fehlermeldung
    Die eine?
    Mehrere?
    Neue?
    Was ist ein

    Nils89 schrieb:

    CreateObject("Scripting.Dictionary")
    :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Immer noch die selbe wie ob in der Selben Zeile:
    Die Zeile sieht jetzt aber so aus:

    Quellcode

    1. ReDim Preserve vntTmp(0 To UBound(CType(vntTmp, Array), 1)), vntTmp(0 To UBound(CType(vntTmp, Array), 2) + 1)


    Hier Sammel ich alle Zeilen und prüfe ob diese doppelt sind oder Unikate sind, wenn diese doppelt sind werden später bestimmte Werte zusammen gerechnet
    @Nils89 Wenn Du was mit Excel machst, steig erst mal auf VB.NET um, such Dir hier ein paar Beispiele raus, wo Excel gelesen und geschrieben wird, dann, wenn Du das verstanden hast, übertrage Dein Problem.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Was ist ein
    CreateObject("Scripting.Dictionary")
    Erzeugt ein Objekt, das sich in .Net mit Dictionary(Of TKey, TValue) abbilden lässt.
    Oder auch als List(Of KeyValuePair(Of TKey, TValue))

    @Nils89
    Dein Code ist schon in VBA (bzw. dessen .Net-Portierung) schon nicht besonders transparent geschrieben.
    Versuche das Grundproblem zu verstehen und mit .Net-Mitteln umzusetzen.
    Da gibt es elegantere Speicherobjekte als Arrays, die dennoch am Schluss zum Kopieren in einen Excel-Range ganz einfach in ein Array umgewandelt werden können (Stichwort .ToArray)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --