Clever-Excel-Forum

Normale Version: Übergabe Variable ByVal ByRef
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
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
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)
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?
@steffl: Ich werde mich mit Deinem Hinweis näher beschäftigen.
Zitat:Ich habe in einer UserForm drei Buttons.
Abhängig vom Button, setze ich einen Wert auf True

Dazu hat MS OptionButtons erfunden.
(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
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
Danke Euch allen für Eure Antworten.
Ich habe wieder einiges gelernt.
Bis bald.
(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 ...
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
Seiten: 1 2