Thema Datum  Von Nutzer Rating
Antwort
Rot VBA - Continuous overwriting
21.06.2021 20:44:31 Yannick
Solved
21.06.2021 23:35:36 Gast45858
Solved

Ansicht des Beitrags:
Von:
Yannick
Datum:
21.06.2021 20:44:31
Views:
330
Rating: Antwort:
 Nein
Thema:
VBA - Continuous overwriting

Hallo zusammen,

es handelt sich um folgende Problemstellung:

Insgesamt existieren ca. 1000 verschiedene "customer_ids". Diese können in der Datei auf mehreren worksheets auch mehrmals auftreten.
Die Datensätze "customer_id" sollen automatisch mit einer neuen Bezeichnung überschrieben werden. Die Bezeichnung stellt ein Format aus einer festen Reihenfolge von Buchstaben + einer fortlaufend, aufsteigenden Zahl dar -> ABC1, ABC2, ..., ABCn. Siehe Abbildung links-oben.

Dabei kann sowohl der Name der Spalte, in denen sich die IDs befinden als auch deren Position auf den verschiedenen worksheets variieren. D.h. die "customer_id" findet sich auch als "cid" und "cust_id" auch in anderen Spalten als "A" wider. Vgl. Abbildungen.

Die wiederkehrenden customer_id's sollen auf allen worksheets dieselbe Bezeichnung haben, vgl. Abbildungen.
 

Die folgende Excel-Datei ist eine beispielhafte Darstellung:

Bisher habe ich die folgenden beiden Codes, mit denen ich es allerdings nicht realisieren kann auch die Datensätze zu editieren, die sich nicht in der Spalte "A" befinden. Außerdem werden die Einträge einer Spalte mit anderen Datensätzen, die sich in "A" befinden überschrieben.Das Ergebnis stelle ich in den Abbildungen unter dem Code vor.:

Option Explicit
  
Sub ChangeID()
   
    Const idBaseName As String = "ABC"
       
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    dict.CompareMode = vbTextCompare ' ignore case of 'idBaseName'
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim ws As Worksheet
    Dim rg As Range
    Dim cCell As Range
    Dim Key As Variant
    Dim lRow As Long
    Dim n As Long
    
    For Each ws In wb.Worksheets
        ' Only if the worksheet name starts with 'wsBaseName'
        ' and ignoring case ('TaBeLlE = Tabelle').
            lRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
            If lRow > 1 Then ' check if any id's
                Set rg = ws.Range("A2:A" & lRow)
                For Each cCell In rg.Cells
                    Key = CStr(cCell.Value)
                    If Not dict.Exists(Key) Then
                        n = n + 1
                        dict.Add Key, idBaseName & n
                    End If
                    cCell.Value = dict(Key)
                Next cCell
            End If
    Next ws
    
    MsgBox "Done.", vbInformation, "Change ID"
   
End Sub

Sub ChangeIDPart2()
  
    Const idBaseName As String = "ABC"
    Const ColNamesList As String = "cid, customer_id, ids, cust_id" ' add more
    Const HeaderRow As Long = 1
      
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
   
    Dim fRow As Long: fRow = HeaderRow + 1
   
    Dim ColNames() As String: ColNames = Split(ColNamesList, ",")
    Dim cUpper As Long: cUpper = UBound(ColNames)
   
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    dict.CompareMode = vbTextCompare ' ignore case of 'idBaseName'
   
    Dim ws As Worksheet ' Current Worksheet
    Dim rrg As Range ' Entire Row of Headers
    Dim rg As Range ' ID Column Range
    Dim cCell As Range ' Current Cell in ID Column Range
    Dim cIndex As Variant ' Current ID Column (could be an error value)
    Dim Key As Variant ' Current ID (string)
    Dim lRow As Long ' ID Column Last Non-Empty (Not Hidden) Row
    Dim n As Long ' New ID Incrementer
    Dim i As Long ' Column Names (Titles, Headers) Counter
    Dim foundHeader As Boolean ' Found Header Boolean
   
    For Each ws In wb.Worksheets
        ' Only if the worksheet name starts with 'wsBaseName'
        ' and ignoring case ('TaBeLlE = Tabelle').
            Set rrg = ws.Rows(HeaderRow)
            For i = 0 To cUpper
                cIndex = Application.Match(ColNames(i), rrg, 0)
                If IsNumeric(cIndex) Then
                    foundHeader = True
                    Exit For
                End If
            Next i
            If foundHeader Then
                foundHeader = False ' reset
                lRow = ws.Cells(ws.Rows.Count, cIndex).End(xlUp).Row
                If lRow > 1 Then ' check if any id's
                    Set rg = ws.Range(ws.Cells(fRow, cIndex), _
                        ws.Cells(lRow, cIndex))
                    For Each cCell In rg.Cells
                        Key = CStr(cCell.Value)
                        If Not dict.Exists(Key) Then
                            n = n + 1
                            dict.Add Key, idBaseName & n
                        End If
                        cCell.Value = dict(Key)
                    Next cCell
                End If
            End If
    Next ws
End Sub
    
    MsgBox "Done.", vbInformation, "Change ID Part 2"
   
End Sub


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot VBA - Continuous overwriting
21.06.2021 20:44:31 Yannick
Solved
21.06.2021 23:35:36 Gast45858
Solved