Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
800to804
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
800to804
800to804
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Tabelleninhalt nach Spalteneintrag aufteilen

Tabelleninhalt nach Spalteneintrag aufteilen
16.09.2006 13:59:29
Fritz_W
Hallo Forumsbesucher,
ich hoffe auf Unterstützung der VBA-Experten:
in meiner Arbeitsmappe finden sich in der Tabelle "Jahr" in einigen Zeilen der Spalte D die Werte "A" bzw. "B". Ich möchte nun erreichen, dass per Makro zwei neue Tabellen in die Mappe eingefügt werden, die die Bezeichnungen "A" bzw. "B" führen sollen. In die Tabelle "A" sollen diejenigen Zeilen aus Tabelle "Jahr" als Wert eingefügt werden, in denen in der Ausgangstabelle "A" in der Spalte D ein "A" steht. Es sollten dabei nur die Spalten C, F und S der Ausgangstabelle "Jahr" eingefügt werden und zwar in die Zieltabelle fortlaufend ab Zeile 4 und ab Spalte C (also Spalte C aus "Jahr" sollte als Spalte C in "A", Spalte F aus "Jahr", als Spalte D in "A", die Spalte S aus "Jahr" als Spalte E in "A" eingefügt werden.
Wenn in "Jahr" in der Spalte D ein "B" ist, sollten die Werte der Spalten C, F und S entsprechend wie vorher beschrieben in die Tabelle "B" eingefügt werden.
Ich hoffe, dass ich das Ganze für euch nachvollziehbar beschrieben habe und bedanke mich bereits im Voraus für eure Unterstützung.
Mfg
Fritz

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabelleninhalt nach Spalteneintrag aufteilen
16.09.2006 14:02:21
Josef
Hallo Fritz!
Sollen die "neuen" Tabellen jedesmal neu erstellt werden, oder sollen in den
bestehenden Tabellen "A"/"B" die Daten jedesmal gelöscht werden, oder sollen die
Daten jedesmal unten angehängt werden?
Gruß Sepp

AW: Tabelleninhalt nach Spalteneintrag aufteilen
16.09.2006 14:16:35
Fritz_W
Hallo Sepp,
das Makro muss vermutlich nur einmal in der jeweiligen Datei ausgeführt werden. Das bedeutet, dass zunächst die Tabellen A und B erstellt werden sollten. Sollten die Tabellen A und B bereits bestehen, sollte das Makro an dieser Stelle abgebrochen werden (Ggf mit Hinweis, dass die Tabellen bereits existieren). In die Tabellen A und B sollten die einzufügenden Zeilen aus der Ausgangstabelle (in der dort auftretenden Reihenfolge) zeilenweise - getrennt nach Tabelle A und B - eingefügt werden.
Vielen Dank für Deine Unterstützung.
Gruß
Fritz
Anzeige
AW: Tabelleninhalt nach Spalteneintrag aufteilen
16.09.2006 14:32:39
Josef
Hallo Fritz!
Kopiere den Code in ein allgemeines Modul deiner Datei.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub CopyA_B()
Dim objShSrc As Worksheet, objShTar As Worksheet
Dim rng As Range, rngCopy As Range
Dim strFirst As String, strMessage As String
Dim varSearch As Variant
Dim intIndex As Integer
Dim lngNext As Long

On Error GoTo ErrExit
GetMoreSpeed

varSearch = Array("A", "B") 'Suchbegriffe/Tabellennamen

Set objShSrc = Sheets("Jahr") 'Tabelle mit Daten

For intIndex = 0 To UBound(varSearch)
  
  Set rngCopy = Nothing
  strFirst = ""
  
  If Not SheetExist(varSearch(intIndex)) Then
    Set objShTar = Worksheets.Add(After:=Sheets(Sheets.Count))
    objShTar.Name = varSearch(intIndex)
    
    With objShSrc
      
      Set rng = .Range("D:D").Find(what:=varSearch(intIndex), LookAt:=xlWhole, After:=.Range("D" & Rows.Count))
      
      If Not rng Is Nothing Then
        strFirst = rng.Address
        
        Do
          
          If rngCopy Is Nothing Then
            Set rngCopy = Union(.Cells(rng.Row, 3), .Cells(rng.Row, 6), .Cells(rng.Row, 19))
          Else
            Set rngCopy = Union(rngCopy, .Cells(rng.Row, 3), .Cells(rng.Row, 6), .Cells(rng.Row, 19))
          End If
          
          Set rng = .Range("D:D").FindNext(rng)
          
        Loop While Not rng Is Nothing And rng.Address <> strFirst
        
      End If
      
      If Not rngCopy Is Nothing Then
        lngNext = objShTar.Cells(Rows.Count, 3).End(xlUp).Row + 1
        If lngNext < 4 Then lngNext = 4
        rngCopy.Copy objShTar.Cells(lngNext, 3)
      End If
      
    End With
    
  Else
    
    strMessage = strMessage & varSearch(intIndex) & vbLf
    
  End If
  
Next

If strMessage <> "" Then
  MsgBox "Die Tabelle(n)" & Space(75) & vbLf & vbLf & _
    strMessage & vbLf & vbLf & "existierte(n) bereits!" & vbLf & vbLf & _
    "Die entsprechenden Daten wurden NICHT kopiert!", 64, "Hinweis"
Else
  MsgBox "Die Daten wurden erfolgreich kopiert!", 64, "Hinweis"
End If

ErrExit:
GetMoreSpeed 0
Set objShSrc = Nothing
Set objShTar = Nothing
Set rng = Nothing
Set rngCopy = Nothing
End Sub



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


Sub GetMoreSpeed(Optional ByVal Modus As Integer = 1)
Static lngCalc As Long

With Application
  If Modus = 1 Then
    lngCalc = .Calculation
    .ScreenUpdating = False
    .EnableEvents = False
    .DisplayAlerts = False
    .Calculation = -4135
    .Cursor = xlWait
  Else
    .ScreenUpdating = True
    .EnableEvents = True
    .DisplayAlerts = True
    .Calculation = IIf(lngCalc <> 0, lngCalc, -4105)
    .Cursor = xlDefault
  End If
End With

End Sub


Gruß Sepp

Anzeige
AW: Tabelleninhalt nach Spalteneintrag aufteilen
16.09.2006 14:49:05
Fritz_W
Hallo Sepp,
vielen Dank für die enorme Arbeit.
Die Tabellen A und B wurden angelegt, enthalten aber keine Daten der Ausgangstabelle.
Vermutlich habe ich das Ganze nicht exakt beschrieben: In der Ausgangstabelle "Jahr" befinden sich in der Spalte D in einigen Zeilen der Eintrag "A" bzw. "B". Es kann aber auch der Wert "" in einer Zeile aus Spalte D stehen. Die jeweiligen Werte werden jeweils über eine Formel "geliefert". Zeile 1 erhält den Texteintrag "Block". Kopiert werden sollten die Spalten C, F und S und je nach dem Eintrag in Spalte D in die Tabellen "A" oder "B" eingefügt werden (als Wert, nicht die Formel).
Vielleicht rührt das Problem daher, dass nicht in jeder Zeile der Ausgangstabelle "A" oder "B" steht und schon gar nicht in der Zeile 1.
Gruß
Fritz
Anzeige
AW: Tabelleninhalt nach Spalteneintrag aufteilen
16.09.2006 14:58:06
Josef
Hallo Fritz!
Dann so.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub CopyA_B()
Dim objShSrc As Worksheet, objShTar As Worksheet
Dim rng As Range, rngCopy As Range
Dim strFirst As String, strMessage As String
Dim varSearch As Variant
Dim intIndex As Integer
Dim lngNext As Long

On Error GoTo ErrExit
GetMoreSpeed

varSearch = Array("A", "B") 'Suchbegriffe/Tabellennamen

Set objShSrc = Sheets("Jahr") 'Tabelle mit Daten

For intIndex = 0 To UBound(varSearch)
  
  Set rngCopy = Nothing
  strFirst = ""
  
  If Not SheetExist(varSearch(intIndex)) Then
    Set objShTar = Worksheets.Add(After:=Sheets(Sheets.Count))
    objShTar.Name = varSearch(intIndex)
    
    With objShSrc
      
      Set rng = .Range("D:D").Find(what:=varSearch(intIndex), _
        LookAt:=xlWhole, _
        LookIn:=xlValues, _
        After:=.Range("D" & Rows.Count))
      
      If Not rng Is Nothing Then
        strFirst = rng.Address
        
        Do
          
          If rngCopy Is Nothing Then
            Set rngCopy = Union(.Cells(rng.Row, 3), .Cells(rng.Row, 6), .Cells(rng.Row, 19))
          Else
            Set rngCopy = Union(rngCopy, .Cells(rng.Row, 3), .Cells(rng.Row, 6), .Cells(rng.Row, 19))
          End If
          
          Set rng = .Range("D:D").FindNext(rng)
          
        Loop While Not rng Is Nothing And rng.Address <> strFirst
        
      End If
      
      If Not rngCopy Is Nothing Then
        lngNext = objShTar.Cells(Rows.Count, 3).End(xlUp).Row + 1
        If lngNext < 4 Then lngNext = 4
        rngCopy.Copy
        objShTar.Cells(lngNext, 3).PasteSpecial xlValues
        Application.CutCopyMode = False
      End If
      
    End With
    
  Else
    
    strMessage = strMessage & varSearch(intIndex) & vbLf
    
  End If
  
Next

If strMessage <> "" Then
  MsgBox "Die Tabelle(n)" & Space(75) & vbLf & vbLf & _
    strMessage & vbLf & vbLf & "existierte(n) bereits!" & vbLf & vbLf & _
    "Die entsprechenden Daten wurden NICHT kopiert!", 64, "Hinweis"
Else
  MsgBox "Die Daten wurden erfolgreich kopiert!", 64, "Hinweis"
End If

ErrExit:
GetMoreSpeed 0
Set objShSrc = Nothing
Set objShTar = Nothing
Set rng = Nothing
Set rngCopy = Nothing
End Sub



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


Sub GetMoreSpeed(Optional ByVal Modus As Integer = 1)
Static lngCalc As Long

With Application
  If Modus = 1 Then
    lngCalc = .Calculation
    .ScreenUpdating = False
    .EnableEvents = False
    .DisplayAlerts = False
    .Calculation = -4135
    .Cursor = xlWait
  Else
    .ScreenUpdating = True
    .EnableEvents = True
    .DisplayAlerts = True
    .Calculation = IIf(lngCalc <> 0, lngCalc, -4105)
    .Cursor = xlDefault
  End If
End With

End Sub


Gruß Sepp

Anzeige
Wie gewünscht!
16.09.2006 15:09:14
Fritz_W
Hallo Sepp!
Funktioniert nun wie gewünscht.
Einfach Klasse!
Erneut besten Dank!
Gruß
Fritz
@Sepp
16.09.2006 15:30:28
Fritz_W
Hallo Sepp,
wie könnte man noch folgendes verwirklichen?
Die Formatierungen und die (jeweiligen) Spaltenbreiten der Ausgangstabelle mit in die Zieltabellen übernehmen.
Vorab vielen Dank.
Gruß
Fritz
AW: @Sepp
16.09.2006 15:44:31
Josef
Hallo Fritz!
Auch kein Problem.
Ersetze diesen Codeteil.
If Not rngCopy Is Nothing Then
  lngNext = objShTar.Cells(Rows.Count, 3).End(xlUp).Row + 1
  If lngNext < 4 Then lngNext = 4
  rngCopy.Copy
  objShTar.Cells(lngNext, 3).PasteSpecial -4122
  objShTar.Cells(lngNext, 3).PasteSpecial 8
  objShTar.Cells(lngNext, 3).PasteSpecial -4163
  Application.CutCopyMode = False
End If

Gruß Sepp

Anzeige
Klappt wunderbar! Danke Sepp! o.w.T.
16.09.2006 15:59:28
Fritz_W

312 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige