Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1064to1068
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

Problem mit Argument ByRef unverträglich

Problem mit Argument ByRef unverträglich
07.04.2009 00:22:28
thomas
Hallo liebe VBA Gemeinde
In einem Userform habe ich eine ListBox2 mit Namen. Jeder Name entspricht der Überschrift einer Spalte in sheet("tabelle1"). Beim klicken auf einen eintrag in der Listbox soll in einer comboBox die Autofilter einträge ausgegeben werden. dafür habe ich folgenden code:
--------------------------------------------------------------------------
Function myList(sh As Worksheet, lngCol As long)
Dim vntList(), n As Long, vntC, vntTmp
Dim myCol As New Collection
With sh
ReDim vntList(1 To 1, 1 To Application.CountA(.Columns(lngCol)))
vntTmp = .Range(.Cells(1, lngCol), .Cells(Rows.Count, lngCol).End(xlUp))
End With
For Each vntC In vntTmp
Err.Clear
On Error Resume Next
myCol.Add vntC, CStr(vntC)
If Err.Number = 0 Then
n = n + 1
vntList(1, n) = vntC
End If
Next
ReDim Preserve vntList(1 To 1, 1 To n)
myList = WorksheetFunction.Transpose(vntList)
End Function


----------------------------------------------------------


Private Sub ListBox2_Click()
For LoI = 0 To Abfrage.MultiPage1.Pages(1).ListBox2.ListCount - 1
If Abfrage.MultiPage1.Pages(1).ListBox2.Selected(LoI) = True Then
SpalteNr = LoI + 1
ComboBox1.List = myList(Sheets("Tabelle1"), SpalteNr)
End If
Next
End Sub


-----------------------------------------------------
Die function mylist läd die autofilter einträge in die combobox FUNZT !
Aber die function spreche ich so an:
ComboBox1.List = myList(Sheets("Tabelle1"), SpalteNr)
dann kommt die Fehlermeldung
Argument ByRef unverträglich
Wenn ich aber :
ComboBox1.List = myList(Sheets("Tabelle1"), 2)
dann funktioniert es und in der combobox stehen die autofiltereinträge aus spalte 2
Kann mir jemand helfen? Die function mylist habe ich hier im forum gefunden. leider unkommentiert.
kann mir vielleicht jemand beim verstehen helfen was da genau abgeht. steh grad zeimlich auf dem schlauch.
Vielen Dank
gruß
Thomas

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Problem mit Argument ByRef unverträglich
07.04.2009 00:40:04
Daniel
Hi
dimensionier mal "SpalteNr" auf die gleiche Weise wie den Parameter, an den es übergeben werden soll: "lngCol", nämlich als LONG
dadurch daß du "SpalteNr" nicht dimensoniert hast, wird automatisch die bei der Zuweisung die passende Variablenart gewählt, und das ist meistens bei Ganzzahlen INTEGER.
bei der normalern Parameterübergabe wird die Variable ByReference übergeben, dh. die ganze Variable, das funktioniert natürlich nur bei gleichen Variablentypen, nicht bei unterschiedlichen.
oder du musst explizit angeben, daß nicht die ganze Variable, sondern nur der Wert an die neue Funktion übergeben wird, durch den Zusatz "ByVal"

Function myList(sh As Worksheet, ByVal lngCol As long)


Gruß, Daniel

Anzeige
AW: Problem mit Argument ByRef unverträglich
07.04.2009 07:31:10
thomas
Servus Daniel
Danke für die schnelle Antwort. Habs grad ausprobiert. Also man muss explizit ByVal angeben wie du es meintest. Die SpalteNr nur als Long zu deklarieren reicht nicht.
Aber jetzt geht alles. Super !
Ich versuch auch grad die funktion zu verstehen was da abgeht. Kannst du mir dazu noch ein paar zeilen schreiben? ich benutz eigentlich nie collection....
gruß
Thomas
AW: Problem mit Argument ByRef unverträglich
07.04.2009 22:55:13
Daniel
HI
kopier mal diese Makros in ein Modul und starte das Makro "Test". dann verstehst du vieilleicht den Unterschied zwischen ByVal und ByRef besser.

Sub Test()
Dim x As Long
x = 2
Debug.Print "-- ByVal --"
Debug.Print "x vorher: " & x
Call ZweiAddierenByVal(x)
Debug.Print "x nachehr: " & x
x = 2
Debug.Print "-- ByRef --"
Debug.Print "x vorher: " & x
Call ZweiAddierenByRef(x)
Debug.Print "x nachehr: " & x
End Sub



Sub ZweiAddierenByVal(ByVal a As Long)
a = a + 2
End Sub



Sub ZweiAddierenByRef(ByRef a As Long)
a = a + 2
End Sub


das Ergebnis wird im Direktfenster angezeigt, dieses sollte also aktiv sein.
Gruß, Daniel

Anzeige
AW: Problem mit Argument ByRef unverträglich
07.04.2009 07:51:08
thomas
Servus naochmal
Eine Frage ist noch offen. Und zwar zeigt die ComboBox mir auch leere Einträge an. Kann ich die rauslöschen.
Mein Versuch sieht wie folgt aus (geht aber leider nicht)
for i=0 to ComboBox1.ListCount-1
IstLeer=ComboBox1.List(i)
If IstLeer="" then
ComboBox1.RemoveItem(i)
end if
next
Kann das eine weil ich über ComboBox1.List=Mylist(....) die Liste verknüpft habe?
gruß
Thomas
AW: Problem mit Argument ByRef unverträglich
07.04.2009 09:38:45
D.Saster
Hallo,
in deinem Fall ist die Nutzung des Dictionary-Objects geschickter.

Function myList(sh As Worksheet, lngCol As Long)
Dim vntC, vntTmp
Dim myDic As Object
Set myDic = CreateObject("Scripting.Dictionary")
With sh
vntTmp = .Range(.Cells(1, lngCol), .Cells(Rows.Count, lngCol).End(xlUp))
End With
For Each vntC In vntTmp
If Not myDic.exists(vntC) Then
myDic.Add vntC, CStr(vntC)
End If
Next
myList = myDic.Keys
End Function


Gruß
Dierk

Anzeige
AW: Problem mit Argument ByRef unverträglich
07.04.2009 10:41:19
thomas
Ok Leute.
Tausend dank. Funktioniert jetzt alles so wie ich es will (und nicht excel ;-)
gruß
Thomas

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige