Anzeige
Archiv - Navigation
1540to1544
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Userform nach Schleife eingeben
08.02.2017 12:01:20
PS
Servus zusammen,
Ich habe mal wieder ein Problem und hoffe ihr könnt mir mal wieder helfen. Ich habe ein äußerst triviales Makro geschrieben, welches über eine Schleife nach bestimmten Werten (größer als 0 und Titel "Bonds") in einer Input Datei sucht und dann verschiedene Daten aus der Input Datei in ein anderes Tabellenblatt (Renten) einfügt. Grundlegend hat mein Makro funktioniert. Nun werden allerdings 2 neue Tabellenblätter statt dem alten Tabellenblatt (Renten) eingeführt. Die Zuordnung hierbei soll nun sozusagen über ein Userform-Formular abgefragt, im Sinne von ich klicke Renten EM an, dann soll es die Daten in das jeweilige Renten EM Tabellenblatt einfügen oder Renten HY, dann soll es die Daten in das Renten HY Tabellenblatt einfügen und das jeweils nur pro Treffer, soll also nach jedem Treffer passieren.
Mein Code sieht nun erstmal so aus:
Sub Renten_hinzu()
Dim TbI, TbRHY, TBRem, LetzteZeileI As Long, LetzteZeileRem, LetzteZeileRHY As Long
Dim x As Long, Wert, Wert2, NextRow As Long
Set TbI = Worksheets("Input")
Set TBRem = Worksheets("Renten EM")
Set TbRHY = Worksheets("Renten HY")
Set TbW = Worksheets("Input Währung")
Set LookupRange = Worksheets("Input Währung").Range("B3:C23")
LetzteZeileI = TbI.Cells(TbI.Rows.Count, 1).End(xlUp).Row
LetzteZeileRem = TBRem.Cells(TBRem.Rows.Count, 1).End(xlUp).Row
LetzteZeileRHY = TbRHY.Cells(TbRHY.Rows.Count, 1).End(xlUp).Row
For x = 2 To LetzteZeileI Step 1
Wert = TbI.Cells(x, 10).Value
Wert2 = TbI.Cells(x, 11).Value
If Wert = "BONDS" And Wert2 > 0 Then
UserForm1.Show
End If
Next x
End Sub Und für das UserForm1:
Private Sub BtnEM_Click()
Dim TbI, TbA, LetzteZeileI As Long, LetzteZeileR As Long
Dim x As Long, Wert, Wert2, NextRow As Long
Set TbI = Worksheets("Input")
Set TBRem = Worksheets("Renten EM")
Set TbRHY = Worksheets("Renten HY")
Set TbW = Worksheets("Input Währung")
Set LookupRange = Worksheets("Input Währung").Range("B3:C23")
LetzteZeileI = TbI.Cells(TbI.Rows.Count, 1).End(xlUp).Row
LetzteZeileRem = TBRem.Cells(TBRem.Rows.Count, 1).End(xlUp).Row
LetzteZeileRHY = TbRHY.Cells(TbRHY.Rows.Count, 1).End(xlUp).Row
TBRem.Cells(LetzteZeileRem + 1, 1).EntireRow.Insert
NextRow = TBRem.Cells(TBRem.Rows.Count, 1).End(xlUp).Row + 1
TbI.Cells(x, 3).Copy Destination:=TBRem.Cells(NextRow, 2)
' Die Eröffnung der Transaktion
TbI.Cells(x, 11).Copy Destination:=TBRem.Cells(NextRow, 5)
' Die Stückzahl wird eingetragen
TbI.Cells(x, 23).Copy Destination:=TBRem.Cells(NextRow, 10)
' Die Währung wird eingetragen
TbI.Cells(x, 13).Copy Destination:=TBRem.Cells(NextRow, 11)
' Der Einstandskurs wird eingetragen
TbI.Cells(x, 21).Copy Destination:=TBRem.Cells(NextRow, 12)
' Der FX-Einstandskurs wird übertragen
TbI.Cells(x, 7).Copy Destination:=TBRem.Cells(NextRow, 9)
' Der BloombergTicker wird eingetragen
TBRem.Cells(NextRow, 4).Value = "long"
' Gibt bei neuen Aktienkäufen immer den Wert "long" an
TBRem.Cells(NextRow, 3).Value = "offen"
' Gibt bei neuen Aktienkäufen immer den Wert "offen" an
TBRem.Cells(NextRow, 8).FormulaR1C1 = "=BDP(RC[1],R3C7)"
' Gibt die Formel bei GICS_Industry_Name ein
TBRem.Cells(NextRow, 13).FormulaR1C1 = "=BDP(RC[-4],R3C12])"
' Autofillt die Formel bei Last_Price
Range(TBRem.Cells(LetzteZeileRem, 15), TBRem.Cells(LetzteZeileRem + 1, 15)). _
FillDown
' Autofillt die +/-
Range(TBRem.Cells(LetzteZeileRem, 16), TBRem.Cells(LetzteZeileRem + 1, 16)). _
FillDown
' Autofillt die P/L in EUR
Range(TBRem.Cells(LetzteZeileR, 17), TBRem.Cells(LetzteZeileRem + 1, 17)).FillDown
' Autofillt die P/L in BP
TBRem.Cells(NextRow, 7).FormulaR1C1 = "=BPD(RC[2],""Name"")"
' Autofillt Wertpapier
TBRem.Cells(NextRow, 6).FormulaR1C1 = "=BDP(RC[3],""CPN"")/100"
' Autofillt Kupon
TBRem.Cells(NextRow, 14).FormulaR1C1 = "=VLookUp(RC10,'" & LookupRange.Worksheet. _
Name & "'!" & LookupRange.Address(1, 1, xlR1C1) & ",2,False)"
End Sub

Der Code für den Button Renten HY sieht ähnlich aus.
Das Problem ist nun, dass er mir den Laufzeitfehler 1004: Anwendungs-oder objektdefinierter Fehler in der ersten Copy Zeile. Ganz offensichtlich erkennt er das x im Userform nicht mehr an. Jetzt weiß ich nicht wie ich dem Code sagen kann, dass er das x aus dem vorherigen Code (also aus dem Modul) nehmen soll. Ich hoffe ihr könnt mir weiterhelfen. Tausend Dank!
PS: Ich weiß, dass der Code nicht optimal ist, aber war mein erster Versuch mal in die VBA-Welt einzusteigen. Ich wusste auch nicht wo die Deklarationen jetzt hin müssen, ob in das Modul oder in das UserForm.

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform nach Schleife eingeben
08.02.2017 13:24:22
Werner
Hallo,
etwas undurchsichtig für mich.
Du deklarierst Variablen ohne sie zu benutzen Wert, Wert2
Hier verwendest du die Variable x für die Zeilennummer. Du hast vorher x aber keinen Wert zugewiesen. x ist somit 0 und eine Zeile 0 gibt es nicht.
TbI.Cells(x, 3).Copy Destination:=TBRem.Cells(NextRow, 2)
Gruß Werner
AW: Userform nach Schleife eingeben
08.02.2017 13:58:02
PS
Genau das Ding ist, dass ich ein Makro geschrieben hatte, welches mir durch eine Schleife die Werte rausgesucht hatte (Wert = "Bonds" und Wert1 größer 0) die nach der Bedingung in das neue Sheet transportiert werden sollten. Nun habe ich aber 2 neue Sheets, bei der die Zuordnung der Werte, welche die Kriterien erfüllen, durch ein Userform stattfinden soll. Also es geht sozusagen das Sheet (Input) durch, findet einen Wert der kopiert werden soll und bevor er kopiert soll über ein Auswahlfenster ein Sheet ausgewählt werden (Renten HY oder Renten EM). Danach soll er die gefundenen Werte in das ausgewählte Sheet kopieren. Ich weiß jetzt aber nicht, wie das Userform am besten implementiert wird. Ich hatte 2 Buttons erstellt und hinter den einen Button, den obigen Code geschrieben. Jetzt erkennt er das x, aus dem vorherigen Makro allerdings nicht mehr und ich weiß nicht wie ich ihm sagen soll, dass er das x (für die Reihe) aus dem vorherigen Makro nutzen soll.
Anzeige
AW: Userform nach Schleife eingeben
08.02.2017 14:55:55
Werner
Hallo,
Dann mußt du x in einem allgemeinen Modul außerhalb der Prozedur, also noch vor deinem Modulkopf als Public deklarieren.
Public x AS Long
Die Deklaration von x muss dann natürlich aus den anderen Codes raus.
Gruß Werner
AW: Userform nach Schleife eingeben
08.02.2017 15:24:08
PS
Sorry, das verstehe ich nicht ganz. Heißt das ich muss es im vorderen Modul, also das aufgeführte definieren? Oder muss ich ein komplett neues Sub eröffnen mit der Deklaration? Und falls ich das schaffe, reicht die Deklaration als Public x as Long um im Userform auf den Wert des x aus dem vorherigen Code zurückzugreifen? (Tut mir Leid, bei mir sind echt nicht viel VBA Kenntnisse vorhanden)
Anzeige
AW: Userform nach Schleife eingeben
08.02.2017 19:39:39
onur
Hi PS,
Du solltest dir mal ein Buch über VBA kaufen und mal lesen.
Tabellenblätter haben Codes.
Userforms habe Codes.
Diese gelten NUR für die jeweiligen Tabellenblätter bzw Userforms.
Wenn Du Makros oder Variable brauchst, die du in jedem Blatt bzw Userform abrufen wilst, müssen Diese in einem MODUL (etwas GANZ ANDERES) stehen und Public deklarieren sein.
Gruß
Onur

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige