PDA

Vollständige Version anzeigen : Maske:1.Spalte nicht anzeigen


optimfish
12.07.2006, 20:48
Hallo zusammen!

Ich habe da wieder mal ein kleines Problemchen, ein Kosmetikproblem :D

Ich habe eine Kundendatenbank und möchte über eine Maske die Daten eingeben. Da die Kundennummer automatisch generiert wird, möchte ich, dass diese in der Maske nicht erscheint! Die Datenbank beginnt bei Spalte B mit der Kundennummer und endet mit der Spalte N. Die Maske funktioniert bestens, aber eben, ich möchte die Spalte B in der Maske ausblenden! Weiss jemand einen Trick dazu?

jinx
13.07.2006, 04:03
<font size="2" face="Century Gothic">Moin, Franz,

entweder den gewünschten Bereich vor dem Aufrufen des Menüpunktes auswählen oder (wenn der Name noch frei ist) den Bereich Datenbank als sich anpassenden Namen auf der Tabelle vergeben...

Anmerkung: eigentlich sollte sich der Bereich bei Datenbank automatisch anpassen - bei meiner Version von Excel97 ist das leider zur Zeit nicht so (die hat sich wohl müde gerechnet...).</font>

optimfish
13.07.2006, 06:30
Hallo Jinx

Der Name Datenbank ist leider schon vergeben. Darum habe ich jetzt ein Makro gemacht, gemäss deinem Tipp und es funktioniert wunderbar. Eigentlich hatte ich auch schon die Idee, den ganzen Bereich zuerst zu markieren, aber dann kam eine Fehlermedlung, jetzt funktioniert es aber und ich musste den Namen Datenbank für ein anders Modul durch einen anderen ersetzen, sonst hätte es auch nicht funktioniert.

Jetzt ist aber alles gut! Vielen Dank!

optimfish
13.07.2006, 21:23
Hallo Jinx

Mein Makro funktioniert doch nicht. Wenn ich den gewünschten Bereich markiere und die Maske aufrufe ist alles in Ordnung: Die Spalte B wird nicht angezeigt. Aber wenn ich die Funktion per Makro aufrufe, wird die Spalte B in der Maske trotzdem angezeigt! Weisst du was an diesem Code falsch ist, warum die Maske die Spalte B anzeigt, obwohl erst ab Spalte C markiert wurde?

Sub maske()
'
' maske Makro
' Makro am 13.07.2006 von Franz Müller aufgezeichnet
'

'
Columns("C:N").Select
ActiveSheet.ShowDataForm

End Sub

jinx
14.07.2006, 04:23
<font size="2" face="Century Gothic">Moin, Franz,

dies ist einer der Fälle, wo die Makroaufzeichnung nicht wie erhofft funktioniert. Lösung: nicht den Macrocode, sondern die Ausführung über den Menüpunkt verwenden. Ich würde ggf. das Ereignis Worksheet_Activate als Auslöser nutzen:

Option Explicit

Private Sub Worksheet_Activate()
Columns("C:N").Select
RunMenu 860
End Sub

Sub RunMenu(iMenuID As Long)
' Bullen/Green/Bovey/Rosenberg: Excel Programmer´s Reference 2002 S. 463

' Dim oCtrl As CommandButton

'Ignore any errors (such as the menu ID not valid)
On Error Resume Next

'Create your own temporary commandbar to hold the control
With Application.CommandBars.Add

'Add the control and execute it
.Controls.Add(Id:=iMenuID).Execute

'Then delete our temporary menu bar
.Delete

End With
End Sub</font>

optimfish
14.07.2006, 06:22
Danke Jinx

Aber sorry, ich weiss jetzt nicht so recht, was ich mit dem Code machen muss, den du mir gesandt hast. Was meinst du mit "Die Ausführung über den Menücode". Kannst du mir einen Anhaltspunkt geben? Das scheint etwas Neues für mich zu sein.

jinx
14.07.2006, 19:36
<font size="2" face="Century Gothic">Moin, Franz,

wie Du selbst gemerkt hast, wird bei Ausführung des Makrobefehls der gesamte Bereich in der Maske angezeigt, beim manuellen Starten jedoch nur der gewünschte Bereich, Und genau da setzt der Code ein, indem er quasi die Ausführung über das Menü nachbildet. Dazu wird kurzfristig eine eigene Symbolleiste mit dem gewünschten Befehl erstellt, dieser ausgeführt und die eben erstellte Symbolleiste wieder gelöscht... ;)</font>

optimfish
14.07.2006, 22:15
Hallo Jinx

Danke für deine sehr verständlichen Ausführungen!! Einfach super was ich hier lernen kann, bin echt begeistert!

Aber ich habe ein Problem, nämlich, dass ich bereits untenstehenden Code (generiert die Rechnungsnummern) im Sheet drin habe! Kann ich denn den neuen Code irgendwie anhängen? Ich habe mal versucht, aber es kommt eine Fehlermeldung, wahrscheinlich weil jetzt 2 Mal steht:"Privat sub Worksheet_Activate()" Gibt es einen Übergang wie bei den Funktionen das &-Zeichen?? Oder kann ich sogar "deinen" Code über eine Schaltfläche ausführen lassen? Das wär mir eigentlich noch lieber.

Gibt es da eine Lösung? Oder müssen wir etwas anderes machen? Nur mit deinem Code im Sheet (ohne den bestehenden) funktioniert die Sache wunderbar!

Dieser Code ist schon drin:

Private Sub Worksheet_Activate()
'*** Dimensionierungen ***
Dim lLetzte As Long '<<< letzte genutzte Zeile der Tabelle
Dim lAktuell As Long '<<< aktuelle Zeile der Tabelle
Dim lGefunden As Long '<<< Fundzeile des Suchbegriffes
Dim lAdresse As Long '<<< Aufnahme der Startzeile fuer die Suche

'*** Feststellen der doppelten Werte in den Spalten C:E,
' dabei wird zuerst die Spalte mit den Nachname gesprueft ***
'<<< Flackern aus
Application.ScreenUpdating = False
'<<< Feststellen letzte genutzte Zeile ohne Pruefung letzte Zelle auf Inhalt
lLetzte = Cells(Rows.Count, 3).End(xlUp).Row
'<<< Schleife von unten her mit negativer Schrittweise
For lAktuell = lLetzte To 3 Step -1
'<<< Vorgabe Startzeile
lAdresse = 1
'<<< Nutzen der Tabellenfunktion Zaehlenwenn zum Feststellen, ob Nachname mehrfach vorkommt
Do While WorksheetFunction.CountIf(Range("D2:D" & lAktuell), Range("D" & lAktuell)) > 1
'<<< Wenn ja, dann in Spalte D nach der Zelle mit der weiteren Fundstelle suchen
With Columns("D:D")
'<<< Fundzeile feststellen
lGefunden = .Find(What:=Cells(lAktuell, 4).Value, After:=.Cells(lAdresse), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Row
End With
'<<< Vergleich der Fundzeile mit der aktuellen Zeile
If lAktuell = lGefunden Then Exit Do
'<<< Die Werte der Nachbarzellen vergleichen
If (Trim(Cells(lAktuell, 3).Value) = Trim(Cells(lGefunden, 3).Value) And _
Trim(Cells(lAktuell, 5).Value) = Trim(Cells(lGefunden, 5).Value)) Then
'<<< Bei Zutreffen letzte Zeile loeschen
Rows(lAktuell).Delete
End If
' Uebergabe der veraenderten Adresse
lAdresse = lGefunden
Loop
Next lAktuell
'<<< Erneutes Feststellen der letzten Zeile
lLetzte = Cells(Rows.Count, 3).End(xlUp).Row
'<<< Schleife
For lAktuell = 2 To lLetzte
'<<< Wenn Zelle leer, Feststellen des Maximums und Addieren von 1
If IsEmpty(Cells(lAktuell, 2).Value) Then
Cells(lAktuell, 2).Value = WorksheetFunction.Max(Range("B2:B" & lLetzte)) + 1
End If
Next lAktuell
End Sub

jinx
15.07.2006, 01:47
<font size="2" face="Century Gothic">Moin, Franz,

jedes Ereignis kann in einem einzigen Klassenmodul nur ein einziges Mal angewendet werden.

Folgende Ansätze: Entweder die beiden Codezeilen aus der von mir geposteten Prozedur werden in Deine übernommen und direkt vor End Sub eingeführt, oder Du lagerst die Prozeduren in ein allgemeines Modul aus (Start über Schaltfläche Formular) oder kopierst die beiden Codezeilen zwischen die "Hülle" einer Steuerelement Toolbox Schaltfläche:

Sub DatenMaskeFranz()
Columns("C:N").Select
RunMenu 860
End Sub
Option Explicit

Private Sub cmdDMAufruf_Click()
Columns("C:N").Select
RunMenu 860
End Sub</font>

optimfish
15.07.2006, 10:13
Hallo Jinx, egal wo ich die beiden Zeilen einfüge, es folgt immer die Fehlermeldung:"Fehler beim kompilieren" und markiert:"RunMenu"...sub oder function nicht definiert.

Hier habe ich zum Beispiel die beiden Zeilen zwischen die "Hülle" einer Steuerelement Toolbox (Command Button1) gelegt, wie du empfohlen hast. Oder ist das etwas anderes?

Private Sub CommandButton1_Click()
Columns("C:N").Select
RunMenu 860
End Sub

Private Sub Worksheet_Activate()
'*** Dimensionierungen ***
Dim lLetzte As Long '<<< letzte genutzte Zeile der Tabelle
Dim lAktuell As Long '<<< aktuelle Zeile der Tabelle
Dim lGefunden As Long '<<< Fundzeile des Suchbegriffes
Dim lAdresse As Long '<<< Aufnahme der Startzeile fuer die Suche

'*** Feststellen der doppelten Werte in den Spalten C:E,
' dabei wird zuerst die Spalte mit den Nachname gesprueft ***
'<<< Flackern aus
Application.ScreenUpdating = False
'<<< Feststellen letzte genutzte Zeile ohne Pruefung letzte Zelle auf Inhalt
lLetzte = Cells(Rows.Count, 3).End(xlUp).Row
'<<< Schleife von unten her mit negativer Schrittweise
For lAktuell = lLetzte To 3 Step -1
'<<< Vorgabe Startzeile
lAdresse = 1
'<<< Nutzen der Tabellenfunktion Zaehlenwenn zum Feststellen, ob Nachname mehrfach vorkommt
Do While WorksheetFunction.CountIf(Range("D2:D" & lAktuell), Range("D" & lAktuell)) > 1
'<<< Wenn ja, dann in Spalte D nach der Zelle mit der weiteren Fundstelle suchen
With Columns("D:D")
'<<< Fundzeile feststellen
lGefunden = .Find(What:=Cells(lAktuell, 4).Value, After:=.Cells(lAdresse), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Row
End With
'<<< Vergleich der Fundzeile mit der aktuellen Zeile
If lAktuell = lGefunden Then Exit Do
'<<< Die Werte der Nachbarzellen vergleichen
If (Trim(Cells(lAktuell, 3).Value) = Trim(Cells(lGefunden, 3).Value) And _
Trim(Cells(lAktuell, 5).Value) = Trim(Cells(lGefunden, 5).Value)) Then
'<<< Bei Zutreffen letzte Zeile loeschen
Rows(lAktuell).Delete
End If
' Uebergabe der veraenderten Adresse
lAdresse = lGefunden
Loop
Next lAktuell
'<<< Erneutes Feststellen der letzten Zeile
lLetzte = Cells(Rows.Count, 3).End(xlUp).Row
'<<< Schleife
For lAktuell = 2 To lLetzte
'<<< Wenn Zelle leer, Feststellen des Maximums und Addieren von 1
If IsEmpty(Cells(lAktuell, 2).Value) Then
Cells(lAktuell, 2).Value = WorksheetFunction.Max(Range("B2:B" & lLetzte)) + 1
End If
Next lAktuell

Columns("C:N").Select
RunMenu 860

End Sub




Und ausserdem verstehe ich nicht, warum der Code, den ich ins Sheet gelegt habe mit der neuen Schaltfläche verknüpft ist?? Sobald ich eine neue Steuerelement Schaltfläche anlege, ist da immer der Code vom Sheet drin! Wenn ich dort den Code lösche, wird er auch im Sheet gelöscht. Das begreife ich nicht?

jinx
15.07.2006, 12:14
<font size="2" face="Century Gothic">Moin, Franz,

das bemängelte ist die andere Prozedur, die sich zwangsläufig auch in der Mappe oder einem zugänglichen Platz befinden muss (persönliche Makroarbeitsmappe, AddIn). Ein Beispiel mit Aufruf per Schaltflächen findest Du im Anhang.</font>

optimfish
15.07.2006, 12:54
Super Jinx, jetzt hats geklappt.

Allerdings weiss ich nicht, ob ich das ganze jetzt nochmals rekonstruieren könnte. Das liegt daran, dass ich praktisch Null-VBA Grundwissen habe. Vorallem das Auslagern der Codes, ist für mich nicht so verständlich. OK, mich interessiert vorallem das Beherrschen der Anwendung und die Weitergabe dieses Wissens. Ohne deine Hilfe hätte ich die Anpassungen für den Komfort nie und nimmer geschafft. Herzlichen Dank!

jinx
15.07.2006, 15:53
<font size="2" face="Century Gothic">Moin, Franz,

betrachte den Vorgang doch einmal unter dem Gesiuchtspunkt, dass es sich um zwei voneinander getrennte Vorgänge handelt. Der eine (RunMenu) ist eine Prozedur, die eine Zahl (die Zahl des Befehls, der ausgeführt werden soll) erwartet. Gleiches tun Funktionen auch: einen Wert erwarten und eine bestimmte Aktion ausführen. Diese Sub ist implizit als Public deklariert, sie kann also von jeder anderen Prozedur angesprochen werden (wenn diese weiß, welcher Parameter übergeben werden muss). Von daher gehört für mich diese Prozedur in ein allgemeines Modul der Arbeitsmappe. Vorteil bei einem solchen Vorgehen: man schreibt einen Code, den man beliebig wiederverwenden kann.

Die andere Prozedur (DatenMaskeFranz) ist eigentlich nur für den Aufruf da: es wird der gewünschte Bereich markiert und das Makro mit der entsprechenden Einstellung gestartet.

Um die Verwirrung nun zu komplettieren, hätte man auch den gesamten Vorgang in einer Prozedur ablegen können. Dann hätte man aber für jede Maske diese Art Vorgehen hinterlegen müssen. Und - wie heißt es so treffend - Programmierer achten darauf, dass der Code so allgemeingültig wie möglich geschrieben wird und nur die Anpassung an den Code bei anderen Problemen verändert werden muss. In meinem Fall musste ich allerdings den Code nur aus der Quelle abschreiben - ich behaupte nun aber nicht, dass das die höheren Programmierweihen seien... :grins:</font>

optimfish
15.07.2006, 16:14
Danke Jinx, das war sehr hilfreich!

Ich denke also, das ist ähnlich wie beim Homepage-basteln, wenn man CSS einsetzt, dann kann man diese Datei auch auslagern und für jede beliebige Seite einsetzen! Es freut mich sehr, dass du mir soviel hilfst!

Wenn du mal ein paar Minuten Zeit hast, würde mich deine Meinung zu diesem Problem, http://ms-office-forum.net/forum/showthread.php?p=880271#post880271 das ich bereits gelöst habe, sehr interessieren. Benutzer RJ meint das sei etwas für Access und im Excel eine halbherzige Lösung. Das glaube ich ihm irgendwie schon, aber ich bleibe dabei, wenn möglich im heim- und halbprofessionellen Bereich: Excel! Erst bei ganz komplexen Aufgaben im Profibereich: Access. Und mit deiner Hilfe macht die Sache noch viel mehr Spass! Jedenfalls ist meine Chefin von meiner Stundenplanung mit automatischem Kalender völlig begeistert!

jinx
16.07.2006, 07:42
<font size="2" face="Century Gothic">Moin, Franz,

nicht ganz, weil die CSS-Anweisungen auch oben im Seitenkopf eingebunden werden können, nicht nur im "Text". Letzteres führt dazu, den Code immer an der Stelle zu wiederholen, im Kopf führt zu einer Verfügbarkeit auf der betreffenden Seite und als externe Datei zu einer generellen Verfügbarkeit, wann immer die Datein im Kopf eingebunden wird.

Ich habe Zeit für eine Antwort, aber schon damals beim Lesen des Beitrages für mich entschieden, dass ich keine Lust verspürte, eine Lösung für Dich zu schreiben. Und daran hat sich bis jetzt auch nichts geändert. Und ich habe und werde mir auch den Anhang nicht ansehen, um mir eine Meinung zu bilden. ;)</font>

optimfish
16.07.2006, 07:50
Danke Jinx!

Geht alles in Ordnung!

Wünsche dir eine gute Zeit und heute gehe ich baden :grins: