Zahlen in Excelzelle vergleichen

matzee

Keks? ツ
ID: 44426
L
25 April 2006
4.546
228
Hallo liebe Proggys,

ich bin gerade dabei eine Auswertung von einer Telefonliste mittels VBA-Makros in Excel zu proggen und scheitere gerade an einem Punkt.

Ich habe viele Telefonnummer aus dem Ausland gemischt mit Telefonnummer aus dem Innland.
Nun möchte ich mittels den Vorwahlen der jeweiligen Länder die ausländischen Telefonnummern filtern, damit ich diese nur noch in meiner Exceltabelle habe.

Würde dies mit einer For-Schleife inkl IF-Anweisungen, wo die einzelnen Vorwahlen abgeprüft werden, alle inländischen Nummern rausschmeißen aus dem Excel-Sheet.

Beispiel:

Telefnummern:
009012469
009057987
004854897
004940879
6497

0090 = Vorwahl Türkei
0048 = Vorwahl Polen
0049 = Vowahl Deutschland
6497 = irgendeine Interne Durchwahl

Die Interne Durchwahl + Deutsche Nummer sollen gelöscht werden.

So stelle ich es mir vor:
Gehe die Zelle 1 bis 65000 durch,
WENN Vorwahl Türkei,
DANN prüfe ob Vorwahl Russland,
DANN prüfe ob Vorwahl ...,
SONST lösche Spalte


Mein Problem ist, dass nicht weiss, wie ich die Vorwahlen in der Zelle überprüfen kann.

Ich hoffe mir kann einer helfen dabei!

Vielen Dank schonmal
 
ich würde einen anderen Ansatz wählen:

wobei ich davon ausgehe, dass die Telefonnummern als Text gespeichert sind und nicht als Zahl ( sonst würden ja die führenden Nullen der Vorwahl nicht angezeigt ).

Alles was mit 0049 beginnt ist Deutschland.
Alles was nicht mit einer 0 beginnt ist Deutschland
Alles andere ist Nicht-Deutschland.

Jetzt suchst Du Dir einfach eine freie Spalte in Deiner Excel-tabelle und schreibst als Formel rein:

=WENN(LINKS(A1;4)="0049";1;WENN(LINKS(A1;1)="0";0;1))

( wenn die Telefonnummer in Spalte A steht )
und ziehst das ganze entsprechend nach unten.

Dann hast Du für jede Telefonnummer aus Deutschland durch die Formel eine 1 und für alle anderen Telefonnummern eine 0.
Jetzt nur noch nach dieser neuen Spalte sortieren dann stehen alle 1 direkt untereinander und alle können auf einen Schlag gelöscht werden.


Oder einfach so nach Tel-nummer sortieren und alle 0049 rausschmeissen und alles >=1 rausschmeissen
 
Zuletzt bearbeitet:
InStr() oder - hier besser, da Telefonnummern immer am Anfang stehen - Left(). Beachte bei der Verwendung von Left(), dass du erst mit Len() guckst, ob überhaupt so viele Zeichen da sind.
Code:
foo = Left("bar", 6)
gibt einen Fehler.
 
Hallo,

Mach einfach ein case auf die ersten 4 Stellen "left(Text,4)" und gehe halt die Vorwahlen durch.
Oder Du schaust per if ob bei "left (Text,2) ob da "00" steht, dann weißt Du, ob es im Ausland ist.


Du musst das regelmäßiger machen? Excel bietet ja auch Boardmittel für solche Sachen - VBA ist da nicht unbedingt nötig.
 
erstmal vielen Dank für Eure schnellen Antworten :)

Hallo,

Mach einfach ein case auf die ersten 4 Stellen "left(Text,4)" und gehe halt die Vorwahlen durch.
Werd es mit dem Case-Befehl probieren, scheint mir am sinnvollsten.

Du musst das regelmäßiger machen? Excel bietet ja auch Boardmittel für solche sachen - VBA ist da nicht unbedingt nötig.

Hätte es gerne "selbst geschrieben" in VBA ;)

Werds mal ausprobieren und dann nochmal posten.
 
Mein Makro macht nun was, es sieht auch so aus, als wenn er die Ausländischen Nummern stehen lässt.
Bloß es bleiben auch viele Interne nummern stehen.
Und wenn ich das Makro mehrmals ausführe, werden auch einige ausländische Nummern gelöscht :(

Hab jetzt folgendes geschrieben:

Code:
Sub ausland2()

Dim zeile As String
Dim nummer As Integer
'nummer ist Zeile

For i = 1 To 65000
    zaehler = i + 1
    
    If Range("H" & zaehler).Value = "" Then
        GoTo Ende
    
    Else
    
    Select Case auslandsvorwahl
        Case 1
            Left(Range("H" & zaehler), 4) = "0048"
        
        Case 2
            Left(Range("H" & zaehler), 5) = "00420"
        
        Case 3
            Left(Range("H" & zaehler), 3) = "007"
        
        Case 4
            Left(Range("H" & zaehler), 4) = "0090"
        
        Case 5
            Left(Range("H" & zaehler), 5) = "00370"
       
        Case 6
            Left(Range("H" & zaehler), 5) = "00380"
        
        Case 7
            Left(Range("H" & zaehler), 4) = "0040"
        
        Case 8
            Left(Range("H" & zaehler), 4) = "0036"
        
        Case 9
            Left(Range("H" & zaehler), 4) = "0043"
            
        Case 10
            Left(Range("H" & zaehler), 5) = "00381"
            
        Case Else
            zeile = zaehler & ":" & zaehler
            Rows(zeile).Select
            Selection.Delete Shift:=xlUp
    
    
    End Select
    
    
    End If
    
    Next i
       

Ende:

End Sub
 
In einer For schleife wird die Zählervariable automatisch erhöht. Die brauchst Du nicht noch einmal erhöhen. Ich denke das ist der Fehler.

Ich würde aber statt der For-Schleife und dem Goto es anders machen und eine while-schleife nutzen,


Code:
	i=1
	while (cells(i,x)<>"") 
		 ' code
		i=i+1
	wend
 
Sorry ich war gerade total falsch und hab Unsinn geschrieben. :roll:

So ist das schon richtig, wenn Du mit for arbeiten möchtest. Könntest aber auch statt "Zaehler" gleich mit i arbeiten.

Dein case ist falsch

Code:
wert = Range("H" & zaehler).Value
    
    Select Case wert 
        Case "": goto end        
        Case "0048":
        Case  "00420":
        ' ....
        Case Else:
            zeile = zaehler & ":" & zaehler
            Rows(zeile).Select
            Selection.Delete Shift:=xlUp
     end select

Schöner als wert = Range("H" & zaehler).Value finde ich persänlich aber cells(8, zaehler).value.
 
Code:
wert = Range("H" & zaehler).Value
    
    Select Case wert 
        Case "": goto end        
        Case "0048":
        Case  "00420":
        ' ....
        Case Else:
            zeile = zaehler & ":" & zaehler
            Rows(zeile).Select
            Selection.Delete Shift:=xlUp
     end select

Aber ich muss doch in meinem Case fall Left() berücksichtigen, da die Telefonnummern ja nicht nur aus den ersten 4 Buchstaben bestehen, sondern aus mehreren Nummern.
 
EDIT:

Ich habe meinen Fehler gefunden.

Das Problem ist, dass er immer einen Wert dazuzählt und zu erst bei H1, dann H2, H3 etc... ist.

Wenn er nun aber eine Zelle löscht, verschiebt sich alles und er hat einen Falschen Wert bei der CASE-Anweisung, sodass ein falscher vergleich ist.

Wie kann ich ihn richtig zählen lassen? ^^
 
Aber ich muss doch in meinem Case fall Left() berücksichtigen
Ich bin heute etwas neben der Spur. :yawn: Sorry.


Wenn Du eine Zeile löscht, mach doch einfach ein "i=i-1". Anschließend zählt er beim for wieder hoch und er geht die gleiche Zeile (nun aber mit anderem Inhalt) wieder neu durch.
 
Wenn Du eine Zeile löscht, mach doch einfach ein "i=i-1". Anschließend zählt er beim for wieder hoch und er geht die gleiche Zeile (nun aber mit anderem Inhalt) wieder neu durch.

aber muss ich dafür nicht wissen, wann eine Zeile gelöscht wird?
Und das weiss ich ja vorher nicht.

Ansonsten wäre es super, wenn posten könntest, wo ich das einbauen soll.

Eigentlich funktioniert es ja, nur diese Fehler muss noch raus :)
 
Da wo Du sie löschst

Case Else
zeile = zaehler & ":" & zaehler
Rows(zeile).Select
Selection.Delete Shift:=xlUp
' Zähler um eines zurücksetzen, da eine zeile gelöscht wurde
i+i-1
end select
 
Da wo Du sie löschst

Case Else
zeile = zaehler & ":" & zaehler
Rows(zeile).Select
Selection.Delete Shift:=xlUp
' Zähler um eines zurücksetzen, da eine zeile gelöscht wurde
i+i-1
end select

jetzt löscht er aber alle Spalten...8O

da muss dann noch was mit dem Case falsch sein.

Aber er benutzt nun nach Löschung den richtigen Wert!
 
Zuletzt bearbeitet:
da muss dann noch was mit dem Case falsch sein.
Ja, sagte ich ja.

Das mit den Unterschiedlichen Längen hatte ich nicht bedacht, als ich case vorgeschlagen habe.

Also entweder machst Du verschiedene cases - das machts aber unsinnig.

Wenn es nur wenige Vorwahlen sind, würde ich sie per If abfrage abfragen

also
Code:
       if (left(text,4)="0049" _
       or left(text,5)="00481" Then
              'delete
       end if

Oder du schreibst alle Vorwahlen die Du abfragen möchtest in ein Array
vorwahlLöschenArray =Array ("0049", "00481", ..)

Und machst dann in der For-Schleife ein foreach über das array (inArray oder sowas gibt es von Haus aus nicht - kannst aber mal hier schauen https://www.codetoad.com/vb_array_without_loop.asp ).
 
Probier das mal: ( Basierend, dass die Nummern in Spalte C stehen )

PHP:
Private Sub CommandButton1_Click()
For i = 1 To 99999
  If Cells(i, 3) = "" Then GoTo ende
  If Left(Replace(Cells(i, 3).Value, "0049", "1"), 2) = "00" Then GoTo ite
    Rows(i).Select
  Selection.Delete
  i = i - 1
ite:
Next i
 
ende:
 End Sub
 
@transversalis:
Vielen Dank! Funktioniert ganz gut. - Jedoch habe ich auch Handynummern drinn, die raus müssen und da es viele unterschiedliche Vorwaheln bei Handynummern gibt, muss ich die Variante andersrum machen als deine.
Sprich nach den bekannten Nummern Filtern.
Ich werde es mal mit der If-Mehrfachverzweigung mal probieren.

Falls es klappt, poste ich natürlich den Programmcode. Vielleicht hat ja jemand auch mal so ein Prob ;)
 
Mein Code sollte eigentlich auch alle Handynummern und Nummern mit nur-Ortsvorwahl löschen und nur internationale Nummern drin lassen