1.4k Aufrufe
Gefragt in Anwendungen(Java,C++...) von
Guten Tag,

ich habe folgende Herausforderung und wäre euch sehr dankbar wenn Ihr mich dabei unterstüzt.

Auf einer Excel-Tabelle sind in den Feldern verschiedene Werte ( Range1 = x ; Range2 = x; usw.). Diese Werte sollen in ein Text-Editor übertragen werden. Der Editor besteht aus ASCII-Daten und ist Tabellarisch aufgebaut.
Darstellung Editor:
"
#Klasse
#-----------------------------------------------------------------------
Data1 | Name | Range1 | Range2| usw.
"
Nun ist die Aufgabe die Excel-Werte Range1; Range2; in die vorgesehenen Text-Editor Felder zu übertragen/kopieren. Die beste Lösung für mich wäre es ein Excel-Makro zu programmieren, sodass mit einem Knopfdruck die Werte übertragen werden.

könnte man das mit einem Excel-Makro programmieren?
Wenn ja, wie würden die Befehle aussehen?
gibt es auch andere möglichkeiten.

Danke im Voraus.

MfG
Marth

10 Antworten

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

da deine Angeben etwas mager sind, hier mal ein Makro, das den Inhalt eines Tabellenblattes als Text-Datei unter dem Namen des Tabellenblatts in das Verzeichnis speichert, in dem die Excel-Datei abgespeichert ist:
Sub txtDateiErstellen2()

Dim lngLZeile As Long
Dim lngLSpalte As Long
Dim lngZeile As Long
Dim lngSpalte As Long
Dim Zeile As String
Dim Vollzeile As String
Dim myArr As Variant

'Bildschirmaktualiserung ausschalten
Application.ScreenUpdating = False

'Ausgabepfad wird festgelegt; Pfad der Excel-Datei
Ausgabepfad = ThisWorkbook.Path & "\" & ThisWorkbook.ActiveSheet.Name & ".txt"

'Trennzeichen wird festgelegt
Trennzeichen = "@"

'Nachfrage, ob Exportdatei erstellt werden soll
Meldung = MsgBox("Möchten Sie eine *.txt Datei erstellen? " & vbCrLf & "Dateipfad: " & Ausgabepfad, vbYesNo, "Export")
If Meldung = vbNo Then
'Bildschirmaktualiserung
Application.ScreenUpdating = True
Exit Sub
End If

With ThisWorkbook.ActiveSheet
'letzte Zeile ermitteln
lngLZeile = .Cells(Rows.Count, 1).End(xlUp).Row

'letzte Spalte ermitteln
lngLSpalte = .Cells(1, Columns.Count).End(xlToLeft).Column
End With

'Ggfs. vorhandene Ausgabedatei löschen
If Dir(Ausgabepfad) <> "" Then
Kill (Ausgabepfad)
End If

'Datei Öffen zur Ausgabe
Open Ausgabepfad For Output As #1

myArr = ActiveSheet.Range(Cells(1, 1), Cells(lngLZeile, lngLSpalte))

'Schleife zum Auslesen der Daten
For lngZeile = LBound(myArr, 1) To UBound(myArr, 1)
For lngSpalte = LBound(myArr, 2) To UBound(myArr, 2)
Zeile = Trim(myArr(lngZeile, lngSpalte))
Zeile = Replace(Zeile, Trennzeichen, "") 'ggf. vorhandenes Trennzeichen im Text entfernen

Vollzeile = Vollzeile & Zeile & Trennzeichen

Next lngSpalte
'Ausgabe in Datei
Vollzeile = Left(Vollzeile, Len(Vollzeile) - 1) 'Letztes Trennzeichen abschneiden
Print #1, Vollzeile
Vollzeile = ""
Next lngZeile

Close #1 'Datei schliessen

'Nachricht, dass Exportdatei erstellt wurde
MsgBox "Die Ausgabedatei wurde erstellt", vbOKOnly, "Export Schulbuchausleihe"

'Bildschirmaktualiserung
Application.ScreenUpdating = True

End Sub


Der Code gehört in ein Standard-Modul deiner Arbeitsmappe. Deine Arbeitsmappe muss gespeichert sein. Du kannst den Ausgabepfad aber auch selbst festlegen.

Gruß

M.O.
0 Punkte
Beantwortet von
Danke dir M.O.. Das ist schonmal ein Anfang.
Um die Aufgabenstellung mal genauer zu beschreiben:
Der Texteditor besteht schon. Es ist ein Datenbank-Texteditor in dem verschiedene Daten aufgelistet sind. Diese Daten müssen ständig aktualisiert werden. Leider kann ich die aktualisierte Werte nur in einer Excel Datei aufrufen. Die Werte in der Excel-Datei muss ich dann in die vorgesehenen Feldern des Texteditor überschreiben.

Excel-Datei aufbau:
Daten1 Wert x Wert y Wert z .....
Daten2 Wert x wert y Wert z .....
......

Texteditor Datenbank aufbau:
#Klasse Datenbank 1
#-----------------------------------------------------------------------
Daten1 | Name | Wert x| Wert y| Wert z| ...
Daten2 | Name | Wert x| Wert y| Wert z| ...

Die aktualisierten Werte von der Excel-Datei müssen nun genau in die Position in dem Texteditor überschrieben werden. Also neu Wertx zur alt Wertx überschreiben.

Es ist leider ein bisschen schwer zu erklären.
Danke nochmals für die Mühe.

Mit freundlichen Grüßen
B.C.
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo,

um was handelt es sich bei Daten1? Ist das z.B. ein eindeutiges Kriterium, das nur einmal in der Datei auftaucht (als z.B. eindeutige Nummer o.ä.), so dass man hierdurch den jeweiligen Datensatz identifizieren kann?

Gruß

M.O.
0 Punkte
Beantwortet von
hi,
Daten 1 = Bauteilbezeichnung
Werte x,y,z ... = größe länge in mm
Daten 1 taucht nur einmal in der Liste auf.

Gruß
Sandora
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo,

der folgende Code gehört in ein Standard-Modul deiner Excel-Tabelle. Die Tabelle mit den aktuellen Daten muss aktiv sein. Ich gehe davon aus, dass die Text-Datei, die aktualisiert werden soll, immer den selben Namen trägt und auch immer im selben Pfad liegt. Die vorhandene Textdatei wird gelöscht und neu geschrieben.

Sub Aktualisieren()
Dim Arr
Dim Datei
Dim FSO
Dim L As Long
Dim Tmp As Variant
Dim arrDaten As Variant
Dim arrExcel As Variant
Dim I As Integer
Dim Str_String As String
Dim strTrenner As String
Dim Pfad As String
Dim Zeile As String
Dim Vollzeile As String
Dim lngLZeile As Long
Dim lngLSpalte As Long
Dim v As Long
Dim e As Long
Dim s As Long

'Trenner für Textdatei festlegen
strTenner = "|"

'Pfad und Dateiname für zu aktualisierende Datei festlegen - anpassen!!
Pfad = "C:\Test\Tabelle2.txt"
'Textdatei auslesen
Set FSO = CreateObject("Scripting.FilesystemObject")
Set Datei = FSO.OpentextFile(Pfad)
Str_String = Datei.readall
Datei.Close

Arr = Split(Str_String, vbCrLf) 'Nach Datensätzen splitten
ReDim arrDaten(UBound(Arr), 200) '200 Spalten reichen ???
For L = 0 To UBound(Arr)
Tmp = Split(Arr(L), strTenner) 'Jeden Datensatz nach Werten splitten
For I = 0 To UBound(Tmp)
arrDaten(L, I) = Tmp(I) 'Jeden Wert in das Array arrDaten umschaufeln
Next I
Next L

With ThisWorkbook.ActiveSheet
'letzte Zeile ermitteln
lngLZeile = .Cells(Rows.Count, 1).End(xlUp).Row
'letzte Spalte ermitteln
lngLSpalte = .Cells(3, Columns.Count).End(xlToLeft).Column
End With

'vorhandene Excel-Daten in Array einlesen
arrExcel = ActiveSheet.Range(Cells(1, 1), Cells(lngLZeile, lngLSpalte))

'beide Arrays vergleichen
For v = 0 To L - 1
For e = 1 To lngLZeile
If Trim(arrDaten(v, 0)) = Trim(arrExcel(e, 1)) Then
'falls Bauteilbezeichnung gleich, Daten aktualisieren
For s = 2 To lngLSpalte
arrDaten(v, s) = arrExcel(e, s)
Next s
End If
Next e
Next v

'Ggfs. vorhandene Ausgabedatei löschen
If Dir(Pfad) <> "" Then
Kill (Pfad)
End If

'Datei Öffen zur Ausgabe
Open Pfad For Output As #1

'Schleife zum Auslesen der Daten
For v = 0 To UBound(arrDaten, 1)
For e = 0 To UBound(arrDaten, 2)
If arrDaten(v, e) <> "" Then
Zeile = Trim(arrDaten(v, e))
Zeile = Replace(Zeile, strTenner, "") 'ggf. vorhandenes Trennzeichen im Text entfernen
Vollzeile = Vollzeile & Zeile & strTenner
End If
Next e
If Vollzeile <> "" Then
'Ausgabe in Datei
Vollzeile = Left(Vollzeile, Len(Vollzeile) - 1) 'Letztes Trennzeichen abschneiden
Print #1, Vollzeile
Vollzeile = ""
End If
Next v

Close #1 'Datei schliessen

'Nachricht, dass Datei aktualisiert wurde
MsgBox "Die Datei wurde aktualisiert", vbOKOnly, "Hinweis"

End Sub

Und probier das bitte erst einmal mit einer Text-Testdatei aus.

Gruß

M.O.
0 Punkte
Beantwortet von
Hi,
vielen Dank M.O. .
Das hilft mir sehr weiter. Danke dir.
Ich will dich gar nicht mehr nerven, du hast mir jetzt schon sehr viel geholfen.
Aber ein Problem habe ich noch.
Das Programm überschreibt mir nur 4 Werte ich habe jedoch 25 Werte die Überschrieben werden müssen.
Müsste ich dafür ein Parameter in deinem Programm um ändern??.

Danke nochmals

Mit freundlichen Grüßen

Sandora
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo,

normalerweise sollten alle Werte - soweit die Bauteilbezeichnis identisch ist - aktualisiert werden.
Was klappt denn nicht? Werden nicht alle Bauteile aktualisiert? Oder gibt es pro Bauteil eine unterschiedliche Anzahl von Werten?

Gruß

M.O.
0 Punkte
Beantwortet von
hi,
Er erkennt die Bauteile und überschreibt die Werte.
Aber er überschreibt nur die Werte 1 - 4 von den Bauteilen. Andere Werte werden nicht überschrieben und bleiben deshalb bestehen.
Pro Bauteil gibt es 25 Werte. Jedoch haben einige Bauteile durch fehlende Geometrien auch nur 22 Werte

MfG
Sandora
0 Punkte
Beantwortet von
hallo,
M.O. ich wollte nur sagen das es funktioniert.
Ich weiss zwar nicht wo der Fehler war, habe es aber mal neugestartet dannnach hat es funktioniert.
Ich danke viel mals dir :))))

mfg
sandora
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo,

freut mich, dass es funktioniert und Danke für die Rückmeldung.

Gruß

M.O.
...