Microsoft Excel

Herbers Excel/VBA-Archiv

Array mit If-Anweisung

Betrifft: Array mit If-Anweisung von: Moritz
Geschrieben am: 29.10.2014 10:23:53

Hallo alle zusammen,

ich beschäftige mich seit ein paar Tagen mit VBA. Ich habe momentan eine Arbeitsmappe die ich dafür gebrauche um eine Liste auszulesen und bestimmte daten dann immer wieder neu erstellten Worksheets zuzuweisen.

als erstes habe ich es ganz statisch nur mit einem worksheet versucht und es hat auch alles geklappt. Nun habe ich das Problem, dass ich über einen Butten ein die neuen Worksheets erstelle und können immer wieder neue kommen und gelöscht werden.

Ich speichere in einem Globalen Array die Namen der Worksheets ab und will dann dieses Array mit den Inhalten einer Spalte vergleichen. Wenn diese übereinstimmen werden die Daten der Zeile in das Worksheet übernommen.

Im ersten Teil des Programms wurde es fest zugewiesen. Im zweiten habe ich es mit einem Array versucht aber habe es leider nicht geschafft. Er beschwert sich immer bei "With ActiveWorkbook.Worksheets(Personal(w))".

Sub test()
 Dim Name As Variant
 Dim x As Integer
 Dim z As String
 Dim w As Integer
 
 While x < 20
    x = x + 1

'Spalte die verglichen werden soll
    Name = Cells(3, 4).Offset(x, 0)

 


    Set PA = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(x, -3)
    Set Kunde = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(x, -2)
    Set Menge = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(x, -1)
    Set Start = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(x, 1)
    Set Planung = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(x, 2)
   

If Name = "Fr. XYZ" Then
 
        With ActiveWorkbook.Sheets(Name)
            .Cells(.Cells(.Rows.Count, 3).End(xlUp).Row + 1, 2) = PA
            .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 3) = Kunde
            .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 4) = Menge
            .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 5) = Start
            .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 6) = Planung
        End With
        End If

'statisches Beispiel das geht


    For w = 1 To 100

'Array Personal wurde global definiert und mit einem anderen Makro gefüllt

	
 


       If Name = Personal(w) Then
           With ActiveWorkbook.Worksheets(Personal(w))
               .Cells(.Cells(.Rows.Count, 3).End(xlUp).Row + 1, 2) = PA
               .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 3) = Kunde
               .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 4) = Menge
               .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 5) = Start
               .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 6) = Planung
           End With
       End If
    Next

'Hier soll das Array durchgegangen werden und die Inhalte aus der Tabelle in die Worksheets die  _
 _
übereinstimmen Übertragen werden

 Wend
 
End Sub



Es kann sein, dass der Code etwas umständlich ist, aber wie gesagt ich bin ein blutiger Anfänger. Ich freue mich über Vorschläge.

  

Betrifft: AW: Array mit If-Anweisung von: Jack_d
Geschrieben am: 29.10.2014 12:05:26

Hallo Moritz

ist ja auch sinnvoll das er bei der Zeile

"With ActiveWorkbook.Worksheets(Personal(w))"

Rumeckert.
Denn er braucht ja die referenz auf das Worksheet. in deinem Fall wäre das das Worksheet W=1-100

Sínnvoll wäre wenn du das folgendermaßen formulierst



For WSSeite=1 to ws.count
for WSSpalte = 1 to 100

With ActiveWorkbook.Sheets("Tabelle" & WSSeite)

next WSSpalte
next WSSeite

Mehr dann gern mit einer Mustermappe

Grüße


  

Betrifft: AW: Array mit If-Anweisung von: Moritz
Geschrieben am: 29.10.2014 16:33:15

War ein guter Ansatzpunkt des ganze zu ändern und jetzt läuft es :) Die Lösung des Problems war eine IF-Anweisung, die leere Zellen in der Tabelle überspringt. Der Code schaut derzeit folgendermaßen aus:

Private Sub test()
Dim WS_Count As Integer
Dim q As Integer
Dim WSSeite As Integer
Dim WSSpalte As Integer
Dim Name As String
Dim Personal(100) As String
Dim Mitarbeiter As String


WS_Count = ActiveWorkbook.Worksheets.Count

    'Array mit den Mitarbeiternamen anlegen
    For q = 1 To WS_Count
        Personal(q) = Worksheets(q).Range("I1")
    Next q
    
    'Mit For-Schleife alle Mitarbeiter durchgehen
    For WSSeite = 1 To WS_Count
        Mitarbeiter = Personal(WSSeite)
        
        'Spalten mit For-Schleife durchlaufen und Zeilen setzen
        
        For WSSpalte = 1 To 30
            Name = Cells(3, 4).Offset(WSSpalte, 0)
            Set PA = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(WSSpalte, -3)
            Set Kunde = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(WSSpalte, -2)
            Set Menge = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(WSSpalte, -1)
            Set Start = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(WSSpalte, 1)
            Set Planung = Worksheets("Datenaufbereitung").Cells(3, 4).Offset(WSSpalte, 2)
            
            If Name <> "" Then
                'Vergleich der Spalte mit den Mitarbeitern aus Array
                If Name = Mitarbeiter Then
                        With ActiveWorkbook.Sheets(Mitarbeiter)
                            .Cells(.Cells(.Rows.Count, 3).End(xlUp).Row + 1, 2) = PA
                            .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 3) = Kunde
                            .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 4) = Menge
                            .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 5) = Start
                            .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 6) = Planung
                        End With
          
                       End If
            End If
            
            
    Next WSSpalte
    Next WSSeite

 
 
 
  
End Sub



  

Betrifft: Super. von: Jack_d
Geschrieben am: 30.10.2014 14:48:12

Freut mich wenn man geholfen werden kann.

Und vielen Dank für die Rückmeldung!

Grüße