1.6k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo Leute,

ich habe eine Frage. In meiner Exceltabelle habe ich in der Spalte B1 bis B500
Daten von 2015 bis 1997. In der Spalte A habe ich folgendes stehen.
Einmal Einkauf von Stahl und Einkauf von Kunstoffen und das immer im Wechsel.
A B
Einkauf von Stahl 25.03.2015
Einkauf von Stahl 01.01.2015
Einkauf von Kunstoffen 15.10.2011
Einkauf von Stahl 03.03.1997
Einkauf von Kunstoffen 12.12.2014 etc.

Davon habe ich jetzt von dem Jahr 2015 bis 1997 insgesamt 500 Einträge.
Ich möchte hiervon ein Liniendiagramm erstellen.
Will jedoch voher mit einer Formel wissen wie oft ist in meiner Liste das Jahr 2015 vorgekommen.
Wie oft das Jahr 2014 usw bis hin zu dem 1998.

Kann mir jemdan von euch dabei helfen?

Gruß Flo

10 Antworten

0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Florian,

ich kann dir nur eine Lösung mit Hilfsspalte anbieten:
Schreibe in die Hilfsspalte die Formel:
=Jahr(B1)
dann ziehe die Formel soweit wie benötigt nach unten.
Die Jahreszahlen kannst du dann mit Zählenwenn auswerten:
=ZÄHLENWENN(C1:C500;2014)
Hier ist die Hilfsspalte in Spalte C und es wird gezählt, wie oft die Jahreszahl 2014 vorkommt.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo Mo,
ich danke dir das hat alles wunderbar geklapt.
Ich habe mal wieder etwas für dich.
Es geht um die VBA Codes die ich größtenteils mit deiner Hilfe fertig geschrieben habe. Ich möchte diese Codes automatisch nach einander abspielen lassen. Wie geht das?
In der Hauptexceldatei (DATENBANK1A) habe ich für jeden VBA Code einen Button. Insgesamt sind es 5 Buttons, die Makros zugewiesen bekommen haben. Ich würde gerne das Ganze auf zwei bis drei Button reduzieren.
Ab VBA-Code (Schritt3) werden nämlich aus der Hauptdatei 10 festgelegte Zellen kopiert und in eine andere gewünschte Exceldatei (z.B. Artikelnummer123.xls) eingelesen. Wenn ich mit einer anderen Makro 10 weitere Daten in die festgelegte Zellen der Hauptdatei einlese und ich dann diese wieder kopieren möchte um diese dann in die selbe Exceldatei (z.B. Artikelnummer123.xls) hinen zukopieren, muss ich halt den Exceldateinamen jedes mal erneut eingetippten.
Schritt 1
Neue Daten
Durch dieses Makro kann in der Exceldatei DATENBANK1A ein neues Tabellenblatt mit einem Namen erstellt werden (z.B. Artikelnummer999).
Dann wird mit dieser Makro aus einem Ordner der sich Artikel nennt, eine Exceldatei geöffnet. Man muss in der InputBox z.B. ( Artikelnummer999) eingeben. Die Inhalte aus dem Tabellenblatt (ART-Beschreibung) dieser Exceldatei werden kopiert und zwar der Bereich von A1 bis X und anschließend in das neu erstellte Tabellenblatt der Exceldatie DATENBANK1A hineinkopiert.
Schritt 2
Neue Daten speichern:
Mit dieser Makro werden alle Inhalte aus den neu erstellten Tabellenblätter (mit dem Namen Artikelnummer…) der Exceldatei DATENBANK1A kopiert und in das Tabellenblatt welches sich DATA nennt hineinkopiert.
Hier wäre es schon sehr gut wenn es möglich wäre die beiden Makros nacheinander abspielen zu können. Das bedeutet man aktiviert einen Button und es laufen die beiden Makros nacheinander ab.
Schritt 3
Daten importieren:
Mit dieser Makro können nun individuell von einer anderen Exceldatei also die Datei Artikelnummer123.xls oder Artikelnummer5568.xls beispielsweise die Spalte A (z.B die 150 Artikelnummern) aus dem Tabellenblatt ART-Beschreibung komplett kopiert und in das Tabellenblatt Source der Exceldatei DATENBANK1A eingefügt werden.
Schritt 4
Artikelnummern aussuchen
Mit dieser Makro kann ich jetzt aus dem Tabellenblatt Source aus der Spalte A, die ersten 10 Artikelnummern in die Spalte C6 bis C15 des Tabellenblattes Dashboard eingelesen werden.
Nach erneuten klicken auf den Button werden die nächsten 10 Artikelnummern
aus dem Tabellenblatt Source in die Spalte C6 bis C15 des Tabellenblattes Dashboard eingelesen usw. bis alle Artikelnummern einmal durch sind. Danach startet es wieder von vorne. Wenn diese Nummern in das Feld C6 bis C15 eingelesen werden erscheinen per Formel in der Spalte H6 bis H15 die dazugehörigen Informationen. Jetzt sollen die Information aus H6 bis H15 wieder in die Exceldatei Artikelnummer558.xls wieder hineinkopiert werden.
Beispiel: Die Datei Artikelnummer558.xls hat in dem Tabellenblatt ART-Beschreibung in der Spalte A z.B. 100 Artikelnummern. Aber in Spalte B sind 100 leere Felder die mit Informationen befüllt werden müssen. Dann werden die 100 Nummern mit dem Makro aus Schritt 3 zuerst in das Tabellenblatt Source Spalte A der Exceldatei DATENBANK1A hineinkopiert.
Nun wird mit der Makro Schritt 4 aus dem Tabellenblatt Source die erst 10 Nummern kopiert und in das Tabellenblatt Dashboard in der Spalte C6 bis C15 eingelesen, per Formel erscheinen in der Spalte H6 bis H16 die dazu gehörigen Informationen, nach erneutem klicken des dazu gehörigen Button werden weitere 10 Nummern in die Spalte C6 bis C15 eingelesen usw.
Schritt 5
Übertagung der Informationen
Mit dieser Makro können jetzt die Informationen aus der Spalte H6 bis H15 aus dem Dashboard in die gewünschte Exceldatei (z.B. Artikelnummer588.xls) die in die 100 leeren Felder der Spalte B in 10ner Schritten untereinander hinweg eingelesen werden. Dadurch dass im Tabellenblatt DATA alle Informationen zu jeder Artikelnummer vorhanden ist, können per Formel die Informationen herausgefunden werden.
End Sub
Vielen Dank Gruß Flo !
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Florian,

das kannst du am einfachsten in diesem Stil machen:

Sub alle()
box1
box2
End Sub

Sub box1()
MsgBox "Hallo, das ist die 1. Messagebox", 64, "Nummer 1"
End Sub

Sub box2()
MsgBox "Hallo, das ist die 2. Messagebox", 64, "Nummer 2"
End Sub


Und wenn du aus deinen Vorhandenen Subs Private Subs machst, dann kannst du nur das Makro aufrufen, das alle anderen aufruft:

Sub alle()
box1
box2
End Sub

Private Sub box1()
MsgBox "Hallo, das ist die 1. Messagebox", 64, "Nummer 1"
End Sub

Private Sub box2()
MsgBox "Hallo, das ist die 2. Messagebox", 64, "Nummer 2"
End Sub


Teste mal beide Versionen.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo Mo,

danke dir das hat wunderbar geklappt mit den ersten beiden Makros.Hier habe ich das letzte mal eine bitte.
Diese beiden Makros möchte ich gerne nacheinader abspielen.

Sub DATENBANK()
Dim anw
Dim Pfad As String
Dim Datei As String
Dim i As Long
Dim shExists As Boolean
Dim lz As Long
Dim Ziel As String
Dim iZiel As String
Dim wbk As Workbook
'STEP 5 Transfer the Data into an ANNEX
'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False
'Pfad anpassen
Pfad = "C:\Users\.........'
inputname:
iZiel = InputBox("Open up the Data to transfer the Justifications", "Input Filename", iZiel)
If iZiel = "" Then
anw = MsgBox("Invalid name! Try again?", 20, "Error")
If anw = vbYes Then
GoTo inputname
Else
Exit Sub
End If
End If
'Endung ggf. anpassen
Ziel = iZiel & ".xls"
Datei = Pfad & Ziel
If Dir(Datei) = "" Then
anw = MsgBox("The file " & Ziel & " doesn't exist! Try again?", 20, "Error")
If anw = vbYes Then
GoTo inputname
Else
Exit Sub
End If
End If
'Zieldatei öffnen
Workbooks.Open Filename:=Datei
Set wkb = Workbooks.Open(Filename:=Datei)
'Prüfen ob Tabelle mit Namen "Artikelnr" im geöffneten Workbook existiert
For i = 1 To wkb.Worksheets.Count
If wkb.Worksheets(i).Name = "Tasks" Then shExists = True
Next i
'Falls nein, dann Meldung und Abbruch
If shExists = False Then
MsgBox "The Worksheet Tasks doesn't exit in the Workbook named " & wkb.Name & "! Abort!", 16, "Error"
Exit Sub
End If
ThisWorkbook.Sheets("Dashboard").Range("H6:H15").copy With wkb
.Worksheets("Tasks").Range(Cells(IndexPos - 11 + 3, 15), Cells(IndexPos - 1 + 3, 15)).PasteSpecial Paste:=xlPasteValues
.Close (True) End With
Application.CutCopyMode = False 'Kopierauswahl aufheben
'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True
MsgBox "The data was copied", 64, "Copy finished"
End Sub
=>>Genau hier wollte ich gerne, dass wenn ich mehr als 100 Artikel beschreibungen habe die zu kopieren sind, das sich die Makro nicht schließt sonder offen bleibt und ich weitere 10 hinein kopieren kann ohne erneut die Makro wieder aufrufen zu müssen und erneut den Dateinamen in die MsgBox eingeben zu müssen.
Da ich sonst bei beispielsweise bei 500 Artikelbeschreibung 50 mal die Datei eintippen muss. Am Ende könnte mann ja fragen weiter? wenn nicht dann die Datei schließen.

Hier habe ich problem mit dem Global... wenn ich beide Makros abspielen möchte bezogen auf dein Vorschlag mit box1 box2 etc.

Global IndexPos As Long
Global ArrQ As Variant
Sub DATENBANK1SAFinale()
Dim Zaehler1 As Long
Dim Zaehler2 As Long
Dim lzeile As Long
'STEP 4 Tasknumber selction
Worksheets("Dashboard").Range("C6:C15").Clear
lzeile = Worksheets("Source").Cells(Rows.Count, 1).End(xlUp).Row
If IndexPos = 0 Then
With Worksheets("Source")
ArrQ = .Range(.Cells(1, 1), .Cells(lzeile, 1))
End With
IndexPos = 1
End If
If IndexPos > UBound(ArrQ) Then
With Worksheets("Source")
ArrQ = .Range(.Cells(1, 1), .Cells(lzeile, 1))
End With
IndexPos = 1
End If
With Worksheets("Source")
If .Cells(lzeile, 1).Value <> ArrQ(UBound(ArrQ), 1) Then
ArrQ = .Range(.Cells(1, 1), .Cells(lzeile, 1))
IndexPos = 1
End If
End With
For Zaehler1 = IndexPos To IndexPos + 9
If Zaehler1 > UBound(ArrQ) Then Exit For
Zaehler2 = Zaehler2 + 1
Worksheets("Dashboard").Cells(Zaehler2 + 5, 3) = ArrQ(Zaehler1, 1)
Next Zaehler1
IndexPos = IndexPos + Zaehler2
End Sub

Vielen Dank ... Gruß Flo!
0 Punkte
Beantwortet von
Hallo Mo,

und hast du was heraus finden können?


Gruß Flo
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Florian,

definiere die Variable iZiel ebenfalls als Global, dann wird diese bei der Frage nach der Datei automatisch vorgeschlagen (nicht vergessen die Dimensionierung mit DIM im Makro zu löschen!!!):

Global IndexPos As Long
Global ArrQ As Variant
Global iZiel As String

Sub DATENBANK1SAFinale()
Dim Zaehler1 As Long
Dim Zaehler2 As Long
Dim lzeile As Long
'STEP 4 Tasknumber selction
Worksheets("Dashboard").Range("C6:C15").Clear
lzeile = Worksheets("Source").Cells(Rows.Count, 1).End(xlUp).Row
If IndexPos = 0 Then
With Worksheets("Source")
ArrQ = .Range(.Cells(1, 1), .Cells(lzeile, 1))
End With
IndexPos = 1
End If
If IndexPos > UBound(ArrQ) Then
With Worksheets("Source")
ArrQ = .Range(.Cells(1, 1), .Cells(lzeile, 1))
End With
IndexPos = 1
End If
With Worksheets("Source")
If .Cells(lzeile, 1).Value <> ArrQ(UBound(ArrQ), 1) Then
ArrQ = .Range(.Cells(1, 1), .Cells(lzeile, 1))
IndexPos = 1
End If
End With
For Zaehler1 = IndexPos To IndexPos + 9
If Zaehler1 > UBound(ArrQ) Then Exit For
Zaehler2 = Zaehler2 + 1
Worksheets("Dashboard").Cells(Zaehler2 + 5, 3) = ArrQ(Zaehler1, 1)
Next Zaehler1
IndexPos = IndexPos + Zaehler2
End Sub

Sub DATENBANK()
Dim anw
Dim Pfad As String
Dim Datei As String
Dim i As Long
Dim shExists As Boolean
Dim lz As Long
Dim Ziel As String
Dim wbk As Workbook
MsgBox iZiel & " " & IndexPos

'STEP 5 Transfer the Data into an ANNEX
'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False
'Pfad anpassen
Pfad = "C:\Test\"
inputname:
iZiel = InputBox("Open up the Data to transfer the Justifications", "Input Filename", iZiel)
If iZiel = "" Then
anw = MsgBox("Invalid name! Try again?", 20, "Error")
If anw = vbYes Then
GoTo inputname
Else
Exit Sub
End If
End If
'Endung ggf. anpassen
Ziel = iZiel & ".xls"
Datei = Pfad & Ziel
If Dir(Datei) = "" Then
anw = MsgBox("The file " & Ziel & " doesn't exist! Try again?", 20, "Error")
If anw = vbYes Then
GoTo inputname
Else
Exit Sub
End If
End If
'Zieldatei öffnen
Workbooks.Open Filename:=Datei
Set wkb = Workbooks.Open(Filename:=Datei)
'Prüfen ob Tabelle mit Namen "Artikelnr" im geöffneten Workbook existiert
For i = 1 To wkb.Worksheets.Count
If wkb.Worksheets(i).Name = "Tasks" Then shExists = True
Next i
'Falls nein, dann Meldung und Abbruch
If shExists = False Then
MsgBox "The Worksheet Tasks doesn't exit in the Workbook named " & wkb.Name & "! Abort!", 16, "Error"
Exit Sub
End If
ThisWorkbook.Sheets("Dashboard").Range("H6:H15").Copy
With wkb
.Worksheets("Tasks").Range(Cells(IndexPos - 11 + 3, 15), Cells(IndexPos - 1 + 3, 15)).PasteSpecial Paste:=xlPasteValues
.Close (True)
End With
Application.CutCopyMode = False 'Kopierauswahl aufheben
'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True
MsgBox "The data was copied", 64, "Copy finished"
End Sub


Die beiden Makros kannst du wie vorgeschlagen aufrufen:
Sub test()
DATENBANK1SAFinale
DATENBANK
End Sub

Deine Probleme mit der Global-Variable kann ich allerdings nicht nachvollziehen. Bei meinen Test funktioniert der Aufruf einwandfrei.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo Mo,

aber eingentlich wäre es auch schon gut wenn man bei Makro step 5
einfach nach dem ersten Durchgang am Ende nur noch mal nach gefraget werden muss ob man weiter kopieren möchte.... wenn ja dann soll der User die möglichkeit haben erstmal wieder mit Makro step4 die Task aus zusuchen und in der Datei gebeben falls auf dem Dashboard zusätzliche veränderung for zu nehmen bevor es dann mit der Makro Step 5 wieder weiter geht um die 10 weiteren daten zukopieren. Wenn Nein Copy complet and close (True).


Gruß Flo
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Florian,

dann ergänze das letzte Makro entsprechend:

Sub DATENBANK()
Dim anw
Dim Pfad As String
Dim Datei As String
Dim i As Long
Dim shExists As Boolean
Dim lz As Long
Dim Ziel As String
Dim wbk As Workbook
Dim answer

'STEP 5 Transfer the Data into an ANNEX
'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False
'Pfad anpassen
Pfad = "C:\Test\"
inputname:
iZiel = InputBox("Open up the Data to transfer the Justifications", "Input Filename", iZiel)
If iZiel = "" Then
anw = MsgBox("Invalid name! Try again?", 20, "Error")
If anw = vbYes Then
GoTo inputname
Else
Exit Sub
End If
End If
'Endung ggf. anpassen
Ziel = iZiel & ".xls"
Datei = Pfad & Ziel
If Dir(Datei) = "" Then
anw = MsgBox("The file " & Ziel & " doesn't exist! Try again?", 20, "Error")
If anw = vbYes Then
GoTo inputname
Else
Exit Sub
End If
End If
'Zieldatei öffnen
Workbooks.Open Filename:=Datei
Set wkb = Workbooks.Open(Filename:=Datei)
'Prüfen ob Tabelle mit Namen "Artikelnr" im geöffneten Workbook existiert
For i = 1 To wkb.Worksheets.Count
If wkb.Worksheets(i).Name = "Tasks" Then shExists = True
Next i
'Falls nein, dann Meldung und Abbruch
If shExists = False Then
MsgBox "The Worksheet Tasks doesn't exit in the Workbook named " & wkb.Name & "! Abort!", 16, "Error"
Exit Sub
End If
ThisWorkbook.Sheets("Dashboard").Range("H6:H15").Copy
With wkb
.Worksheets("Tasks").Range(Cells(IndexPos - 11 + 3, 15), Cells(IndexPos - 1 + 3, 15)).PasteSpecial Paste:=xlPasteValues
.Close (True)
End With
Application.CutCopyMode = False 'Kopierauswahl aufheben
'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True

answer = MsgBox("The data was copied. Do you want to copy the next tasknumber?", 36, "Continue copying?")
If answer = vbYes Then DATENBANK1SAFinale 'bzw den Namen des Makros, der die beiden Makros aufruft

End Sub


Statt dem Namen DATENBANK1SAFinale musst du ggf. den Namen des Makros einsetzen, der die beiden Makros aufruft.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo Mo,

danke für deine Antwort. Hat alles gut geklappt. Nur leider musste ich doch feststellen, dass der wenn beide
Makros hinter einander weg ablaufen, ich keine möglichkeit mehr die Zellen H6:H16 zwichen durch zu ändern.
Deshalb bringt der Ablauf leider doch nichts. Aber es funktioniert. Kannst du mir aber noch zeigen wie ich auf der Datei bleiben kann ohne das ich in der MsgBox den dateinamen eingeben muss.
Also ich klicke auf JA... dann muss ich wieder die Datei ANNEX ... eingeben. Bei 100 Nummern ist es ja kein problem dann muss ich ja nur 10 mal den Dateinamen eingeben aber was mach ich beispielsweise bei 500 Nummern?


answer = MsgBox("The data was copied. Do you want to copy the next tasknumber?", 36, "Continue copying?")
If answer = vbYes Then DATENBANK1SAFinale 'bzw den Namen des Makros, der die beiden Makros aufruft



Gruß Flo
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Florian,

siehe hierzu meine Antwort 6. Ändere deine Variable iZiel in eine Global-Variable und es sollte wie gewünscht funktionieren.

Gruß

M.O.
...