VBA für index-vergleich

Antwort erstellen

Smilies
:D :) :( :o :shock: :? 8-) :lol: :x :P :razz: :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :badgrin: :doubt:
BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet
Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: VBA für index-vergleich

Re: VBA für index-vergleich

Beitrag von HH-Joh. » 29. Dez 2020, 21:34

Hallo Helmut, danke für den Tipp. So klappt es jetzt.
Code: Alles auswählen
Option Explicit
    Sub KundenFinden2()
    Dim Suchzelle As String
    Dim Kdno As String
    Dim rngFound As Range
    Dim firstAddress As Variant
    Dim Frage As String
    Dim Name As String

    'Suchzelle = Worksheets("Kunden").Range("G3").Value
    Frage = InputBox("Bitte geben Sie einen Wert ein", "Werte-Eingabe", , 200, 500)
    MsgBox Frage

    Suchzelle = Frage
     
    With Worksheets("Kunden").Range("b2:b300")

    Set rngFound = .Find(What:="*" & Suchzelle & "*", LookIn:=xlValues)
           'MsgBox rngFound.Address
           
      If Not rngFound Is Nothing Then
      firstAddress = rngFound.Address
        Do
             Name = rngFound
             MsgBox Name
             Kdno = rngFound.Offset(, -1).Value
            Set rngFound = .FindNext(rngFound)
            MsgBox Kdno
         Loop While rngFound.Address <> firstAddress
          MsgBox "Suche abgeschlossen."
        Else
           MsgBox "Suche war ergebnislos."
      End If
      End With
    End Sub

Re: VBA für index-vergleich

Beitrag von HKindler » 29. Dez 2020, 20:42

Hi,

überlege dir einmal ganz genau was wohl mit firstaddress gemeint sein könnte und wann du dir dann diese merken solltest...

Re: VBA für index-vergleich

Beitrag von HH-Joh. » 29. Dez 2020, 20:11

Hallo in die Runde,
der Code funktioniert gut, wenn der Suchbegriff nur einmal in der Liste vorkommt. Habe ich aber den Suchbegriff zweimal, so komme ich aus der Schleife nicht mehr raus. Die Suche fängt dann wieder von vorne an.
Habt ihr einen Denkanstoß für mich, wie ich den Code umschreiben kann, dass auch dieser (zwar seltene Fall) abgefedert werden kann.
Danke im voraus.

Johanna

Re: VBA für index-vergleich

Beitrag von HH-Joh. » 04. Dez 2020, 06:35

so geht es jetzt gut
Code: Alles auswählen
Sub KundenFinden()
Dim Suchzelle As String
Dim Kdno As String
Dim rngFound As Range
Dim firstAddress As Variant
Dim Frage As String

'Suchzelle = Worksheets("Kunden").Range("G3").Value
Frage = InputBox("Bitte geben Sie einen Wert ein", "Werte-Eingabe", , 200, 500)
MsgBox Frage

Suchzelle = Frage
 
With Worksheets("Kunden").Range("b2:b300")

Set rngFound = .Find(What:="*" & Suchzelle & "*", LookIn:=xlValues)
   
  If Not rngFound Is Nothing Then
    Do
     firstAddress = rngFound.Address
      Kdno = rngFound.Offset(, -1).Value
      Set rngFound = .FindNext(rngFound)
      MsgBox Kdno
     Loop While rngFound.Address <> firstAddress
     
      MsgBox "Suche abgeschlossen."
    Else
       MsgBox "Suche war ergebnislos."
  End If
  End With
End Sub

Re: VBA für index-vergleich

Beitrag von HH-Joh. » 03. Dez 2020, 21:06

Hallo Helmut,

danke für deine Unterstützung. Jetzt hab ich es verstanden.
Der Code klappt nun wie vorgesehen.

Gruß
Johanna

Re: VBA für index-vergleich

Beitrag von HKindler » 03. Dez 2020, 08:30

Hi,
HH-Joh. hat geschrieben:das sind unterschiedliche Typen string und range

richtig. Und was macht die Anweisung firstAddress = rngFound? Richtig, sie weist der Variabeln firstAddress den Inhalt (=Wert) von rngFound zu und nicht die Zelladresse. Aber das hast du ja mittlerweile korrigiert.

HH-Joh. hat geschrieben:Wie mache ich es, dass er beim ersten anfängt?

Überlegen wir einmal: Zunächst wird der erste Treffer gesucht. Falls dieser gefunden wurde, wird die Schleife gestartet, die den nächsten Treffer sucht. Dieser wird ausgegeben und falls die Adresse ungleich der ersten Adresse ist, wird die Schleife wiederholt. Fällt dir etwas auf? Auf diese Art gibst den 2., 3., 4.,.... 1. Treffer aus.
Was kann man dagegen tun? Ganz einfach: dreh diese beiden Zeilen um:
Code: Alles auswählen
      Set rngFound = .FindNext(rngFound)
      Kdno = rngFound.Offset(, -1).Value
wird zu
Code: Alles auswählen
      Kdno = rngFound.Offset(, -1).Value
      Set rngFound = .FindNext(rngFound)

Re: VBA für index-vergleich

Beitrag von HH-Joh. » 02. Dez 2020, 21:13

das sind unterschiedliche Typen string und range
Code: Alles auswählen
im Suchzelle As String
Dim Kdno As String
Dim rngFound As Range
Dim firstAddress As Variant

Suchzelle = Worksheets("Kunden").Range("G3").Value
'Frage = InputBox("Bitte geben Sie einen Wert ein", "Werte-Eingabe", , 200, 500)
'MsgBox Frage
MsgBox Suchzelle
 
With Worksheets("Kunden").Range("a1:B9")

Set rngFound = .Find(What:=Suchzelle, LookIn:=xlValues)
   
  If rngFound Is Nothing Then
        MsgBox "Suche war ergebnislos"
    Else
        firstAddress = rngFound.Address
    Do
      Set rngFound = .FindNext(rngFound)
      Kdno = rngFound.Offset(, -1).Value
      MsgBox Kdno
     Loop While rngFound.Address <> firstAddress
  End If
  End With
End Sub


So funktioniert der Code, aber nicht gut. Bei z.b. Drei Meiers findet er den Zweiten, den dritten und den ersten.

Wie mache ich es, dass er beim ersten anfängt?

Re: VBA für index-vergleich

Beitrag von HKindler » 02. Dez 2020, 20:49

Hi,

was fällt dir bei
Code: Alles auswählen
firstAddress = rngFound
auf?

Re: VBA für index-vergleich

Beitrag von HH-Joh. » 02. Dez 2020, 20:25

habt ihr noch einen Tipp für mich ,wie ich das FindNext in einer Schleife fortsetzen kann?

Gruß
Johanna

Re: VBA für index-vergleich

Beitrag von HH-Joh. » 01. Dez 2020, 18:12

Danke Sabina,

hab jetzt versucht, deine Idee umzusetzen.
aber es gibt einen Fehler mit der Schleife.
Code: Alles auswählen
Sub KundenFinden()
Dim Suchzelle As String
Dim Kdno As String
Dim rngFound As Range
Dim firstAddress As String

Dim i As Long

Suchzelle = Worksheets("Kunden").Range("G3").Value
'Frage = InputBox("Bitte geben Sie eine Wert ein", "Werte-Eingabe", , 200, 500)
'MsgBox Frage
MsgBox Suchzelle
 
With Worksheets("Kunden").Range("b2:B9")

Set rngFound = .Find(What:=Suchzelle, LookIn:=xlValues)
      If rngFound Is Nothing Then
        MsgBox "Suche war ergebnislos"
    Else
        firstAddress = rngFound
        Kdno = rngFound.Offset(, -1).Value
        MsgBox Kdno
  Do
    Set rngFound = .FindNext(rngFound)
    Loop While rngFound.Address <> firstAddress

    End If
  End With

End Sub


Habt ihr noch einen Tipp für mich?

Gruß
Johanna

Re: VBA für index-vergleich

Beitrag von Flotter Feger » 01. Dez 2020, 18:09

... warum wohl ...

1) Range.Find ist das schnellste, was ich in VBA je gesehen habe
2) warum soll man eine Formel zusammenschustern, die einem auch noch einen LFZ um die Ohren haut, wenn es den Namen nicht gibt, den man sucht,
3) wenn es etwas gibt, das besser ist ... und auch mehrere Ergebnisse verarbeiten kann ... und nicht nur das erste der Möglichen ...

... ist ja auch nicht mein Problem ...
Only my two Cents
Sabina

Re: VBA für index-vergleich

Beitrag von HH-Joh. » 01. Dez 2020, 16:59

Hallo FlotterFeger,
danke für deine Antwort, warum ist es denn so grottenfalsch?
Code: Alles auswählen
Sub Kunde()

Dim Kdno As String
Dim Suchzelle As String
Dim Frage As String

Frage = InputBox("Bitte geben Sie eine Wert ein", "Werte-Eingabe", , 200, 500)
MsgBox Frage
Range("G3") = Frage

Suchzelle = Worksheets("Kunden").Range("G3")
MsgBox Suchzelle
   
  If Suchzelle <> "" Then

Kdno = WorksheetFunction.Index(Worksheets("Kunden").Range("A2:B9"), _
WorksheetFunction.Match(Worksheets("Kunden").Range("G3").Value, Worksheets("Kunden").Range("B2:B9"), 1), 1)
MsgBox Kdno
  End If
 
End Sub

Re: VBA für index-vergleich

Beitrag von Flotter Feger » 01. Dez 2020, 16:44

Hallo,

der Ansatz die Formel in VBA zu übersetzen, ist so was von grottenfalsch ... :roll:

Für so eine Suche gibt es in VBA Range.Find() und Range.FindNext() ... es könnte ja mehrere Ergebnisse geben.
Das entspricht übrigens Strg+F und 'Weiter suchen...' ... die Zelle links daneben ist dann rng.Offset(0, -1) ... nur mal so.

Sabina

Re: VBA für index-vergleich

Beitrag von HH-Joh. » 01. Dez 2020, 16:44

Danke Helmut.

das hat geklappt.
Code: Alles auswählen
Sub Kunde()

Dim Kdno As String
Dim Suchzelle As String

Suchzelle = Worksheets("Kunden").Range("G3")
MsgBox Suchzelle
   
  If Suchzelle <> "" Then

Kdno = WorksheetFunction.Index(Worksheets("Kunden").Range("A2:B9"), _
WorksheetFunction.Match(Worksheets("Kunden").Range("G3").Value, Worksheets("Kunden").Range("B2:B9"), 1), 1)
MsgBox Kdno
  End If
 
End Sub


Gibt es (wie in Access ) eine ARt ParameterAbfrage über eine Messagebox, in die ich den Name (statt Suchzelle) eintragen kann?

Gruß Johanna

Re: VBA für index-vergleich

Beitrag von HKindler » 01. Dez 2020, 16:28

Hi,

schreib einmal vor das "Match" noch ein "WorksheetFunction."

Nach oben

cron