Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1356to1360
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
Inhaltsverzeichnis

Argumenttyp ByRef unverträglich

Argumenttyp ByRef unverträglich
06.05.2014 11:53:15
Peter
Guten Tag
Beim Verlassen des Worksheets will ich mir gewisse Bereiche definieren.
Dabei soll die erste und letzte Zeile dem Range ("_F_KFIBU") entsprechen.
Diese Zeilennummern frage ich nachstehend ab. lngFirstRow wird die Zahl 7, lngLastRow wird die Zahl 362 zugewiesen.
Wenn ich dann weiter unten in der Funktion CreateBereich2222 die Zahl 7 durch die Varible lngFirstRow, resp. die Zahl 362 durch die Variable lngLastRow ersetze, erhalte ich die Fehlermeldung "Fehler beim Kompilieren: Argumenttyp ByRef unverträglich".
Ich verstehe nicht, was hier nicht in Ordnung ist.
Gruss, Peter
Private Sub Worksheet_Deactivate()
Dim lngFirstRow As Integer, lngLastRow As Integer, rCell As Range, lngColumn As Integer
'''erste Zeile anhand Range("_FKFIBU") bestimmen
With Me.Range("_F_KFIBU")
lngFirstRow = .Row
End With
'''letzte Zeile anhand Range("_FKFIBU") bestimmen
With Me.Range("_F_KFIBU")
lngLastRow = .Row + .Rows.Count - 1
End With
For Each rCell In Me.Range("C1:G1")
If rCell  "" Then
Call CreateBereich2222(rCell.Value, Me, rCell.Column, 7, rCell.Column, 362)
Else
End If
Next
End Sub

Sub CreateBereich2222(strBereichsname As String, wkTabelle As Worksheet, zeUp As Long, spLinks As Long, zeDown As Long, spRechts As Long)
Dim Bereich As Range
Set Bereich = Worksheets(wkTabelle.Name).Range(wkTabelle.Cells(spLinks, zeUp), wkTabelle.Cells(spRechts, zeDown))
ActiveWorkbook.Names.Add _
Name:=strBereichsname, _
RefersTo:=Bereich, Visible:=True
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Argumenttyp ByRef unverträglich
06.05.2014 12:34:01
Daniel
Hi
es gibt zwei Methoden, eine Variable an eine Funktion oder Sub zu übergeben:
a) byRef (Standard)
b) byVal
bei der Übergabe byVal wird nur der Wert übergeben und für die Sub/Function wird eine neue Variable angelegt.
bei der Übergabe byRef wird im Prinzip die Variable selbst an die Sub/Function übergeben, sie erhält hier ggf nur einen anderen Namen.
dh änderst du den Wert der Variablen in der aufgerufenen Sub, so ändert sich auch der Wert der Variablen in der aufrufenden Sub.
der Übergabetyp "byRef" wird von Excel standardmäßig verwendet, wenn du keine genauen Angaben hierzu machst.
bei der Übergabe "byRef" ist es zwingend erforderlich, dass die die Variablentypen genau übereinstimmen, dh du kannst eine Integer-Variable nicht übergeben, wenn eine LONG-Variable gefordert ist, sondern nur eine LONG-Variable.
Verwendest du den Übertabetyp "byVal", dann geht das problemlos (weil hier eine neue Variable entsteht kann Excel die erforderliche Typumwandlung durchführen, bei "byRef" ensteht keine neue Variable, daher müssen die Typen exakt gleich sein.)
Es gibt für deinen Fall folgende Lösungsmöglichkeiten:
a) du passt die Variablentypen in aufrufender und aufgerufener Sub an:
a1) du deklariersst deine Variabeln genau so, wie sie von der Sub benötigt werden, dh nicht als Integer sondern als Long.
Sub Makro1()
Dim x as long
x = 1
Call Makro2(x)
End Sub
Sub Makro2(y as long)
msgbox y*y
End Sub
a2) du kannst die Variable auch temporär umwandeln, so dass sie nur für die Übergabe den anderen Typ hat:
Sub Makro1()
Dim x as Integer
x = 1
Call Makro2(CDbl(x))
End Sub
Sub Makro2(y as long)
msgbox y*y
End Sub

b) du machst die Variablenübergabe vom Typ "byVal"
hierzu gibt es zwei möglichkeiten:
b1) du gibst in der Sub an, dass die Variablenübergabe "byVal" erfolgen soll:
Sub Makro1()
Dim x as Integer
x = 1
Call Makro2(x)
End Sub
Sub Makro2(byVAl y as long)
msgbox y*y
End Sub
b2) du setzt beim Aufruf die Variable in Klammern, dann erfolgt die Übergabe ebenfalls "byVal"
Sub Makro1()
Dim x as Integer
x = 1
Call Makro2((x))
End Sub
Sub Makro2(y as long)
msgbox y*y
End Sub

Gruß Daniel

Anzeige
AW: Argumenttyp ByRef unverträglich
06.05.2014 12:34:44
Rudi
Hallo,
teste mal:
Sub CreateBereich2222( _
strBereichsname As String, _
wkTabelle As Worksheet, _
ByVal zeUp As Long, _
ByVal spLinks As Long, _
ByVal zeDown As Long, _
ByVal spRechts As Long)
With wkTabelle
.Range(.Cells(spLinks, zeUp), .Cells(spRechts, zeDown)).Name = strBereichsname
End With
End Sub

Gruß
Rudi

AW: Argumenttyp ByRef unverträglich
06.05.2014 13:09:02
Peter
Hallo zusammen
Vielen Dank euch beiden.
Ich habe jetzt mal die vorgesehenen Variablen benutzt und eine Klammer darum gesetzt. So funktioniert es.
Gruss, Peter

Hier wird von dir außerdem sehr schön ...
06.05.2014 13:26:26
dir
…dokumentiert, wie sinnlos die Verwendung von UN-Präfixen ist, wenn man sich dann im Verlaufe des Pgms nicht an ihre Aussage hält, Peter… ;->
(Falls du das nicht verstehst, lng wird von vielen Anhängern der sog Ungarischen Notation als Präfix für Long-Variablen verwendet. Das ist VBA aber egal! Ähnliches zeitigt nur Wirkung, wenn die Variable nicht explizit in der Prozedur, sondern über den 1.Buchstaben ihres Namens mit einer DefType-Anweisung, zB DefLng Buchstabenbereich[,Buchstabenbereich]… für BuchstabenbereichBuchstabe1[-Buchstabe2], global [prä-]definiert wird.)
Übrigens gibt es im Grunde genommen sogar drei Aufrufmethoden für Variablen, nur unterstützen viele Sprachen nur die von Daniel genannten zwei, CallByReference und CallByValue, so ursprünglich auch Basic und VB(A). In VB(A) wurde die 3.Methode nachträglich als Fkt/Methode CallByName implementiert, kann aber nur im ProzedurKörper verwendet wdn.
Gruß Luc :-?

Anzeige
AW: Hier wird von dir außerdem sehr schön ...
06.05.2014 13:37:41
dir
Hallo Luc
Vielen Dank. Manchmal ist man irgendwie blind :-)
Allerdings habe ich diese Aussage gar nicht verstanden:
"Ähnliches zeitigt nur Wirkung, wenn die Variable nicht explizit in der Prozedur, sondern über den 1.Buchstaben ihres Namens mit einer DefType-Anweisung, zB DefLng Buchstabenbereich[,Buchstabenbereich]… für Buchstabenbereich ⇐ Buchstabe1[-Buchstabe2], global [prä-]definiert wird.)"
Vielleicht hast du da ja ein Beispiel?
Gruss, Peter

Bsp findest du in der VBEditorHilfe, wenn ...
06.05.2014 13:48:51
Luc:-?
…du darin nach DefType suchst, Peter!
Luc :-?

AW: Danke! owT
06.05.2014 14:04:30
Peter

Hilfe von der Aussenwelt ;-)
06.05.2014 14:01:44
der
Hallo Peter,
Mal diesen Code in ein Modul und laufen lassen, bzw. spielen damit:
DefLng L
DefInt I
DefStr S-T
DefDate D
Sub Test()
Dim i1, irgendwas, iCnt
Dim lx, l2
Dim sText, tString, xNotDef, undefiniert
Dim dHeute
xNotDef = Array(1, 2)
MsgBox "i1 ist ein: " & TypeName(i1) & vbCrLf & _
"irgendwas ist ein: " & TypeName(irgendwas) & vbCrLf & _
"iCnt ist ein: " & TypeName(iCnt) & vbCrLf & _
"lx ist ein:" & TypeName(lx) & vbCrLf & _
"l2 ist ein:" & TypeName(l2) & vbCrLf & _
"sText ist ein:" & TypeName(sText) & vbCrLf & _
"tString ist ein:" & TypeName(tString) & vbCrLf & _
"dHeute ist ein:" & TypeName(dHeute) & vbCrLf & _
"undefiniert ist ein:" & TypeName(undefiniert) & vbCrLf & _
"xNotDef ist ein:" & TypeName(xNotDef), , "Variablentypen"
End Sub
Gruess Hansueli
Anzeige

15 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige