Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1564to1568
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

Problem mit Range Überprüfung

Problem mit Range Überprüfung
14.06.2017 22:59:57
Balthasar
Hallo liebe Community,
schreibe seit ca 1,5 Wochen an einer Rechnungsvorlage für ein Hotel in Excel die auf Geschäftspapier abgestimmt ist. Habe dafür 2 Userforms erstellt (Datei angehängt). Das 1te ist kein Problem aber mit dem 2ten sollen zusätzliche Rechnungen (19% Besteuerung) eingetragen werden.
https://www.herber.de/bbs/user/114283.xlsm
Nun ist das Problem, das der Druckbereich limitiert ist (Rechnung muss noch "schön" aussehen) und ich daher nur bis zu einer bestimmten Zelle eintragen kann bevor ich auf eine weitere Seite (soll durch Zellen überspringen geschehen) ausweichen muss. Um das zu bewerkstelligen habe ich eine Schleife im Internet gefunden die in der Range ("B23:B29")~f~ nach einem bestimmten Wert sucht ~f~(Modul2 -> Sub RestaurantÜberprüfen),
Nun wird durch die Schleife der Wert aus der ersten Textbox 7 mal eingetragen, um dann erst mit dem 2ten weiterzumachen, zumindest scheint es mir so. Bei acht möglichen Textboxen ist das zuviel.
Kann mir da einer zufällig Abhilfe schaffen?
Würde mich sehr freuen. In der Hoffnung das ein paar auch am Feiertag hier reinschauen und oder die nächsten Tage.
Verbleibe ich mit freundlichem Gruß,
Balthasar
Bitte erschreckt nicht allzu sehr über den Code und die immens vielen If-Statements, bis jetzt habe ich weder die Schleife noch Select Case so richtig verstanden und der Unterricht in der Schule über VBA ist leider auch schon vorbei.

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Problem mit Range Überprüfung
15.06.2017 09:50:44
yummi
Hallo Balthasar,
wenn Du die 2. Seite aufbaust, dn nrufst Du Rechnung1 bis Rechnung8aufbauen auf. In Jeder der Funktionen rufst fragst du alle Comboboxen ab und trägst den Inhalt ein. Deshalb hast du auch soviele Einträge.
So wie Du es programmiert hast, reicht wenn du Rechnung8Aufbauen alleien aufrufst.
Gruß
yummi
AW: Problem mit Range Überprüfung
15.06.2017 10:46:21
Balthasar
Hallo Yummi,
vielen Dank für die schnelle Antwort. Hast recht ich hatte vergessen diesen Code zu ändern, als ich die Makros dazu geändert habe...
Nur gilt das meines Erachtens nur für Seite 2 und die wird ja erst dann aufgerufen, wenn ich keinen Platz auf Seite 1 habe oder nicht?
Mein Problem ist das ich zwar 8 Comboboxen habe um weitere Rechnungen einzutragen, auf Seite 1 aber nicht immer Platz ist für alle Rechnungen. Das möchte ich überprüfen. In meiner Überprüfung soll geschaut werden, ob bis Zeile 40 Rechnungen eingetragen werden können, wenn z.B. in Zeile 33 nichts steht, alle 8 Rechnungen eingetragen werden können, Zeile 32 und davor ist sowieso kein Problem, ab Zeile 34 geht nur 7 Rechnungen usw. wenn nicht geht muss alles auf die neue Seite.
Habe nun in Zeile 32 einen Wert und 33 ist frei aber aus irgendeinem Grund geht er alle folgenden s ubs durch erst Rechnung8Über dann Rechnung7Über usw. aber eigentlich sollte das durch die If-Klauseln doch gestoppt werden oder nicht? Das ist der entsprechende Code jeweils von 8 runterzählend bis 1.
If frmRestaurant.txtRechnung8.Visible = False Or frmRestaurant.txtAnzahl8.Visible = False Then
Call Rechnung7Über
Else
Call Rechnung8True
Exit Sub
End If
End Sub</pre>
<pre>Sub Rechnung8True()
If Range("B33").Find("*") Is Nothing Then
Call Rechnung8Aufbauen
Else
Call NeueSeiteEintragen
End If
End Sub</pre>
Hoffe das ich damit etwas mehr Klarheit verschafft habe. Entschuldigt bitte, das ich mich in meinem ersten Post so umständlich ausgedrückt habe. Habe den einen Teil des Problems auch erst heute morgen richtig erkannt.
Viele Grüße,
Balthasar
Anzeige
AW: Problem mit Range Überprüfung
15.06.2017 11:11:04
yummi
Hallo Balthasar,
du fragst falsch rum ab ;-)
If frmRestaurant.txtRechnung8.Visible = False Or frmRestaurant.txtAnzahl8.Visible = False Then bedeutet
wenn textbox8 unsichtbar oder textbox Anzahl ist unsichtbar, was du abe haben willst ist
wenn textbox8 sichtbar oder textbox Anzahl ist sichtbar dann Rechnung schreiben
Gruß
yummmi
AW: Problem mit Range Überprüfung
15.06.2017 12:02:26
Piet
Hallo Balthasar,
ich habe mir auch das Programm angesehen und sage, das hast du dir sicher viel Arbeit gemacht.
Sinn eines Forums ist, dir auch Wege zu zeigen wie du deinen Code sinnvoll reduzieren kannst.
Dazu mal ein Vorschlag von mir. - Als Programmierer schaue ich mir an was doppelt, dreifach vorkommt,
und überlege wie ich das sinnvoll zusammen fassen kann. Lange Ausdrücke zum Auswerten lieber in eine
Txt Variable laden, dann kann man bei IF Then bequem mit "And" oder "Or" arbeiten. Mehrfachauswertung!!
Halb und Vollpension werte ich über Teil-Text im String aus: - If Instr(Txt,"pension") Then
Als Programmierer würde ich auch nicht über ActiveCell.Select arbeiten, soweit bist du aber noch nicht.
Höfliche bitte aus Erfahrung:
wenn du den Code umschreiben willst dann bitte -nur in einer Testdatei- !! Die Erfahrung zeigt das man sich beim Umschreiben immer selbst Fehler reinhaut. Hast du dann die Originaldatei versemmelt steht der ganze Laden still. Das darf nicht sein. Ich test wichtige Programme zuerst in meiner Entwicklungs Datei bis alles korrekt laeuft! Verbessern ja, aber auf Nummer sicher gehen!
Der Code ist mir aber zu lang um den umzuschreiben. Will dir hiermit Tipps als Anregung zum selbst basteln geben.
mfg Piet

' verkürzter Code von Piet - bitte die Rangfolge beachten!!  Die Formel sollte zuerst gesetzt  _
werden
'Text zum Auswerten in Variable holen !!
Txt = frmRestaurant.cboRechnung8.Value
'zuerst diesen Teil auswerten wegen:  ActiveCell.Offset(1,0).Select !!
If Txt = "Frühstück a.H." Or Instr(Txt, "pension") Then
ActiveCell.Offset(0, 4).Value = "=RC[-5]*RC[-1]"
End if
If Txt = "Restaurant" or Txt = "Frühstück a.H."Or Txt = "Minibar" Or Instr(Txt, "pension")  _
Then
ActiveCell.FormulaR1C1 = frmRestaurant.cboRechnung8.Value
ActiveCell.Offset(0, 4).Value = frmRestaurant.txtRechnung8.Value
End if
'dann die einzelnen Besonderheiten als eine Zeile auswerten !!
If frmRestaurant.cboRechnung8.Value = "Frühstück a.H." Then
ActiveCell.Offset(0, 3).Value = Tabelle2.Range("J3").Value
ElseIf frmRestaurant.cboRechnung8.Value = "Halbpension" Then
ActiveCell.Offset(0, 3).Value = Tabelle2.Range("J4").Value
ElseIf frmRestaurant.cboRechnung8.Value = "Vollpension" Then
ActiveCell.Offset(0, 3).Value = Tabelle2.Range("J5").Value
End if
' Original Code, ganz am Ende vor End Sub
If frmRestaurant.cboRechnung8.Value = "Restaurant" Then
ActiveCell.FormulaR1C1 = frmRestaurant.cboRechnung8.Value
ActiveCell.Offset(0, 4).Value = frmRestaurant.txtRechnung8.Value
ActiveCell.Offset(1, 0).Select
ElseIf frmRestaurant.cboRechnung8.Value = "Frühstück a.H." Then
ActiveCell.FormulaR1C1 = frmRestaurant.cboRechnung8.Value
ActiveCell.Offset(0, 3).Value = Tabelle2.Range("J3").Value
ActiveCell.Offset(0, -1).Value = frmRestaurant.txtAnzahl8.Value
ActiveCell.Offset(0, 4).Value = "=RC[-5]*RC[-1]"
ActiveCell.Offset(1, 0).Select
ElseIf frmRestaurant.cboRechnung8.Value = "Halbpension" Then
ActiveCell.FormulaR1C1 = frmRestaurant.cboRechnung8.Value
ActiveCell.Offset(0, 3).Value = Tabelle2.Range("J4").Value
ActiveCell.Offset(0, -1).Value = frmRestaurant.txtAnzahl8.Value
ActiveCell.Offset(0, 4).Value = "=RC[-5]*RC[-1]"
ActiveCell.Offset(1, 0).Select
ElseIf frmRestaurant.cboRechnung8.Value = "Vollpension" Then
ActiveCell.FormulaR1C1 = frmRestaurant.cboRechnung8.Value
ActiveCell.Offset(0, 3).Value = Tabelle2.Range("J5").Value
ActiveCell.Offset(0, -1).Value = frmRestaurant.txtAnzahl8.Value
ActiveCell.Offset(0, 4).Value = "=RC[-5]*RC[-1]"
ActiveCell.Offset(1, 0).Select
ElseIf frmRestaurant.cboRechnung8.Value = "Minibar" Then
ActiveCell.FormulaR1C1 = frmRestaurant.cboRechnung8.Value
ActiveCell.Offset(0, 4).Value = frmRestaurant.txtRechnung8. _
Value
ActiveCell.Offset(1, 0).Select
End If
End Sub

Anzeige
AW: Problem mit Range Überprüfung
15.06.2017 16:13:33
Balthasar
@Yummi Vielen Dank, manchmal kann schweres so einfach sein... wäre ich im Leben nicht drauf gekommen. So funktioniert schonmal der Überprüfen Code. Leider fängt jetzt wieder der Nächste Seite Eintragen Code an zu spinnen, dass der zusätzlich noch ausgeführt wird und auch immer beide Teile des If Statements. Hier nochmal beide zusammenhängenden Teile des Codes.
<pre>Sub NeueSeiteEintragen()
'wenn Restaurantrechnungen auf Seite 2 eingetragen werden dann wird die Tabelle vorbereitet
Range("A58:F58").Font.Bold = True
Range("A58") = "Anzahl"
Range("B58") = "Bezeichnung"
Range("E58") = "Einzelpreis"
Range("F58") = "Gesamtpreis"
If Range("B59").Find("*") Is Nothing Then
Range("B59").Select
Call Rechnung8Aufbauen
Exit Sub
Else
Range("B60").Select
Call Rechnung8Aufbauen
Exit Sub
End If
End Sub</pre>
<pre>Sub Rechnung8True()
If Range("B33").Find("*") Is Nothing Then
Call Rechnung8Aufbauen
Exit Sub
Else
Call NeueSeiteEintragen
Exit Sub
End If
End Sub</pre>
@Piet genau nach so etwas habe ich die letzten 2 Tage im Internet gesucht, nur leider sind die meisten Posts in den Hilfeforen weit über meinen VBA-Kenntnissen :-). Die Datei ist bis jetzt noch nicht in Benutzung und muss sowieso noch formatiert werden mit Blattschutz und Druckeinstellungen usw. am Ende soll der Nutzer dann immer eine Leere Excel Tabelle vorfinden in die er mit den cmd Buttons die Daten eintragen kann.
Wenn ich deinen Code so durchlese fällt mir auf das du nur Rechnung8 benutzt hast. Müsste ich um alle Komboboxen zu durchlaufen mit einer Schleife arbeiten? Oder übersehe ich grundlegendes?
Mir käme kürzerer Code sehr entgegen.
Trotzallem vielen Dank an euch Beide für die schnelle und kompetente Hilfe
Viele Grüße
Balthasar
Anzeige
AW: Problem mit Range Überprüfung
15.06.2017 16:19:19
Balthasar
Ohje es tut mir Leid... ich muss zurückrudern... Hatte meinen Code nicht richtig getestet, ein einfaches Exit Sub löst gerade meine Probleme in Bezug auf das Neue Seite Eintragen Problem.
Entschuldigung und Danke für euer Verständnis
AW: Problem mit Range Überprüfung
15.06.2017 17:29:41
Piet
Hallo Balthasar
ich kann mir den Code noch mal ansehen, aber bei der Menge kann das 3-4 Tage dauern.
Wenn du schon was geaendert hast waere eine neue Beispieldatei gut, das man sieht was
noch aktuelle ist, und nwelche Codeteile nicth mehr benutzt werden. Kann dir aber keine
Garantie geben das ich auf Anhieb einen besseren habe. Der ist schon recht umfangreich.
mfg Piet
Anzeige
AW: Problem mit Range Überprüfung
15.06.2017 18:21:16
Balthasar
Hallo Piet,
habe deinen Code bisher noch nicht eingebaut oder an meinem alten Code etwas geändert, da es funktioniert und das ist das wesentliche :D. Habe leider nur noch bis Sonntag Zeit hier und muss bis dahin fertig sein und zumindest eine nutzbare Datei vorweisen. Ich wollte mich nächste Woche einfach zu Übungszwecken nochmal daran setzen und schauen ob ich den Code vereinfachen kann. Aber vielen Dank schonmal für die Hinweise und die Hilfe
Viele Grüße,
Balthasar
AW: Problem mit Range Überprüfung
16.06.2017 08:29:35
yummi
Hallo Balthasar,
wenn du wirklich was verbessern willst, dann entferne im 1. Zug die ganzen selects, das macht man so gut wie gar nicht in VBA.
z.b. (nicht aus deienm Code)
vorher
ActiveSheet.Cells(x,y).select
Selection.Value = 3
nachher
ActiveSheet.Cells(x,y).Value = 3
und im nächsten Step schau mal Teile an, wo du mehrmals das gleiche machst
Cells(1,2).value = x
Cells(2,2).value = x
...
Cells(8,2).value = x
wird zu
for i = 1 to 8
Cells(i,2).value = x
next i
Nur so als Anregung
Gruß
yummi
Anzeige
AW: Problem mit Range Überprüfung
18.06.2017 11:53:58
Piet
Hallo Balthasar
anbei deine Beispieldatei mit einigen Vorschlaegen zum besseren Programmieren zurück.
Ich habe den Code für UserForm Rechnungsdaten verkürzt, indem ich alles was ausgeblendet wird noch oben geschoben habe, - vor If Befehl, und nur mit Visible = True die über IF Then gewünschten Textfelder wieder einblende. Der Code wird dadurch kürzer.
Im Editor befindet sich ein Public Modul mit einer Demo warum ich gerne über Basis Adressen arbeite.
Von dieser Basis Adresse lassen sich benötigte Nachbarzellen bequem über Offset(x,y) erreichen.
Ausserdem sind in der Info Tabelle noch einige Tipps zum besseren Programmieren - ohne Select!
Der Code ist aber so lang das es mir zuviel Aufwand ist mir das alles anzusehen.
Ich hoffe aber das meine Tipps zum sich einen Code Selber basteln nützlich sind.
https://www.herber.de/bbs/user/114342.xlsm
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige