Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1280to1284
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
Inhaltsverzeichnis

Excel VBA so ordentlich?

Excel VBA so ordentlich?
11.10.2012 12:50:35
xltyp
Hallo!
Ich habe folgenden VBA-Code, welcher eine Liste von Bestellungen durchgibt und überprüft, ob sie zu einer bestimmten RechnungsNummer gehören. Wenn ja, wird die Bestellung zu einer Rechnung zusammengefügt:
Dim rnNr As Integer
Dim x As Integer
Dim y As Integer
rnNr = 2
y = 2
x = 1
While Not Worksheets("allgemein").Cells(y, x) = ""
If Worksheets("allgemein").Cells(y, x) = rnNr Then
Worksheets("formular").Cells(Rows.Count, 2).End(xlUp).Offset(1) = Worksheets("allgemein").Cells(y, x + 1)
Worksheets("formular").Cells(Rows.Count, 3).End(xlUp).Offset(1) = Worksheets("allgemein").Cells(y, x + 2)
End If
y = y + 1
Wend
Hauptsächlich werden einfach mehrere Artikel, die in einer Tabelle stehen, nach der Rechnungs-ID zusammengefasst.
Es funktioniert. Aber habt ihr eine Idee, ob der Code vielleicht zu dreckig ist bzw. es auch ordentlicher geht?
Viele Grüße,
xltyp

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel VBA so ordentlich?
11.10.2012 13:12:38
ChrisL
Hi
Viele Wege führen nach Rom und die Geschmäcker sind verschieden.
Was mir auffällt:
- Worksheet würde ich als Variable definieren, damit sparst du ein paar Buchstaben
- y ist dein Suchkriterium, also würde ich es auch als solches bezeichnen (x, y etc. sagt nichts aus und wird auf Dauer lästig)
Hier noch ein Vorschlag ohne Schleife:
Sub tt()
Dim WS1 As Worksheet, WS2 As Worksheet
Dim rng As Range, letztezeile As Long
Dim strKriterium As String
Set WS1 = Worksheets("allgemein")
Set WS2 = Worksheets("formular")
letztezeile = WS1.Range("A65536").End(xlUp).Row
Set rng = WS1.Range("A1:C" & letztezeile)
strKriterium = "2"
Application.ScreenUpdating = False
rng.AutoFilter Field:=1, Criteria1:=strKriterium
WS1.Range("B2:C" & letztezeile).Copy WS2.Range("B2")
rng.AutoFilter
Application.ScreenUpdating = True
End Sub

(n.b. die Variable für "2" habe ich ausnahmsweise als String definiert, weil der Autofilter mit String arbeitet und deine ID vielleicht auch mal Buchstaben enthalten kann)
cu
Chris

Anzeige
alles Geschmack
11.10.2012 13:31:31
Rudi
Hallo,
While ... Wend benutze ich nie. Eher Do ... Loop. Beides die lahmsten Schleifen, die es gibt.
Noch ein Bsp.:
Sub Rechnung(lngReNr As Long)
Dim rngC As Range, rngReNr As Range
Dim arrRechnung(), iCounter As Integer
With Worksheets("Allgemein")
Set rngReNr = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp))
End With
If WorksheetFunction.CountIf(rngReNr, lngReNr) = 0 Then
MsgBox "Rechnung " & lngReNr & " nicht vorhanden!", , "Gebe bekannt..."
Else
ReDim arrRechnung(1 To WorksheetFunction.CountIf(rngReNr, lngReNr), 1 To 2)
For Each rngC In rngReNr
If rngC = lngReNr Then
iCounter = iCounter + 1
arrRechnung(iCounter, 1) = rngC.Offset(, 1)
arrRechnung(iCounter, 2) = rngC.Offset(, 2)
End If
Next
Worksheets("Formular").Cells(Rows.Count, 2).End(xlUp).Offset(1).Resize(UBound(arrRechnung),  _
2) = arrRechnung
End If
End Sub

Sub aaab()
Rechnung 123456
End Sub

Gruß
Rudi
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige