Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Daten aus Excelliste lesen


Betrifft: Daten aus Excelliste lesen von: M. Schmid
Geschrieben am: 26.01.2019 14:47:06

Betrifft: Daten aus Excelliste lesen
von: M. Schmid
Geschrieben am: 23.01.2019 21:35:48

Hallo,
ich benötige Hilfe mit folgendem Problem:

Ich habe eine Excelliste, die ich mit Userformtextboxen bearbeite. D.h.
Ich habe ein Textfeld in dem ich ein Suchwort eingebe, einen Button der mir die
Exceldatei öffnet und das Suchwort verarbeitet.
Das Suchwort (b) wird in einer Spalte gefunden und befindet sich in einer Zeile

A B C D E F
1
2 a b c d e f
3
4

Ich möchte nun die Spalte F auslesen. Also b wird gefunden und gibt mir f aus

Das funktioniert prima.

Jetzt mein Problem. Wenn in der Spalte B nicht nur das b sondern auch b und x steht
muss ich in mein Textsuchfeld im Userform b und x eingeben, damit die Zeichenkette gefunden wird.
D.h. ich muss den ganzen Zeileninhalt eingeben. Ich kann nicht zb. nur x in mein Suchfeld eingeben damit ich die Ausgabe f erhalte.
Also ich kann kein Schlagwort eingeben, sondern ich muss genau die Zeichenkette eingeben, damit f ausgegeben wird. Ansonsten erhalte ich eine Fehlermeldung.

Ich lese eine riesige Exceldatei aus und ich weiss ja nicht was genau in der Zelle steht um das gesuchte zu finden.

Wer kann mir helfen??

Hier mein funktionierender Ausschnitt

If Len(Trim$(Tex_Variable)) Then
Tex_Lizenz = ""
For Each objWB In Application.Workbooks
If objWB.FullName = cstrFile1 Then bolAlreadyOpen = True: Exit For
Next
If objWB Is Nothing Then Set objWB = Workbooks.Open(cstrpath & cstrFile1)
With objWB
Set objRange = .Sheets(cstrTab).Columns(3).Find(What:=Tex_Variable, LookAt:=xlWhole, _
LookIn:=xlValues, MatchCase:=False, SearchFormat:=False)

If Not objRange Is Nothing Then
Tex_Lizenz = objRange.Offset(0, 5)
Else
MsgBox "Anwendung nicht gefunden!"
End If
If Not bolAlreadyOpen Then .Close False
End With
Else
MsgBox "Anwendung im Feld Variable eingeben!", vbCritical
Exit Sub
End If



Betrifft: AW: Daten aus Excelliste lesen
von: Rudi Maintaire
Geschrieben am: 24.01.2019 12:52:20

Hallo,
dann solltest du auch nach Teilen suchen.

Ändere
LookAt:=xlWhole
in
LookAt:=xlPart

Gruß
Rudi
#############################################################

Danke Rudi funktioniert einwandfrei!

Es wird mit dem Schlagwort die Zeile gefunden und der Wert einer Zelle ausgelesen.

Aber immer nur der erste Wert der gefunden wird.

Wie funktioniert es damit ich z.B. in Zeile 150 das Schlagwort finde und mir der Wert ausgegeben wird und dann in Zeile 180 das gleiche Schlagwort und auch dort mir der Wert ausgegeben wird??

Also einmal funktionierts, aber wenn das Schlagwort mehrmals im Excelsheet ist, wird nur das erste gefundene ausgegeben.

Eine Hilfe wäre echt super

  

Betrifft: AW: Daten aus Excelliste lesen von: onur
Geschrieben am: 26.01.2019 15:29:36

Nimm statt

LookAt:=xlWhole

das:
LookAt:=xlPart



  

Betrifft: AW: Daten aus Excelliste lesen von: M. Schmid
Geschrieben am: 26.01.2019 19:05:26

Danke für die Antwort, aber die hatte ich schon erhalten.

Mein Problem ist nun, daß wie bereits beschrieben mit einem Schlagwort nur ein Ergebnis bzw. Anzeige gibt. es soll, wenn es noch einen Treffer gibt, die Felder gelöscht werden und das neue Ergebnis darin erscheint


  

Betrifft: AW: Daten aus Excelliste lesen von: onur
Geschrieben am: 26.01.2019 19:09:35

Und wie stellst du dir das vor?
Wenn z.B. 3 Ergebnisse gefunden werden, wird Ergebnis1 angezeigt und sofort gelöscht, das 2. angezeigt, sofort gelöscht und das 3. angezeigt. Das würde so schnell gehen, dass du immer nur das letzte Ergebnis sehen würdest.


  

Betrifft: AW: Daten aus Excelliste lesen von: M. Schmid
Geschrieben am: 26.01.2019 19:23:32

Das habe ich mir so vergestellt, dass wenn noch ein Ergebnis da ist gestoppt wird. Ein neues Ergebnis müsste doch programmtechnisch abzufangen sein. Irgenwie eine Schleife einbauen? aber wie??


  

Betrifft: AW: Daten aus Excelliste lesen von: onur
Geschrieben am: 26.01.2019 19:27:42

Google mal "VBA .Find" und nimm den ersten Vorschlag (Microsoft).
Da wird erklärt, wie man diesen Befehl richtig benutzt.
z.B. so:

With Worksheets(1).Range("a1:a500") 
    Set c = .Find(2, lookin:=xlValues) 
    If Not c Is Nothing Then 
        firstAddress = c.Address 
        Do 
            c.Value = 5 
            Set c = .FindNext(c) 
        Loop While Not c Is Nothing
    End If 
End With



  

Betrifft: AW: Daten aus Excelliste lesen von: M. Schmid
Geschrieben am: 26.01.2019 19:31:20

Danke - probiere es mal aus


  

Betrifft: AW: Daten aus Excelliste lesen von: Luschi
Geschrieben am: 26.01.2019 22:22:00

Hallo onur,

Du hättest diesen Tipp aus der M$-Online-Hilfe auch mal testen sollen, denn hättest Du bemerkt, daß da eine klassische Endlosschleife entsteht.
Schon die Variable 'firstAddress' wird zwar definiert/belegt, aber nie abgefragt - wozu braucht man sie dann eigentlich?
In der früheren Online-Hilfe stand dieser Code so da:

With Worksheets(1).Range("a1:a500") 
    Set c = .Find(2, lookin:=xlValues) 
    If Not c Is Nothing Then 
        firstAddress = c.Address 
        Do 
            c.Value = 5 
            Set c = .FindNext(c) 
        Loop While Not c Is Nothing And firstAddress <> c.Address 
    End If 
End With
Denn die Find-Funktion erzeugt eine Endlos-Schleife, wenn der Suchwert gefunden und die Anfangs-Adresse nicht in die Auswertung einbezogen wird. Ich habe mich schon mehrmals darüber bei M$ beschwert, daß bei Loop dieser Vergleich 'Not c Is Nothing' sinnlos ist, weil 'c' so nie Nothing werden kann!
Und nun haben sie genau den falschen Teil der Loop-Bedingung weggestrichen, und so sollte es eigentlich sein:
Loop While firstAddress <> c.Address

Aber auch sonst wird gegen die Empfehlungen bei der Benutzung der Find-Funktion verstoßen, denn es werden 4 Parameter angegeben, die immer mit angegeben werden sollen (LookIn, LookAt, SearchOrder und MatchByte ),
siehe: https://docs.microsoft.com/de-de/office/vba/api/excel.range.find

Gruß von Luschi
aus klein-Paris


  

Betrifft: AW: Daten aus Excelliste lesen von: onur
Geschrieben am: 26.01.2019 22:29:19

Stimmt, hätte ich vielleicht, aber das sollte sowieso nur ein Beispiel sein, wie man FindNext verwendet.
Ist leider nicht das erste mal, dass bei MS Fehler zu finden sind, auch ich habe Einige davon entdeckt (von den Übersetzungsfehlern mal ganz abgesehen).


  

Betrifft: AW: Daten aus Excelliste lesen von: Luschi
Geschrieben am: 26.01.2019 22:39:28

Hallo onur,

es ist nur schade, daß hinter dieser Vba-Hilfe MVP-dekorierte Excel-Experten stehen, die schon einige Bücher zu diesem Thema veröffentlicht haben und dann so jämmerlich versagen!

It's all right and Gruß von Luschi
aus klein-Paris



  

Betrifft: AW: VBA Todesschleife im Forum entdeckt!! Piet von: Piet
Geschrieben am: 27.01.2019 02:49:47

Hallo Kollegen

@onur + @Luschi - bitte seit mir nicht böse was ich gerade in eurer AW entdeckt habe ...!!

Ihr schimpft über die Experten von Mikrosoft, aber der Code den ihr dem Frager anbietet ist - ABSOLUT TÖDLICH!

Ich habe ihn gerade getestet, und der MUSS unweigerlich in einer doppelten Katastrophe enden!
1. - der Code von euch laeuft unerbittlich in eine Todesschleife, wo selbst Is Nothing nichts mehr nützt!
2. - die Todesschleife entsteht druch das Veraendern von Daten, was in einer Original Datei absolut Tödlich ist!

Ich kam nur dahinter weil mir etwas auffiel, und ich Ahnungslos dachte: - oh, was für eine Super geile Idee der Kollegen! -
Kann man waehrend dem FindNext Suchlauf den gesuchten Ausdruck staendig Variabel veraendern??? - s.hier: - c.Value = 5

Im ersten Augenblick dachte ich naiv ab hier sucht er die neue Zahl 5, bis ich auf meine Tabelle sah, und alle 2er verschwunden waren. Das Makro lief in einen Laufzeitfehler. Das begriff ich zuerst nicht, wiederholte den Test. Bis ich begriff das ich die Zahl 2 durch den Wert 5 staendig überschrieben!! - Dann begriff ich die Gefahr für eine umfangreiche Original Datei!!

Wie will das Programm dann bitte die "firstAdresse" wiederfinden, wenn der Wert überschrieben wurde???
Als ich das begriff verstand ich auch das der Frager bitte diesen Code so NICHT verwenden darf. Der killt sich ja im Original wichtige Daten! Sorry, wenn es die Wahrheit ist müssen wir sie als verantwortliche Ratgeber auch offen nennen. Selbst wenn wir zugeben müssen selber Mist gebaut zu haben!

Fehler machen ist menschlich, und ich habe grossen Respekt gerade vor Luschi und onur, weil eur Wissen und eure Programmier Faehigkeiten weit über meinen liegen!! Das erkenne ich ohne jede Diskussion an!

Auch wenn ich nicht die "hellste Kerze" im Herber Forum Kronleuchter bin hat der alte Praktiker seine Nische gefunden.
Trotzdem mache ich auch immer wieder die dümmsten Fehler. Reichen wir uns die HAND ALS KOLLEGEN ...


@Frager - hier mal ein Versuch von mir eine Lösung über MsgBox anzubieten, wobei man mit c.Select die Zelle direkt anspringen kann, damit man sieht was da wirklich drinsteht. Wenn mehrere Werte gesucht werden sollen, evtl. auch in anderen Spalten, evtl. in der gleichen Zeile, kann man das noch mit IF Then auswerten. Dazu müsste ich aber konkret wissen was gesucht werden soll und in welcher Reihenfolge? Bei Text kann man prüfen ob der Anfang oder das Ende übereinstimmen. Varianten im Suchlauf gibt es mehr als genug.

Hilft das weiter??? - Sonst helfen wir solange beim Code weiter bis er passt ....

mfg Piet

Sub Makro_als_Todesschleife()
Dim c As Range, Wert As Variant
Dim firstAddress As String
  With Worksheets(1).Range("A1:A500")
      Wert = 2
      Set c = .Find(What:=Wert, LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
      If Not c Is Nothing Then
          firstAddress = c.Address
          Do  'Zelle anspringen
              c.Select
              MsgBox c.Value
              Set c = .FindNext(c)
          Loop While Not c Is Nothing And firstAddress <> c.Address
      End If
  End With
End Sub



  

Betrifft: AW: VBA Todesschleife im Forum entdeckt!! Piet von: onur
Geschrieben am: 27.01.2019 08:53:08

"Trotzdem mache ich auch immer wieder die dümmsten Fehler" - Natürlich mache ich auch Fehler, aber nicht in diesem Fall.
Nicht ICH habe den Fehler gemacht, sondern Microsoft (VBA-Hilfe), mein Fehler war höchstens, Codefetzen von Microsoft ungeprüft als Beispiel zu posten.
Ich habe zwar extra erwähnt, dass es nur ein BEISPIEL (deswegen auch ungeprüft) für die Verwendung des Find-Befehls ist (hauptsächlich des FindNext-Befehls), aber selbst die trübste Dumpfbacke hätte wohl auch so gemerkt, dass er den Code erst für sich umschreiben muss.


  

Betrifft: AW: VBA Todesschleife im Forum entdeckt!! Piet von: Luschi
Geschrieben am: 27.01.2019 09:41:11

Hallo Piet,

was soll denn der Unsinn:
c.Select
MsgBox c.Value

- MsgBox c.Value - geht auch ohne c.Select
- in Do-Schleife und damit zur MsgBox kommt der Vba-Code überhaupt nicht
- wenn da '.Find(...) vor der Schleife keinen Wert findet
- das verhindert das anschließende: If Not c Is Nothing Then
- die Do Schleife ist nur für das Auswerten des 1. gefundenen Werte per .Find
- und das eventuell erforderliche Weitersuchen durch .FindNext
- wahrscheinlich hast Du Set c = .FindNext(c) nicht verstanden
- das ist der Auftrag zum Weitersuchen nach dem c-Range in Richtung Bereichsende
- wenn man aber in der Schleife landet, hat c schon einen gültigen gefundenen Wert

- und die Abfrage nach Not c Is Nothing am Schleifenende ist total überflüssig
- c selbst ist aber da entsprechende Zellenobjekt, in dem der Suchwert gefunden wurde

Seit es die Vba-Hilfe nur noch online gibt, ist die Qualität (Anzahl der Infos zum Problem)
sehr zurückgegangen. Wenn ich zu bei dieser Vba-Zeile 'Set c = .Find(2, lookin:=xlValues)' den Cursor in das Wörtchen 'Find' stelle und die F1-Taste drücke, lande ich hier:
WorksheetFunction.Find-Methode (Excel).
Bei anderen Eigenschaften/Methoden zu Range lande ich zur Hilfe eines Shape-Objektes
Also Piet, teste nochmals in Ruhe unseren kritisierten Code durch und urteile dann.

Gruß von Luschi
aus klein-Paris


  

Betrifft: AW: Daten aus Excelliste lesen von: Piet
Geschrieben am: 27.01.2019 21:18:53

Hallo

sollte ich zu heftig reagiert haben dann entschuldige ich mich bei euch beiden in aller Form.
Was mir aber Siedendheiss durch den Kopf ging war bei dem Code das veraendern von Daten durch c.Value =5

Viele Frage haben wenig Ahnung von VBA! Sie erkennen diese Tücke nicht als Gefahr! Wer das in einer Originaldatei mit 10.000 Daten testet kann bei der Menge nicht bemerken wenn nur einzelne Zellen beim Suchlauf vom Makro veraendert werden!

Es war mein Haupt Anliegen den Frager darauf hinzuweisen das dieses MS Beispiel in einer Originaldatei testen zu riskant ist!
Ich stehe auch dazu das mein VBA Wissen in keiner Weise eurem fundiertem Fachwissen entspricht.

mfg Piet