Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1780to1784
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

VBA Script umbauen - replace

VBA Script umbauen - replace
15.09.2020 13:44:37
Philip
Moin Zusammen,
ihr müsst bitte mir einmal Licht ans Fahrrad machen, ich bin etwas aufgeschmissen. Wir haben ein Script gebaut, welches in der Spalte 20 Werte überprüft und aus einer Mapping Tabelle ersetzt:
Sub SuchenErsetzen2()
Dim arName3 As Variant
Dim arName4 As Variant
Dim ii As Long
Dim lngSpalte2 As Long
With Sheets("Do-Not-Edit")
arName3 = .Range("F2:F" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
arName4 = .Range("H2:H" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value
End With
On Error Resume Next
lngSpalte2 = Columns(20).Column
On Error GoTo Ende
With Sheets("NSC")
If lngSpalte2 > 0 Then
For ii = LBound(arName3) To UBound(arName3)
.Columns(lngSpalte2).Replace arName3(ii, 1), arName4(ii, 1), xlWhole
Next
End If
End With
Exit Sub

Jetzt möchte ich aber nicht, dass er den Namen3 gegen den Namen4 ersetzt. Er soll stattdessen in Spalte 47 den Wert arName4 eintragen.
Hier weiß ich leider nicht wie ich vorgehen soll. Kann mir jemand hier helfen?
Vielen Dank!
VG
Philip

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Script umbauen - replace
15.09.2020 14:16:39
Nepumuk
Hallo Philip,
teste mal:
Public Sub SuchenErsetzen2()
    
    Dim avntName3 As Variant
    Dim avntName4 As Variant
    Dim ialngIndex As Long
    Dim strFirsAddress As String
    Dim objCell As Range
    
    On Error GoTo Ende
    
    With Worksheets("Do-Not-Edit")
        avntName3 = .Range("F2:F" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
        avntName4 = .Range("H2:H" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
    End With
    
    With Worksheets("NSC")
        For ialngIndex = LBound(avntName3) To UBound(avntName3)
            Set objCell = .Columns(20).Find(What:=avntName3(ialngIndex, 1), _
                LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
            If Not objCell Is Nothing Then
                strFirsAddress = objCell.Address
                Do
                    objCell.Offset(0, 27).Value = avntName4(ialngIndex, 1)
                    Set objCell = .Columns(20).FindNext(After:=objCell)
                Loop Until objCell.Address = strFirsAddress
                Set objCell = Nothing
            End If
        Next
    End With
    
    Exit Sub
    Ende:
    '?
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Script umbauen - replace
15.09.2020 14:21:47
Philip
Das funktioniert leider nicht.
AW: VBA Script umbauen - replace
15.09.2020 14:26:51
Philip
Moment, er rödelt wie bekloppt, aber es scheint zu funktion ieren.
Er arbeitet aber fast 30 Minuten.
VG
Philip
AW: VBA Script umbauen - replace
15.09.2020 14:31:22
Nepumuk
Hallo Philip,
30 Minuten? Du hast meine Antwort erst vor 10 Minuten bekommen. Wie viele Einträge hat den die Spalte A in der Tabelle "Do-Not-Edit"? Sind in dieser Tabelle in der Spalte F leere Zeilen?
Gruß
Nepumuk
AW: VBA Script umbauen - replace
15.09.2020 14:27:12
Nepumuk
Hallo Philip,
wie habe ich das zu verstehen. Ich habe deine Frage so verstanden:
Suche in Spalte 20 nach den Einträgen aus dem ersten Array und trage in Spalte 47 die korrespondierenden Werte aus dem zweiten Array ein.
Gruß
Nepumuk
Anzeige
AW: VBA Script umbauen - replace
15.09.2020 14:31:18
Philip
Ich melde mich gleich. Glaube im Script stand Zelle 27. Ändere das eben und teste es.
Danke Dir!
AW: VBA Script umbauen - replace
15.09.2020 14:33:21
max.kaffl@gmx.de
Hallo Philip,
nicht Zelle 27 sondern 27 Spalten von Spalte 20 entfernt. Das bedeutet nämlich Offset.
Gruß
Nepumuk
AW: VBA Script umbauen - replace
15.09.2020 14:35:51
Philip
Danke. Es funktionert :))))
AW: VBA Script umbauen - replace
15.09.2020 15:19:52
Philip
Eine kurze Frage habe ich noch.
Die Laufzeit des Skriptes ist ca. 20 Sekunden. Wenn ich das gleiche auf eine andere Spalte mache und nach anderen Kriterien Filter, dann läuft das binnen 2 Sekunden für 1000 Zeilen. Kann man das so begrenzen, dass er nur noch 1000 Zeilen sich ansieht in der Schleife?
Wäre das mit einer Eingrenzung der maximalen Werteanzahl für den Zähler möglich?
Vielen Dank!
Anzeige
AW: VBA Script umbauen - replace
15.09.2020 15:32:49
Nepumuk
Hallo Philip,
dann muss ich nochmal fragen, befinden sich in Tabelle "Do-Not-Edit" in Spalte F leere Zellen? Das würde nämlich die Laufzeit erklären. Dann findet die Find-Methode nämlich alle leeren Zeilen in Spalte 20 und das sind bei 1.000 Datenzeilen 1.047.576 Zellen.
Gruß
Nepumuk
AW: VBA Script umbauen - replace
15.09.2020 15:39:44
Philip
Nein leider nicht bewusst. Evtl. irgendwo dazwischen, sichtbar erstmal nicht.
AW: VBA Script umbauen - replace
15.09.2020 15:39:47
Philip
Nein leider nicht bewusst. Evtl. irgendwo dazwischen, sichtbar erstmal nicht.
AW: VBA Script umbauen - replace
15.09.2020 15:41:55
Philip
Habe noch einmal die Spalten neu angelegt - keine Veränderung.
Bin etwas ratlos.
VG
Philip
AW: VBA Script umbauen - replace
15.09.2020 15:45:41
Nepumuk
Hallo Philip,
dann weiß ich auch nicht woran es liegt. Versuch mal den Suchbereich der Find-Methode einzugrenzen:
Option Explicit

Public Sub SuchenErsetzen2()
    
    Dim avntName3 As Variant
    Dim avntName4 As Variant
    Dim ialngIndex As Long
    Dim strFirsAddress As String
    Dim objCell As Range
    
    On Error GoTo Ende
    
    With Worksheets("Do-Not-Edit")
        avntName3 = .Range("F2:F" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
        avntName4 = .Range("H2:H" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
    End With
    
    With Worksheets("NSC")
        With .Range(.Cells(1, 20), .Cells(.Rows.Count, 20).End(xlUp))
            For ialngIndex = LBound(avntName3) To UBound(avntName3)
                Set objCell = .Find(What:=avntName3(ialngIndex, 1), _
                    LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
                If Not objCell Is Nothing Then
                    strFirsAddress = objCell.Address
                    Do
                        objCell.Offset(0, 27).Value = avntName4(ialngIndex, 1)
                        Set objCell = .FindNext(After:=objCell)
                    Loop Until objCell.Address = strFirsAddress
                    Set objCell = Nothing
                End If
            Next
        End With
    End With
    
    Exit Sub
    Ende:
    '?
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Script umbauen - replace
15.09.2020 15:50:59
Philip
Funktioniert, bester Mann!
Vielen vielen Dank!
AW: VBA Script umbauen - replace
15.09.2020 16:37:20
Philip
Eine allerletzte Frage habe ich noch:
Wenn ich nun noch prüfen möchte, dass in Spalte 20 ein Wert steht, der nicht in unter F2:F steht, dann soll er eine Fehlermeldung bringen, dass in Zeile XY ein Fehler ist. Wenn gar nichts drin steht, dann ist das zu ignorieren.
Vielen Dank :*
AW: VBA Script umbauen - replace
15.09.2020 17:19:32
Nepumuk
Hallo Philip,
teste mal:
Option Explicit

Public Sub SuchenErsetzen2()
    
    Dim avntName3 As Variant
    Dim avntName4 As Variant
    Dim avntValues As Variant
    Dim ialngIndex As Long
    Dim strFirsAddress As String
    Dim objCell As Range
    Dim objDictionary As Object
    
    On Error GoTo Ende
    
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    
    With Worksheets("Do-Not-Edit")
        avntName3 = .Range("F2:F" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
        avntName4 = .Range("H2:H" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
    End With
    
    With Worksheets("NSC")
        With .Range(.Cells(1, 20), .Cells(.Rows.Count, 20).End(xlUp))
            For ialngIndex = LBound(avntName3) To UBound(avntName3)
                objDictionary.Item(Key:=avntName3(ialngIndex, 1)) = vbNullString
                Set objCell = .Find(What:=avntName3(ialngIndex, 1), _
                    LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
                If Not objCell Is Nothing Then
                    strFirsAddress = objCell.Address
                    Do
                        objCell.Offset(0, 27).Value = avntName4(ialngIndex, 1)
                        Set objCell = .FindNext(After:=objCell)
                    Loop Until objCell.Address = strFirsAddress
                    Set objCell = Nothing
                End If
            Next
            avntValues = .Value
            For ialngIndex = LBound(avntValues) To UBound(avntValues)
                If Not objDictionary.Exists(Key:=avntValues(ialngIndex, 1)) Then _
                    Call MsgBox("Fehler in Zeile " & CStr(ialngIndex), vbCritical, "Falsche Eintrag")
            Next
            Set objDictionary = Nothing
        End With
    End With
    
    Exit Sub
    Ende:
    '?
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Script umbauen - replace
15.09.2020 17:22:36
Nepumuk
Ooooooops,
die leeren Zellen ausschließen habe ich vergessen.
Option Explicit

Public Sub SuchenErsetzen2()
    
    Dim avntName3 As Variant
    Dim avntName4 As Variant
    Dim avntValues As Variant
    Dim ialngIndex As Long
    Dim strFirsAddress As String
    Dim objCell As Range
    Dim objDictionary As Object
    
    On Error GoTo Ende
    
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    
    With Worksheets("Do-Not-Edit")
        avntName3 = .Range("F2:F" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
        avntName4 = .Range("H2:H" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
    End With
    
    With Worksheets("NSC")
        With .Range(.Cells(1, 20), .Cells(.Rows.Count, 20).End(xlUp))
            For ialngIndex = LBound(avntName3) To UBound(avntName3)
                objDictionary.Item(Key:=avntName3(ialngIndex, 1)) = vbNullString
                Set objCell = .Find(What:=avntName3(ialngIndex, 1), _
                    LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
                If Not objCell Is Nothing Then
                    strFirsAddress = objCell.Address
                    Do
                        objCell.Offset(0, 27).Value = avntName4(ialngIndex, 1)
                        Set objCell = .FindNext(After:=objCell)
                    Loop Until objCell.Address = strFirsAddress
                    Set objCell = Nothing
                End If
            Next
            avntValues = .Value
            For ialngIndex = LBound(avntValues) To UBound(avntValues)
                If Not IsEmpty(avntValues(ialngIndex, 1)) Then _
                    If Not objDictionary.Exists(Key:=avntValues(ialngIndex, 1)) Then _
                    Call MsgBox("Fehler in Zeile " & CStr(ialngIndex), vbCritical, "Falsche Eintrag")
            Next
            Set objDictionary = Nothing
        End With
    End With
    
    Exit Sub
    Ende:
    '?
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Script umbauen - replace
15.09.2020 17:31:25
Philip
Vielen Dank. Aktuell sagt er immer, dass er in Zeile 1 einen Fehler hat. Er muss praktisch ja bei 2 starten, da 1 die Überschrift ist. Trage ich in Zeile 1 einen richtigen Wert ein, spukt er es aus.
AW: VBA Script umbauen - replace
15.09.2020 17:35:41
Nepumuk
Hallo Philip,
das kommt wenn man wichtige Informationen zurückhält.
Option Explicit

Public Sub SuchenErsetzen2()
    
    Dim avntName3 As Variant
    Dim avntName4 As Variant
    Dim avntValues As Variant
    Dim ialngIndex As Long
    Dim strFirsAddress As String
    Dim objCell As Range
    Dim objDictionary As Object
    
    On Error GoTo Ende
    
    Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
    
    With Worksheets("Do-Not-Edit")
        avntName3 = .Range("F2:F" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
        avntName4 = .Range("H2:H" & CStr(.Cells(.Rows.Count, 1).End(xlUp).Row)).Value
    End With
    
    With Worksheets("NSC")
        With .Range(.Cells(2, 20), .Cells(.Rows.Count, 20).End(xlUp))
            For ialngIndex = LBound(avntName3) To UBound(avntName3)
                objDictionary.Item(Key:=avntName3(ialngIndex, 1)) = vbNullString
                Set objCell = .Find(What:=avntName3(ialngIndex, 1), _
                    LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
                If Not objCell Is Nothing Then
                    strFirsAddress = objCell.Address
                    Do
                        objCell.Offset(0, 27).Value = avntName4(ialngIndex, 1)
                        Set objCell = .FindNext(After:=objCell)
                    Loop Until objCell.Address = strFirsAddress
                    Set objCell = Nothing
                End If
            Next
            avntValues = .Value
            For ialngIndex = LBound(avntValues) To UBound(avntValues)
                If Not IsEmpty(avntValues(ialngIndex, 1)) Then _
                    If Not objDictionary.Exists(Key:=avntValues(ialngIndex, 1)) Then _
                    Call MsgBox("Fehler in Zeile " & CStr(ialngIndex + 1), vbCritical, "Falsche Eintrag")
            Next
            Set objDictionary = Nothing
        End With
    End With
    
    Exit Sub
    Ende:
    '?
End Sub

Gruß
Nepumuk
Anzeige
AW: VBA Script umbauen - replace
15.09.2020 17:40:37
Philip
Hast du vollkommen Recht. Ich bin sehr beeindruckt von deiner Hilfsbereitschaft. Wahnsinnig.
Der absolute Hammer, funktioniert prima!
Hab einen schönen Abend!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige