3.6k Aufrufe
Gefragt in Tabellenkalkulation von ahorn38 Experte (3.2k Punkte)
Hallo,

in einem Code möchte ich mit cal.....
ein Unterprogramm ausführen. Dabei brauche ich eine Variable, der ich im Hauptprogramm bereits einen Wert zugewiesen haben. Beim einfachen Aufrufen des Unterprogramms geht diese Variable aus dem Hauptprogramm leider "verloren". Gibt es eine Möglichkeit, den Variablenwert irgendwie mit zu übernehmen??
Danke und Gruß

10 Antworten

0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Andreas,

meinst Du sowas?

Option Explicit
Dim strText As String

Sub test()
strText = "Andreas"
Range("A1") = strText
Call test2
End Sub

Sub test2()
MsgBox strText
End Sub


Gruß
Rainer
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo Rainer
ja, genau das meine ich.
mir fehlte aber die Zeile

Option Explicit

Ich hatte den Code so nicht, weiß jetzt aber wie es geht. Wie immer...DANKE!!
Ich wünsche dir noch einen schönen Abend!
Gruß Andreas
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo Rainer,

dein Tipp funktioniert aber ich habe ein Problem, wenn ich das übernehmen will. Wenn ich die Befehlszeilen

Option Explicit
Dim strText As String
meinem Programm voranstelle werden sie trotzdem nicht im Programmlauf berücksichtigt. Weißt du woran das liegen kann?
Gruß
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Andreas,

eine Ferndiagnose kann ich dazu leider nicht stellen. da ich Deinen Code nicht kenne.

Gruß
Rainer
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo Rainer,,

hier ist mein Code.
Die Variable "monat" will ich im Code "Diagramm" weiter nutzen....

Option Explicit
Dim monat As Integer


Sub Zahlungen()
'
'Aktualisiert in der Zieldatei ausgewählte Datensätze aus einer "Veränderungsdatei"
Dim Veraend As String, sVer As Double
Dim monat As Integer
Dim monat1 As Integer, gesamt As Integer

gesamt = Columns(1).Find(what:="Gesamt", lookat:=xlWhole).Row


Veraend = Application.InputBox("Nr. eingeben: ", "Ein-/Auszahlungen Training")
monat = Application.InputBox("MonatsNr: ", "Ein-/Auszahlungen Training")
monat1 = (monat * 3) + 1

Cells(Cells(Rows.Count, monat * 3 + 1).End(xlUp).Row, monat * 3 + 1) = Format(Date, "DD.MM. ") & Veraend
Cells(Cells(Rows.Count, monat * 3 + 2).End(xlUp).Row + 1, monat * 3 + 2).Value = _
Application.WorksheetFunction.Sum(Range(Cells(5, monat * 3 + 2), Cells(gesamt - 1, monat * 3 + 2)))
Cells(Cells(Rows.Count, monat * 3 + 2).End(xlUp).Row, monat * 3 + 2).NumberFormat = ("#,##0.00 ")

Sheets("Zahlungen").Select
' Application.Calculation = xlCalculationManual
Dim rng As Range
Dim iRow As Integer
iRow = 3
Do Until IsEmpty(Cells(iRow, 1))
If Cells(iRow, 10) = Veraend And Cells(iRow, 8) <> "" Then
sVer = sVer + Cells(iRow, 7)
Set rng = Worksheets("Jahresabrechnung").Columns(1).Find( _
what:=Cells(iRow, 9), lookat:=xlWhole, LookIn:=xlValues)
If Not rng Is Nothing Then
If Cells(iRow, 7).Value + rng.Offset(0, monat1).Value > rng.Offset(0, monat1 - 1).Value And monat < 12 Then
rng.Offset(0, monat1 + 3).Value = Cells(iRow, 7).Value + rng.Offset(0, monat1).Value - rng.Offset(0, monat1 - 1).Value
rng.Offset(0, monat1).Value = rng.Offset(0, monat1 - 1)
Else
rng.Offset(0, monat1).Value = rng.Offset(0, monat1).Value + Cells(iRow, 7).Value
End If
If (rng.Offset(0, monat1 + 1).Value <> 0 Or rng.Offset(0, monat1 + 3) <> 0) And monat1 + 3 < 40 Then
rng.Offset(0, monat1).Font.ColorIndex = 46
End If
End If
End If
iRow = iRow + 1
Loop

' Übertragung des aktuellen Standes der Veränderungen in das Arbl
Sheets("Zahlungen").Select
Dim stand As String
ActiveSheet.Range("J" & Cells(Rows.Count, 10).End(xlUp).Row).Select
stand = Application.ActiveCell
Sheets("Jahresabrechnung").Select

Cells(Cells(Rows.Count, monat * 3 + 3).End(xlUp).Row, monat * 3 + 3) = sVer
Cells(Cells(Rows.Count, monat * 3 + 3).End(xlUp).Row, monat * 3 + 3).NumberFormat = ("#,##0.00 ")

Cells(4, monat1) = "Stand:" & stand
' Application.Calculation = xlCalculationAutomatic
Cells(50, monat1).Select
'Range("G" & Cells(Rows.Count, 1).End(xlUp).Row + 1).Select

Call Diagramm

End Sub


Sub Diagramm()

Dim gesamt As Double, ende As Integer
Application.ActiveSheet.ChartObjects.Delete

gesamt = Columns(1).Find(what:="Gesamt", lookat:=xlWhole).Row
Cells(Cells(Rows.Count, monat * 3 + 1).End(xlUp).Row + 1, monat * 3 + 1) = "OFFEN"
Cells(Cells(Rows.Count, monat * 3 + 3).End(xlUp).Row + 1, monat * 3 + 3) = -Cells(gesamt, monat * 3 + 3)



ende = Cells(Rows.Count, monat * 3 + 1).End(xlUp).Row

Dim chrDiagramm As ChartObject


ActiveSheet.Shapes.AddChart.Select
ActiveSheet.ChartObjects(1).Top = Range("AQ183").Top
ActiveSheet.ChartObjects(1).Left = Range("AQ183").Left

ActiveChart.SetSourceData Source:=Union(Range("AK196:AK" & ende), Range("AM196:AM" & ende))
ActiveChart.ChartType = xlColumnStacked
ActiveChart.PlotBy = xlRows
'ActiveChart.PlotArea.Select

For Each chrDiagramm In ActiveSheet.ChartObjects
chrDiagramm.Width = 250
chrDiagramm.Height = 140
Next

Range("AQ180").Select

End Sub
0 Punkte
Beantwortet von kauz Mitglied (291 Punkte)
Hallo,
mal ganz allgemein:
Eine Variable, die im gesamten Projekt verwendbar sein soll, kann man
in einem Modul als:
Public strText As String
deklarieren.

Ob Public auch an anderer Stelle funktioniert weiß ich nicht.
Hab das immer nur in einem Modul benutzt - weil übersichtlicher, wenn
Public-Variablen nur an einer Stelle deklariert wird.

Gruß
Andreas
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
...danke, ich probier's gleich einmal aus.
Gruß Andreas
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Andreas!

Du kannst beim Call-Aufruf die Variable ohne Problem mit übergeben. Nachfolgend mal ein Beispiel, wie das geht.

Option Explicit

Sub test()
Dim strText As String

strText = "Andreas"
Range("A1") = strText

'Beim Call-Aufruf wird in Klammern die Variable(en) eingetragen, _
die übergeben werden soll. Bei mehreren Variablen sind diese _
durch ein Komma zu trennen, also z.B. "strText1, strText2, strText3"
Call test2(strText)
End Sub

Sub test2(strText As String)
'Die Variable muss in der Sub-Anweisung in der Klammer eingetragen _
und deklariert werden. Bei mehreren Variablen sind diese _
durch ein Komma zu trennen, also z.B. "strText1 as String, _
strText2 as String, strText3 as String"
MsgBox strText
End Sub


Alle weiteren Erklärungen findest Du in den beiden Makros als auskommentierter Text. Füge einfach mal das Beispiel in eine Exceldatei ein.

Von der Deklaration „Public“ würde ich eher abraten, da es damit bei größeren Dateien mit viel VBA-Code zu Problemen mit der Performance oder auch, wird die Variable an einer Stelle benutzt, wo man nicht mehr daran denkt, dass diese mit Public deklariert wurde, einen anderen Wert, weil irgendwo anders die Variable beschrieben wurde, haben kann als den Wert, den man erwartet.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Andreas.

sorry, für meine Falschmeldung.
Du siehst, ich bin kein VBA-Spezialist und eher auf Formeln ausgerichtet.

Dennoch würde ich Dir ans Herz legen, beim Posten von Code auch das dafür vorgesehene HTML-Tag "Code" (oberhalb des Antwortfensters) zu verwenden.
Damit wird auch die Struktur des Codes besser deutlich, weil auch die Einrückungen mit rüber gebracht werden.

Außerdem solltest Du, in eigenen Interesse die Variablendeclaration etwas übersichtlicher gestalten,

anstatt
Dim Veraend As String, sVer As Double
Dim monat As Integer
Dim monat1 As Integer, gesamt As Integer

so
Dim strVeraend As String, dblSver As Double
Dim imtMonat As Integer
Dim intMonat1 As Integer, intGesamt As Integer

Damit erkennt man in längeren Codes immer sofort um welchen Variablentyp es sich handelt.
Außerdem solltest Du Dir zur Pflicht machen, als erste Zeile im Codemodul den Befehl "Option Explicit" zu verwenden.

Da Du nun schon zwei weitere Antworten erhalten hast, die sicher zum Ziel führen, erspare ich mir weitere Tests mit Deinem Code.
Ich würde den Vorschlag von Oliver favorisieren, aber den Code, entsprechend des Vorschlages von @Kauz, in ein Allgemeines Modul schreiben.

Gruß
Rainer
0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo,

hallo Rainer, nicht nur deine Formeln, auch deine Tipps zu den Codes haben mir immer geholfen!!!!
Danke euch allen für die sehr hilfreichen und kompetenten Hinweise/Vorschläge!!!!!!!
Gruß Andreas
...