Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Übergabe Variable ByVal ByRef
#1
Hallo liebe VBA-Gemeinde,

das heutige Problem bekomme ich nicht gelöst. Ich habe verschiedene Möglichkeiten probiert.

Ich habe in einer UserForm drei Buttons.
Abhängig vom Button, setze ich einen Wert auf True

Code:
Public weiterleiten As Boolean
Public interne_ablage As Boolean
Public ablage As Boolean

Private Sub cb1_Click()
    weiterleiten = True
    Call nachweis(weiterleiten)
End Sub

Private Sub cb2_Click()
    interne_ablage = True
    Call nachweis(interne_ablage)
End Sub

Private Sub cb3_Click()
    ablage = True
    Call nachweis(ablage)
End Sub

Den jeweiligen Werte möchte ich in das Folgemakro übergeben.

Code:
Sub nachweis(ByRef weiterleiten as Boolean, interne_ablage as Boolean, ablage as Boolean)

    ...

    ...

Beim Drücken des cb1 kommt die Fehlermeldung: Fehler beim Kompilieren: Argument ist nicht optional

Ich gehe davon aus, dass es an der Syntax im Folgemakro liegt.

Schreib ich nur den folgenden Code, gibt es kein Problem

Code:
Sub nachweis(ByRef weiterleiten as Boolean)

Ich habe auch ByVal ausprobiert.
Wer kann mir sagen, wo mein Fehler liegt?

Gruß

tmessers


Ich glaube ich habe meinen Fehler gefunden.
Ich übergebe dem Folgemakro drei Variablen, also muss ich im Startmakro auch drei
Variablen haben.
Wenn ich eine Variable auf True setze, muss ich im selben Makro die anderen Variablen
auf False setzen und alle Variablen übergeben.
Richtig?

Code:
Public weiterleiten As Boolean
Public interne_ablage As Boolean
Public ablage As Boolean

Private Sub cb1_Click()
    weiterleiten = True
    interne_ablage = False
    ablage = False
    Call nachweis(weiterleiten, interne_ablage, ablage)
End Sub
Antworten Top
#2
du kannst die beiden letzten variable als optional deklarieren. dann müssen sie nicht mit angegeben werden. 

Sub nachweis(ByRef weiterleiten as Boolean, optional interne_ablage as Boolean, optional ablage as Boolean)
[-] Folgende(r) 1 Nutzer sagt Danke an ralf_b für diesen Beitrag:
  • tmessers
Antworten Top
#3
Auch Hallo,

Public-Variablen sind nur in einem allgemeinen Modul erlaubt. Im Klassenmodul einer Userform verwendet man Dim oder noch besser Private. Wenn du eh globale bzw. Modulvariablen verwendest, warum übergibst Du sie noch als Parameter?
Gruß Stefan
Win 10 / Office 2016
Antworten Top
#4
@steffl: Ich werde mich mit Deinem Hinweis näher beschäftigen.
Antworten Top
#5
Zitat:Ich habe in einer UserForm drei Buttons.
Abhängig vom Button, setze ich einen Wert auf True

Dazu hat MS OptionButtons erfunden.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#6
(17.12.2020, 07:41)Steffl schrieb: Auch Hallo,

Public-Variablen sind nur in einem allgemeinen Modul erlaubt. Im Klassenmodul einer Userform verwendet man Dim oder noch besser Private. Wenn du eh globale bzw. Modulvariablen verwendest, warum übergibst Du sie noch als Parameter?
Auch Hallo,
das ist mit das Dümmste was ich jemals zu VBA gelesen habe - sorry.

Schreibe bitte nicht so einen Unsinn, bevor du dich nicht intensiv damit beschäftigt hast.
Am Ende glauben dir das noch ein paar Leute  Huh


Beschäftige dich mal mit Public Friend Private Dim und Konsorten.

Wenn Public nur in allgemeinen Modulen erlaubt wäre, haben die das in den anderen Modultypen nur aus Spaß implementiert?
Um dann die Polizei einzuschalten, wenn es nicht in einem allgemeinen Modul deklariert wird.

Hi,
du hast vieles schon mittlerweile erkannt.
Wenn man drei Argumente verlangt muss man auch 3 Argumente übergeben (außer die Argumente sind optional wie im Thread schon erwähnt)
Das hat nichts mit ByRef zu tun (übrigens sind alle Argumente in deinem Beispiel ByRef da dies in VBA der Default ist)

Guck auch mal hier:
https://www.online-excel.de/excel/singsel_vba.php?f=5
Gruß Jeanie
[-] Folgende(r) 1 Nutzer sagt Danke an Jeanie für diesen Beitrag:
  • tmessers
Antworten Top
#7
Hi

Zitat:das ist mit das Dümmste was ich jemals zu VBA gelesen habe - sorry.
Schreibe bitte nicht so einen Unsinn, bevor du dich nicht intensiv damit beschäftigt hast.

77

Oh je gleich so überzogen. Nicht damit beschäftigt, glaubst du doch selbst nicht.

Klar ist es erlaubt Public in allen Modulen zu verwenden. Nur wird es im Klassenmodul einer Userform oder im Blattmodul nicht den gewünschten Effekt der Modul übergreifenden Verfügbarkeit haben.



Gruß Elex
Antworten Top
#8
Danke Euch allen für Eure Antworten.
Ich habe wieder einiges gelernt.
Bis bald.
Antworten Top
#9
(18.12.2020, 09:58)Elex schrieb: Nur wird es im Klassenmodul einer Userform oder im Blattmodul nicht den gewünschten Effekt der Modul übergreifenden Verfügbarkeit haben.
Doch, nur anders 05
https://stackoverflow.com/questions/1595...a-in-forms


Zitat:Öffentliche Variablen können in allen Prozeduren des Projekts verwendet werden. Wenn eine öffentliche Variable in einem Standardmodul oder einem Klassenmodul deklariert wird, kann sie auch in allen Projekten verwendet werden, die auf das Projekt verweisen, in dem die öffentliche Variable deklariert wurde
https://docs.microsoft.com/de-de/office/...-variables


Was der TS mitnehmen sollte, dass es üblicherweise als  "bad practise" angesehen wird öffentliche Variablen zu verwenden.
Und vor allem braucht er öffentliche Variablen in seinem Beispiel überhaupt nicht ...
Antworten Top
#10
Moin und nur extrem wenig off topic:
Ehrlicherweise hab ich das so herum noch nie genutzt:

Klassenmodul Tabelle1
Option Explicit

Public MyString$

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Target
  If .Column = 1 Then MyString = .Text
End With
End Sub


Die Variable kann man jetzt so abrufen:

Allgemeines Modul:
Option Explicit

Sub Test()
MsgBox Tabelle1.MyString
End Sub

Ich kannte es bisher nur anders herum:
Manuelles Umbenennen eines Private-Ereignismakros in Public

Praktisches (jetzt aber off topic) Beispiel:
Ich arbeite gerne mit der Tastatur.
Es gibt ja die "Rechtsklick-Ersatz-Taste" rechts neben der Leertaste zwischen AltGr und Strg
Damit kann man ja (nach Selektion) das jeweilige Kontextmenue aufrufen.
Allerdings wird dadurch kein BeforeRightClick ausgelöst!

"Einfache" Lösung:
Arbeitsmappe:
Private Sub Workbook_Activate()
Application.OnKey "+{F10}", "RechtsKlickErsatz"
End Sub

Private Sub Workbook_Deactivate()
On Error Resume Next
Application.OnKey "+{F10}"
On Error GoTo 0
End Sub

allgemeines Modul:
Sub RechtsKlickErsatz()
Call Tabelle1.Worksheet_BeforeRightClick(ActiveCell, True)
End Sub

Tabelle1:
Public Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
MsgBox Target.Text
End Sub

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste