837 Aufrufe
Gefragt in Tabellenkalkulation von max19555 Einsteiger_in (91 Punkte)

Guten Morgen M.O.,

ich hoffe Du hast meinen Beitrag gefunden :)

Ich habe versucht Deine Codes in einem neuen Excel File zu mappen welches ich für die Berechnung von Kosten hernehmen aber ich kriege es nicht so wirklich zum Laufen. Ich habe die Datei im ähnlichen Format aufzubauen.

In dieser Datei gibt es aber einen Unterschied. Es sollten im ersten Schritt mehrere Spalten gleichzeitig ermittelt werden (Zonen: Spalte E bis K) - die Vorgängerdatei (Liste) hat ein Ausgabefeld (Spalte F) zurückgegeben. Das Modul dafür ist unter Zone gespeichert. Da wo ich Änderungen zu Deinem Originalcode vorgenommen habe, habe ich eine entsprechende Markierung geschrieben (ÄNDERUNG...).

Die hellblauen Felder (Spalte L bis Q) bedienen sich aus den Zonen davor: Express Plus (Spalte L) ist Spalte E, Spalte N ist Spalte F, Spalte P ist Spalte F. Dann erfolgt eine neue Auslesung im Datensheet (shpCost) anhand der Zonen, den Spaltennamen L, N, P, R (Gewicht), Inhalt (S). Jede Spalte hat ein eigenes Modul (CostZoneExpress, CostZoneExpressPlus, ...).

Ich kriege sogar für jede Spalte die Kosten raus aber die zweiten Spalten (Rate Type...) da schreibt er mir überall etwas rein obwohl bei den Preisen nix drin steht... also keine Übereinstimmung...

Ich habe sicherlich einiges falsch gemacht. Könntest Du bei Gelegenheit rein schauen?

http://supportnet.de/forum/?qa=blob&qa_blobid=3670514027080710149

LG Max

16 Antworten

0 Punkte
Beantwortet von max19555 Einsteiger_in (91 Punkte)

Hallo M.O.,

blush upps... das habe ich vollkommen vergessen zu erwähnen.

Das ist eine Zusatzleistung. Indem Fall gelten die gleichen Zonen aus Express, also für Spalte P gelten die Zonen der Spalte F. Kann man das überhaupt dann so mixen?

LG und vielen Dank für Deine Antwort mit der Arbeit smiley Ich habe heute auch schon angefangen wieder in meinem Buch zu lesen.

Max

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)

Hallo Max,

hier ist der überarbeitete Code. Prüfe mal, ob die entsprechenden Angaben stimmen:

Sub suche()

Dim varZone As Variant
Dim varSuche As Variant
Dim varShip As Variant
Dim lngLZeile As Long
Dim lngLSpalte As Long
Dim s As Long
Dim sc As Long
Dim z As Long
Dim i As Long
Dim u As Long
Dim x As Long
Dim strService As String

'Daten aus Tabellenblatt Eingabe in Feld einlesen
With Worksheets("Eingabe")
 lngLZeile = .Cells(Rows.Count, 1).End(xlUp).Row                  'Letzte Zeile in Spalte A
 lngLSpalte = .Cells(1, Columns.Count).End(xlToLeft).Column       'Letzte Spalte in Zeile 1
 varSuche = .Range(.Cells(1, 1), .Cells(lngLZeile, lngLSpalte))    'Daten in Feld einlesen
End With

'Zonen in Feld einlesen
With Worksheets("Zonen")
 varZone = .UsedRange
End With

'ShipCost in Feld einlesen
With Worksheets("ShpCost")
 lngLZeile = .Cells(Rows.Count, 1).End(xlUp).Row                  'Letzte Zeile in Spalte A
 lngLSpalte = .Cells(1, Columns.Count).End(xlToLeft).Column       'Letzte Spalte in Zeile 1
 varShip = .Range(.Cells(1, 1), .Cells(lngLZeile, lngLSpalte))    'Daten in Feld einlesen
End With

'Suchfeld durchlaufen
For s = 2 To UBound(varSuche, 1)
 'Zone durchsuchen
 For z = 2 To UBound(varZone, 1)
    'Absender-Postleitzahl wird gesucht
    If varSuche(s, 2) >= varZone(z, 2) And varSuche(s, 2) <= varZone(z, 3) Then
       'Zielland wird gesucht
       If varSuche(s, 3) = varZone(z, 4) Then
           'Zielpostleitzahl wird gesucht
           If varSuche(s, 4) >= varZone(z, 5) And varSuche(s, 4) <= varZone(z, 6) Then
             'gefundene Daten werden per Schleife in Suchfeld übertragen
             For i = 5 To 11
               varSuche(s, i) = varZone(z, i + 2)
             Next i
             End If
       End If
     End If
 Next z

 'ShpCost durchlaufen
 For sc = 2 To UBound(varShip, 1)
   'hier werden die Spalten L bis P aus der Tabelle Eingabe durchlaufen
   For i = 12 To 16 Step 2
        'hier wird der Service aus dem Suchfeld in der Tabelle ShpCost gesucht
        If varSuche(1, i) = varShip(sc, 1) Then
               'falls eine Übereinstimmung gefunden wurde, wird der entsprechende Inhalt in ShpCost gesucht
               If varSuche(s, 19) = varShip(sc, 2) Then
                    'hier wird das entsprechende Gewicht gesucht
                    If varSuche(s, 18) >= varShip(sc, 3) And varSuche(s, 18) <= varShip(sc, 4) Then
                        'hier werden nun die Daten aus den Spalten E bis K in ShpCost gesucht
                        'da für Express Weekend die selben Bedingungen gelten, wie für Express, wird dieser als Suchbegriff ersetzt
                        If varSuche(1, i) = "Express Weekend" Then
                          strService = "Express"
                         Else
                          strService = varSuche(1, i)    'ansonsten wird der normale Suchbegriff verwendet
                        End If
                        'nun in den Spalten E bis K nach der entsprechenden Überschrift suchen
                        For x = 5 To 11
                          If strService = varSuche(1, x) Then
                            'falls Übereinstimmung gefunden, werden nun die Überschriften aus ShpCost nach der gefundenen Überschrift durchsucht
                                For u = LBound(varShip, 2) To UBound(varShip, 2)
                                    If varSuche(s, x) = varShip(1, u) Then
                                       'bei Übereinstimmung werden die gefundenen Daten in das Suchfeld geschrieben
                                       varSuche(s, i) = varShip(sc, u)              'Preis
                                       varSuche(s, i + 1) = varShip(sc, 5)           'Rate Type aus Spalte E der Datei ShpCost
                                       Exit For
                                    End If
                                Next u
                          End If
                        Next x
                  End If
             End If
          End If
    Next i
 
 
 Next sc

Next s

'Daten ausgeben
With Worksheets("Eingabe")
  For s = 2 To UBound(varSuche, 1)
    For i = 5 To 17
      If varSuche(s, i) <> "" Then
            .Cells(s, i) = varSuche(s, i)       'gefundene Daten werden in die jeweiligen Zellen geschrieben
          Else
            'falls das Suchfeld leer ist, wird entsprechender Text ausgegeben
            .Cells(s, i) = "Nichts gefunden"
      End If
    Next i
  Next s
End With

End Sub

Ich habe auch alles kommentiert, damit man es möglichst nachvollziehen kann.

Viel Spaß beim Lesen deines Buches. Vergiß aber nicht, auch auszuprobieren!

Gruß

M.O.

0 Punkte
Beantwortet von max19555 Einsteiger_in (91 Punkte)

Guten Morgen M.O.,

ich habe mich leider gestern und vorgestern nicht melden können. Ich lag mit einer Erkältung und Fieber im Bett.

Ich habe es gerade getestet und es funktioniert laugh​ Ich bin Mega Happy :D. Ich werde es nun mit echten Daten probieren aber die Struktur wird gleich sein.

Deine Erklärungen sind extrem hilfreich. Ich hätte zu folgendem eine Frage:

'hier werden nun die Daten aus den Spalten E bis K in ShpCost gesucht
'da für Express Weekend die selben Bedingungen gelten, wie für Express, wird dieser als Suchbegriff ersetzt
If varSuche(1, i) = "Express Weekend" Then
strService = "Express"
Else
strService = varSuche(1, i)    'ansonsten wird der normale Suchbegriff verwendet
End If

Mal angenommen, wir bekommen einen neuen Service, könnte ich dann diesen Part mit dem neuen Namen gleich darunter kopieren oder muss ich eine bestimmte Reihenfolge beachten?

LG und einen schönen Tag

Max

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Max,

normalerweise kannst einen neuen Service mit einer normalen IF-Abfrage einfach darunter setzen.

Gruß

M.O.
0 Punkte
Beantwortet von max19555 Einsteiger_in (91 Punkte)

Hallo M.O.,

ich hoffe, ich nerve Dich nicht all zu sehr...

Eine Frage hätte ich noch (ich denke dann lasse ich Dich damit auch in Ruhe) smiley

'hier werden nun die Daten aus den Spalten E bis K in ShpCost gesucht
'da für Express Weekend die selben Bedingungen gelten, wie für Express, wird dieser als Suchbegriff ersetzt
If varSuche(1, i) = "Express Weekend" Then
strService = "Express"
Else
strService = varSuche(1, i)    'ansonsten wird der normale Suchbegriff verwendet
End If


'nun in den Spalten E bis K nach der entsprechenden Überschrift suchen
For x = 5 To 11
If strService = varSuche(1, x) Then

'falls Übereinstimmung gefunden, werden nun die Überschriften aus ShpCost nach der gefundenen Überschrift durchsucht
For u = LBound(varShip, 2) To UBound(varShip, 2)
If varSuche(s, x) = varShip(1, u) Then
'bei Übereinstimmung werden die gefundenen Daten in das Suchfeld geschrieben
varSuche(s, i) = varShip(sc, u)              'Preis
varSuche(s, i + 1) = varShip(sc, 5)        'Rate Type aus Spalte E der Datei ShpCost
 

Du schreibst das in den Spalten E bis K nach den Überschriften gesucht und die Daten in die Suchfelder geschrieben werden aber die Spalten L, N und P sind ebenfalls Serviceleistungen. Ich stehe hier auf dem Schlauch.

LG

Max

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Max,

in den Spalten E bis K sind ja für die einzelnen Serviceleistungen je Fracht die Überschriften für die Tabelle ShpCost hinterlegt (in welcher der Spalten F bis AG steht der Preis?). Nun muss ja z.B. für die Spalte L (Express Plus) herausgefunden werden, aus welcher Spalte in der Tabelle ShpCost der Preis gelesen werden muss. Da das Makro ja nicht "weiß" wo in den Spalten E bis K des Suchblattes die Daten für "Express Plus" stehen, werden die Überschriften der Spalte E bis K durchlaufen, bis eben "Express Plus" gefunden wird (hier Spalte E = 5. Spalte). Damit kann jetzt der Wert der aus der 5. Spalte des jeweiligen Frachtgutes eingelesen werden und damit in der Tabelle ShpCost entsprechend gesucht werden. Diese gefundenen Werte (= Preis) werden dann in varSuch geschrieben.

Das Makro macht im Prinzip nichts anderes als du. Du sollst für Spalte L (Express Plus) den Preis suchen. Also schaust du nach, welche Kategorie (= Überschrift in ShpCost) für deine Fracht in der Tabelle Zonen gefunden wurde (z.B. 3). Jetzt weißt du, dass Spalte mit der Überschrift 3 die richtige für die Fracht ist.

Gruß

M.O.
...