Nein! Ich versuche alles mitzunehmen was mir an Wissen vermittelt wird! Trotzdem hinterlässt Kritik immer einen faden Nachgeschmack....und davon hatte snb jetzt doch recht viel....
Hallo
Noch etwas Feedback von mir.
Mit VBA bin ich nicht so bewandert. Und Userforms finde ich meistens überflüssig. Man kann alles auch direkt in den Tabellen erledigen. Deshalb habe ich mich auf die Tabellen und allgemeine Fragen konzentriert.
Blatt "Übersicht"
Änderungsvorschläge für die Spaltenüberschriften:
Inventierter Bestand -> Anfangsbestand
Könnte missverstanden werden in dem Sinne dass nach jeder Inventur die Werte angepasst werden.
Bestandsbuchungen -> Bestandsveränderungen
Spaltenreihenfolge:
Aktueller Bestand nach Anfangsbestand und Bestandsveränderungen. Die abhängigen Zellen stehen in der Regel links von einer Formel.
Die Formel in der Spalte "Letzte Buchung" ermittelt nicht den Zeitpunkt der letzten Buchung. Hier würde ich MAXWENNS() verwenden. Alternativ je nach Excel-Version: AGGREGAT() oder {MAX(WENN))}. Um die Anzeige der 0 zu unterdrücken würde ich hier ein benutzerdefiniertes Zahlenformat verwenden.
Du schreibst jedem Artikel nur einen Lagerplatz zu. Entspricht das den Gegebenheiten?
Falls ja, dann kann hier eine Gültigkeitsprüfung verwendet werden und im Blatt "Buchungssätze" kann der Lagerplatz mit einer Formel ermittelt werden.
Falls nein, dann muss die Information hier entfallen oder die "Übersicht" muss mit Pivot-Tabelle und/oder Power Query aufgebaut werden.
In aktuellen Datei gibt es bei "Aktueller Bestand" negative Werte. Das muss bereits bei der Bestandsbuchung verhindert werden.
Blatt "Buchungssätze"
Wofür steht "BS"? Wenn es keine bei den Mitarbeitern bekannte Abkürzung ist dann besser ausschreiben. Gleiches gilt auch für die Werte (AB, ZU). Hier fehlt auch noch die Möglichkeit einer Korrekturbuchung. Ein Textfeld mit Erklärung wäre sicher auch nicht falsch.
Die Spalten "Datum" und "Uhrzeit" sollten durch die Spalte "Zeitstempel" ersetzt werden.
In den Spalten "Ort" und "Ersteller" gibt es keine Gültigkeitsprüfung obwohl entsprechende Listen existieren. Deswegen gibt es hier für "Halle 5" verschiedene Schreibweisen.
Allgemeines
Spalten einheitlich in den verschiedenen Blättern benennen:
Mal "Lagerplatz", mal "Ort". Mal "Artikelnummer/SKU", mal "SKU".
Strukturierte Verweise in den Formeln verwenden.
@ Snb welche Bereiche würdest du denn mit Multipage Gestalten? Ein Kompletter Aufbau auf Multipage scheint mir unsinnig...
Danke @ Shift - Del damit lässt sich arbeiten..
Hallo,
im Dialog zu den Einstellungen führt Dein Code zum Hinzufügen eines Erstellers bei mir zum Absturz von Excel 2016. Das
könnte an der intelligenten Tabelle liegen, die es hier
anscheinend nicht mag, per Code eine Zeile hinzuzufügen. Oder auch womöglich an einem anderen Code-Teil. Ich habe das aus Zeitmangel
nicht genauer untersucht.
Und, ob das jetzt ein Excel-Bug ist oder nicht, weiss ich (noch) nicht. Kann aber sein, dass es schon bekannt ist.
Du verwendest eine intelligente Tabelle, was an sich sehr praktisch ist, da Du diese unabhängig ihrer Position im Code ansprechen kannst. Deine Einfügeprozedur habe ich
mal
rudimentär (man könnte z.B. noch Leertext abfangen, siehe auch Hinweise weiter unten) überarbeitet und diese sähe dann so aus. Beim Testen hatte ich die
Tabelle mal auf Spalte K gelegt, da auch Absturz für Spalte F.
Code:
Private Sub Button_Übertrag_Ersteller_Click()
Dim finden As Range
With ThisWorkbook.Worksheets("Einstellungen") _
.ListObjects("Ersteller")
Set finden = .ListColumns(1).DataBodyRange.Find(TextBoxErsteller)
If finden Is Nothing Then
If TextBoxErsteller.Text <> "" Then
.ListRows.Add
.ListRows(.ListRows.Count).Range(1).Value = TextBoxErsteller.Text
Me.TextBoxErsteller = ""
Call UserForm_Initialize
End If
Else
MsgBox "Bereits Vorhanden!"
End If
End With
End Sub
Ein paar Anmerkungen zum Code (auch von Dir)...
- Spreche bitte die Eigenschaften immer vollständig an, also statt TextBoxErsteller dann z.B. TextBoxErsteller.Text oder statt Cells(x,y) dann Cells(x,y).Value.
- Achte auf die Referenzierung: Set finden = Range("F:F").Find(... bezieht sich auf die aktive Tabelle! Somit auf die Übersicht, gesetzt von Start.
- Me kannst Du weglassen, denn der Code wird bereits in der UserForm ausgeführt.
- Ereignisse sind nicht dafür gedacht, diese im Code aufzurufen (Call UserForm_Initialize). Wenn Du Code-Teile aus der Initalisierung brauchst, dann mache für den Teil eine Prozedur und rufe den dann in der Intialisierung und woanders auf.
- Was mich betrifft, bin ich ein Freund von Variablendeklarationen. Strukturiert und führt vor Augen, um was für Datentypen und Werte es sich handelt.
- Was mich betrifft, bin ich ein Freund von korrekten Code-Einrückungen (blockweise), macht das Ganze doch leserlicher.
- Vermeide Umlaute in Prozedur-, Variablen- und weiteren Namen, die den Code betreffen. Auch wenn Du es wahrscheinlich nicht planst, aber z.B. auf einem Mac mit Excel, hättest Du dadurch weniger Probleme. Unabhängig davon, dass ListViews auf einem Mac eh' nicht funktionieren.
- Was übrigens Multipages betrifft, so kann - muss aber nicht - das Verwenden von ListViews in Multipage-Seiten dazu führen, dass diese sich zur Laufzeit nicht korrekt positionieren.
Gruß
Moin Mourad!
(01.07.2018, 08:30)maninweb schrieb: [ -> ]Ereignisse sind nicht dafür gedacht, diese im Code aufzurufen
Ein wenig off topic, sorry dafür …
Ich musste mal für ein Projekt der "Rechtsklick-Ersatz-Taste" zwischen Alt Gr und Strg "klarmachen", dass sie gefälligst auch ein Rechtsklickereignis auslösen soll.
Dies wollte der Auftraggeber, weil er sinnvollerweise ein Tastatur-Junkie ist.
Lösung:
Tabelle1
Code:
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Private in
Public umbenannt.
DieseArbeitsmappe
Code:
Private Sub Workbook_Activate()
Application.OnKey "+{F10}", "RechtsKlickErsatz"
End Sub
Private Sub Workbook_Deactivate()
On Error Resume Next
Application.OnKey "+{F10}"
On Error GoTo 0
End Sub
allgemeines Modul
Code:
Sub RechtsKlickErsatz()
Call Tabelle1.Worksheet_BeforeRightClick(ActiveCell, True)
End Sub
Wüsstest Du eine Lösung abseits meines callen?
Gruß Ralf
Moin Ralf,
ich würde jetzt dafür API nehmen, wobei es dann ja auch nur in Windows funktionieren würde. Einfacher ist sicherlich, für diesen Ausnahmefall,
doch das Ereignis aufzurufen. Insofern kann man meine vorherige Aussage durchaus etwas relativieren, vermeiden würde ich es generell trotzdem.
Im obigen Fall (Frogger1986) in jedem Fall.
Code:
Option Explicit
' API...
Private Declare PtrSafe Sub apiMouseEvent Lib "user32" _
Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, _
ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
' Constants...
Private Const cstMouseRightDown As Long = &H8
Private Const cstMouseRightUp As Long = &H10
' Functions...
Sub RechtsKlickErsatz()
apiMouseEvent cstMouseRightDown, 0, 0, 0, 0
apiMouseEvent cstMouseRightUp, 0, 0, 0, 0
End Sub
Gruß
Danke dafür!
Ich habe selbstverständlich getestet und folgendes Problem festgestellt:
Die API simuliert einen Rechtsklick
auf die Position des Mauszeigers.
Gewünscht war damals aber natürlich der "Rechtsklick"
auf die aktive Zelle.
Nach Studium der
MS-Seite könnte man natürlich auch den Mauszeiger
vorher mittels API positionieren.
Wäre für mich hier aber eher ein Fall für die armen Spatzen (die mit den Kanonen).
Anyway:
Ich habe es mir mal für meine API-Sammlung verlinkt.
Gruß und Danke,
Ralf
Vielen dank für die investierte Zeit euch allen..
Die Bereiche für "Ersteller" und "Orte" habe ich in normale Bereiche Konvertiert.. das war dann auch des Fehlers Lösung zum Absturz! -------> Deinen Code teste ich noch
Der Fehler mit der Listview ärgert mich tierisch, aber ich bin schon dabei diese gegen Listboxen zu tauschen... -----> Passiert mir nicht noch einmal!
Der Fehler mit der Optik im Code wird mir auch gerade beim überarbeiten bewusst... das ist echt schwierig.. ---> Passiert mir nicht noch einmal!
Mit den Ereignissen wollte ich Fehler minimieren, es etwas übersichtlicher gestalten und mir das Hacken ersparen! -------> Werde ich mit der Optik im Code versuchen
umzubauen
Frei nach dem Motto "Mach`s zu deinem Projekt!"
@SNB
Ich hab mich etwas eingelesen zur Multipage und ziehe meine Frage zurück..
Ganz klar gehört alles in die Multipage!
Manchmal sollte man nicht reagieren, doch warten bis .....
(in NL. 'tot het kwartje valt') :19:
Statt 'commandbuttons' im Startuserfom hast du nun 'Tabs' im Multipage.