Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Brauche hilfe bei VBA Code





Frage

Hallo Leute, habe eine klasse VBA-Code hier bekommen, und ihn modifiziert, jetzt bin ich endlich fertig, und er funzt nicht *frusst* Hat jemand die Musse sich das Teil mal anzuschauen? Dann ist hier die Datei: [url]http://rapidshare.com/files/131698076/Ausbildungsplan20082.zip[/url] Brauche das Ding ab 01.08., es ist ein Ausbildungsplan... Danke schon mal im Vorraus Benjä [*][sup][i] *Threadedit* 11:06:41, 25.07.2008 Admininfo: Führ bitte einen Thread nicht fort indem du Weitere eröffnest, und vermeide Mehrfachanfragen. Die Datenbank und User werden es dir danken. Siehe [u][url=https://supportnet.de/faqsthread/840]FAQ 2, #3[/url][/u].[/i][/sup]

Antwort 1 von coros

Hallo Benjamin,

was funktioniert denn nicht? Ich habe Deine Datei mal getestet. Ich habe in Zelle A32 bzw. Zelle J32 eine 1 eingetragen. Es erscheint eine Meldung. So soll es doch sein oder?

Noch ein Tipp: Entweder Du stellst Deine Frage in dem dazugehörigen Beitrag von Dir, oder Du erklärst in Deinem Neuen genau, was der Code machen soll und was nicht funktioniert, eventuell mit einem Link auf Deinen anderen Beitrag. Denn mit Deinem jetzigen Beitrag kann niemand etwas richtig anfangen, außer denen, die Deinen letzten Beitrag kennen.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 2 von BenjaminM

Sorry für die Verwirrung, ich lerne noch mit dem Umgang im Forum!

Also mit der A & J &.... Spalte (die jeweils erste Spalte pro Monat) ist alles i.O., aber mit den folge Spalten nicht, da zählt er nicht bzw. gib die Msg Box nicht aus beim erreichen der Zählsumme.

Also für den ersten Part haut alles hin, nur für die Folgenden nicht. B & K &....

Gruß Benjä

Antwort 3 von BenjaminM

Für Alle die,
die sich auch noch reindenken wollen, hier die Vorgeschichte:

https://supportnet.de/threads/2129643

Benjä

Antwort 4 von coros

Hallo Benjamin,

Du beschreibst mit Deinem Code die falschen Variablen. Bei Spalte A sieht das so aus:

iSummeSpalteA1 = Application.WorksheetFunction.CountIf(Range("A2:A32"), 1)
iSummeSpalteA2 = Application.WorksheetFunction.CountIf(Range("A36:A66"), 1)
iSummeSpalteJ1 = Application.WorksheetFunction.CountIf(Range("J2:J32"), 1)
iSummeSpalteJ2 = Application.WorksheetFunction.CountIf(Range("J36:J66"), 1)
iSummeSpalteS1 = Application.WorksheetFunction.CountIf(Range("S2:S32"), 1)
iSummeSpalteS2 = Application.WorksheetFunction.CountIf(Range("S36:S66"), 1)
iSummeSpalteAB1 = Application.WorksheetFunction.CountIf(Range("AB2:AB32"), 1)
iSummeSpalteAB2 = Application.WorksheetFunction.CountIf(Range("AB36:AB66"), 1)
iSummeSpalteAK1 = Application.WorksheetFunction.CountIf(Range("AK2:AK32"), 1)
iSummeSpalteAK2 = Application.WorksheetFunction.CountIf(Range("AK36:AK66"), 1)
iSummeSpalteAT1 = Application.WorksheetFunction.CountIf(Range("AT2:AT32"), 1)
iSummeSpalteAT2 = Application.WorksheetFunction.CountIf(Range("AT36:AT66"), 1)

iSummeSpalteA3 = Application.WorksheetFunction.CountIf(Range("A2:A32"), 2)
iSummeSpalteA4 = Application.WorksheetFunction.CountIf(Range("A36:A66"), 2)
iSummeSpalteJ3 = Application.WorksheetFunction.CountIf(Range("J2:J32"), 2)
iSummeSpalteJ4 = Application.WorksheetFunction.CountIf(Range("J36:J66"), 2)
iSummeSpalteS3 = Application.WorksheetFunction.CountIf(Range("S2:S32"), 2)
iSummeSpalteS4 = Application.WorksheetFunction.CountIf(Range("S36:S66"), 2)
iSummeSpalteAB3 = Application.WorksheetFunction.CountIf(Range("AB2:AB32"), 2)
iSummeSpalteAB4 = Application.WorksheetFunction.CountIf(Range("AB36:AB66"), 2)
iSummeSpalteAK3 = Application.WorksheetFunction.CountIf(Range("AK2:AK32"), 2)
iSummeSpalteAK4 = Application.WorksheetFunction.CountIf(Range("AK36:AK66"), 2)
iSummeSpalteAT3 = Application.WorksheetFunction.CountIf(Range("AT2:AT32"), 2)
iSummeSpalteAT4 = Application.WorksheetFunction.CountIf(Range("AT36:AT66"), 2)


Bei Spalte B sieht das so aus:

 iSummeSpalteB1 = Application.WorksheetFunction.CountIf(Range("B2:B32"), 1)
iSummeSpalteB2 = Application.WorksheetFunction.CountIf(Range("B36:B66"), 1)
iSummeSpalteK1 = Application.WorksheetFunction.CountIf(Range("K2:K32"), 1)
iSummeSpalteK2 = Application.WorksheetFunction.CountIf(Range("K36:K66"), 1)
iSummeSpalteT1 = Application.WorksheetFunction.CountIf(Range("T2:T32"), 1)
iSummeSpalteT2 = Application.WorksheetFunction.CountIf(Range("T36:T66"), 1)
iSummeSpalteAC1 = Application.WorksheetFunction.CountIf(Range("AC2:AC32"), 1)
iSummeSpalteAC2 = Application.WorksheetFunction.CountIf(Range("AC36:AC66"), 1)
iSummeSpalteAL1 = Application.WorksheetFunction.CountIf(Range("AL2:AL32"), 1)
iSummeSpalteAL2 = Application.WorksheetFunction.CountIf(Range("AL36:AL66"), 1)
iSummeSpalteAU1 = Application.WorksheetFunction.CountIf(Range("AU2:AU32"), 1)
iSummeSpalteAU2 = Application.WorksheetFunction.CountIf(Range("AU36:AU66"), 1)

]iSummeSpalteB1 = Application.WorksheetFunction.CountIf(Range("B2:B32"), 2)
iSummeSpalteB2 = Application.WorksheetFunction.CountIf(Range("B36:B66"), 2)
iSummeSpalteK1 = Application.WorksheetFunction.CountIf(Range("K2:K32"), 2)
iSummeSpalteK2 = Application.WorksheetFunction.CountIf(Range("K36:K66"), 2)
iSummeSpalteT1 = Application.WorksheetFunction.CountIf(Range("T2:T32"), 2)
iSummeSpalteT2 = Application.WorksheetFunction.CountIf(Range("T36:T66"), 2)
iSummeSpalteAC1 = Application.WorksheetFunction.CountIf(Range("AC2:AC32"), 2)
iSummeSpalteAC2 = Application.WorksheetFunction.CountIf(Range("AC36:AC66"), 2)
iSummeSpalteAL1 = Application.WorksheetFunction.CountIf(Range("AL2:AL32"), 2)
iSummeSpalteAL2 = Application.WorksheetFunction.CountIf(Range("AL36:AL66"), 2)
iSummeSpalteAU1 = Application.WorksheetFunction.CountIf(Range("AU2:AU32"), 2)
iSummeSpalteAU2 = Application.WorksheetFunction.CountIf(Range("AU36:AU66"), 2) 


Du überschreibst immer wieder die Variablen "iSummeSpalteB1 ", "iSummeSpalteB2 " usw.

Du musst das wie für Spalte A machen, also den ersten Block

iSummeSpalteB1 = Application.WorksheetFunction.CountIf(Range("B2:B32"), 1)
iSummeSpalteB2 = Application.WorksheetFunction.CountIf(Range("B36:B66"), 1)
iSummeSpalteK1 = Application.WorksheetFunction.CountIf(Range("K2:K32"), 1)
iSummeSpalteK2 = Application.WorksheetFunction.CountIf(Range("K36:K66"), 1)
iSummeSpalteT1 = Application.WorksheetFunction.CountIf(Range("T2:T32"), 1)
iSummeSpalteT2 = Application.WorksheetFunction.CountIf(Range("T36:T66"), 1)
iSummeSpalteAC1 = Application.WorksheetFunction.CountIf(Range("AC2:AC32"), 1)
iSummeSpalteAC2 = Application.WorksheetFunction.CountIf(Range("AC36:AC66"), 1)
iSummeSpalteAL1 = Application.WorksheetFunction.CountIf(Range("AL2:AL32"), 1)
iSummeSpalteAL2 = Application.WorksheetFunction.CountIf(Range("AL36:AL66"), 1)
iSummeSpalteAU1 = Application.WorksheetFunction.CountIf(Range("AU2:AU32"), 1)
iSummeSpalteAU2 = Application.WorksheetFunction.CountIf(Range("AU36:AU66"), 1)


und beim 2. Block dann

 
iSummeSpalteB3 = Application.WorksheetFunction.CountIf(Range("B2:B32"), 2)
iSummeSpalteB4 = Application.WorksheetFunction.CountIf(Range("B36:B66"), 2)
iSummeSpalteK3 = Application.WorksheetFunction.CountIf(Range("K2:K32"), 2)
iSummeSpalteK4 = Application.WorksheetFunction.CountIf(Range("K36:K66"), 2)
iSummeSpalteT3 = Application.WorksheetFunction.CountIf(Range("T2:T32"), 2)
iSummeSpalteT4 = Application.WorksheetFunction.CountIf(Range("T36:T66"), 2)
iSummeSpalteA1 = Application.WorksheetFunction.CountIf(Range("AC2:AC32"), 2)
iSummeSpalteA2 = Application.WorksheetFunction.CountIf(Range("AC36:AC66"), 2)
iSummeSpalteAL3 = Application.WorksheetFunction.CountIf(Range("AL2:AL32"), 2)
iSummeSpalteAL4 = Application.WorksheetFunction.CountIf(Range("AL36:AL66"), 2)
iSummeSpalteAU3 = Application.WorksheetFunction.CountIf(Range("AU2:AU32"), 2)
iSummeSpalteAU4 = Application.WorksheetFunction.CountIf(Range("AU36:AU66"), 2)


Das Ganze auch für die anderen Blöcke.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 5 von BenjaminM

Danke Oliver!

Manchmal sieht man den Wald vor lauter Bäumen nicht!

Es haut hin! Danke schön!

Gruß Benjä

Antwort 6 von lorf55

Hallo BenjaminM,
nur so als Tip: Du hast sicher ganz toll gearbeitet um den Code so hinzukriegen, wie er jetzt ist. Trotzdem solltest du versuchen, ihn zu vereinfachen, indem du Arrays benutzt und dir mehrmalig benutzbare Hilfsfunktionen baust. Dabei fängt man klein an und baut sich aus selbstgemachten Bausteinen sein Haus zusammen.

wenn du z.B. für diesen Ausdruck eine Hilfsfunktion mit passenden Parametern baust, wäre das nicht schlecht:

iSummeSpalteA1 = Application.WorksheetFunction.CountIf(Range("A2:A32"), 1)
iSummeSpalteA2 = Application.WorksheetFunction.CountIf(Range("A36:A66"), 1)
usw.


Man kann die Bereiche vereinigen und dann zählen:
Private Function Summe1()
Dim iSummeA_AT As Integer
iSummeA_AT = Application.WorksheetFunction.CountIf( _
    Union(Range("A2:A32"), Range("A36:A66"), _
    Union(Range("J2:J32"), Range("J36:J66")), _
    Union(Range("S2:S32"), Range("S36:S66")), _
    Union(Range("AB2:AB32"), Range("AB36:AB66")), _
    Union(Range("AK2:AK32"), Range("AK36:AK66")), _
    Union(Range("AT2:AT32"), Range("AT36:AT66")), 1))
End Function 

Aufruf:
If Summe1() > varGrenzwert1 Then
    MsgBox "Büro max.60Tage...", vbInformation, "Maximale Arbeitstage erreicht"
    Target.Cells.ClearContents
End If


Denn kann man statt
Union(Range("A2:A32"), Range("A36:A66")
Union(Range(Cells(2, 1+Offset), Cells(32, 1+Offset)), Range(Cells(36, 1+Offset), Cells(66, 1+Offset))) usw. usf.
benutzen und in die Funktion noch einen Versatz (Offset) einbauen, um sie noch öfter anzuwenden.

Eventuell hilft es für die Übersicht, mit benannten Bereichen zu arbeiten, weiß ich jetzt aber nicht 100%, mir hat es aber schon oft geholfen.

Sonst baust du dir Code, den man später schlecht warten, also anpassen kann.

Ist nur so als Tipp gemeint, bitte nicht persönlich nehmen.

Gruß
lorf

PS: ich glaube du wirst dich wundern, wie kurz dein Code sein kann.
PPS: Ich habe jetzt leider keine Zeit mehr, das ordentlich zu machen, obwohl es mir in den Fingern juckt...

Antwort 7 von BenjaminM

Danke für den Hinweis,
habs mal eben probiert, jedoch wo muss ich dann den Dim für meinen varGrenzwert setzen?

So, wie der Code jetzt geschrieben ist, funzt die Msg Box nicht!
------------------------------------------------------------------------------------
Noch ne Frage zum vorrangegangenen Code:

Fein Tuning,

Ist es möglich den "varGrenzwert" in die Msg Box einzubinden? Das wenn ich die BezugsZelle des varGrenzwertes ändere, das die Änderung auch in der Msg Box angezeigt/geändert wird?
Es handelt sich um eine Tagesanzahl, die als max. Wert in der Msg Box angezeigt wird.(momentan händisch)

MsgBox "Büro max.60Tage...", vbInformation, "Maximale Arbeitstage erreicht"

Gedanke:

MsgBox "Büro max.=varGrenzwertTage...", vbInformation, "Maximale Arbeitstage erreicht"

Hier wird dann aber alles als Text angezeigt.(geht wohl nicht! Oder etwa doch?)

MfG Benjä

Antwort 8 von coros

Hallo Benjamin,

meinst Du das so:

    MsgBox "Büro max. " & varGrenzwert1 & " Tage...", vbInformation, "Maximale Arbeitstage erreicht"


MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 9 von BenjaminM

Danke Oliver,

Das ist Spitze!

Funzt alles wunderbar, aber an einem Schräubchen hätte ich gerne noch gedreht!

Ist es möglich, bei dieser Zählerei, die bereits eingetragenen Zahlen, in einer bestimmten Zelle auszugeben?

Momentan zieht er sich ja den Grenzwert aus einer Zelle, und ich stelle mir vor, das in der benachtbarten Zelle die Zahl der momentan eingetragenen Werte angezeigt werden(naturlich für jeden Bereich einzelnd).

Ist sowas auch noch drin?

Oder wie sähe das mit einer Zählenwenn Formel aus?
Macht das mehr Sinn, und wie müsste die aussehen?

Danke fürs Kopfzerbrechen!!!

MfG Benjä

Antwort 10 von coros

Hallo Benjamin,

mit dem Befehl

Range("Z1") = iSummeSpalteA1 


wird z.B. der Wert der Funktion ZÄHLENWENN in Zelle Z1 ausgegeben. Meinst Du das so?


MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 11 von BenjaminM

Hallo Oliver,

eigentlich, solle es eher so aussehen:

Range("BE26") = iSummeSpalteA1 + iSummeSpalteA2 + iSummeSpalteJ1 + iSummeSpalteJ2 + iSummeSpalteS1 +
iSummeSpalteS2 + iSummeSpalteAB1 + iSummeSpalteAB2 +
iSummeSpalteAK1 + iSummeSpalteAK2 + iSummeSpalteAT1 +
iSummeSpalteAT2

Is es das schon? Oder geht das noch einfacher?

Und dann noch die Frage wo muss ich das im VBA-Editor unterbringen?
Neues Private Sub?
Oder an welche Stelle gehört das in das
Private Sub Worksheet_Change(ByVal Target As Range)

Ich bin eben Anfänger!

Sag mal kannst du mir (nur so nebenbei) eine gute VBA Lern-Literatur empfehlen?
Ich glaube ich sollte diese Sprache lernen!
Was hälst du von Bernd Held?

Danke für mein Teilnehmen an deinem Hobby! (HP) ;-)

MfG Benjä

Antwort 12 von coros

Hallo Benjamin,

wenn Du alle Summen addiert haben möchtest, muss die Befehlszeile wie aus Deinem letzten Beitrag lauten.

Die Befehlszeile gehört vor dem "End Sub" des Worksheet_Change-Ereignisses.

Ein Buch kann ich Dir nicht empfehlen, da ich keines besitze. Ich bin bei VBA etwas durch meinen Beruf vorbelastet, da ich dort in VB (Visual Basic) und in von VB abgeleiteten Programmen programmiere. Den Rest von Excel habe ich mir mit learning for doing durch viel lesen und ausprobieren in Foren wie das Supportnet beigebracht.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 13 von BenjaminM

Hallo Oliver,

habe die Zeile aus Antwort11 vor das End Sub kopiert, aber es wird nicht in der Tabelle/Zelle ausgegeben. (?)

Und eine Sache hab ich auch noch, merkt man erst wenn man mit dem Sheet arbeitet,

Wenn die Msg Box beim erreichen des Zählergebnises angezeigt wird, löscht er ja(nach klich auf OK) den letzten Eintrag!

Das ist auch schön, aber wenn ich jedoch etwas ändere, in dem ich einen Bereich kopiere und einfüge, kommt keine Msg Box! Das Problem dabei ist, wenn ich dann händisch eine weitere Zahl einfüge wird die Msg Box angezeigt, aber ich kann diese nicht mehr schliessen bzw. sie wird immer wieder angezeigt!(ist ja auch klar, da ja mehr Zahlen eingetragen sind als sollen)
Das Ding ist nur, das ich dann die Excel Datei über den Task-Manager schliessen muss da sie weder weiterbearbeitet werden kann noch ich die Msg Box weg bekomme, speichern ist auch nicht möglich(klaro, wird ja von der MSG Box blockiert) und alles was bis dahin nicht sicher im Kasten war is wech.

Kann man das irgendwie umgehen?
Oder darf man einfach das kopieren einfügen nicht machen?

MfG Benjä

Antwort 14 von coros

Hallo Benjamin,

lade bitte Deine Datei hoch, damit man sich das in Deiner Datei ansehen kann.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 15 von BenjaminM

Hier einmal die jetzige Datei!

Die Zählenwenn habe ich ohne VBA eingebaut, wäre aber trotzdem schön sie im VBA zu haben!

http://rapidshare.com/files/132087707/Ausbildungsplan2008.zip

MfG Benjä

Antwort 16 von BenjaminM

Hallo Oliver,

noch als Ergänzung,

der Fehler aus Antwort13
tritt auch auf, wenn ich den Wert in einer der varGrenzwert-Zellen minimiere, ohne vorher die Zelleninhalte im Kalender zu löschen.

Und noch ´ne blöd Frage, kann man den Code noch vereinfachen?
Der ist mittlerweile ziemlich unübersichtlich!


Danke dir

MfG Benjä

Antwort 17 von coros

Hallo Benjamin,

sorry, dass ich mich erst jetzt wieder melde, aber ich hatte zu tun.

Du musst die Ereignisanzeige am Anfang des VBA-Codes deaktivieren und am Ende wieder aktivieren. Das sieht wie folgt aus:

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ERRORHANDLER
Application.EnableEvents = False
.
.
.
Deine weitereren Befehle
.
.
ERRORHANDLER:
Application.EnableEvents = True

End Sub

Damit erscheint die Meldung auch beim Kopieren ganzer Bereiche nur einmal.

Den kann man sicherlich vereinfachen. Eine Möglichkeit hat Dir ja @lorf in AW6 aufgezeigt.
Ich kann ihn Dir jetzt nicht vereinfachen, da mir dazu im Moment die Zeit fehlt.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 18 von BenjaminM

Moin, moin

danke Oliver das du dir gestern noch die Zeit genommen hast!

Ich hab die Erweiterung gestern noch übernommen, und lief prima, als ich heute morgen die Datei aufgemacht habe ging gar keine MsgBox mehr!
Habe jetzt schon 2 std. rumprobiert, aber ich kriegs nicht mehr zum laufen!

Was kann das den sein!?
Hab
On Error GoTo ERRORHANDLER
Application.EnableEvents = False

&
ERRORHANDLER:
Application.EnableEvents = True


auch noch mal entfernt, aber nix!
Wenn du noch mal Zeit hast....


http://rapidshare.com/files/132292214/Ausbildungsplan22008.zip

Antwort 19 von BenjaminM

Hallo Oliver!

Anwort18 zurück!!!

Datei funz nach Rechner Neustart wieder!!

Jedoch mit einer Einschränkung!

Beim Eintrag der Nr.6 (in der jeweiligen 6 Spalte jeden Monats) wird (trotz richtigem Bezug des varGrenzwertes) die MsgBox bei einem falschen Wert angezeigt.

In der Bezugszelle steht 35, und wenn bis 30 gezählt ist, wird die MsgBox bereits angezeigt.
*grübbel, grübbel*

Der gleiche varGrenzwertbezug ist mit in die Textausgabe integriert, zeigt da auch 35 an (???)

Ich steig da nicht hinter!

Könntest du bei Zeiten noch mal schaun?

Danke schön Benjä
http://rapidshare.com/files/132292214/Ausbildungsplan22008.zip

Antwort 20 von BenjaminM

Moin, moin

habs alles hinbekommen!

Danke für deine/eure Hilfe

MfG Benjä

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: