Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1756to1760
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
Finden String in Array
08.05.2020 21:35:57
Lars
Guten Tag
Ich habe 2 Fragen zum Umgang mit Arrays:
1. Auslesen Array mit for each Funktion an Variablentyp Variant gebunden ?
Bsp findet sich in Prozedur "Auslesen_Array"
Ich habe eine Array namens "Test_Array" angelegt, das Jahre enthält. In der Variablendeklaration ist es von Typ Variant angelegt.
mit for each .... kann ich die Elemente des Arrays auslesen.
Wenn ich den Typ des Arrays auf String ändere, klappt der for each Befehl nicht.
Ist "for each" an den Variablentyp Variant gebunden ?
2. Position eines Strings (in meinem Fall ein konkretes Jahr) im Array "Test_Array" finden. Das Test_Array enthält austeigend die Jahre 2010 bis 2020. Ich suche 2022. Im Direkteingabefenster rufe ich dne Prozedur durch call Durchsuchen3 auf. Ich bekomme allerdings einen Run time error 5 in der Zeile Found_Row .... Warum ? Wie kann ich das vermeiden. Ich hätte gerne den Rückgabewert 9 = Jahr 2018. Wenn ein Jahr gesucht wird, dass nicht im Array enthalten ist soll der Rückgabewert Null sein.
Da ich nicht sicher bin, ob das mit dem Hochladen der Datei klappt zur Sicherheit der kleine Quelltext.
Test_Array = Array("2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020")
Sub Durchsuchen3()
Dim Found_Row As Variant
Dim Err As Integer
Dim Search As String
Search = "2018"
Found_Row = (Application.Match(CStr(Search), Test_Array, 0))
-> Anmerkung: hier entsteht ein Run time error 5 Invalide Procedure Call or  _
argument
End Sub
Danke im Voraus für Eure Hilfe
Gruß
Lars

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Finden String in Array
08.05.2020 21:59:39
Daniel
Hi
- die äußere Klammer ist nicht erforderlich
- CStr ist nicht erforderlich, da die Variable schon als String deklariert ist.
- in deinem Beispielcode fehlt die Deklaration und Zuweisung der Werte für Test-Array. Erfolgt diese an anderer Stelle? Wenn ja, wie und wo?
In deinem Fall kannst du die Position auch so finden, außerdem hast du da die 0 als alternativergebnis automatisch:
Found_Row = Instr("xxx-" & Join(Test_Array, "-") & "-", "-" & Search & "-") / 5

Wenn die Jahre aufsteigend und lückenlos gelistet sind, dann kannst du die Position auch einfach über die Differenz zwischen gesuchten Jahr und Jahr des ersten Eintrags berechnen.
Suchen musst dur, wenn die Liste unsortiert ist oder Jahre zwischendrin fehlen.
Gruß Daniel
Anzeige
AW: Finden String in Array
08.05.2020 21:59:49
onur
WO steht denn überhaupt:
Test_Array = Array("2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020")

AW: Finden String in Array
08.05.2020 22:54:02
Lars
Das Test_Array habe ich ausserhalb der Prozedur als String Type fest definiert.
AW: Finden String in Array
08.05.2020 22:56:25
onur
Aber du rufst doch das Makro im Direktfenstzer auf und nicht von da, wo das Array befüllt wurde.
Also ist das Array leer.
AW: Finden String in Array
08.05.2020 23:06:45
Lars
das Test_Array habe ich in der Variablendeklation als Public Test_Array() As Variant gesetzt. Dann füllt ich es hart mit
Test_Array = Array("2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020")
und dann will ich auf diesem Array 2018 über die 2. Prozedur finden. Geht das nicht ?
Anzeige
AW: Finden String in Array
08.05.2020 23:11:47
Mullit
Hallo,
 Geht das nicht ? 

...doch, schon....;-)
Gruß, Mullit
AW: Finden String in Array
08.05.2020 23:15:08
Lars
aber ?
AW: Finden String in Array
08.05.2020 23:31:26
Mullit
aber...;-)... Du mußt Dein TestArray auch tatsächl. vorher über eine Proc füllen, darauf hatte glaub ich Onur schon hingew., die Proc dann entw. händisch ausführen, oder in Durchsuchen aufrufen, also bspw so:
Option Explicit
Public Test_Array() As Variant
Public Sub Fill_Array()
Test_Array = Array("2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", " _
2019", "2020")
End Sub
Public Sub Durchsuchen3()
Dim Found_Row As Variant
Dim Err As Integer
Dim Search As String
Search = "2018"
Found_Row = Application.Match(Search, Test_Array, 0)
If IsError(Found_Row) Then Found_Row = 0
MsgBox Found_Row
End Sub

Gruß, Mullit
Anzeige
AW: Finden String in Array
08.05.2020 23:37:55
Mullit
...btw, dann wäre viell. eine Public Function noch eleganter:
Public Function Test_Array() As Variant
Test_Array = Array("2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", " _
2019", "2020")
End Function
Public Sub Durchsuchen3()
Dim Found_Row As Variant
Dim Err As Integer
Dim Search As String
Search = "2018"
Found_Row = Application.Match(Search, Test_Array, 0)
If IsError(Found_Row) Then Found_Row = 0
MsgBox Found_Row
End Sub

Gruß, Mullit
AW: Finden String in Array
08.05.2020 23:18:17
Lars
oder muss ich der 2. Prozedur das Array als Variable übergeben ?
AW: Finden String in Array
08.05.2020 23:31:41
onur
Dass Test_Array public ist, bedeutet nicht, dass es automatisch befüllt wird - nur wenn das Makro, das es befüllt VOR "Durchsuchen3" gelaufen ist,ist es auch befüllt.
Also am besten direkt in "Durchsuchen3" befüllen.
Anzeige
AW: Finden String in Array
08.05.2020 22:38:37
Mullit
Hallo,
viell. nochmal kurz zu Deinem 1): Du nutzt in diesem spez. Fall die Array-Funktion, dessen Rückgabewert ist immer vom Typ Variant, ebenfalls muß die Laufvariable in einer For Each- Schleife bei Arrays jegl. Typs immer vom Typ Variant sein, der Typ des Arrays selbst ist davon unbenommen...
https://docs.microsoft.com/de-de/office/vba/language/reference/user-interface-help/array-function
https://docs.microsoft.com/de-de/office/vba/language/reference/user-interface-help/for-eachnext-statement
Gruß, Mullit
Anzeige
AW: Finden String in Array
08.05.2020 23:03:32
Mullit
Hallo,
so würde Dein Ansatz übrigens laufen, stellt sich die Frage ob es so sinnvoll ist Jahre als String anzulegen, meistens doch eher als Zahl oder Datum, aber ok...
Sub Durchsuchen3()
Dim Found_Row As Variant
Dim Err As Integer
Dim Search As String
Dim Test_Array As Variant
Test_Array = Array("2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", " _
2019", "2020")
Search = "2018"
Found_Row = Application.Match(Search, Test_Array, 0)
If IsError(Found_Row) Then Found_Row = 0
MsgBox Found_Row
End Sub

Gruß, Mullit
AW: Finden String in Array
08.05.2020 23:14:09
Lars
danke da sind die Experten am Start und der Laie staunt :-)
das Test_Array habe ich in der Variablendeklation als Public Test_Array() As Variant gesetzt ausserhalb der Sub Prozedur Durchsuchen3. Dann füllt ich es hart mit
Test_Array = Array("2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020")
und dann will ich auf diesem Array 2018 über die Prozedur Durchsuchen3 finden. Kann die Prozedur Durchsuchen3 nicht das das ausserhalb der Prozedur definierte Array zugreifen ? Geht das nicht ?
die Jahreswerte sind nur einfache Beispiele. Eigenlich will ich im Array eineindeutige Bezeichnungen finden. Daher die Definition als String.
Anzeige
AW: Finden String in Array
09.05.2020 08:44:04
Daniel
Hi
Kann sie schon, wenn man folgendes beachtet:
- Die Dimensionierung von Test_Array muss außerhalb der Makros erfolgen.
- Befindet sich die Dimensionierung in einem anderen Modul, muss mit "Public" dimensioniert werden.
- Befindet sich die Dimensionierung nicht in einem allgemeinen Modul sondern in einem Tabellenblatt-, Userform- oder sonstigen speziellen Modul, muss ber, so muss bei Verwendung außerhalb dieses Moduls der Modulname vorangestellt werden: "Tabelle1.Test_Array"
- Die Wertzuweisung an das Array kann in einem anderen Makro erfolgen, aber es muss sichergestellt sein, dass diese ausgeführt wird, bevor die Variable das erste mal anderweitig verwendet wird und in der Zwischenzeit die Variablen nicht zurückgesetzt wurden (passiert bei einem Fehlerabbruch, dem Befehl End oder bei Klick auf den Rücksetzten-Button.
Noch ne Variante zum Suchen wäre folgende.
Hierbei gibt es keine Fehler oder Fehlerwerte wenn der Schwert nicht vorhanden ist, dh. Found_Row kann als Long deklariert werden.

For Found_Row = Ubound(Test_Array) to 0 step - 1
If Test_Array(Found_Row) = Search Then Exit For
Next
Found_Row = Found_Row + 1
Btw ich würde auch den Variablennamen "Search" mal etwas abändern. Korrekte englische Wörter könnten auch VBA-Schlüsselbegriffe sein, und wenn man jetzt Variablen genauso benennt, hätte man eine Doppeldeutigkeit dieses Begriffs.
Das kann funktionieren wenn man Glück hat und sich der Interpreter in der jeweiligen Situation für die richtige Variante entscheidet, aber es kann auch schief gehen.
Zumindest für die Lesbarkeit des Quellcodes ist es besser, wenn man Eigenkreationen auch erkennbar als solche benennt.
Ich bevorzuge daher als Varaiblenbezeichnung deutsche Wörter.
Gruß Daniel
Anzeige
AW: Finden String in Array
09.05.2020 11:33:15
Herbert
Hallo Daniel,
du hast recht, das mit der "Doppeldeutigkeit" der Variablen ist immer wieder mal ein Problem. Deshalb habe ich mir angewöhnt, dem Variablen-Namen immer den 1. Buchstaben des V-Typs voran zu stellen. Dann hat man schon mal die meisten Doppeldeutigkeiten vermieden.
Servus
AW: Finden String in Array
10.05.2020 12:25:24
Lars
Hallo Zusammen
jetzt bin ich mir nicht sicher, ob meine email bei Euch angekommen ist. Erstmal echt grosses Danke an alle für die schnelle Hilfe. Ich bin mir nicht sicher was die Reihenfolge der Schritte auf dieser Seite angeht. Schreibe ich erst die Antwort, gehe dann auf Vorschau und sage dort absenden oder muss ich vor dem Versenden erst z.B. einen File_Upload machen ?
Gruß
Lars
Anzeige
AW: Finden String in Array
10.05.2020 12:18:51
Lars
Hallo zusammen,
Erstmal vielen Dank für die vielen Infos. Habe mal angefangen, VBA zu machen, dann lange nix mehr gemacht und jetzt stehe ich wieder am Anfang :-(
Ich habe mal als Erstes den Source Code von Mullit nachgebaut.
Ich hoffe, Ihr könnt die neue Datei sehen, die ich hochgeladen habe. Sie sollte 2 Przeduren enthalten
1. "Durchsuchen3" = analog Vorschlag Mullit, Array wird in der Prozedur hart definiert und abgefragt, funktioniert
2. "Anlegen_Array : Test_Array2 wird auf einer Excel Tabelle eingelesen und besteht aus 5 Werten von 2016 bis 2020, wenn ich dann 2018 auf diesem Array suche bekomme ich immer den Wert 0. Warum ?
Noch 2 weitere Fragen:
1. was ist der Rückgabewert der Zeile ..."Found_Row = Application.Match(Search_String, Test_Array2, 0)..." ist das eine Zahl oder True/False ?
2. wenn ein Array über dim dem System bekannt gegeben wird, muss die Länge des Array über Redim erst festgelegt werden bevor das Array das erste Mal verwendet wird ?
Gruß Lars
Anzeige
AW: Finden String in Array
10.05.2020 16:52:36
Mullit
Hallo,
2. "Anlegen_Array : Test_Array2 wird auf einer Excel Tabelle eingelesen und besteht aus 5 Werten von 2016 bis 2020, wenn ich dann 2018 auf diesem Array suche bekomme ich immer den Wert 0. Warum ?

Das kommmt darauf an, wie Du genau das Array befüllst und ob Du richtig suchst, also auch auf die Datentypen achtest, Deine Beispiel-Datei fehlt übrigens leider noch....
Zu
2.1.: Das kommt darauf an, wird ein Wert gefunden, da wird der Pos.-Index zurückgegeben, ansonsten ein Fehlerwert:
https://docs.microsoft.com/de-de/office/vba/api/excel.worksheetfunction.match
2.2.: Auch das kommt darauf an, ob Du ein Array mit konstanter Größe oder ein dynamisches Array anlegst:
https://docs.microsoft.com/de-de/office/vba/language/reference/user-interface-help/dim-statement
https://www.online-excel.de/excel/singsel_vba.php?f=152
Der letzte Link ist ein Dreiteiler...empfehlenswert mal durchzuarbeiten...;-)
Gruß, Mullit
AW: Finden String in Array
10.05.2020 20:41:38
Lars
Hallo Mullit ,
ich bin mir nicht sicher, ob meine letzte email vom 10.5. 20 Uhr bei Dir ankam. Daher erneuter Versuch. Mir ist nicht klar, wie ich an eine email zuverlässig ein attachment anfügen kann. Logisch für mich wäre, dass ich die email anfange, dann auf den Buttom "Zum File-Upload" gehe, der über den Schreibbereich steht, dort die Datei hochlade und dann wieder zur email zurückspringe. Dann könnte das System sicher einen Link ziwschen email und attachment herstellen. Ich versuch´s mal. Bitte melden wenn die Datei wieder nicht ankommt.
Ah ich glaube so klappt´s
https:\/\/www.herber.de/bbs/user/137403.xlsm
Gruß
Lars
AW: Finden String in Array
10.05.2020 21:24:18
Lars
habe in den Thread nochmal eine email geschickt mit dem Link zur Datei . Weisst Du zufällig, wie man in Firefox die X-frame options deaktiviert. Die verhindern das Öffnen der Links. Hab in Firefox nix gefunden. Solange mache ich Deine Links halt in Edge und CO auf :-)
AW: Finden String in Array
10.05.2020 23:33:22
Mullit
Hallo,
ja, darum ritt ich vorher so auf den Datentypen insbes. Strings bei Zahlen rum, Du suchst einen String in einem Long-Array das haut nich hin, so gehts:
'...
Dim Search_Value As Long
Search_Value = 2018
Found_Row = Application.Match(Search_Value, Test_Array2, 0)
'...

Dein Array könntest Du auch noch sauberer als Long-Array dekl., wenn da tatsächhl. ganze Zahlen rein sollen:
Dim Test_Array2() As Long

Zum Öffnen der Links das scheint mit der Forensoftware zus. zu hängen, einfach Rechtsklick auf den Link, dann 'In neuem Tab Öffnen'...;-)
Jaja der Frauenschalter, Option Base 1 ist eigentl. immer überflüssig, gerade in Deinem Code setzt Du ja die untere Grenze im Array selbst, wenn's einem leichter fällt ok, ansonsten sollte man sich an nullbasierte Arrays gewöhnen, die sind in fast allen Prog.-Sprachen Standard.
Um im Home Office bei Stimmung zu bleiben, hier mal eine Kurzgeschichte zu diesem Thema, Nepumuk hatte diesen Klassiker irgendwann mal eingestellt:
http://www.office-loesung.de/ftopic226251_0_0_asc.php#898103
Gruß, Mullit
AW: Finden String in Array
11.05.2020 17:06:08
Lars
Kaum macht man´s richtig schon tut´s. Im Endausbau suche ich nur Begriffe. Daher habe ich mal das Test_Array3 angelegt als Typ String. Dann suche ich auf dem Array einen String. Et voila. Perfekt. Was mache ich, wenn ich eine Kombination aus Zahlen und Wörtern in einem Array hätte ? Würde ich das Array dann als Variant definieren und eine Variable vom Typ Variant darauf suchen ? Gibt das dann den richtigen Rückgabewert? Das muss ich gleich mal ausprobieren. Ich danke allen hier im Thread für ihre Hilfe, Dir natürlich vor allem. Ich hoffe wir bleiben in Kontakt.
By the way wie kann ich hier gezielt nach einer Person suchen ?
rofl - der Link den Du mir geschickt hast ist mega - das mit dem Frauenschalter darf meine Frau nicht sehen sonst kriege ich einen strengen körperlichen Verweis :-) Muss mich an die Denke ab Null erst gewöhnen. Für Variablen und Schleifen echt besser wenn man die Anzahl braucht aber 99-0 ist leider in Euro immer noch 99 nicht 100 :-(
https:\/\/www.herber.de/bbs/user/137430.xlsm

194 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige