PDA

Vollständige Version anzeigen : mit VBA im gleichen Feld addieren


Quartzlurch
30.06.2014, 17:08
Excel 2003, Windows 7

Hallo an Alle,

war schon ewig nicht mehr im Forum und habe wieder einmal ein Problem. Nach langer Suche habe ich ein Makro gefunden, das mir zunächst weiterhilft, aber nur für 1 Zelle. Hier meine Frage:

Kann man folgenden VBA-Code so ändern, dass ich beliebig viele Felder damit bearbeiten kann?

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Static oldValue As Variant
If Target.Address(0, 0) = "A1" Then
On Error GoTo Err_Exit
Application.EnableEvents = False
If Target Then Target = Target + oldValue
End If
Err_Exit:
Application.EnableEvents = True
oldValue = Range("A1")
End Sub

Habe diesen Code in das entsprechende Tabellenfenster eingefügt und das klappt 100%, leider eben nur mit einer Zelle. Ich benötige davon ca. 20 oder mehr. Wenn mir jemand einen Denkanstoß geben kann, wo ich ansetzen kann, ich helfe gerne mit. Ehrlich gesagt: "Ich bewundere alle, für die solche Programmierungen ein Klacks sind! Das meine ich jetzt wirklich als Kompliment :-)

Wäre super, wenn ihr mir helfen könntet.

Gruß Horst

Mc Santa
30.06.2014, 18:13
Hallo,

wenn du so viele Zellen hast, würde ich mit einem verstecktem Blatt arbeiten und mir dort die Zellenwerte merken, damit man nicht so viele Variablen erstellen muss.

Etwa so:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim bereich As Range
Set bereich = ThisWorkbook.Worksheets("Tabelle1").Range("A1:H5")

On Error GoTo Error_Handler
Application.EnableEvents = False
If Not Target.Count > 1 Then
If Not Intersect(Target, bereich) Is Nothing Then
Target = ThisWorkbook.Worksheets("Tabelle2").Range(Target.Address) + Target
ThisWorkbook.Worksheets("Tabelle2").Range(Target.Address) = Target
End If
End If
Error_Handler:
Application.EnableEvents = True
End Sub


Hilft dir das weiter?
VG

Quartzlurch
30.06.2014, 20:16
Hallo und guten Abend Mc Santa,

zuerst mal herzlichen Dank für deine rasche Hilfe, wie ist dein Tip heute Abend?

Ich habe mir den VBA-Code mal angschaut und versucht ihn zu analysieren, für mich "schwer", aber ich habe an einem Beispiel damit gearbeitet. Deinen Code könnte ich so wie er ist einsetzen. Aber folgendes Problem: Ich benötige aus einem Formular deren Zell-Beträge auf verschiedenen Zeilen und Spalten angeordnet sind eben diese Werte in dem (genau gleich aufgebauten) Formular "Jahrestabelle" deren Inhalte ohne Formel. Auf diesem Wege möchte ich jeweils zum Monatsende die Werte in einer Jahrestabelle kumulieren, d.h. jeden Monat möchte ich von der Monatstabelle jede der über 20 Zellinhalte in die Jahrestabelle zum Zweck der Kumulierung übertragen. Ich könnte mir vorstellen, dass ein kleines Makro, welches ich mit einer "Schaltfläche-Monatsabschluss" zum kopieren der entsprechenden Felder und dem einfügen des Inhaltes als Wert in die Jahrestabelle, und das Zelle für Zelle nacheinander, sehr hilfreich wäre. Zum Beispiel von Tabelle1 "B2" den Wert kopieren und nach Tabelle2 "B2" den Wert einfügen. Wenn Du mir, sagen wir mal für 2 Zellen den Code schreiben könntest damit ich sehen kann wie das eventuell verschachtelt ist, den Rest sollte ich dann schon hinbekommen. Hast Du eine Idee dazu und kannst helfen?

Gruß Horst

Quartzlurch
01.07.2014, 18:55
Hallo Forum,

noch gebe ich die Hoffnung auf eine Antwort auf meine Frage nicht auf. Es ist ja nicht so, dass ich nicht weiß wie man ein Makro mit dem "Rekorder aufzeichnet", ich bin sicherlich auch bereit einen Code entsprechend auf meine Bedürfnisse anzupassen oder zu erweitern. Schaut euch mal das von mir aufgezeichnete Makro an und probierts mal aus, oder auch nicht. Natürlich funktioniert das Makro einwandfrei, aber das hin und herspringen der aktiven Zelle beim Kopiervorgang, das ist unprofessionell und wirkt störend. Kann mir >bitte< jemand Tipps geben, was ich verändern muss, damit dies alles sauber im Hintergrund abläuft? Hier der aufgezeichnete Code:

Sub Monatsabschluss()
'
' Monatsabschluss Makro
' Makro am 01.07.2014 von Quartzlurch aufgezeichnet
'

'
Sheets("Belege").Select
Range("J2").Select
Selection.Copy
Range("J2,K2").Select
Range("K2").Activate
Application.CutCopyMode = False
Selection.Copy
Sheets("Jahresbericht").Select
Range("B4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Belege").Select
Range("K7:K8").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Jahresbericht").Select
Range("C9").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Belege").Select
Range("K10").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Jahresbericht").Select
Range("C12").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Belege").Select
Range("K12").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Jahresbericht").Select
Range("C14").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("A1").Select
End Sub

Gruß Horst

Mc Santa
01.07.2014, 19:31
Hallo,

ich versuche einmal das zu beschreiben, was ich bisher verstanden habe, bitte korrigiere mich bei Fehlern.

Du hast gleich aufgebaute Tabellenblätter für die einzelnen Monate Jan-Dez und eine gleich (oder ähnlich) aufgebautes Tabellenblatt als Jahresübersicht. In dieser Jahresübersicht möchtest du nun die Werte der Monatstabellen zusammen rechnen, für eine Übersicht/Auswertung.

Meine erste Anmerkung: ist es hier nicht möglich direkt mit einer Formel zu arbeiten, statt über VBA?

Du hast dir eine Art Button überlegt, der die Werte aus einer dieser Monatstabellen in die Jahrestabelle kopiert. Damit du das nacheinander für alle Monate tun kannst, hast du nach dem Code aus deinem ersten Code gefragt: Dadurch kannst du nacheinander aus den Monaten in die Jahrestabelle kopieren und erhälst am Ende eine Summe.

Hier meine zweite Anmerkung: Das Zusammenrechnen kann das Makro auch direkt übernehmen, dazu braucht es nicht das Makro aus meiner Antwort weiter oben.
Man könnte das Zusammenrechnen immer einzeln für jedem Monat machen, mit einem Button auf jedem Monatsblatt.
Oder man kann das für alle Monate gleichzeitig machen, dann würde ich einen Button auf das Jahresblatt legen.

Zusätzlich kann ich dir das Makro aus deiner letzten Antwort kürzer schreiben, das wäre kein Problem, aber ich finde das ein wenig umständlich, wenn du das dann wirklich in Kombination mit meinem Makro von oben benutzt, das geht einfacher ;)

VG

Quartzlurch
01.07.2014, 19:41
Hallo Mc Santa,

interessieren (für mich zum lernen und verstehen) würde mich beides, wenn's dir nicht zuviel ist. Vielleicht zunächst das Makro mit dem Zelle kopieren und Zelle Werte einfügen? Praktisch wäre es, wenn Du die Daten von meinem aufgezeichneten Makro verwenden würdest, das sind nur 6 Zellen und ich würde das entsprechend um ca. 20 Zellen erweitern. Geht das?

Gruß Horst

Mc Santa
01.07.2014, 21:40
Hallo,

Hier ist der Code von dir oben ein wenig optimiert. Du kannst immer Select und Activate aus dem Makrorekorder eliminieren, ich habe den Code von oben so wenig wie möglich verändert um zu zeigen, wie das geht.
Zusätzlich habe ich mal eine Variante aufgeschrieben, so oder so ähnlich würde ich es vermutlich schreiben:

Sub Monatsabschluss()
Sheets("Belege").Range("J2:K2").Copy
Sheets("Jahresbericht").Range("B4").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False


Sheets("Belege").Range("K7:K8").Copy
Sheets("Jahresbericht").Range("C9").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False


Sheets("Belege").Range("K10").Copy
Sheets("Jahresbericht").Range("C12").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False


Sheets("Belege").Range("K12").Copy
Sheets("Jahresbericht").Range("C14").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub

Sub meineVariante()

Dim src As Worksheet, tar As Worksheet
Set src = Sheets("Belege")
Set tar = Sheets("Jahresbericht")

tar.Range("B4") = src.Range("J2")
tar.Range("C4") = src.Range("K2")
tar.Range("C9") = src.Range("K7")
tar.Range("C10") = src.Range("K8")
tar.Range("C12") = src.Range("K10")
tar.Range("C14") = src.Range("K12")

End Sub

Das ist allerdings immer noch ein wenig umständlich, wenn du Zahlen zusammenrechnen willst, würde ich das im Makro direkt machen, etwa so:
Sub meineVariante2()

Dim src As Worksheet, tar As Worksheet
Set src = Sheets("Belege")
Set tar = Sheets("Jahresbericht")

tar.Range("B4") = src.Range("J2") + tar.Range("B4")
tar.Range("C4") = src.Range("K2") + tar.Range("C4")
tar.Range("C9") = src.Range("K7") + tar.Range("C9")
tar.Range("C10") = src.Range("K8") + tar.Range("C10")
tar.Range("C12") = src.Range("K10") + tar.Range("C12")
tar.Range("C14") = src.Range("K12") + tar.Range("C14")

End Sub

Hilft dir das weiter?
VG

Quartzlurch
01.07.2014, 22:01
Hallo Mc Santa,

danke für die beiden Beispiele. Wenn die Variante2 denselben Zweck erfüllt wie die andere, dann ist das schon deutlich ein Unterschied :rolleyes: ! Ich probiere beide erst morgen früh aus, gehe jetzt schlafen. Nachdem ich mir die beiden Varianten angeschaut und analysiert habe, melde ich mich wieder. Wünsche dir eine angenehme Nachtruhe, bis morgen.

Gruß Horst

Mc Santa
01.07.2014, 23:15
Also noch einmal zum Verständnis:
Di beiden Makro Monatsabschluss und MeineVariante machen genau das gleiche.
In Verbindung mit dem Makro aus #2 machen sie dann das gleiche, wie Meinevariante2 gleich am Stück macht.

Alles klar und verständlich?
Fragen gerne :)

Falls du Probleme hast, damit es in deiner Mappe funktioniert, dann lade bitte eine Beispieldatei hoch, an der ich testen kann.
VG

Quartzlurch
02.07.2014, 12:38
Hallo Mc Santa,

entschuldige bitte mein spätes Feedback, kam leider nicht früher dazu. Ich habe deine Variante2 soweit auf meine Bedürfnisse angepasst und es funktioniert alles tadellos. Hast Du super gemacht! Gibt es jetzt noch eine Möglichkeit nach jedem Monatsabschluss Excel zu zwingen die Datei unter einem anderen Namen abzuspeichern? Ich stelle mir das so vor: Nach Ablauf des Makro öffnet sich ein Feld und man wird gefragt, ob man das Worksheet abspeichern möcht. Wenn nein, wird nicht gespeichert, wenn ja dann erhält man eine Eingabeaufforderung um einen Dateinamen (im Sinne von: speichern unter) einzugeben. Könnte wohl mit >before save< sein, mehr weiß ich leider nicht.

Gruß Horst

Mc Santa
02.07.2014, 13:24
Hallo,

ergänze einfach am Ende folgendes:
Dim Dateiname As String
Dateiname = Format(Date, "yyyy-mm-dd")
Application.Dialogs(xlDialogSaveAs).Show Dateiname

Eine Abfrage würde ich mir sparen, denn man kann ja auf Abbrechen klicken.

Hast du es dir so vorgestellt?
VG

Quartzlurch
02.07.2014, 13:34
Hallo Mc Santa,

sieht gut aus. Muss jetzt leider aus dem Haus, melde mich später wieder, wenn ich's ausprobiert habe. Ich danke dir sehr für deine Hilfe, bis später :grins: :D :yelrotfl:

Gruß Horst

Quartzlurch
02.07.2014, 15:40
Hallo Mc Santa,

es funktioniert, aber meinen gewünschten Dateinamen zum Beispiel:>Monat_Juni 2014< wird verändert, indem manche Buchstaben mit Zahlen überschrieben werden >7o0at_Ju0i 2014<. Das ganze sollte automatisch als PDF-Datei abgespeichert werden.

Gruß Horst

Mc Santa
02.07.2014, 15:48
Bitte sag mir doch den Code, den du benutzt hast, sonst kann ich doch keinen Fehler finden.

Ich würde es so machen:
Dim Dateiname As String
Dateiname = "Monat_Juni 2014"
Application.Dialogs(xlDialogSaveAs).Show Dateiname

Ich glaube allerdings nicht, dass man eine Exceldatei direkt als pdf abspeichern kann.

VG

Quartzlurch
02.07.2014, 16:22
Sorry Mc Santa,

den Code hatte ich so eingegeben:

Dim Dateiname As String
Dateiname = Format(Monat_Juni 2014")
Application.Dialogs(xlDialogSaveAs).Show Dateiname

Habe jetzt das >Format< weggelassen und schon klappts :rolleyes: :cool: Habe gerade was gelernt!

Man kann die Datei durch einen Druckbefehl in ein PDF-Format umwandeln. Zum Beispiel durch die Auswahl im Druckmenü: Foxit Reader PDF Printer

Gruß Horst

Quartzlurch
04.07.2014, 22:38
Guten Abend und hallo Mc Santa,

habe endlich den richtigen Code gefunden, mit dem man eine xls-Datei direkt als PDF-Dokument speichern kann. Jetzt muss ich nur noch eine Möglichkeit finden, diese Datei in den dafür vorgesehenen Ordner zu speichern, respektive, eine Abfrage zu starten ob der Ordner bereits besteht oder angelegt werden soll. Nachfolgend der Code (der obere Teil stark verkürzt, damit er nicht soviel Platz braucht), kannst Du gerne selbst mal ausprobieren. Bei mir funktioniert er:

Sub Monatsabschluss()

Dim src As Worksheet, tar As Worksheet
Set src = Sheets("Belege")
Set tar = Sheets("Jahresbericht")

tar.Range("B4") = src.Range("J2") + tar.Range("B4")
tar.Range("C4") = src.Range("K2") + tar.Range("C4")
tar.Range("C9") = src.Range("K7") + tar.Range("C9")
tar.Range("C10") = src.Range("K8") + tar.Range("C10")

Dim Dateiname As String
Dateiname = "Monat_Juni 2014"
Application.Dialogs(xlDialogSaveAs).Show Dateiname

Application.ActivePrinter = "Foxit Reader PDF Printer auf Ne03:"
ActiveWindow.SelectedSheets.PrintOut From:=InputBox("Druck ab Seite Nummer:", "Erste Druckseite"), To:=InputBox("Druck bis Seite Nummer:", "Letzte Druckseite"), Copies:=1, _
ActivePrinter:="Foxit Reader PDF Printer auf Ne03:", Collate:=True

End Sub

Liebe Grße Horst

Quartzlurch
04.07.2014, 23:49
Bitte sag mir doch den Code, den du benutzt hast, sonst kann ich doch keinen Fehler finden.

Ich würde es so machen:
Dim Dateiname As String
Dateiname = "Monat_Juni 2014"
Application.Dialogs(xlDialogSaveAs).Show Dateiname

Ich glaube allerdings nicht, dass man eine Exceldatei direkt als pdf abspeichern kann.

VG

Guten Abend und hallo Mc Santa,

habe endlich den richtigen Code gefunden, mit dem man eine xls-Datei direkt als PDF-Dokument speichern kann. Jetzt muss ich nur noch eine Möglichkeit finden, diese Datei in den dafür vorgesehenen Ordner zu speichern, respektive, eine Abfrage zu starten ob der Ordner bereits besteht oder angelegt werden soll. Nachfolgend der Code (der obere Teil stark verkürzt, damit er nicht soviel Platz braucht), kannst Du gerne selbst mal ausprobieren. Bei mir funktioniert er:

Sub Monatsabschluss()

Dim src As Worksheet, tar As Worksheet
Set src = Sheets("Belege")
Set tar = Sheets("Jahresbericht")

tar.Range("B4") = src.Range("J2") + tar.Range("B4")
tar.Range("C4") = src.Range("K2") + tar.Range("C4")
tar.Range("C9") = src.Range("K7") + tar.Range("C9")
tar.Range("C10") = src.Range("K8") + tar.Range("C10")

Dim Dateiname As String
Dateiname = "Monat_Juni 2014"
Application.Dialogs(xlDialogSaveAs).Show Dateiname

Application.ActivePrinter = "Foxit Reader PDF Printer auf Ne03:"
ActiveWindow.SelectedSheets.PrintOut From:=InputBox("Druck ab Seite Nummer:", "Erste Druckseite"), To:=InputBox("Druck bis Seite Nummer:", "Letzte Druckseite"), Copies:=1, _
ActivePrinter:="Foxit Reader PDF Printer auf Ne03:", Collate:=True

End Sub

Liebe Grße Horst

Quartzlurch
05.07.2014, 13:53
Hallo Mc Santa,

da mein WorkSheet nun so gut wie beendet ist, dank deiner Hilfe, möchte ich mich nochmals recht herzlich füe deine Hilfe bedanken.

Gruß Horst