Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1348to1352
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
Userform Werte aus Spalten zuweisen
08.02.2014 01:54:13
Dietmar
Hallo zusammen,
Ich habe 1 Datenpool und zwei Userformen, in denen ich Artikel eintragen lassen möchte, wenn in der jeweiligen Spalte *Anzahl1* oder *Anzahl2* Werte vorhanden sind. Dann sollen auch die jeweiligen Spalten *SUM Anzahl1* bzw. *SUM Anzahl2* dargestellt werden. Sonst soll die UF leer sein und einen Hinweis zeigen.
Die Werte der Spalten 1,2,5,8 sollen in jeder UF vorkommen.
Hier meine Beispieldatei:
https://www.herber.de/bbs/user/89167.xls
Leider kriege ich es nicht hin, die Spalten selektiv einzutragen. Mir ist aus dem Code, den ich hier im Forum bekommen habe, die Logik des Spaltenversatzes nicht klar. Insbesondere auch, weil die Spalten nicht zusammenhängend sind.
Vielen Dank für jeden Tipp.
Dietmar aus Aachen

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

Betreff
Datum
Anwender
Anzeige
AW: Userform Werte aus Spalten zuweisen
08.02.2014 10:08:12
Christian
hallo Dietmar,
für die UF-1 zB. so:
Sub ListeFuellen(rngBereich As Range)
Dim zeile As Long, spalte As Long
Dim vntSp As Variant
vntSp = Array(1, 2, 3, 5, 6, 8)         'relevante Spalten
With rngBereich
For zeile = 2 To .Rows.Count
If .Cells(zeile, 3) > 0 Then
lngIndex = lngIndex + 1
ReDim Preserve arrListe(UBound(vntSp), 1 To lngIndex)
For spalte = 0 To UBound(vntSp)
Select Case vntSp(spalte)
Case 5, 6
arrListe(spalte, lngIndex) = Format(.Cells(zeile, vntSp(spalte)), "#,##0.00 €" _
)
Case Else
arrListe(spalte, lngIndex) = .Cells(zeile, vntSp(spalte))
End Select
Next
End If
Next
End With
End Sub
Für die UF-2 musst du
- das Array vntSp anpassen vntSp = Array(1, 2, 4, 5, 7, 8)
- statt Spalte 3 hier die Spalte 4 auf ">0" prüfen,
- und die Spalten 5 und 7 als Währung formatieren
Gruß
Christian

Anzeige
... einfach toll ! ... Sahnehäubchen möglich?
08.02.2014 11:48:08
Dietmar
Hallo Christian,
elegant gelöst und wenn ich das Ergebnis sehe, sieht es mal wieder soooo logisch aus :-)
Kann man da noch zwei Sahnehäubchen draufsetzen?
Lässt sich die Anzahl 1 und der Preis in der UF summieren, so dass man diese quasi als Kassenjounal nutzen kann und somit sehen kann, was ein Kunde bezahlen muss? (als 1. Zeile in Fettdruck möglich? und dann abgesetzt der Rest).
Dann noch ein letzes: Kann man die UF als Ausdruck zur Verfügung stellen? Also so etwas wie eine ausdruckbare Quittung? (Die Schaltfläche dafür kann ich selbst einbauen.)
Du würdest mich sooo glücklich machen :-)
Vielen Dank und noch einen schönen Samstag!
LG
Dietmar

Anzeige
AW: ... einfach toll ! ... Sahnehäubchen möglich?
08.02.2014 15:02:39
Christian
Hallo Dietmar,
Für die Summen kannst du zB. beim Durchlaufen aller Zeilen entspr. Variablen hochzählen.
In dem Userform würde ich diese zB. in eine Textbox schreiben und nicht in die Listbox.
Formatierung einzelner Einträge sind in der Listbox nicht möglich.
Bsp:
Sub ListeFuellen(rngBereich As Range)
Dim zeile As Long, spalte As Long
Dim vntSp As Variant
Dim dblSum As Double
vntSp = Array(1, 2, 3, 5, 6, 8)         'relevante Spalten
With rngBereich
For zeile = 2 To .Rows.Count
If .Cells(zeile, 3) > 0 Then
lngIndex = lngIndex + 1
dblSum = dblSum + .Cells(zeile, 6)
Next
End With
Me.TextBox1 = Format(dblSum, "#,##0.00 €")
End Sub
Für den Ausdruck schlage ich vor, die entsprechenden Einträge wieder in eine Excel-Tabelle zu schreiben und diese zu drucken.
Gruß
Christian

Anzeige
... Fehlermeldung wenn nur 1 Wert ...
08.02.2014 15:17:40
Dietmar
Hallo Christian,
stoße gerade auf eine Fehlermeldung wenn in Spalte 3 (dort wird ja geprüft ob > 0 vorliegt) nur ein einziger Wert eingetragen ist. Wenn ich dann in Spalte 3 einen zweiten Wert eintrage, werden beide Artikel in der UF angezeigt. D.h. als eine einzele Eintragung in Spalte 3 generiert keine Anzeige, sondern folgende Fehlermeldung (Fehler beim Aufruf der Userform; Fehlernummer 9, Fehlerbeschreibung: Index außerhalb des gültigen Bereichs).
An welcher Stellschraube muss ich drehen?
Hier zur besseren Übersicht nochmals der Code von Dir:
Sub ListeFuellen(rngBereich As Range)
Dim zeile As Long, spalte As Long
Dim vntSp As Variant
vntSp = Array(1, 2, 3, 5, 6, 8)         'relevante Spalten
With rngBereich
For zeile = 2 To .Rows.Count
If .Cells(zeile, 3) > 0 Then
lngIndex = lngIndex + 1
ReDim Preserve arrListe(UBound(vntSp), 1 To lngIndex)
For spalte = 0 To UBound(vntSp)
Select Case vntSp(spalte)
Case 5, 6
arrListe(spalte, lngIndex) = Format(.Cells(zeile, vntSp(spalte)), "#,##0.00  _
€" _
)
Case Else
arrListe(spalte, lngIndex) = .Cells(zeile, vntSp(spalte))
End Select
Next
End If
Next
End With
End Sub
Vielen Dank!
LG
Dietmar

Anzeige
AW: ... Fehlermeldung wenn nur 1 Wert ...
09.02.2014 08:20:38
Christian
hallo Dietmar,
im Code von "UserForm_Initialize":
musst du bei Case 1 schreiben (hier fett):

Select Case lngIndex
Case 0
Case 1
      .AddItem arrListe(0, 1)
For spalte = 1 To 5
.List(0, spalte) = arrListe(spalte, 1)
Next
Case Else
End Select
Gruß
Christian

Ach, wie schön, wenn es dann funzt ...
09.02.2014 11:12:32
Dietmar
Hallo Christian,
lieben Dank!
Also du kannst mir glauben, ich habe an allen Schräubchen herumgedreht und gemacht und getan ... an dieser Ecke hatte ich auch den Verdacht, dass es dort sein müsste ... habe aber wohl falsch herum gedreht.
Whatever, genau so soll es sein!
Dein Hinweis, dass man diese Inhalte für einen Quittungsaudruck wieder in ein Sheet schreiben sollte, wird wohl gut sein, ich habe nur leider überhaupt keinen Schimmer, wie das gehen könnte. Ggf. könnte auch der Übertrag in den .txt-Datei sinnvoll sein. Ich werde darauf gelegentlich noch zurückkommen :-)
Wünsche Dir einen schönen Sonntag :-)
Viele Grüße
Dietmar

Anzeige
AW: Ach, wie schön, wenn es dann funzt ...
09.02.2014 12:52:47
Christian
Hallo Dietmar,
auf die gleiche Art, wie du die Listbox füllst, kannst du die Werte auch in ein Tabellenblatt oder in eine neue xl-Mappe schreiben.
Dabei ist es sinnvoll, die Werte beim Auslesen zunächst in ein Array zu schreiben und dieses Array anschließend komplett in das Ziel-Tabellenblatt zu übergeben. Das ist einiges schneller als jeden Wert einzeln in die betreffende Zelle zu schreiben.
Bsp: füge ein CommandButton mit dem Namen "cmdExport" in das Userformular ein:
Private Sub cmdExport_Click()
Dim i As Long, j  As Long, k As Long
Dim vntSp As Variant, vntRes As Variant
Dim dblSum As Double
vntSp = Array(1, 2, 3, 5, 6, 8)
'Werte aus 1. Tabellenblatt lesen
With ThisWorkbook.Sheets(1)
'zähle Einträge in Spalte C
For i = 201 To 400
If .Cells(i, 3) > 0 Then
k = k + 1
End If
Next
If k > 0 Then
'Array dimensionieren
ReDim vntRes(k, UBound(vntSp))
'Überschriften aus Zeile 200
For j = 0 To UBound(vntSp)
vntRes(0, j) = .Cells(200, vntSp(j))
Next
'Werte in Array schreiben
k = 1
For i = 201 To 400
If .Cells(i, 3) > 0 Then
For j = 0 To UBound(vntSp)
vntRes(k, j) = .Cells(i, vntSp(j))
Next
k = k + 1
End If
'Gesamtsumme ermitteln
dblSum = dblSum + .Cells(i, 6)
Next
End If
End With
'Ergebnis in 2. Tabellenblatt schreiben
With ThisWorkbook.Sheets(2)
.Cells.Delete
.Cells(1, 1).Resize(k, UBound(vntSp) + 1) = vntRes
.Cells(k + 1, 1) = "Summe:"
.Cells(k + 1, 5) = dblSum
.Cells(2, 4).Resize(k, 2).NumberFormat = "#,##0.00 $"
End With
'Speicher freigeben
Erase vntRes
End Sub
Beachte: Alle Einträge im 2. Tabellenblatt werden zuvor gelöscht.
Gruß
Christian

Anzeige
AW: Ach, wie schön, wenn es dann funzt ...
09.02.2014 18:19:02
Dietmar
Hallo Christian,
leise hatte ich es gehofft und dann doch nicht wirklich dran geglaubt :-) Damit hast Du mir eine große Freude gemacht!
Ganz herzlichen Dank!
Und die Sache läuft dabei ja hammerschnell ab!! Kompliment!
Da ich die ganze Nummer ja hier nur als Beispieldatei generiert hatte und es für ein Projekt brauche, habe ich das mal auf meine Bedürfnisse umgeschrieben, indem ich ein eigenständiges Sheet 'Quittung' eingebaut habe, das ich nach dem Druckaufruf auch sofort selektiere.
Habe das ganze ferner so angepasst, so dass die Einträge erst ab Zeile 11 stattfinden. Klappt super!
Wie kann ich das '.cells.delete' anpassen, so dass die Einträge des Sheets 'Quittung' bei einem neuen Druckauftrag erst die Zeile 11 gelöscht werden?
Dann sollten daber nur die Werte gelöscht werden, weil ich die Seite mit Formatierungen etwas aufhübschen möchte.
Liebe Grüße und einen guten Start in die Woche!
Dietmar

Anzeige
AW: Ach, wie schön, wenn es dann funzt ...
10.02.2014 17:57:58
Christian
einfach die letzte Zeile bestimmen und im Bereich "Zeile 11 bis letzte Zeile" mit der ClearContents-Methode den Inhalt löschen.
Das kriegst du sicher selber hin, bist ja jetzt auch schon etliche Jahre dabei.
Gruß
Christian

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige