Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Werte übertragen von Zeile in Spalte

Werte übertragen von Zeile in Spalte
27.03.2015 17:23:31
Gregor

Hallo zusammen
Siehe Musterdatei
https://www.herber.de/bbs/user/96676.xlsx
Vom Quellblatt muss ich im Zielblatt in die Spalten P55/Index, P45/Index, P40/Index usw. die Werte H und Länge übertragen. Als Beispiel habe ich die ABK "LS" und "STSA" (im Quellblatt weit unten) ins Zielblatt übertragen.
Vorgehen:
- Auf dem Zielblatt ist pro ABK nur eine No, auf dem Quellbaltt können pro No 1 bis 4 Zeilen sein.
- Auf das Zielblatt ist ab dem Quellblatt innerhalb der ABK und No immer die Zeile mit den grössten Werten (Total) zu übertragen, bei gleichem Total sind die Werte der 1. Zeile zu übertragen.
Folgt dem P55, P45, usw. ein H, muss dieser in der entsprechenden Spalte H übertragen werden (siehe Beispiel "STSA")
- Die Länge kann kaufmännisch gerundet oder auch abgerundet werden
- Für die Spalte kleinerP20 gibt es kein H, in die Spalte Höhe ist die Ziffer des P zu übertragen (zB. P17 = 17)
Ich weiss nicht, ob das verständlich und per vba machbar ist, manuel wäre das jedoch einen Riesenaufwand.
Vielen Dank und Gruss
Gregor

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Werte übertragen von Zeile in Spalte
27.03.2015 20:06:27
Christian
hallo Gregor,
ja, das ist sicher per VBA machbar.
Als Hilfestellung folgendes Vorgehen:
- Durchlaufe in einer äußeren Schleife die Tabelle "Quelle" ab Zeile 2
-- merke dir die Einträge von "ABK", "No", "Tot" und der aktuellen Zeile
-- Durchlaufe in einer inneren Schleife alle weiteren Zeilen von "Quelle"
--- prüfe, ob "ABK" und "No" gleich sind und "Tot" größer ist als die zuvor gemerkten Einträge
--- wenn ja, dann merk dir diese Zeile
--- wenn nein, dann innere Schleife verlassen
-- Ende innere Schleife
-- Durchlaufe in einer weiteren inneren Schleife die Spalten der gemerkten Zeile
--- summiere die Werte zu jedem gleichen "P-Eintrag" (P55, P45, ...) zB in einem Array oder Dictionary
--- wenn es einen "H-Eintrag" gibt, dann schreibe diesen ebenfalls in das Array
-- Ende innere Schleife
-- schreibe in Tabelle "Ziel" die Werte von "ABK", "No" und "Tot"
-- Durchlaufe in einer weiteren inneren Schleife die Spalten in Zeile1 von Tabelle "Ziel"
--- wenn der entsprechende "P-Eintrag" im Array / Dictionary existiert, dann schreibe den zugehörigen Array-Wert in Tabelle "Ziel"
--- gleiches Vorgehen mit den "H-Einträgen"
-- Ende innere Schleife
-- Zeilennummer in Tabelle "Ziel" erhöhen
- Ende äußere Schleife
Gruß
Christian

Anzeige
AW: Werte übertragen von Zeile in Spalte
27.03.2015 22:12:35
Gregor
Hallo Christian
Danke für die Anleitung, leider krieg ich das nicht hin. Ich versuchte auf einem Code aufzubauen, der mir Erich G vor wenigen Tagen geliefert hat, ich komme aber nicht zum Ziel.
Sub Dict_Max()
Dim myDict As Object, arW, zz As Long, strK As String
Dim arrK, arE()
Dim Länge As Double
Dim P As Variant, H As Variant
Set myDict = CreateObject("Scripting.Dictionary")
With Sheets("Quelle")
arW = .Cells(2, 1).Resize(.Cells(.Rows.Count, 2).End(xlUp).Row - 1, 6)
End With
For zz = 1 To UBound(arW)
If arW(zz, 1) = "" Then arW(zz, 1) = arW(zz - 1, 1)
strK = arW(zz, 1) & "|" & arW(zz, 3)
If myDict.Exists(strK) Then
' neuer Wert ist kleiner
If myDict(strK) >= arW(zz, 3) Then myDict(strK) = arW(zz, 3)
Else
myDict(strK) = arW(zz, 3)
End If
P = arW(zz, 4)
H = arW(zz, 5)
Länge = arW(zz, 6)
Next zz
End Sub
Kannst du oder mir oder jemand weiter helfen, wäre sehr froh, da doch recht komplex mit den Schlaufen und Array.
Danke und Gruss
Gregor

Anzeige
AW: Werte übertragen von Zeile in Spalte
28.03.2015 00:03:19
Christian
hallo Gregor,
je nach Vorkenntnisse wird das auch so schnell nicht umzusetzen sein... ggf. wirst du etwas Zeit und Interesse investieren müssen, um dich mit der Materie vertraut zu machen.
Wenn du hingegen eine fertige Lösung für deine Aufgabe "folgende Daten sollen so ausgewertet werden" erwartest, findest du sicher jemanden, der dies im Rahmen einer Auftrags-Progammierung für dich erledigt.
Gruß
Christian

AW: Werte übertragen von Zeile in Spalte
31.03.2015 08:55:39
Gregor
Hallo
Das ist ein funktionierender Code, nur leider recht langsam. Evt. kann mir ein vba-Profi diesen prüfen und ergänzen/ändern, damit dieser schneller läuft.
Option Explicit
Sub Dict_Max()
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim myDict As Object, arW, Zeile As Long, Zeile_Ziel As Long, strK As String, i As Long, Hö _
he As Long
Dim arrK, arE(), arrDaten()
Dim Länge As Double, Start As Double, Start1 As Double, Spalte As Double
Dim P As Variant, H As Variant, Wert As Variant
Dim a As Variant
Set myDict = CreateObject("Scripting.Dictionary")
With Sheets("Quelle")
arW = .Cells(2, 1).Resize(.Cells(.Rows.Count, 2).End(xlUp).Row - 1, 18)
End With
For Zeile = 1 To UBound(arW)
If arW(Zeile, 1) = "" Then arW(Zeile, 1) = arW(Zeile - 1, 1)
strK = arW(Zeile, 1) & "|" & arW(Zeile, 3)
If myDict.Exists(strK) Then
'neuer Wert ist grösser
If myDict(strK) > Int(arW(Zeile, 2)) Then
GoTo weiter
End If
Else
myDict(strK) = Int(arW(Zeile, 2))
End If
ReDim arrDaten(1 To 17, 1 To UBound(arW))
Spalte = 0
arrDaten(1, 1) = myDict(strK)
arrDaten(17, 1) = 0
For Start = 0 To 6
P = Array("P55", "P45", "P40", "P35", "P30", "P25", "P20")
Spalte = Spalte + 2
If arW(Zeile, 4) = P(Start) Then
arrDaten(Spalte, 1) = Int(arW(Zeile, 6))
arrDaten(Spalte + 1, 1) = arW(Zeile, 5)
End If
If arW(Zeile, 7) = P(Start) Then
arrDaten(Spalte, 1) = arrDaten(Spalte, 1) + Int(arW(Zeile, 9))
arrDaten(Spalte + 1, 1) = arW(Zeile, 8)
End If
If arW(Zeile, 10) = P(Start) Then
arrDaten(Spalte, 1) = arrDaten(Spalte, 1) + Int(arW(Zeile, 12))
arrDaten(Spalte + 1, 1) = arW(Zeile, 11)
End If
If arW(Zeile, 13) = P(Start) Then
arrDaten(Spalte, 1) = arrDaten(Spalte, 1) + Int(arW(Zeile, 15))
arrDaten(Spalte + 1, 1) = arW(Zeile, 14)
End If
If arW(Zeile, 16) = P(Start) Then
arrDaten(Spalte, 1) = arrDaten(Spalte, 1) + Int(arW(Zeile, 18))
arrDaten(Spalte + 1, 1) = arW(Zeile, 17)
End If
Next Start
For Start1 = 4 To 16 Step 3
If arW(Zeile, Start1) = "P19" Or arW(Zeile, Start1) = "P18" Or arW(Zeile, Start1) =  _
"P17" Or arW(Zeile, Start1) = "P16" Or arW(Zeile, Start1) = "P15" _
Or arW(Zeile, Start1) = "P14" Or arW(Zeile, Start1) = "P13" Or arW(Zeile,  _
Start1) = "P12" Or arW(Zeile, Start1) = "P11" Or arW(Zeile, Start1) = "P10" Then
Höhe = Right(arW(Zeile, Start1), 2)
arrDaten(16, 1) = Höhe
If arrDaten(16, 1) <> "" And arrDaten(16, 1) > Höhe Then arrDaten(16, 1) = Höhe
arrDaten(17, 1) = arrDaten(17, 1) + Int(arW(Zeile, Start1 + 2))
End If
Next Start1
If arrDaten(17, 1) = 0 Then arrDaten(17, 1) = ""
With Sheets("Ziel")
On Error Resume Next
Zeile_Ziel = .Application.Match(arW(Zeile, 1), .Columns(1), 0)
For i = Zeile_Ziel To Zeile_Ziel + 30
If .Cells(i, 2) = arW(Zeile, 3) Then
.Cells(i, 3).Resize(1, 17) = WorksheetFunction.Transpose(arrDaten)
Exit For
End If
Next i
End With
weiter:
Next Zeile
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Vielen Dank
Gregor

Anzeige
AW: Werte übertragen von Zeile in Spalte
01.04.2015 22:46:02
Christian
Hallo Gregor,
in erster Linie ist es wichtig, dass der Code das korrekte Ergebnis liefert.
Mein Vorschlag sah ja etwas anders aus - und wäre auch entsprechend schneller. Bei ca. 2500 Einträgen sollte das nach meiner Einschätzung in weniger als 1 Sekunde erledigt sein.
Performance ist aber zweitrangig, denn mein Vorschlag würde an der ein oder anderen Stelle ein anderes Resultat liefern und welches Ergebnis korrekt ist, kannst nur du entscheiden.
Siehe zB:
- CH-5
- WIL-3
- SIR-2 (keine P-Angabe)
- SD-1
- EF-1
- usw.
Gruß
Christian

324 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige