VBA in VB Umschreiben

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Alex73.

    VBA in VB Umschreiben

    Hallo,

    ich habe hier einen Code der 14 Zellen mit Daten mit hilfe einer Schleife füllt.
    Nun würde ich das aber auch gerne in VB umschreiben.
    Also erstmal ein gesammt Array (zweidimensional) erstellen wie schon in VBA vorhanden. Und dann mit einer Variablen die einzelnen Zellen (14) in ein eindimensionales Array füllen.
    Kann mir da einer helfen?

    Gruß

    Alex

    Hier der VBA Code:

    For i = 1 To TotCols 'Zellenanzahl
    RowOffset = 0
    For k = 1 To dwLength 'Zeilenanzahl
    Cells(1 + k, 9 + i).FormulaR1C1 = OutputData(RowOffset + i) 'Cells(1 + k, 7 + i) Array ab der 7.Zelle füllen

    RowOffset = RowOffset + TotCols
    Next k
    Next i
    Welches VB? 6.0 oder .Net
    Was Du auf jeden Fall machen musst, Excel als Object anlegen, die Excel-Application, -Datei und -Tabelle als Variablen deklarieren und füllen und anschließend kannst Du dann die Zellen innerhalb deiner Tabellenvariable ansprechen.

    Meines Erachtens solltest Du Dich mal intensiv mit dem richtigen Deklarieren von Variablen und dem für den Teil deiner Programmierung notwedigen Objekt-Modellen auseinander setzen.
    Was schreibst Du denn in deine Zelle? Eine Formel oder einen Wert? Hier wird das Object-Modell nicht sauber verstanden.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hallo INOPIAE,

    mein Wunsch wäre es den Code in VB6 umzuschreiben.
    Das war übrigens nur ein Teil des Codes.
    Wie gesagt. Das Mokro läuft, nur hätte ich gerne in VB6, dass ich mir einer Variablen ein eindimensionals Array aus dem OutputData Array füllen kann.

    Hier der ganze code:


    Declare Function WAV Lib "JRS_32.dll" ( _
    ByRef daData As Double, _
    ByRef pdOut As Double, _
    ByVal dwLength As Long, _
    ByVal dwNMIndex As Long, _
    ByVal iMode As Long) As Long

    Declare Function WAVCols Lib "JRS_32.dll" ( _
    ByVal dwNMIndex As Long, _
    ByVal iMode As Long) As Long

    Sub WAV_Test()

    Dim k As Long
    Dim i As Long
    Dim iResult As Long
    Dim dwLength As Long
    Dim dwNMIndex As Long
    Dim TotCols As Long
    Dim OutCells As Long
    Dim RowOffset As Long
    Dim iMode As Long
    Dim calctype As Long



    ' iMode determines output type
    ' 1 standard
    ' 2 detrended
    ' 3 detrended/normalized

    Dim InputData() As Double
    Dim OutputData() As Double


    'disable automatic calculation
    calctype = Application.Calculation
    Application.Calculation = xlManual


    'Zählen der Input Daten
    Dim Anzahl As Long
    On Error Resume Next
    With ActiveSheet
    .Range("F1").Select
    Anzahl = Anzahl + .Columns("F").SpecialCells(xlCellTypeConstants, 23).count
    End With


    ReDim InputData(Anzahl - 1) 'Redimensionieren des InpuData Array


    dwLength = (Anzahl - 1) ' input has 199 elements
    dwNMIndex = 12 ' set INDEX = 12

    ' Read Data from spreadsheet into array
    ' Input data is in column 1

    For k = 1 To dwLength
    InputData(k) = Cells(k + 1, 3) ' Input befindet sich in Zelle 6 - Cells(k + 1, 6)
    Next k

    ' *** Create the standard mode output ***

    iMode = 3

    ' redimension output array to be large enough to contain
    ' Call WAV using pointers to first elements of arrays

    TotCols = WAVCols(dwNMIndex, iMode)
    OutCells = TotCols * dwLength
    ReDim OutputData(1 To OutCells) As Double
    iResult = WAV(InputData(1), OutputData(1), dwLength, dwNMIndex, iMode)

    '----- error codes ------
    ' 0 no error conditions met
    ' -1 problem with password/installation
    ' 10001 pointer to data NULL
    ' 10002 pointer to output memory NULL
    ' 10003 Mode parameter not between 1 and 3 inclusive
    ' 10004 N and M Index parameter outside min and max values
    ' 10005 not enough data rows for N and M Index
    ' 10006 N and M Index must be at least 10 if Mode is 2
    ' 10007 N and M Index must be at least 12 if Mode is 3

    If iResult <> 0 Then
    ' Post Error Message and HALT
    Call Error_handler(iResult, calctype)
    Else
    ' Show results in columns 5+ on spreadsheet

    For i = 1 To TotCols 'Zellenanzahl
    RowOffset = 0
    For k = 1 To dwLength 'Zeilenanzahl
    Cells(1 + k, 9 + i).FormulaR1C1 = OutputData(RowOffset + i) 'Cells(1 + k, 7 + i) Array ab der 7.Zelle füllen

    RowOffset = RowOffset + TotCols
    Next k
    Next i
    End If

    'enable automatic calculation

    Application.Calculation = calctype

    End Sub
    ' The following subroutine is a simple way to handle run-time errors that may occur
    ' It is good practice to handle each error type mentioned in the user manual.

    Private Sub Error_handler(ByVal error_code As Long, ByVal calctype As Long)
    Dim result As Long
    result = MsgBox("Error number " & Str(error_code) & " was returned by WAV.", , "WAV Error")
    Application.Calculation = calctype
    End ' this END command will halt execution of the VBA code.
    End Sub
    Ich habe auch schon nach dieser Möglichkeit gesucht und leider nur schlechte Nachrichten für dich.

    Es ist nicht möglich vollautomatisch deinen VBA code in VB umzuwandeln, du musst das Gesamte Projekt neu erstellen und den jeweiligen Code kopieren.

    Jetzt kommt der tricky part: VB erkennt nicht alle VBA Befehle, d.h. du musst einzelne Befehle die dir unterstrichen werden leider in VB umschreiben.

    Grüße
    Hallo manuelritter,

    bin schon dabei den VBA Code in VB6 umzuschreiben.
    Wo ich noch große Probleme hab ist die For-Schleife und da speziell das RowOffset.
    For i = 1 To TotCols 'Zellenanzahl
    RowOffset = 0
    For k = 1 To dwLength 'Zeilenanzahl
    Cells(1 + k, 9 + i).FormulaR1C1 = OutputData(RowOffset + i) 'Cells(1 + k, 7 + i) Array ab der 7.Zelle füllen

    RowOffset = RowOffset + TotCols
    Next k
    Next i


    Kannst Du mir die Schleife kurz erklären.
    Es muss doch möglich sein mit der gleichen Schleife ein VB6 Array zu füllen.
    Und dann mit noch einer Schleife die Werte abzugreifen.
    Ich auch die Excel-Tabelle zusenden falls jemand Interesse hat.

    Gruß
    Alex
    Hoffe das meintest du:
    schleife i
    Zähle von 1(i) bis Intwert TotCols
    erstelle string RowOffset und initialisiere 0

    schleife k
    Zähle von 1(k) bis Intwert dwLength
    Schreibe in Zelle Zeile 1+k, Spalte 9+i den Wert in Array OutputData an der Stelle von RowOffset + i

    erhöhe RowOffset um sich selber und TotCols
    wiederhole schleife k

    wiederhole schleife i

    erster durchlauf:
    i = 1
    TotCols = TotCols (kenne den wert nicht)
    RowOffset = 0
    k = 1
    dwLength = dwLength (kenne den wert nicht)
    Zelle Zeile 2, Spalte 10 (J)
    OutputData(1)
    RowOffset = 0+TotCols

    and so on ... ?

    Übrigens, Arrays beginnen ab 0, willst du das erste element nicht aus dem Array holen?
    Hallo,

    hab da noch ein Problem.
    Bin schon ein wenig weiter gekommen mit dem umschreiben.
    Zum überprüfen ob das Array auch wirklich gefüllt ist würde ich es gerne in eine ListBox oder so füllen.
    Kann mir da einer helfen wie das in meinem Fall geht?
    Überprüfen würde ich gerne das Ergebnis Array.


    Hier der Code:

    Option Explicit

    Public Function Calculate(cDaten As Object, Parameter As Variant, Ergebnis() As Single) As Boolean
    'Dieser Funktion zeigt exemplarisch, wie ein externer Indikator programmiert
    'werden kann. Sie berechnet den Swing-Index, wobei das Daily-Limit im
    '1. Parameter übergeben wird.
    '' Ab Version 3.2 von Investox kann cDaten auch als "KSEDataCollection" deklariert werden

    On Error GoTo FehlerAllgemein

    Dim i!
    Dim StartI&
    Dim EndI&
    Dim CloseDaten!()
    Dim Feld!()
    Dim InDaten!()

    On Error GoTo FehlerDaten

    Feld = cDaten(Parameter(1))

    StartI = LBound(Feld)
    EndI = UBound(Feld)

    If SetzeGrenzen(Feld, StartI, EndI) <> True Then
    Calculate = ErrNoData
    Exit Function
    End If

    ReDim InDaten(StartI To EndI)

    For i = StartI To EndI
    InDaten(i) = Feld(i)
    Ergebnis(i) = InDaten(i)
    Next i





    Calculate = True ' Berechnung OK

    Rücksprung:
    Exit Function

    FehlerAllgemein:
    '' Hier gflls. Fehlerbehandlung
    Calculate = ErrExternIndiFehler
    Resume Rücksprung

    FehlerDaten:
    Calculate = ErrNoData
    Resume Rücksprung

    FehlerParameter:
    Calculate = ErrInvalidParameter
    Resume Rücksprung

    End Function