myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Excel Daten von einer Tabelle in andere einfügen (https://mygully.com/showthread.php?t=4701655)

Mixer007 22.01.17 16:01

Excel Daten von einer Tabelle in andere einfügen
 
Hallo,

ich habe eine Frage: ich würde gerne ein VBA Tool schreiben, mit dem ich die Werte aus einer Excel Tabelle in eine andere übertragen will. Die neue Tabelle sollte dabei automatisiert erstellt werden.

Wie gehe ich da vor? Bin leider noch nicht so sehr erfahren mit VBA.

Würde mich über jede Hilfe sehr freuen!!

Draien 22.01.17 16:25

Moin,

gibt viele Wege das zu lösen. Der Einfachheit halber würde ich dir empfehlen, die Daten vorerst von einem Tabellenblatt, in das nächste zu kopieren.
Excel hat diesen tollen Makrorekorder. Wenn du den anschmeißt, ein bisschen rumklickst, bzw. einige Zellen markierst (oder ganze Bereiche) und dir dann danach den Code anschaust, kommst du relativ schnell dahinter.

Du siehst dann oft solche Schlagworte wie
Zitat:

Worksheets("Tabelle1").Range("A1:B2").Select
Sprich er hat in der Tabelle1 (Tabellenblatt) den Bereich "markiert". Er wird diesen bereich jedesmal markieren, wenn du das Makro ausführst. (das kannst du dann auch auf einen Button legen)

Da ich deine Programmierkenntnisse nicht kenne erklär ichs einfach mal für "doofies":
Den Wert einer Zelle bekommst du durch den Befehl .Value. Den Wert einer Zelle schreibst du auch mit dem Befehl .Value. Du musst nur beide richtig anwenden.
Sagen wir du willst eine Zelle(Cell) oder einen Bereich(Range) von "Tabellenblatt1" nach "Tabellenblatt2" kopieren:

Zitat:

Worksheets("Tabellenblatt2").Cell('A1').Value = Worksheets("Tabellenblatt1").Cell('A1').Value
Das Gleiche eben auch für Range (aber vorsichtig sein). Wenn sich die Zellen ändern, müsstest du überlegen, wie du die richtigen Zellen ansprichst. Eventuell eine Variable als String (Dim xyz as String)?

Wenn das Makro Exceldateien übergreifend sein soll, brauchst du noch das Schlagwort Workbook:

Zitat:

Workbooks("Datei2.xlsx").Worksheets("Tabelle1").Ra nge("A1").Value = Workbooks("Datei1.xlsx").Worksheets("Tabelle1").Ra nge("A1").Value
Das ist zwar nicht die Musterlösung aber sollte vorerst reichen. Wenn du mehrmals kopieren möchtest (oder mehr als nur inhalte) schau dir das an:

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] (Copy)
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] (Paste)

ThreeChord 22.01.17 16:26

Meinst du aus einem anderen Tabellenblatt, oder aus einer komplett anderen Excel-Datei?

Mir half es am Anfang immer den Recorder zu nutzen.
Du zeichnest also auf was du machst, und kannst dir nachher den entsprechenden Code anzeigen lassen und diesen nach deinen Wünschen bearbeiten

eitch100 22.01.17 19:43

Hier mal ein kleines Beispiel:
Lege dir einen Commandbutton auf das Blatt von dem die Werte stammen und füge folgendes als Code für das Blatt ein...
Code:

Private Sub CommandButton1_Click()
Dim myname
myname = "Werte_" & Format(Now, "dd-mm-yyyy_hhmmss")
Selection.Copy
Worksheets.Add.Name = myname
Sheets(myname).Range("C1").PasteSpecial xlValues
Application.CutCopyMode = False
End Sub

Damit werden die markierten Werte des aktuelles Blattes auf einem neu eingefügten Blatt ab Zelle C1 eingefügt. Das neue Blatt heißt immer Werte_ und hat als Zusatz das aktuelle Datum und die aktuelle Uhrzeit.

Ansonsten braucht man einfach mehr Infos, sonst raten wir hier ins Blaue...:T

Rasiererkönig 22.01.17 21:29

Ich arbeite täglich mit Excel, aber wenn ich das lese, muss ich erkennen dass ich fast keine Ahnung von der Software habe... :rolleyes::o

eitch100 23.01.17 10:57

@Rasiererkönig

Mit Excel bzw. VBA geht "fast" alles incl. der Zugriff auf das Dateisystem. Man könnte sich quasi seinen eigenen Dateimanager programmieren. Ich war in VBA vor Jahren noch deutlich fitter, aber sooo oft arbeite ich damit auch nicht mehr.

Zu meinen Vorrednern Draien und ThreeChord muss ich noch anmerken, dass sie zwar Recht haben, dass der Makrorekorder als Einstieg recht nützlich ist, aber er stößt leider sehr sehr schnell an seine Grenzen. Aber auch ich habe damit mal angefangen und es mir dann peu a peu selbst beigebracht. Daher ist mein "Programmierstil" (wenn man ihn überhaupt so nennen kann :D ) nicht gerade professionell, aber Hauptsache es funktioniert...:T

Speziell zu Draien muss ich noch sagen, dass etwas so nicht funktionieren dürfte...

Dieser Befehl z.B. wird kaum ohne Fehler funktionieren (könnte es sein, dass das die Syntax aus OpenOffice ist?)
Code:

Worksheets("Tabellenblatt2").Cell('A1').Value = Worksheets("Tabellenblatt1").Cell('A1').Value
Folgende 3 Alternativen fielen mir ein, wenn man es denn überhaupt so lösen sollte.
Code:

Worksheets("Tabellenblatt2").Cells(1,1).Value = Worksheets("Tabellenblatt1").Cells(1,1).Value

Worksheets("Tabellenblatt2").Range("A1").Value = Worksheets("Tabellenblatt1").Range("A1").Value

Worksheets("Tabellenblatt2").[A1].Value = Worksheets("Tabellenblatt1").[A1].Value

Und es bringt auch nichts, einfach eine Variable zu definieren, wenn sich die Zeile oder Spalte einer Zelle ändert. Das muss man anders lösen.

Mixer007 24.01.17 17:15

Also erstmal danke für die Antworten.

Was ich brauche ist folgendes: Und zwar habe ich mir da zwei Beispieldateien erstellt, wo ich das gerne anwenden würde.
Was ich machen will ist folgendes: ich habe eine Liste mit Monaten drin, welche in jeder Woche die Anzahl der Tage angibt, in welchen eine Maschine benutzt wurde und von welchem Hersteller die Maschine stammt. Jetzt habe ich noch eine andere Liste, wo auch die Wochentage angegeben sind. Die Anzahl der Wochentage will ich jetzt von der einen Liste in die andere übertragen und zwar per button. Das heißt, auf der einen Tabelle sind ja unsere Maschinen angegeben und z.B. im Monat März die Anzahl der Benutzung in der Woche ( z.B. 3-Mal). Das soll jetzt in die andere Tabelle übertragen werden. Die andere Tabelle enthält dann die Tage wo die Maschine benutzt wurde bzw. nicht benutzt wurde.

Die eine Tabelle enthält alle Monate, aber nur mit Wochen aufgeteilt. Da steht dann z.B. in der Woche 01 im März 2017 die Ziffer 3. Das bedeutet, die Maschine wird 3-Mal in der Woche genutzt. Die Tabelle wo diese Information hinsoll, enthält nur den Monat März, aber auch die Wochentage. Und das soll dann so aussehen, dass die Wochentage, in welchen die Maschine genutzt wird, farblich dargestellt werden und da wo nicht, weiß.
Und das will ich als Makro haben, wenn es geht.

EDIT: Da sind die beiden Beispiel-Dateien zu finden:

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

eitch100 24.01.17 19:23

Sorry, aber wer hat sich denn sowas einfallen lassen?:mad: Zum einen sind ja die Kalenderwochen flexibel und nicht deckungsgleich mit einem Monat. Fällt z.B. MO, Di noch in den Februar und der Rest in den März und an allen Tagen wird die Maschine benutzt, macht das doch schon wenig Sinn.
Zitat:

Zitat von Mixer007 (Beitrag 29640258)
Das bedeutet, die Maschine wird 3-Mal in der Woche genutzt. Die Tabelle wo diese Information hinsoll, enthält nur den Monat März, aber auch die Wochentage.

Und woher soll das Programm wissen, an welchen Tagen der Woche die Maschine benutzt wird, wenn man nur die Anzahl der Wochenbenutzungen kennt? Denn so habe ich dein Vorhaben verstanden. Andersherum würde ich es ja noch nachvollziehen können.

Warum sind dafür überhaupt mehrere Dateien notwendig? Und warum nicht für das ganze Jahr nur 1 Tabellenblatt, anstatt für jeden Monat eine Datei/Tabellenblatt? Entscheidend für das Makro ist die Wiederholbarkeit und Struktur der Tabelle. Für mich persönlich sieht das (und das ist nicht böse gemeint) irgendwie wenig durchdacht aus. Aber "theoretisch" und somit hier auch praktisch wäre "sowas in der Art" möglich.

Mixer007 24.01.17 19:45

Ich kann leider keine Dateien von meinem Betrieb Posten. Daher auch das Beispiel mit der Maschinenbelegung. Ja, das Beispiel ist nicht gut durchdacht. Es geht hier nur um das Prinzip, Tabellenwerte rüberzukopieren. Bei den richtigen Tabellen geht es um Urlaubstage und diese sollen in eine Anwesenheitsliste übertragen werden.
Kannst du mir zeigen wie ich nun das so rüberkopieren kann per Makro ?

eitch100 25.01.17 11:23

Zitat:

Zitat von Mixer007 (Beitrag 29641005)
Ich kann leider keine Dateien von meinem Betrieb posten.

Das verstehe ich selbstverständlich.
Zitat:

Zitat von Mixer007 (Beitrag 29641005)
Kannst du mir zeigen wie ich nun das so rüberkopieren kann per Makro ?

Da gibt es nun ohne Ende Möglichkeiten, wie man das löst. Aber man muss genau wissen, was der Code tun soll. Hier mal ein ganz billiges Beispiel für deine geposteten Dateien. Angenommen es sind beide Dateien geöffnet. In der Datei "Maschinennutzung" sind angenommen in Zeile 9 KW11 am Mo, Mi und Fr jeweils eine 1 eingetragen. Mit folgendem Code werden die nun addiert und in "Maschinenbelegung" in Zelle O5 eingetragen.
Code:

Workbooks("Maschinenbelegung.xlsx").Sheets("Tabelle1").Range("O5").Value = Application.WorksheetFunction.Sum(Range("U9:Y9"))
Der Code muss natürlich in irgendeine Prozedur wie z.B. ein (Command)Button.
Code:

Private Sub CommandButton1_Click()
Workbooks("Maschinenbelegung.xlsx").Sheets("Tabelle1").Range("O5").Value = Application.WorksheetFunction.Sum(Range("U9:Y9"))
End Sub

Allerdings wird dir das nicht viel helfen, weil ja vermutlich verschiedenste Zellen, von verschiedenen Maschinen bzw. Mitarbeitern in die entsprechende Zelle/Zeile der anderen Datei kopiert werden sollen. Du könntest aber auch über eine ganz normale Formel auf andere Dateien zugreifen, falls dir das hilft. Also z.B. folgende Formel in der Datei "Maschinenbelegung" in Zelle O5 hat denselben Effekt wie der obige Code.
Code:

=SUMME([Maschinennutzung.xlsx]Tabelle1!$U$9:$Y$9)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.