Mit VBA eine Excel-Datei splitten

3 Antworten

Was ist denn deine Frage? Ob das möglich ist? → Ja, das ist möglich.

Du kannst es direkt aus Excel heraus machen oder als VBS-Datei. Du kannst auch Excel-Dokumente mit SQL auslesen.

Habe hier leider nur Excel Starter, aber sei dir schon einmal versichert, dass es geht. Also du wirst nicht umsonst anfangen, dich in die Thematik einzuarbeiten.
Mache dich am besten mit Grundkonzepten von Programmiersprachen (Abfrage, Schleifen, Variablen,...) als erstes vertraut, dann mit dem Objektmodell von Excel.

Danke für deine Antwort. Im Optimalfall bin ich auf der Suche nach einer Beispieldatei oder einem Beispiel Code, den ich verwenden möchte. Im Gründe soll der Code für jede unterschiedliche Angabe in Spalte A (dort steht der Projektname) eine eigene Datei erzeugen. Ein anderer Code soll diese erzeugten Dateien dann wiederzu einer Datei zusammenfassen.

Danke vorab, Torsten

0
@torstenkr

Ich kann dir ja mal ein paar Ansätze für eine Lösung mittels eines Scriptfiles geben. Speichere es als .vbs Datei ab:

' Lesen aus einer Exceldatei mittels SQL
Sub TestExcelSQL
    sSql = "select Artikel, VK from rangeArtikelpreise"
    Set oResultSet = db_ExecuteQuery(sSql, "DSN=Test Excel 1")
    oResultSet.MoveFirst
    sAusgabe = sAusgabe & "Excel" & vbcrlf & "-----" & vbcrlf & "Artikel" & vbtab & "VK" & vbcrlf
    Do While Not oResultSet.eof
        sAusgabe = sAusgabe & oResultSet("Artikel") & vbtab & oResultSet("VK") & vbcrlf
        oResultSet.MoveNext
    Loop
    sAusgabe = sAusgabe & vbcrlf
End Sub

' Schreiben einer Exceldatei
Sub TestExcelSchreiben()
    sExceldatei = "C:\temp\exceldatei.xlsx"
    Set oExcel = CreateObject("Excel.Application")

    oExcel.Visible = True
    oExcel.Workbooks.add
    oExcel.Cells(1, 1).Value = "Testeintrag"
    oExcel.ActiveWorkbook.SaveAs(sExceldatei)
    oExcel.Quit
End Sub

' Hilfsfunktion zum Lesen aus einer Exceldatei mittels SQL
Function db_ExecuteQuery(sSelect, sDSN)
    On Error Resume Next
    if oConnection.State <> 0 then _
        oConnection.Close
    oConnection.Open sDSN
    db_ExecuteQuery.Close
    Set db_ExecuteQuery = oConnection.Execute(sSelect)
End Function

Ich hoffe, nichts Wesentliches vergessen zu haben. Der Code ist schon etwas älter.

0

Hey Torsten,

sowas würde ich eher mit einer Zugangskontrolle machen. Bedeutet wenn sich die Datei öffnet gibt es eine Starttabelle wo nur ein Login und Schliessen Button ist.

Dann kann sich der Projektleiter mit Name und Passwort einloggen und sieht nur seine Tabelle, dafür braucht jedes Projekt sein eigenes Tabellenblatt.

Da du wahrscheinlich eine große Datei hast wo alles auf einem Tabellenblatt ist würde ich erstmal für jedes Projekt ein eigenes Tabellenblatt erstellen. Danach können dann die Projektleiter ihre Daten immer sebst bearbeiten und abspeichern.

Wäre das was für dich?

Ich gehe davon aus, dass sich deine User bei Windows anmelden müssen.

Diesen Anmeldenamen schreibst du hinter alle Daten in eine neue Spalte jeweils für jeden Datensatz ein.

Bei mir ist das im Beispiel Spalte 8 = "H"

Du gehst mit Alt F11 in den Makroeditor.

Dort wählst (Doppelklick!) du oben links "Diese Arbeitsmappe"

Rechts setzt du dann folgenden Code ein:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim lngLastRow As Long
Dim objWB As Workbook

Sheets("Tabelle1").Unprotect ("MeinPasswort")
lngLastRow = Sheets("Tabelle1").Range("H:H").SpecialCells(xlCellTypeLastCell).Row 'xlCellTypeLastCell xlCellTypeBlanks

Sheets("Tabelle1").Range("A1:H" & lngLastRow).Locked = True
Sheets("Tabelle1").Range("A1:H" & lngLastRow).FormulaHidden = True
Sheets("Tabelle1").Range("A1:H" & lngLastRow).EntireRow.Hidden = True
For Each objWB In Application.Workbooks
    objWB.Save
Next objWB
Application.Quit
End Sub

Private Sub Workbook_Open()
Dim lngLastRow As Long
Dim I As Long

ActiveSheet.Unprotect ("MeinPasswort")
lngLastRow = Sheets("Tabelle1").Range("H:H").SpecialCells(xlCellTypeLastCell).Row 'xlCellTypeLastCell xlCellTypeBlanks

Sheets("Tabelle1").Range("A1:H" & lngLastRow).Locked = True
Sheets("Tabelle1").Range("A1:H" & lngLastRow).FormulaHidden = True
Sheets("Tabelle1").Range("A1:H" & lngLastRow).EntireRow.Hidden = True

For I = lngLastRow To 2 Step -1
    'Abfrage , ob in Spalte 8 (H) der Name steht
    If Cells(I, 8) = Environ("Username") Then
        Sheets("Tabelle1").Rows(I).EntireRow.Hidden = False
        Sheets("Tabelle1").Rows(I).Locked = False
        Sheets("Tabelle1").Rows(I).FormulaHidden = False
    End If
Next I
ActiveSheet.Protect ("MeinPasswort"), DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Mein Passwort musst du natürlich anpassen.

Damit die User deinen Code nicht sehen können nun noch ein paaar Schritte:

Geh mit einem Rechtsklick auf "Diese Arbeitsmappe"

Wähle "Eigenschaften von VBA:Projekt"

Wähle Registerkarte "Schutz"

Sperre das Projekt und vergib ein Kennwort

Dieses Beispiel braucht keine Einzeldateien pro Projekt, die dann wieder zusammenkopiert werden (Redundanz), es kommt mit einem Datensatz aus.

Die Testdatenbank - (Excel, VBA)

Klasse! DH!

0

Excel wiederholungszeilen

Moin, ich habe mittels vba Wiederholungszeilen und Wiederholungsspalten eingestellt.

.PageSetup.PrintTitleRows = "$1:$4"

.PageSetup.PrintTitleColumns = "$A:$C"

Er mekkert auch nicht. Wenn ich nun auf Seitenlyout gehe, fehlen in den oberen Zeilen auf den Seiten Wörter oder sind abgehakt, weil eine spalte zu ende ist. Also auf der ersten Seite siehts aus wie es aussehen soll, aber auf den anderen sind total komische Fehler. Sieht sehr buggy aus. Ist das ein bekanntest Problem? MFG habeeinefra

...zur Frage

Makro mit if-Abfrage nach Knopfdruck?

Hallöchen ihr Lieben! Ich probiere grade ein bisschen mit VBA etc in Excel rum und möchte folgendes Problem lösen: Ich habe bereits zwei Comboboxen erstellt. In der einen soll der aktuelle Monat ausgewählt werden, in der anderen der erste Tag des Monats. Die beiden Werte werden in je eine Zelle übertragen. Nach einem Knopfdruck soll der Wert der Zellen geprüft werden. Angenommen, der Monat wäre der April und der erste Tag ein Freitag. Dann soll ein Programm automatisch das Datum in die richtige Zelle in die Tabelle eintragen (am ersten Freitag den 01.04., am Samstag den 02.04. etc). Die Wochentage stehen immer in einer Zeile, in der Zeile darunter soll das entsprechende Datum erscheinen, dann bleiben 4 Zeilen frei für Einträge und dann kommt wieder eine Zeile mit Wochentagen usw. Um meine Frage zu spezifizieren:

  1. Wie trage ich anhand von Makros ein Datum in eine Zelle ein?
  2. Wie kann ich dieses Datum automatisch fortführen lassen?
  3. Wie überspringe ich dabei Zeilen?
  4. Wie mache ich das Datum abhängig vom ausgewählten Monat?
  5. Wie lege ich die Startzelle fest?

Ich weiß, das ist eine Menge, aber ich wäre sehr dankbar, wenn sich jemand die Zeit nimmt und versucht mir zu helfen. Ich möchte keine fertige Lösung, Denkanstöße, damit ich das Problem selber lösen kann, wären super!!!

Danke!!!

...zur Frage

Microsoft office excel VBA Makro zum Drucken versch Druckbereiche?

Hallo,

ich schreibe gerade an einem Drucker Makro mit UserForm.

Auf der UserForm sind mehrere CheckBoxen, und ein Durck-Button.

Das Ziel ist es: Z.b. dass man CheckBox1 und CheckBox3 anklickt und so die beiden Druckbereiche ausgewählt werden. Beim drücken des "Drucken" Buttons sollen dann die beiden druckbereiche jeweils auf eine seite gedruckt werden.

Ich habs soweit hinbekommen, dass sich über die checkboxen die richtigen druckbereiche auswählen lassen. JEDOCH lassen sich zwar mehrere checkboxen ankreuzen, jedoch druckt es letzendlich immer nur eine seite mit dem Druckbereich des letzt gedrückten checkbox.

Also prinzipiell könnte man wenn man z.b. Checkbox1 und checkbox 3 gedruckt haben will. Nacheinander die 1 anwählen drucken drücken und dann die 3 anwählen drucken drücken.

Das Ziel ist es aber dass beide gleichzeitig angewählt sein können und dann auch beide gedruckt werden auf jeweils eine seite.

Welchen code muss ich ergänzen? und vorallem wo?

Vielen dank

...zur Frage

Exif-Daten durch Excel(VBA)?

Hallo, ich habe eine Datenbank mit Fotos in Excel erstellt. Jetzt möchte ich aber, dass das Datum das Datum der Aufnahme ist, also das Datum, das in den Exif-Daten der Bilder angegeben ist. Ich habe die Funktion .DateTimeOriginal gefunden, aber habe gelesen, dass diese Funktion nicht in VBA arbeitet, da sie aus einer anderen Sprache, VB .NET, ist und in Visual Basic Express angewendet werden kann. Gibt es andere Möglichkeiten die Exif-Daten rauszuleiten durch VBA ?

...zur Frage

VBA - Pfad über Fenster auswählen und als String speichern?

Hallo Community,

ich habe ein Makro geschrieben, das auf eine Excel-Datei zugreift. Der Pfad für die Datei steht in meinem Makro drin und ist als String abgespeichert.

Ich möchte aber, weil sich der Name der Excel Datei von Monat zu Monat ändert, dass sich ein Fenster öffnet über das man die richtige Excel Datei auswählt und das dann den Pfad zu dieser Datei in meinem Makro speichert.

Also nicht so wie es bis jetzt ist, dass der Pfad von anfang an drin steht, sondern so dass beim ausführen des Makros ein Fenster geöffnet wird wo man selbst die Datei und somit den Pfad auswählen kann.

Liebe Grüße

Chris

...zur Frage

Zellen mit gleichem Inhalt pro Spalte automatisch verbinden ?

Hallo Community, möchte gerne alle Zellen gleichen Inhalts pro Spalte automatisch verbinden lassen (Inhalte müssen, wie bei Excel üblich nur einmal erhalten bleiben). Später soll also der Konfernzname, das Datum und der Ort nur noch einmal pro Konferenz auftauchen. Die Teilnehmer und ihre Beiträge könnte man dann zwar auch noch verbinden, aber hier müssten natürlich die ganzen Zellinhalte erhalten bleiben (was Excel üblicherweise nicht macht). Ist wahrscheinlich nur mit VBA möglich oder? Danke im Vorraus

Bild siehe Anhang

...zur Frage

Was möchtest Du wissen?