bn2023
Goto Top

Daten aus mehreren Excelspalten in Textdatei übernehmen

Hallo,

ich habe eine Libre-Office Calc-Datei (jedoch als .xlsx gespeichert) mit Zeitangaben (z.B. 04:38), die automatisch addiert werden.
Die Ergebnisse der Zeitangaben werden automatisch in eine andere Spalte "H" übernommen.

In Spalte "G" stehen jedoch auch noch Einträge (G7 - G78).

Nun sollen die Einträge aus den Spalten "G + H" (also G7 - H78) zusammengeführt und dann in eine Textdatei (.txt) übertragen werden.

Meine Lösungsversuche bisher:

Nun habe ich mit dem Befehl "=VERKETTEN(G7;H7)" in der Zelle J7 und dann runterziehen bis J78 schon mal Teil 1 geschafft.
Leider werden die Zeitangaben nicht korrekt übernommen. In den entsprechenden Zellen steht nun z.B. "INDEX 01 0,1875".
Dort sollte aber eigentlich stehen "INDEX 01 04:30:00".

Ich habe jetzt alle Zellen, die diesen Eintrag enthalten mal mit "Uhrzeit" formatiert. Aber da änderte sich nichts...
Offenbar werden die Zeitangaben mit "Dezimalzahl Standard" oder "Text" übertragen. Ich suchte nun also eine Möglichkeit, zunächst mal über eine Hilfsspalte die Zeitangaben in Dezimalzahlen zu übernehmen, aber eben so, wie Uhrzeiten geschrieben werden --> 04:30:00

Das wiederum habe ich eben mit der Formel "=TEXT(H15; "hh:mm:ss")" versucht, die auch zunächst mal funktioniert.
Jedoch nur bis zum Eintrag "21:44:00". Ab dem folgenden Eintrag springt der Eintrag quasi auf den nächsten Tag um.
Da soll nämlich eigentlich "27:05:00" stehen. Aber es erscheint der Text "03:05:00".

OK... auch das gelölst face-smile

Mit der Formel "=TEXT(H15; "[HH]:MM:SS")" geht es. Jetzt steht dort "27:05:00".

Aber wie übertrage ich jetzt den Inhalt der verketteten Spalte in eine Textdatei (.txt)?

Könnt Ihr hier weiterhelfen?

Danke und Grüße,
BN

Content-ID: 668571

Url: https://administrator.de/contentid/668571

Ausgedruckt am: 18.11.2024 um 21:11 Uhr

150704
Lösung 150704 03.10.2024, aktualisiert am 05.10.2024 um 10:46:30 Uhr
Goto Top
Aber wie übertrage ich jetzt den Inhalt der verketteten Spalte in eine Textdatei (.txt)?
Von Hand ??

Markieren
CTRL+C
Textdatei öffnen
CTRL+V

Oder Speichern unter > *.csv

usw. usw.

Automatisiert, z.B. Powershell

$mappe = "D:\Ordner\Mappe.xlsx"  
$export = "D:\Ordner\export.txt"  
if(!(Get-Module -ListAvailable -Name ImportExcel)){
    Install-Module ImportExcel -Scope CurrentUser
}
(Import-Excel -Path $mappe -StartColumn 10 -EndColumn 10 -NoHeader).P1 | set-content -Path $export
Oder ohne ImportExcel Modul (nur für die Benutzung mit MS Office!)
$mappe = "D:\Ordner\Mappe.xlsx"  
$export = "D:\Ordner\export.txt"  
Add-Type -AssemblyName Microsoft.Office.Interop.Excel
$objExcel = New-Object -Com Excel.Application -Property @{Visible = $true}
$wb = $objExcel.Workbooks.Open($mappe)
$ws = $wb.Sheets.Item(1)
$ws.Range("J1:J" + $ws.Cells($ws.Rows.Count,"J").End([Microsoft.Office.Interop.Excel.XlDirection]::xlUp).Row).Value() | set-content -Path $export  
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel)
$wb.Close($false)
$ojExcel.Quit()
Oder als VBA/LibreOffice Basic
Sub ExportToText()
    Dim fso As Object, txtFile As Object, r as long, c as long
    Const FILEPATH = "D:\Daten\export.txt"    
    Set fso = CreateObject("Scripting.FileSystemObject")   
    Set txtFile = fso.OpenTextFile(FILEPATH, 2, True)

    ' export data to textfile from first sheet  
    With ThisComponent.Sheets(0)
            ' export Range J1:J15 of the sheet  
	    set exportRange = .getCellRangeByName("J1:J15").getRangeAddress()  
	    for c = exportRange.startColumn to exportRange.endColumn
	    	for r = exportRange.startRow to exportRange.endRow
	    	  	txtFile.WriteLine(.getCellByPosition(c,r).getString())
	        Next
	    Next
    End with
    ' close text file  
    txtFile.Close
    Set fso = Nothing
    Set txtFile = Nothing
End Sub

usw.
BN2023
BN2023 03.10.2024 aktualisiert um 18:48:09 Uhr
Goto Top
WOW, sehr schön... danke. Das sieht sehr gut aus face-wink

Eine Frage habe ich noch.

Wie ändere ich die folgende Formel so ab, dass ich auf "Tabelle 1" Bezug nehmen kann?
Bekomme das nicht hin face-sad

=TEXT(C8; "[HH]:MM:SS")  

Die Zelle "C8" befindet sich in "Tabelle 1".

Habe es so versucht, aber ohne Erfolg:

=TEXT($tabelle1;C8; "[HH]:MM:SS")  

...und so auch nicht:

=$tabelle1;TEXT(C8; "[HH]:MM:SS")  


Hab´s gerade gefunden. Es geht so, also mit Punkt hinter der 1:

=TEXT($tabelle1.A7; "[HH]:MM:SS")  

Habt Ihr ne Idee?

Grüße,
BN
150704
150704 03.10.2024 aktualisiert um 18:52:38 Uhr
Goto Top
Einfach nur den Cursor während der Formeleingabe auf die gewünschte Zelle in dem Blatt bewegen schon stehts da von selbst face-wink
=TEXT(Tabelle1!C8;"[HH]:MM:SS")  
BN2023
BN2023 03.10.2024 um 19:02:29 Uhr
Goto Top
...ja, aber das funktionierte mit der Formel nicht, die mit "TEXT" begann face-wink

Ansonsten kenne ich den Vorgang schon auch...

Grüße,
BN
BN2023
BN2023 03.10.2024 aktualisiert um 20:21:06 Uhr
Goto Top
Ich habe jetzt das VBA-Makro wie folgt eingegeben:

Sub Cuesheet
    Dim fso As Object, csvFile As Object
    Const FILEPATH = "C:\Users\imab\dwhelper\cuesheet.cue"    
    Set fso = CreateObject("Scripting.FileSystemObject")    
    Set csvFile = fso.OpenTextFile(FILEPATH, 2, True)
    With Sheets(1)
        For Each cell In .Range("E3:E" & .Cells(Rows.Count, "E").End(xlUp).Row)    
            csvFile.WriteLine cell.Value
        Next
    End With
    csvFile.Close
    Set fso = Nothing
    Set csvFile = Nothing
End Sub

Der zu speichernde Bereich ist im Tabellenblatt 2 "Tabelle2" und geht von E3 - maximal E74.
Ich vermute mal, dass der Code nicht funktioniert, weil dort kein Hinweis darauf ist, dass der Bereich im Tabellenblatt 2 zu finden ist.

Ich hatte den obigen Code im Bereich der Codezeile 7 angepaßt, wo vorher ""J1:J" & .Cells(Rows.Count, "J")" stand.

Was muss ich hier noch anpassen?

Grüße,
BN
150704
150704 03.10.2024 aktualisiert um 21:15:23 Uhr
Goto Top
Zitat von @BN2023:

...ja, aber das funktionierte mit der Formel nicht, die mit "TEXT" begann face-wink
Klappt hier einwandfrei 😋

weil dort kein Hinweis darauf ist, dass der Bereich im Tabellenblatt 2 zu finden ist
Einfach Code in Ruhe Zeile für Zeile lesen und verstehen, dann entdeckst du folgende Zeile: ....
With Sheets(1)
Aus ner 1 ne 2 machen schaffst du dann auch noch selbst 😋
Auch der Code wurde getestet und funktioniert ebenso problemlos.
BN2023
BN2023 03.10.2024 um 22:00:08 Uhr
Goto Top
Ich habe jetzt zunächst in Zeile 8 eingegeben "With Sheets(2)". Dann kam noch immer eine Fehlermeldung. Danach habe ich auch in Zeile 9 noch eine Änderung durchgeführt. Und zwar bei in Zeile 9 auch noch "Sheets(2) eingefügt vor ".Range". Aber auch dann kommt eine Fehlermeldung:

BASIC-Laufzeitfehler.
Prozedur Sub oder Function nicht definiert.

Dabei wird Zeile 9 markiert.
Vielleicht liegt es auch daran, dass ich ja mit "Libre Office Calc" arbeite und nicht mit Excel, obwohl ich es ja als ".xlsx"-Datei abgespeichert habe.

Grüße,
BN
150704
150704 04.10.2024 aktualisiert um 08:05:15 Uhr
Goto Top
Vielleicht liegt es auch daran, dass ich ja mit "Libre Office Calc" arbeite
Joa, die Info hätte in den Eingangspost gehört, da erklären sich auch deine Probleme sofort MS-Excel ≠ LibreOffice, klar das das da so nicht läuft der Code war ausschließlich für MS-Office und läuft dort in der Art nicht muss man erst umschreiben...
BN2023
BN2023 04.10.2024 aktualisiert um 11:44:17 Uhr
Goto Top
...es stand sogar ganz am Anfang meines Eingangspost, dass ich "eine Libre-Office" Calc Datei habe face-wink

Ich bin aber in Sachen Scripts überhaupt nicht erfahren und daher kann ich mir hier auch nichts selbst stricken.
Falls das aber auch mit einer Batchdatei ginge... wäre perfekt face-smile

Aber noch eine andere Frage zur gleichen Datei:

Ich muss da ja u.a. Zeiten eintragen, wie oben schon beschrieben.
Diese werden eingetragen in der Form: 00:04:38
Hier also 4 Minuten und 38 Sekunden.
Formatiert sind die Zellen mit: [hh]:mm:ss

Die Stunden muss ich nie aktiv eingeben, aber da die Zeiten in einer anderen Spalte addiert werden, kann es dort auch über eine Stunde gehen.

Hier mal ein Screenshot, wo man auch sieht, wie alles formatiert wurde:

stunden-minuten

Ich muss in die Zellen der linken Spalte aber jedes Mal den ganzen Summs eingeben... also 2 Nullen am Anfang und jedes Mal auch den Doppelpunkt. Das ist nervig face-sad

Gibt es eine Möglichkeit, dass man in die Zellen der linken Spalte z.B. nur "4:38" einträgt und das automatisch als "00:04:38" in die Zellen der rechten Spalte übernommen wird?

Grüße,
BN
BN2023
BN2023 04.10.2024 aktualisiert um 13:21:59 Uhr
Goto Top
UPDATE:

Ich habe eben herausgefunden, wie es schon etwas einfacher gehen kann:

Und zwar muss die erste Spalte mit "Text" formatiert sein.
Die zweite Spalte bleibt dann weiterhin mit "[hh]:mm:ss" formatiert, aber enthält den Code:

="00:" & A3  

Somit werden einfach 2 führende Nullen und ein Doppelpunkt vor das Ergebnis gesetzt face-wink
Ergebnis ist dann korrekt: "00:04:38".

Man muss bei den kleinen Werten (z.B. "4:38) aber noch immer händisch eine Null davor setzen, also "04:38".
Gebe ich im Code nach dem Doppelpunkt eine weitere Null ein, wird die natürlich auch für größere Zahlen davorgesetzt (z.B. "21:30" würde dann zu "00:021:30").

Grüße,
BN
BN2023
BN2023 04.10.2024 aktualisiert um 18:53:52 Uhr
Goto Top
UPDATE 2:

Ich habe es nach langen Versuchen hinbekommen über 2 Hilfsspalten face-wink

Eine letzte Frage gibt es dennoch:
Das Tabellenblatt 1 hat 23 Zellen, die beschrieben werden können.
Die Inhalte werden in eine Hilfsspalte in Tabellenblatt 2 übernommen.

Wenn jetzt jedoch nur 15 von den 23 Zellen beschrieben wurden, stehen in der Hilfsspalte jeweils auch Werte drin (Null, bzw. die letzte Zeitangabe wird in jeder Zelle wiederholt).

Gibt es eine Möglichkeit, im Code schon eine Art "Wenn-Dann-Abfrage" zu machen. Also wenn in Zelle B16 nichts steht, dann soll auch kein Code in der Hilfsspalte I22 (Tab.Bl. 2) stehen.

Grüße,
BN
BN2023
BN2023 04.10.2024 um 23:37:09 Uhr
Goto Top
...hat sich alles schon erledigt.

Die Datei steht nun und funktioniert.
Es fehlt nur noch eine Lösung für das kopieren des Codes in die Textdatei... vielleicht als Batch? face-wink

Grüße,
BN
150704
Lösung 150704 05.10.2024 aktualisiert um 11:09:45 Uhr
Goto Top
Zitat von @BN2023:
Es fehlt nur noch eine Lösung für das kopieren des Codes in die Textdatei... vielleicht als Batch? face-wink
Nein fehlt nicht, steht doch oben im ersten Post! Erster Code ist Powershell der ist universell für alle xlsx egal ob LibreOffice oder MS Office, kannst du aber auch in ne Batch packen wenn du willst. powershell -EP ByPass -File "D:\script.ps1"

p.s. Habe den VBA/Basic Code an Libre Office im ersten Post angepasst damit er damit funktioniert - wurde hier getestet und funktioniert. Jetzt hast du's ehrlich gesagt auf dem Silbertablett, den Rest kannst du selbst in der Doku nachschlagen ... 🖖

Bitte dann den Thread auch schließen.
BN2023
BN2023 05.10.2024 um 11:21:42 Uhr
Goto Top
Heyyyyyyyyyy danke Dir.
Der Code (VBA) hat perfekt funktioniert.
Habe nur den Bereich angepaßt sowie das Zielverzeichnis und dann getestet.
Die Textdatei, bzw. "cuesheet.cue" wurde perfekt erstellt.

Übrigens ging es bei diesem kleinen Projekt um ein kleines Programm, welches - jetzt fast vollautomatisch - eine vorhandene mp3-Datei, die ein komplettes Album enthält, in die einzelnen Tracks aufteilt. Man muss lediglich in die Excel-Datei die Namen der Titel eingeben, Albumname und Interpret sowie die jeweilige Länge der Tracks... das war´s schon face-wink

Das erstellte "cuesheet.cue" wird dann einfach im Programm "mp3DirectCut" geladen und dann "geteilt gespeichert". Fertig.

Jetzt muss ich nicht mehr stundenlang herum schneiden, wenn ich mir ein Album runtergeladen habe, welches in EINER mp3-Datei gespeichert ist.

Danke für Eure super Hilfe.
Und falls jemand von Euch an dem kleinen Programm interessiert ist, sende ich es natürlich gerne zu.

Grüße,
BN
BN2023
BN2023 05.10.2024 aktualisiert um 20:43:48 Uhr
Goto Top
Sorry... es gibt doch nochmal eine Nachfrage.
Ich habe jetzt 2 Dinge noch verändert:

1) der Bereich, aus dem kopiert wird, liegt nun in Tabellenblatt 2. Dazu habe ich im VBA-Code eine Änderung durchgeführt bei " With ThisComponent.Sheets(1)" Da habe ich eine 1 eingefügt, statt vorher der 0.

2) ich habe den Desktop als Speicherort der Datei ausgewählt. Dazu habe ich "%USERPROFILE%\desktop\cuesheet.cue" als Pfad angegeben.

Wenn ich jetzt auf den Ausführen-Button in meiner Datei klicke, erhalte ich eine Fehlermeldung. Dabei wird eine Zeile markiert (siehe Screenshot).

Hier der Screenshot dazu:

fehler libre office

Kann mir jemand von Euch sagen, wo der Fehler liegt?
Kenne mich mit VBA leider überhaupt nicht aus. Und die 1 hinter "Sheets" hatte ich einfach nur vermutet.
Der Pfad funktioniert im Windows Explorer... das dürfte also nicht das Problem sein. Es sei denn, man darf da keine Einträge wie "%USERPROFILE% machen...

Grüße,
BN
150704
150704 05.10.2024 aktualisiert um 21:48:13 Uhr
Goto Top
Es sei denn, man darf da keine Einträge wie "%USERPROFILE% machen...
Nope darfst du nicht, in Strings wird keine automatische Expansion von Umgebungsvariablen vorgenommen, um das gewünschte zu erreichen schreibst du das stattdessen so ...
Dim FILEPATH as String
FILEPATH = Environ("USERPROFILE") & "\Desktop\cuesheet.cue"  

Kenne mich mit VBA leider überhaupt nicht aus
Auch du darfst gerne lesen und lernen
https://help.libreoffice.org/latest/de/text/sbasic/shared/main0601.html? ...
BN2023
BN2023 06.10.2024 aktualisiert um 12:51:50 Uhr
Goto Top
Danke Dir für die weitere Hilfe.
Die von Dir verlinkte Seite ist interessant und ich habe schon ein paar interessante Dinge darauf entdeckt face-smile

Grds. funktioniert die Datei jetzt wirklich super gut.

Allerdings bringt es mich gerade zur Verzweiflung, dass der Button, den ich als "Schaltfläche" eingefügt habe, nicht mehr vorhanden ist, wenn ich die Datei einmal geschlossen habe und danach wieder öffne.

Ich habe in den Eigenschaften "Steuerelement-Eigenschaften" und "Formulareigenschaften" nirgendwo eine Möglichkeit gefunden, wo man nochmal auf "speichern" klicken könnte.
Der Button funktioniert perfekt... ist aber verschwunden, nachdem ich das Dokument einmal schließe.
Natürlich habe ich vorab das Dokument nochmal gespeichert und die Tabelle ist auch geschützt und es spielt keine Rolle, ob ich das Dokument geschützt speichere oder ungeschützt. Der Button verschwindet in beiden Fällen.

Dazu habe ich bisher keine Lösung gefunden...

Grüße,
BN
150704
150704 06.10.2024 aktualisiert um 14:15:15 Uhr
Goto Top
ich habe eine Libre-Office Calc-Datei (jedoch als .xlsx gespeichert)
That's by design wenn du als xlsx speicherst , solche Mappen dürfen per se keine Makros und Steuerelemente haben nur die *.xlsm Varianten dürfen das und deswegen werden die dann entfernt, speichere als *.ods dann lüppt dat auch.
BN2023
BN2023 06.10.2024 um 14:17:09 Uhr
Goto Top
aaaah ok, ich verstehe.
Habe es eben getestet und... funktioniert face-wink

Dann werde ich es später einfach auch mal mit *.xlsm testen, ob das auch funktioniert. Ansonsten lasse ich es einfach als *.ods.

So... hoffe das war´s dann endlich face-smile

Danke nochmal fürs Helfen...

Grüße,
BN
150704
150704 06.10.2024 aktualisiert um 14:27:38 Uhr
Goto Top
Zitat von @BN2023:
Dann werde ich es später einfach auch mal mit *.xlsm testen, ob das auch funktioniert. Ansonsten lasse ich es einfach als *.ods.
Nein das geht aus LibreOffice nicht, *.xlsm ist nur für Mappen mit Makros innerhalb von MS-Office und inkompatibel mit LibreOffice.
Du solltest hier also strikt LibreOffice Docs mit Makros von solchen mit MS-Office Makros trennen und auch die Dateiendung entsprechend wählen als *.ods.
LibreOffice "Basic" MS Office "VBA".
Danke nochmal fürs Helfen...
Bidde.
BN2023
BN2023 06.10.2024 um 16:09:17 Uhr
Goto Top
OK... verstanden.

Dann sind wir jetzt endlich durch face-wink

Grüße und danke,
BN
BN2023
BN2023 11.10.2024 um 09:57:54 Uhr
Goto Top
...doch nochmal ne Frage an @150704 face-smile

Ich werde jetzt von LO auf MS365 umstellen.
Dann würde ich die hiesige Datei auch im Excel-Format nutzen.

Daher habe ich den Code nun für VBA angepaßt... leider funktioniert er so noch nicht.

Hier mal mein Code:

Private Sub Cuesheet()
'  
Dim FILEPATH As String

Sheets("Tabelle2").Select  
Range("E3:E80").Select  
Selection.Copy
Application.WindowState = xlNormal

FILEPATH = Environ("USERPROFILE") & "\Desktop\cuesheet.cue"  
End Sub

Den Teil, wo der Bereich von E3 - E80 aus Tabellenblatt 2 kopiert wird, habe ich einfach über "Makro aufzeichnen" erstellt. Und das kopieren habe ich dann z.T. aus Deinen obigen Antworten entnommen und versucht, es auf VBA-Code umzustricken. Offenbar mit wenig Erfolg face-wink

Kannst Du vielleicht da nochmal helfen?

Grüße,
BN
150704
150704 11.10.2024 aktualisiert um 10:18:54 Uhr
Goto Top
Einfach den alten Code nehmen der war doch schon für MS-Office gedacht 😉.

Sub Cuesheet
    Dim fso As Object, txtFile As Object, cell as Range, FILEPATH as String
    FILEPATH = Environ("USERPROFILE") & "\Desktop\cuesheet.cue"      
    Set fso = CreateObject("Scripting.FileSystemObject")      
    Set txtFile = fso.OpenTextFile(FILEPATH, 2, True)
    With Sheets(2)
        For Each cell In .Range("E3:E" & .Cells(Rows.Count, "E").End(xlUp).Row)      
            txtFile.WriteLine cell.Value
        Next
    End With
    txtFile.Close
    Set fso = Nothing
    Set txtFile = Nothing
End Sub
BN2023
BN2023 11.10.2024 um 11:22:31 Uhr
Goto Top
...oooh, das hatte ich jetzt irgendwie falsch auf dem Schirm face-smile

Sorry wegen der erneuten Anfrage.
Hat jetzt auf Anhieb funktioniert.

Vielen Dank nochmal.

Grüße
BN
BN2023
BN2023 20.10.2024 aktualisiert um 14:30:29 Uhr
Goto Top
Hallo,

ich habe nochmal eine kurze Verständnisfrage zu diesem Thread.
Der Code funktioniert ja hervorragend, um eine Cuesheetdatei "cuesheet.cue" auf dem Desktop zu erstellen.

Am Ende steht folgendes im Code:

End With
    txtFile.Close
    Set fso = Nothing
    Set txtFile = Nothing
End Sub

Ich würde nun am Ende jedoch gerne die soeben erstellte und gespeicherte Datei "cuesheet.cue" öffnen... also quasi starten.

Grund dafür ist, dass ich nun mein Windows so eingestellt habe, dass alle Dateien mit ".cue" automatisch im Programm "MP3DirectCut" geöffnet werden.
Wenn ich also am Ende diese Datei starte, dann wird sie gleich ins Programm geladen, wodurch ich einige weitere Schritte einsparen kann.

Meine bisherigen Versuche:

- Versuch über "workbook" funktionierte natürlich nicht, da ja keine Excel-Datei gestartet werden soll.
-
Dim Pfad As String
      Pfad = "D:\Desktop\cuesheet.cue"  
      Pfad = Shell(Pfad, vbNormalFocus)

Das funktionierte auch nicht.
Ich nehme an, dass hier nur eine kleine Änderung im VBA-Code nötig ist. Aber ich checke einfach nicht, was ich genau anpassen muss.

Könnt Ihr nochmal helfen?

Grüße,
BN
150704
150704 20.10.2024 aktualisiert um 15:08:27 Uhr
Goto Top
Never ending story mal wieder ...
CreateObject("WScript.Shell").Run(FILEPATH,1,FALSE)  
Me out.
BN2023
BN2023 20.10.2024 aktualisiert um 15:10:28 Uhr
Goto Top
Hallo @150704

Danke für die Ergänzung.
Aber auf diesen Code-Zusatz wäre ich im Leben nicht gekommen. face-wink

Werde es sofort mal testen...

Grüße
BN
BN2023
BN2023 20.10.2024 um 15:23:57 Uhr
Goto Top
...hat super funktioniert.

Ich habe jetzt nur den Pfad nochmal angepaßt in der VBA-Datei, damit die MP3-Datei und die Cuesheet-Datei immer im gleichen Verzeichnis liegen. Dann funktioniert es wirklich perfekt.

Grüße,
BN