Mit VBA Zellen vergleichen, bei true in Tabelle 2 kopieren

Hallo,
wieder mal hänge ich im VBA.

Ich habe die Anzahl Zeilen ermittelt, kann aus der Spalte A (z.B 100000-020-235) das Mittelteil ermitteln = 020. Schleife läuft durch die Spalte A, Mittelteile werden in MSG Box angezeigt.
Knackpunkt: ist auskommentiert.
Habe Mittelteil als String Variable deklariert, nun bringt er in   IF Mittelteil = 23 then   den Fehler Typenunverträglichkeit (muss ich den String in Integer umwandeln?
will alle Zellen mit dem entsprechenden Mittelteil in Tabelle 2 kopieren. Momentan wird alles kopiert. Bitte um Hilfe, alle Mittelteile sind mit - umgeben. Vielen Dank schon mal.Sub Mittelteil_ausgeben()
Dim Zeile As Long, a As Long
Dim AnzZeilen As Integer
Dim Mittelteil() As String

'… Startwert setzen

a = 2
Zeile = 1
'… ermittle die Anzahl der Zeilen

AnzZeilen = Worksheets(„Tabelle1“).UsedRange.Rows.Count

With Worksheets(„Tabelle1“)
    For Zeile = 2 To AnzZeilen
    
    Mittelteil() = Split(.Cells(Zeile, 1), „-“)
    
       
    MsgBox "Der Mittelteil = " & Mittelteil(1)
    
                 
         
        'If Mittelteil = 23 Then
            
            
            Worksheets(„Tabelle1“).Rows(Zeile).Copy _
              Destination:=Worksheets(„Tabelle2“).Rows(a)
          
                    
             a = a + 1
      'Exit For
     ’ End If
      
      Next Zeile
      
End With

End Sub

Dim Mittelteil() As String

If Mittelteil = 23 Then --> string wird hier mit einer numerischen Zahl verglichen
Mit val() kannst du die ziffern im String in einen numerischen Wert wandeln

Probier mal if val(Mittelteil(1)) = 23 then

das array Mittelteil kannst du zudem nur mit index ansprechen wie in Zeile:   MsgBox "Der Mittelteil = " & Mittelteil(1)

Prüfe außerdem, ob in dem Array Mittelteil(x) alles so drin steht wie von dir gedacht.
for x = 0 to ubound(Mittelteil,1)
msgbox Mittelteil(x)
next x
Vermutlich steht der Mittelteil b deines Triplets a-b-c im index 1 deines Array: Mittelteil(1)

also wenn das programm schon sagt, typen sind unverträglich dann mussu wohl
den vergleich so machen das es auch typengleich ist

string = „bla bla bla“

also

varstring = „23“

Wenn Du die Variable Mittelteil als String deklarierst must Du auch die Zahl als String  vergleichen  Also „23“ benutzen

Hallo os2,

Mittelteil = Split(.Cells(Zeile, 1), „-“)
Mitteteil ist danach ein Array aus Strings.
Vergleich Mittelteil(1)=23 muß schiefgehen, Vergleich Mittelteil(1)=„23“ würde funktionieren wenn da „23“ der Mittelteil(1) wäre, isser aber nicht, der Mittelteil(1) ist gemäß deiner Anfrage wohl „023“.

Ergo, wie zumindest einmal gesagt
Vergleich val(Mittelteil(1))=23

Mein nachstehender Code funktioniert wenn deine Tabelle gemäß deiner Anfrage aufgebaut ist. Fehleingaben wie …-o23-… u.a. verzeiht er nicht. Sowas mußt du einbauen.
Gruß
Reinhard

Sub Mittelteil\_ausgeben()
Dim Zeile As Long, Mittelteil, a As Long
With Worksheets("Tabelle1")
 For Zeile = 2 To .UsedRange.Rows.Count
 Mittelteil = Split(.Cells(Zeile, 1), "-")
 If UBound(Mittelteil) = 2 Then
 If Val(Mittelteil(1)) = 23 Then
 .Rows(Zeile).Copy Destination:=Worksheets("Tabelle2").Rows(a + 2)
 a = a + 1
 End If
 End If
 Next Zeile
End With
End Sub

Hallo Reinhard,

vielen Dank für Deine Hilfe, funktioniert einwandfrei.
Die Befehle UBound und Val muss ich mir noch aus der Hilfe erarbeiten.
Vielen, vielen Dank os2

Vielen Dank für die schnelle Hilfe.

VG os2

Hallo TechPech,
vielen Dank
VG os2

Hallo Cylex,
Vielen Dank für die schnelle Hilfe.
Muss mir das nach in einer ruhigen Stunde reinziehen.
Weiter unten hat Reinhard ähnliches geschrieben.
Muss sagen toll wie man hier Hilfe erhält.
VG os2

Mein Suchkriterium war „-“ bei anderen ellenlangen Listen ist’s das Leerzeichen, nun habe ich Probleme.
Wie kann ich das Mittelteil (0023) aus 100200 0023 254 zwischen den Leerzeichen selektieren?
Was ich auch noch nicht genau rausbekommen habe: If UBound(Mittelteil) = 2 Then
–> was mach UBound aus dem Mittelteil.
Fall Sie lieber Experte noch mal ein Ohr für mich hätten.
Vielen Dank os2

Hallo Os2,

Mein Suchkriterium war „-“ bei anderen ellenlangen Listen
ist’s das Leerzeichen, nun habe ich Probleme.
Wie kann ich das Mittelteil (0023) aus 100200 0023 254
zwischen den Leerzeichen selektieren?

ersetz einfach in der Split-Codezeiler „-“ durch " "

Was ich auch noch nicht genau rausbekommen habe: If
UBound(Mittelteil) = 2 Then
–> was macht UBound aus dem Mittelteil.

Wenn du einen dreiteiligen Term wie im Code splittest hast du drei Teile, sie haben (normalerweise) die Indizes 0, 1 und 2.
UBound(Splitvariable) ergibt den höchsten Index, hier die 2
LBound(Splitvariable) ergibt den niedrigsten Index, hier die 0

Mit
If UBound(Mittelteil) = 2
prüfe ich nur ab ob der Term tatsächlich dreiteilig ist.
Hat was mit Fehlerabfangung zu tun, kannste weglassen wenn deine Zellenwerte alle koscher sind.

Fall Sie lieber Experte noch mal ein Ohr für mich hätten.

Nachstehend drei Codes. Code 1 und Code 2 sind in der Funktion wie der dir vorliegende Code, da ist das Ubound draußen und sie sind unterschiedlich lang codiert.
Code 3 kannst du für beide Listenarten benutzen, also für Trennzeichen „-“ und Trennzeichen Leerzeichen.

Der Code erkennt das selbstständig in dieser Zeile:
Trenner = IIf(InStr(.Cells(Zeile, 1), „-“) = 0, " ", „-“)
In deutsch übersetzt heißt der Code, Wenn in der Zelle kein „-“ zu finden ist dann ist der Trenner das Leerzeichen, andernfalls ist der Trenner das „-“

IIF ist die verkürzte Form für eine IF-ElseIf-Abfrage bei zwei Auswahlen.

Alle drei Codes sind ungetestet, meld dich mit Angabe der Codezeile und Fehlernr, Fehlerbez. usw wenn was passiert.

Gruß
Reinhard

Gruß
Reinhard

Option Explicit

Sub Mittelteil\_ausgeben1()
Dim Zeile As Long, Mittelteil, a As Long
With Worksheets("Tabelle1")
 For Zeile = 2 To .UsedRange.Rows.Count
 Mittelteil = Split(.Cells(Zeile, 1), "-")(1)
 If Val(Mittelteil(1)) = 23 Then
 .Rows(Zeile).Copy Destination:=Worksheets("Tabelle2").Rows(a + 2)
 a = a + 1
 End If
 Next Zeile
End With
End Sub

Sub Mittelteil\_ausgeben2()
Dim Zeile As Long, a As Long
With Worksheets("Tabelle1")
 For Zeile = 2 To .UsedRange.Rows.Count
 If Val(Split(.Cells(Zeile, 1), "-")(1)) = 23 Then
 .Rows(Zeile).Copy Destination:=Worksheets("Tabelle2").Rows(a + 2)
 a = a + 1
 End If
 Next Zeile
End With
End Sub

Sub Mittelteil\_ausgeben3()
Dim Zeile As Long, a As Long, Trenner As String
With Worksheets("Tabelle1")
 For Zeile = 2 To .UsedRange.Rows.Count
 Trenner = IIf(InStr(.Cells(Zeile, 1), "-") = 0, " ", "-")
 If Val(Split(.Cells(Zeile, 1), Trenner)(1)) = 23 Then
 .Rows(Zeile).Copy Destination:=Worksheets("Tabelle2").Rows(a + 2)
 a = a + 1
 End If
 Next Zeile
End With
End Sub

Hallo Reinhard,
sorry für das lange warten, habe Grippe.

Habe beim 1. Code: Mittelteil = Split(.Cells(Zeile, 1), „-“) '(1)
die 1 in Klammern auskommentiert läuft.
Code 2 und 3 laufen auch.
Code 3 mit Bindestrich - oder Leerzeichen
Vielen, vielen Dank.
Wie lernt man das, durch stetige Übung möglich?

Vielen Grüße

OS2