Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1060to1064
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
Inhaltsverzeichnis

Makro korrigieren

Makro korrigieren
24.03.2009 11:31:22
mehmet
Hallo zusammen,
Tino war so nett und hatte mir das Makro zur Verfügung gestellt:

Sub markiere_G20_G31()
'G20-G30 in blau+fett und G31-G99 rot+fett
Sheets("WX").Select
Dim lngSt As Long
Dim rZelle As Range
Dim strTemp As String
Dim SuchWert As String
For Each rZelle In Range("c3:c100")
If rZelle  "" Then
With rZelle
'G20-G30
If InStr(.Value, "G") > 0 Then SuchWert = "G" Else SuchWert = ""
If InStr(.Value, SuchWert) > 0 And SuchWert > "" Then
strTemp = Right$(.Value, Len(.Value) - InStr(.Value, SuchWert) + 3)
strTemp = Left$(strTemp, 2)
If IsNumeric(strTemp) Then
If strTemp >= 20 Then
lngSt = InStr(.Value, strTemp & SuchWert)
.Characters(start:=lngSt, Length:=Len(SuchWert & strTemp)).Font.ColorIndex = 5
.Characters(start:=lngSt, Length:=Len(SuchWert & strTemp)).Font.FontStyle = "Fett"
End If
End If
End If
'G31-G99
If InStr(.Value, "G") > 0 Then SuchWert = "G" Else SuchWert = ""
If InStr(.Value, SuchWert) > 0 And SuchWert > "" Then
strTemp = Right$(.Value, Len(.Value) - InStr(.Value, SuchWert) + 3)
strTemp = Left$(strTemp, 2)
If IsNumeric(strTemp) Then
If strTemp >= 31 Then
lngSt = InStr(.Value, strTemp & SuchWert)
.Characters(start:=lngSt, Length:=Len(SuchWert & strTemp)).Font.ColorIndex = 3
.Characters(start:=lngSt, Length:=Len(SuchWert & strTemp)).Font.FontStyle = "Fett"
End If
End If
End If
End With
End If
Next rZelle
Range("A1").Select
End Sub


Ich habe natürlich - so kreativ wie ich bin, das Makro "versucht" anzupassen.
Es soll in C3:C100 gesucht werden.
Beispiel steht in C3:
SDF45SDF FDA45GDF DFGH 5455421GT SDFE85G8H 5DFG35K54 RETZZ54RT 54HGJ43GFGH
Die fett markierte Stellen sollen je nach grösse farblich markiert werden.
Im Makro werden nur die erste Fundstelle markiert, weitere nicht mehr.
Dank und Gruss
mehmet

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro korrigieren
24.03.2009 15:24:38
Heinz
Hi,
nach welcher Regel soll markiert werden?
mfg Heinz
AW: Makro korrigieren
24.03.2009 15:54:21
mehmet
Hallo Heinz,
in Spalte C3:C100 stehen Strings.
Markiert sollen alle Strings, die so aufgebaut sind:
2 Zahlen Buchstabe G
Wenn 20G bis Zahlenwert 30G, dann in blau+fett.
Wenn 31G bis Zahlenwert 99G, dann in rot+fett.
Diese koennen mehrmals vorkommen in einer Zelle.
Heinz, koenntest Du es auch kommentieren zwecks Verstaendnis.
Herzlichen Dank im Voraus
Gruss
mehmet
AW: Makro korrigieren
24.03.2009 17:37:02
fcs
Hallo Mehmet,
hier dein Makro "etwas" angepasst, so dass Wiederholungen im Text, die Kriterien erfüllen, markiert werden.
Gruß
Franz

Sub markiere_G20_G31()
'G20-G30 in blau+fett und G31-G99 rot+fett
Sheets("WX").Select
Dim lngPos As Long
Dim rZelle As Range
Application.ScreenUpdating = True
For Each rZelle In Range("c3:c100")
With rZelle
If .Value  "" And InStr(1, .Value, "G") > 0 Then
'Font zurücksetzen
.Font.ColorIndex = xlColorIndexAutomatic 'schwarz
.Font.Bold = False
For lngPos = 1 To Len(.Value)
'Prüfen, ob "G" an Position
If Mid(.Value, lngPos, 1) = "G" Then
'Text (2 Zeichen) links vom G prüfen
If lngPos >= 3 Then
If IsNumeric(Mid(.Value, lngPos - 2, 2)) Then
'Markierungsroutine aufrufen
Call Markieren(Zelle:=rZelle, Wert:=Val(Mid(.Value, lngPos - 2, 2)), _
lngStart:=lngPos - 2)
End If
End If
'Text (2 Zeichen) rechts vom G prüfen
If lngPos = 20 And Wert = 31 And Wert 


Anzeige
es funktioniert, Danke schoen. o.T.
24.03.2009 18:53:59
mehmet
.
AW: es funktioniert, Danke schoen. o.T.
25.03.2009 00:58:35
mehmet
Hallo Franz,
Hallo zusammen,
ich habe es versucht auch mit KT zu machen statt G:
Geht aber nicht:

Private Sub Markiere_KT20_KT31()
'KT20-KT30 in blau+fett und KT31-KT99 rot+fett
Sheets("WX").Select
Dim lngPos As Long
Dim rZelle As Range
Application.ScreenUpdating = True
For Each rZelle In Range("c3:c100")
With rZelle
If .Value  "" And InStr(1, .Value, "KT") > 0 Then
'''''      'Font zurücksetzen
'''''      .Font.ColorIndex = xlColorIndexAutomatic 'schwarz
'''''      .Font.Bold = False
For lngPos = 1 To Len(.Value)
'Prüfen, ob "G" an Position
If Mid(.Value, lngPos, 1) = "KT" Then
'Text (2 Zeichen) links vom G prüfen
If lngPos >= 3 Then
If IsNumeric(Mid(.Value, lngPos - 2, 2)) Then
'Markierungsroutine aufrufen
Call Markieren(Zelle:=rZelle, Wert:=Val(Mid(.Value, lngPos - 2, 2)), _
lngStart:=lngPos - 2)
End If
End If
'''''          'Text (2 Zeichen) rechts vom G prüfen
'''''          If lngPos 



Sub Markieren(Zelle As Range, Wert As Double, lngStart As Long)
'Subroutine zum markieren der 3 Zeichen
Dim Farbe As Long, Fett As Boolean
'Farbe(n) gemäß Wertebereich setzen
'KT20-KT30 in blau+fett und KT31-KT99 rot+fett
If Wert >= 20 And Wert = 31 And Wert 


Dank und Gruss
mehmet

Anzeige
AW: es funktioniert, Danke schoen. o.T.
25.03.2009 10:10:55
Tino
Hallo,
versuche es mal so.
Für G
Sub Markieren()
Dim Bereich As Range
Dim objRegEx As Object, objMatch As Object
Dim i As Integer, iColor As Integer
Dim LRow As Long
Set objRegEx = CreateObject("VBScript.RegExp")

With objRegEx
 .IgnoreCase = False 'Groß u. Kleinschreibung nicht beachten, sonst False 
 .MultiLine = True
 .Global = True
 .Pattern = "[0-9]{2,2}[G]{1,1}|[G]{1,1}[0-9]{2,2}" 'Suchbegriffe durch | trennen 
End With

LRow = IIf(IsEmpty(Cells(100, 3)), Cells(100, 3).End(xlUp).Row, 100)
Set Bereich = Range("C3:C" & LRow) 'Suchbereich 

Application.ScreenUpdating = False
    With Bereich.Font
     .Bold = False
     .ColorIndex = xlAutomatic
    End With
    
    For Each Bereich In Bereich
     If Bereich <> "" Then
        
        Set objMatch = objRegEx.Execute(Bereich.Text)
        
        For i = 0 To objMatch.Count - 1
           With Bereich.Characters(objMatch(i).FirstIndex + 1, Len(objMatch(i)))
            
            Select Case Replace(objMatch(i), "G", "") * 1
             Case Is < "31": iColor = 5
             Case Is < "100": iColor = 3
             Case Else: iColor = xlAutomatic
            End Select
            
            .Font.ColorIndex = iColor
            .Font.Bold = True
           End With
        Next i
        
     
     End If
    Next Bereich

Application.ScreenUpdating = True
Set objMatch = Nothing: Set objRegEx = Nothing
End Sub


Für KT

Sub Markieren()
Dim Bereich As Range
Dim objRegEx As Object, objMatch As Object
Dim i As Integer, iColor As Integer
Dim LRow As Long
Set objRegEx = CreateObject("VBScript.RegExp")

With objRegEx
 .IgnoreCase = False 'Groß u. Kleinschreibung nicht beachten, sonst False 
 .MultiLine = True
 .Global = True
 .Pattern = "[0-9]{2,2}[KT]{2,2}|[KT]{2,2}[0-9]{2,2}" 'Suchbegriffe durch | trennen 
End With

LRow = IIf(IsEmpty(Cells(100, 3)), Cells(100, 3).End(xlUp).Row, 100)
Set Bereich = Range("C3:C" & LRow) 'Suchbereich 

Application.ScreenUpdating = False
    With Bereich.Font
     .Bold = False
     .ColorIndex = xlAutomatic
    End With
    
    For Each Bereich In Bereich
     If Bereich <> "" Then
        
        Set objMatch = objRegEx.Execute(Bereich.Text)
        
        For i = 0 To objMatch.Count - 1
           With Bereich.Characters(objMatch(i).FirstIndex + 1, Len(objMatch(i)))
            
            Select Case Replace(objMatch(i), "KT", "") * 1
             Case Is < "31": iColor = 5
             Case Is < "100": iColor = 3
             Case Else: iColor = xlAutomatic
            End Select
            
            .Font.ColorIndex = iColor
            .Font.Bold = True
           End With
        Next i
        
     
     End If
    Next Bereich

Application.ScreenUpdating = True
Set objMatch = Nothing: Set objRegEx = Nothing
End Sub


Gruß Tino

Anzeige
* 1 kann kann raus, geht auch ohne oT.
25.03.2009 10:22:03
Tino
AW: es funktioniert, Danke schoen. o.T.
25.03.2009 13:38:31
fcs
Hallo Mehmet,
wenn du die Routine für verschiedene Buchstabenstaben ausführen willst, dann sollten die Routinen etwas anders aufgebaut werden.
Gruß
Franz

Private Sub Markiere_KT20_KT31()
'KT20-KT30 in blau+fett und KT31-KT99 rot+fett
Dim rZelle As Range, strSuch As String
Sheets("WX").Select
Application.ScreenUpdating = True
strSuch = "KT"
For Each rZelle In Range("c3:c100")
With rZelle
If .Value  "" And InStr(1, .Value, strSuch) > 0 Then
.Font.Bold = False
.Font.ColorIndex = xlColorIndexAutomatic
Call Markiere_String_Nr_Links(rngZelle:=rZelle, SuchText:=strSuch, _
AnzZiffern:=2)
'        Call Markiere_String_Nr_Rechts(rngZelle:=rZelle, SuchText:=strSuch, _
AnzZiffern:=2)
End If
End With
Next rZelle
Application.ScreenUpdating = False
Range("A1").Select
End Sub
Sub Markiere_String_Nr_Links(rngZelle As Range, SuchText As String, _
AnzZiffern As Long)
'Sucht Text im Zellinhalt und markiert wenn Zahl links vom Text im Bereich
Dim lngPos As Long
Dim Farbe As Long, Fett As Boolean
Dim Wert As Double, lngStart As Long, Anzahl As Long
With rngZelle
For lngPos = 1 To Len(.Value)
'Prüfen, ob Suchtext an Position
If Mid(.Value, lngPos, Len(SuchText)) = SuchText Then
If lngPos >= AnzZiffern + Len(SuchText) Then
If IsNumeric(Mid(.Value, lngPos - AnzZiffern, AnzZiffern)) Then
Wert = Val(Mid(.Value, lngPos - AnzZiffern, AnzZiffern))
lngStart = lngPos - AnzZiffern
Anzahl = AnzZiffern + Len(SuchText)
'Farbe(n) gemäß Wertebereich setzen
If Wert >= 20 And Wert = 31 And Wert = 20 And Wert = 31 And Wert 


Anzeige
AW: es funktioniert, Danke schoen. o.T.
25.03.2009 20:28:21
mehmet
Wunderbar Franz
Herzlichen Dank
Gruss
mehmet
AW: es funktioniert, Danke schoen. o.T.
25.03.2009 23:12:20
Tino
Hallo,
Du kannst in meinem Beispiel auch beide Bedingungen im Regulären Ausdruck kombinieren.
Weil Du sehr oft mit solchen Markierungen arbeitest, würde ich mich an Deiner stelle sowieso mal näher mit RegExp befassen, einen Beispiellink habe ich Dir schon mal gegeben,
über Google findest Du noch jede menge Lektüre zu diesem Thema.
Beispiel zur Kombination.
Sub Markieren()
Dim Bereich As Range
Dim objRegEx As Object, objMatch As Object
Dim i As Integer, iColor As Integer
Dim LRow As Long
Set objRegEx = CreateObject("VBScript.RegExp")

With objRegEx
 .IgnoreCase = False 'Groß u. Kleinschreibung nicht beachten, sonst False 
 .MultiLine = True
 .Global = True
 .Pattern = "[0-9]{2,2}[G]|[G][0-9]{2,2}|[0-9]{2,2}[KT]{2,2}|[KT]{2,2}[0-9]{2,2}" 'Suchbegriffe durch | trennen 
End With

LRow = IIf(IsEmpty(Cells(100, 3)), Cells(100, 3).End(xlUp).Row, 100)
Set Bereich = Range("C3:C" & LRow) 'Suchbereich 

Application.ScreenUpdating = False
    With Bereich.Font
     .Bold = False
     .ColorIndex = xlAutomatic
    End With
    
    For Each Bereich In Bereich
     If Bereich <> "" Then
        
        Set objMatch = objRegEx.Execute(Bereich.Text)
        
        For i = 0 To objMatch.Count - 1
           With Bereich.Characters(objMatch(i).FirstIndex + 1, Len(objMatch(i)))
            
            Select Case Replace(Replace(objMatch(i), "KT", ""), "G", "") * 1
             Case Is < "31": iColor = 5
             Case Is < "100": iColor = 3
             Case Else: iColor = xlAutomatic
            End Select
            
            .Font.ColorIndex = iColor
            .Font.Bold = True
           End With
        Next i
        
     
     End If
    Next Bereich

Application.ScreenUpdating = True
Set objMatch = Nothing: Set objRegEx = Nothing
End Sub


Gruß Tino

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige