Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Makro um Zeilen mit gleichem Inhalt zu kopieren

Makro um Zeilen mit gleichem Inhalt zu kopieren
christian
Hallo,
vielleicht kann mir jemand von euch helfen....
Ich habe eine Ausgangstabelle mit verschiedenen Produktnummern in Spalte A und unterschiedlichen
anderen Informationen in den Spalten B-U. Die Daten in dieser Tabelle habe ich sortiert, so dass in Spalte
A alle gleichen Produkte untereinander stehen.
Jetzt möchte ich versuchen, mithilfe eines Makros immer für gleiche Produkte die gesamten Zeilen zu markieren, zu kopieren und in ein neues Tabellenblatt einzufügen. Also z.B. Zeilen A1-A25 enthalten das
gleiche Produkt, also kopiere ich diese Zeilen und paste sie in ein neues Tabellenblatt.
Die Zielen A26-A40 enthalten wieder die gleiche Produktbezeichnung und ich kopiere sie wieder in ein neues Tabellenblatt usw.
Geht sowas?
Für Hilfe wäre ich dankbar, da ich vor einem Berg an Daten stehe....
mfg christian
Anzeige
AW: Makro um Zeilen mit gleichem Inhalt zu kopieren
15.10.2009 18:56:31
christian
kennt niemand einen Ansatz zur Lösung?
mfg christian
AW: Makro um Zeilen mit gleichem Inhalt zu kopieren
15.10.2009 19:00:11
robert
hi,
der berg wird dadurch aber noch größer :-)
..genügt nicht der filter ?
bzw. beschreibe wozu du eigene blätter brauchst
gruß
robert
AW: Makro um Zeilen mit gleichem Inhalt zu kopieren
15.10.2009 19:43:18
christian
die eigenen blätter brauche ich, um sie an verschiedene Personen zu verteilen.
Mit filter wäre es sehr manuell, ich müsste über 70 verschiedene Produkte auswählen
Anzeige
AW: Makro um Zeilen mit gleichem Inhalt zu kopieren
15.10.2009 19:35:57
Josef
Hallo Christian,
das sollte es tun.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub copyNumbers()
  Dim objSh As Worksheet
  Dim lngStart As Long, lngEnd As Long, lngLast As Long, lngIndex As Long
  
  On Error GoTo ErrExit
  GMS
  
  With Sheets("Tabelle2") 'Quelltabelle - Name anpassen!
    lngLast = .Cells(Rows.Count, 1).End(xlUp).Row
    lngIndex = .Index
    lngStart = 1
    Do
      lngEnd = lngStart + Application.Max(lngStart, Application.CountIf(.Range("A:A"), .Cells(lngStart, 1))) - 1
      If SheetExist(.Cells(lngStart, 1).Text, ThisWorkbook) Then
        Set objSh = ThisWorkbook.Sheets(.Cells(lngStart, 1).Text)
        objSh.Cells.Clear
        lngIndex = objSh.Index
      Else
        Set objSh = ThisWorkbook.Worksheets.Add(after:=ThisWorkbook.Sheets(lngIndex))
        objSh.Name = .Cells(lngStart, 1).Text
        lngIndex = lngIndex + 1
      End If
      .Range(.Cells(lngStart, 1), .Cells(lngEnd, 1)).EntireRow.Copy objSh.Cells(1, 1)
      lngStart = lngEnd + 1
    Loop While lngStart <= lngLast
    .Activate
  End With
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox "Fehler " & .Number & vbLf & vbLf & _
      .Description & vbLf & vbLf & "In Prozedur (copyNumbers) in Modul Modul1", _
      vbExclamation, "Fehler in Modul1 / copyNumbers"
  End With
  
  GMS True
  Set objSh = Nothing
End Sub

Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
  Dim wks As Worksheet
  On Error GoTo ERRORHANDLER
  If Wb Is Nothing Then Set Wb = ThisWorkbook
  For Each wks In Wb.Worksheets
    If wks.Name = sheetName Then SheetExist = True: Exit Function
  Next
  ERRORHANDLER:
  SheetExist = False
End Function

Public Sub GMS(Optional ByVal Modus As Boolean = False)
  
  Static lngCalc As Long
  
  With Application
    .ScreenUpdating = Modus
    .EnableEvents = Modus
    .DisplayAlerts = Modus
    .EnableCancelKey = IIf(Modus, 1, 0)
    If Not Modus Then lngCalc = .Calculation
    If Modus And lngCalc = 0 Then lngCalc = -4105
    .Calculation = IIf(Modus, lngCalc, -4135)
    .Cursor = IIf(Modus, -4143, 2)
    
  End With
  
End Sub

Gruß Sepp

Anzeige
AW: @Sepp..nicht ganz..
16.10.2009 10:14:16
Josef
Hallo Robert,
war ein kleiner Fehler drin.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub copyNumbers()
  Dim objSh As Worksheet
  Dim lngStart As Long, lngEnd As Long, lngLast As Long, lngIndex As Long
  
  On Error GoTo ErrExit
  GMS
  
  With Sheets("Tabelle1") 'Quelltabelle - Name anpassen!
    lngLast = .Cells(Rows.Count, 1).End(xlUp).Row
    lngIndex = .Index
    lngStart = 2
    Do
      lngEnd = lngStart + Application.CountIf(.Range("A:A"), .Cells(lngStart, 1)) - 1
      If SheetExist(.Cells(lngStart, 1).Text, ThisWorkbook) Then
        Set objSh = ThisWorkbook.Sheets(.Cells(lngStart, 1).Text)
        objSh.Cells.Clear
        lngIndex = objSh.Index
      Else
        Set objSh = ThisWorkbook.Worksheets.Add(after:=ThisWorkbook.Sheets(lngIndex))
        objSh.Name = .Cells(lngStart, 1).Text
        lngIndex = lngIndex + 1
      End If
      .Range(.Cells(lngStart, 1), .Cells(lngEnd, 1)).EntireRow.Copy objSh.Cells(1, 1)
      lngStart = lngEnd + 1
    Loop While lngStart <= lngLast
    .Activate
  End With
  
  ErrExit:
  With Err
    If .Number <> 0 Then MsgBox "Fehler " & .Number & vbLf & vbLf & _
      .Description & vbLf & vbLf & "In Prozedur (copyNumbers) in Modul Modul1", _
      vbExclamation, "Fehler in Modul1 / copyNumbers"
  End With
  
  GMS True
  Set objSh = Nothing
End Sub

Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook) As Boolean
  Dim wks As Worksheet
  On Error GoTo ERRORHANDLER
  If Wb Is Nothing Then Set Wb = ThisWorkbook
  For Each wks In Wb.Worksheets
    If wks.Name = sheetName Then SheetExist = True: Exit Function
  Next
  ERRORHANDLER:
  SheetExist = False
End Function

Public Sub GMS(Optional ByVal Modus As Boolean = False)
  
  Static lngCalc As Long
  
  With Application
    .ScreenUpdating = Modus
    .EnableEvents = Modus
    .DisplayAlerts = Modus
    .EnableCancelKey = IIf(Modus, 1, 0)
    If Not Modus Then lngCalc = .Calculation
    If Modus And lngCalc = 0 Then lngCalc = -4105
    .Calculation = IIf(Modus, lngCalc, -4135)
    .Cursor = IIf(Modus, -4143, 2)
    
  End With
  
End Sub

Gruß Sepp

Anzeige
Danke, jetzt Super :-) owT-Gruß
16.10.2009 10:24:50
Robert
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige