würdet Ihr mir bitte etwas unter die Arme greifen bei folgendem Problem?
Aus einer Tabelle (beschrifteter Bereich A1:T500) sollen durch Markieren
Daten in eine Textdatei exportiert werden. Die Markierung findet entweder
statt durch ....
- Markieren einer bestimten Zeilenzahl innerhalb des zu exportierenden
Bereiches (also z.B. Zeile 2:10) oder
- Markieren eines Zellbereiches (also z.B. A2:A10).
- Theoretisch auch durch Markieren mehrerer Zellen innerhalb des
beschrifteten Bereiches (z.B. B2:B10).
In allen 3 Fällen (gesamte Zeilenmarkierung oder Markierung A2:A10 oder
B2:B10) soll die Markierung aber trotzdem in A2 beginnen und bis zum Ende
des beschrifeten Bereiches T10 reichen.
Dabei soll also die Markierung automatisch auf die volle Breite der
beschrifteten Tabelle erweitert werden. Danach will ich dann den
Export-Vorgang starten.
Nun meine Frage:
Wie mache ich es am besten per VBA, dass - beginnend mit der ersten
markierten Zeile Excel die Bereichsmarkierung immer bis zur letzen Zeile der
Beispielmarkierung markiert?
Schon mal ganz herzlichehn Dank für Euere Hilfe und Anregungen.
Viele Grüße aus München
Andi Volkert
Hallo
>
> Wie mache ich es am besten per VBA, dass - beginnend mit der ersten
> markierten Zeile Excel die Bereichsmarkierung immer bis zur letzen Zeile der
> Beispielmarkierung markiert?
Hier erst mal die automatische Erweiterung der Markierung beginnend
mit der ersten Zeile des ursprünglich markierten Bereichs bis zu Zelle
T500. Mit einer kleinen Sicherheitsabfrage, damit nicht jede
Mini-Markierung den Erweiterungs-Prozess startet (die Markierung muss
mindestens 5 Zeilen überspannen)
F1: War es das was Du wolltest?
F2: Brauchst Du auch Hilfe beim Export in die Text-Datei?
Peter
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Bei Bedarf anpassen oder entfernen
If Target.Rows.Count < 5 Then
Exit Sub
End If
Range(Cells(Target.Row, "A"), [T500]).Select
End Sub
vielen Dank für Deine superschnelle Antwort.
"Peter Schleif" <gib.spam.k...@web.de> schrieb im Newsbeitrag
news:479f9767$0$27209$9b4e...@newsspool1.arcor-online.net...
>
[...]
> Hier erst mal die automatische Erweiterung der Markierung beginnend
> mit der ersten Zeile des ursprünglich markierten Bereichs bis zu Zelle
> T500. Mit einer kleinen Sicherheitsabfrage, damit nicht jede
> Mini-Markierung den Erweiterungs-Prozess startet (die Markierung muss
> mindestens 5 Zeilen überspannen)
>
> F1: War es das was Du wolltest?
[...]
A: Ja und nein.
Deine Lösung klingt verlockend. Habe ich das richtig verstanden, dass beim
Setzen der markierung automatisch der Bereich erweitert wird? Wenn ja, wo
muss ich den Code hinkopieren, damit das so klappt?
Mir ist nicht ganz klar, welches Ereignis das Markieren dann letztendlich
auslöst.
Bisher ist es mir nicht gelungen, Deinen Code zum Laufen zu bringen.
Allerdings habe ich gar nicht mit einer so automatisierten Lösung gerechnet,
sondern wollte bloß in irgendeiner Form die Anzahl an Zeilen (Beginnend mit
der Spalte A) markieren, die vorher von Hand markiert werden.
Nach dem händischen Markieren des (in meiner Frage) genannten Bereiches
wollte ich einen Button betätigen, der das Erweitern der Markierung
durchführt.
[...]
> F2: Brauchst Du auch Hilfe beim Export in die Text-Datei?
[...]
Da würde ich bei Bedarf gerne noch einmal darauf zurückkommen.
Ich muss dann nämlich aus dem markierten Bereich eine Textdatei erstellen
(Dateiname sollte heißen Kreditoren _ aktuellesDatum _ aktuelleUhrzeit). Die
Überschriften der Exportdatei muss ich als 1. Zeile setzen und anschließend
kommen ausgewählte Spalten (also z.B. B, D,G,H usw.) aus der Markierung
dazu.
Hast Du hier auch eine Lösung für mich?
Schon mal ganz herzlichen Dank für Deine Bemühungen und Deine Hilfe.
Ja. Mir kam dieser Automatismus auch eher unpraktisch vor - deshalb
die Sicherheitabfrage - aber es schien mir das zu sein was Du
wolltest. Hab' mich wohl geirrt - sorry.
> Wenn ja, wo muss ich den Code hinkopieren, damit das so klappt?
In de VBA-Bereich der Tabelle in der Du die Markierung auswählst.
> Mir ist nicht ganz klar, welches Ereignis das Markieren dann letztendlich
> auslöst.
Das manuelle Markieren eines Bereichs der mehr als 4 Zeilen
überspannt. I.d.R. mit der Maus.
> Nach dem händischen Markieren des (in meiner Frage) genannten Bereiches
> wollte ich einen Button betätigen, der das Erweitern der Markierung
> durchführt.
Finde ich auch besser. So hast Du mehr Kontrolle
Dann leg Dir doch einen Button auf deine Tabelle und setzte folgenden
Code in die Klick-Ereignis-Prozedur dieses Buttons. Name des Buttons
ist hier: *cmdMarkierungErweitern*
Private Sub cmdMarkierungErweitern_Click()
Range(Cells(Selection.Row, "A"), [T500]).Select
End Sub
>> F2: Brauchst Du auch Hilfe beim Export in die Text-Datei?
>
> Da würde ich bei Bedarf gerne noch einmal darauf zurückkommen.
Hab' noch bis Sonntag Urlaub.
> Ich muss dann nämlich aus dem markierten Bereich eine Textdatei erstellen
> (Dateiname sollte heißen Kreditoren _ aktuellesDatum _ aktuelleUhrzeit). Die
> Überschriften der Exportdatei muss ich als 1. Zeile setzen und anschließend
> kommen ausgewählte Spalten (also z.B. B, D,G,H usw.) aus der Markierung
> dazu.
>
> Hast Du hier auch eine Lösung für mich?
Ganz Bestimmt. Aber morgen ist auch noch ein Tag. :-)
Jetzt gehe ich erst mal schlafen. Gute Nacht.
Peter
[...]
> Jetzt gehe ich erst mal schlafen. Gute Nacht.
>
> Peter
[...]
danke für Deine Tipps gestern. Hoffe, du hast gut geschlafen!
[...]
> In de VBA-Bereich der Tabelle in der Du die Markierung auswählst.
>
>> Mir ist nicht ganz klar, welches Ereignis das Markieren dann letztendlich
>> auslöst.
>
> Das manuelle Markieren eines Bereichs der mehr als 4 Zeilen
> überspannt. I.d.R. mit der Maus.
[...]
Ja, das hat jetzt ganz gut geklappt, ich hatte den Code anfänglich nur in
DieseArbeitsmappe kopiert, aber das ist ja Worksheet bezogen.
[...]
>> Nach dem händischen Markieren des (in meiner Frage) genannten Bereiches
>> wollte ich einen Button betätigen, der das Erweitern der Markierung
>> durchführt.
>
> Finde ich auch besser. So hast Du mehr Kontrolle
>
> Dann leg Dir doch einen Button auf deine Tabelle und setzte folgenden
> Code in die Klick-Ereignis-Prozedur dieses Buttons. Name des Buttons
> ist hier: *cmdMarkierungErweitern*
>
[...]
Ja, das werde ich auf jeden Fall so machen, weil ich nicht sicher sein kann,
wie viele Zellen der jeweilige Benutzer markiert
[...]
> Range(Cells(Selection.Row, "A"), [T500]).Select
[...]
Hier muss ich nacharbeiten, denn ich möchte innerhalb eines beschriebenen
Tabellenbereiches einfach eine bestimmte Anzahl von Zeilen markieren und
Excel soll mir dann genau diese Anzahl von Zeilen (und zwar beginnend mit
der Spalte A und endend mit der letzten beschrifteten Spalte) markieren.
Hier gibt's meines Wissens was mit Range(cells(??????...End(xlUp).Row.?????)
Vielleicht ein Beispiel hierzu:
beschrifteter Tabellenbereich von A1 bis T500. Ich markiere B3:B10 und das
Makro erweitert mir (nach Betätigen des Buttons) auf A3 bis T10.
Hast Du (oder auch jemand anders) bitte noch einmal einen Tipp wie ich das
am besten anstelle?
Vielen Dank im Voraus für jede Hilfe
Viele Grüße
Andi Volkert
"Beschrifteter Tabellenbereich von A1 bis T500" verstehe ich so, dass
unterhalb von Zeile 500 und rechts von Spalte T nichts mehr steht.
Ich hab' den Code mal etwas ausführlicher/übersichtlicher gemacht,
damit er sich selbst erklärt.
Peter
Private Sub cmdMarkierungErweitern_Click()
Dim zeile_von As Integer
Dim zeile_bis As Integer
Dim spalte_von As Integer
Dim spalte_bis As Integer
zeile_von = Selection.Row
zeile_bis = Selection.Rows.Count + zeile_von - 1
spalte_von = 1
spalte_bis = Cells.SpecialCells(xlCellTypeLastCell).Column
Range(Cells(zeile_von, spalte_von), _
Cells(zeile_bis, spalte_bis)).Select
End Sub
Bingo!!!!
[...]
>
> Private Sub cmdMarkierungErweitern_Click()
>
> Dim zeile_von As Integer
> Dim zeile_bis As Integer
> Dim spalte_von As Integer
> Dim spalte_bis As Integer
>
> zeile_von = Selection.Row
> zeile_bis = Selection.Rows.Count + zeile_von - 1
> spalte_von = 1
> spalte_bis = Cells.SpecialCells(xlCellTypeLastCell).Column
>
> Range(Cells(zeile_von, spalte_von), _
> Cells(zeile_bis, spalte_bis)).Select
>
> End Sub
[...]
Du bist eine Schau! Genau so habe ich mir's vorgestellt! Super!
Jetzt traue ich mir gar nicht zu fragen, ob Du noch einen Tipp hast, wie ich
die Daten in eine .txt-Datei stellen kann?
Hintergrund ist folgender:
die Liste soll (abschnittsweise aufgrund Deiner tollen
Markierungsmöglichkeit) mehrmals im Monat markiert und einzelne Spalten
daraus in eine .txt-Datei geschrieben werden. Diese Daten werden dann in
Lexware eingelesen.
Was ich nun bräuchte, wäre die Möglichkeit, zunächst mehrere feste
Spaltenüberschriften in eine Textdatei zu schreiben (Komma- oder
Strichpunkt-separiert, ), darunter einzelne Spalten des markierten Bereiches
(also z.B. Spalte B, D, F, H, M, etc., ebenfalls Komma- oder
Strichpunkt-separiert, die Texte in Anführungszeichen) in die gleiche
Textdatei zu schreiben und die Datei mit einem Dateinamen Kreditoren_
Datum_Uhrzeit (also so: Kreditoren_30.01.2008_10.30.txt) zu benennen.
Wenn Du mir freundlicherweise nochmals helfen könntest wäre das aber super.
Ganz herzlichen Dank schon mal im Voraus für Deine tolle Unterstützung!
Andi Volkert
Ich weiß jetzt nicht auswendig, welches Format Lexware erwartet und
habe daher drei Konstanten angelegt, die Du ggf. anpassen musst:
Const begrenzer As String = """"
Const separator As String = ","
Const maskierer As String = "\"
begrenzer und separator sind wohl klar. maskierer ist das Zeichen,
dass verwendet wird, wenn der begrenzer selbst in der Zelle ist.
>
> Was ich nun bräuchte, wäre die Möglichkeit, zunächst mehrere feste
> Spaltenüberschriften in eine Textdatei zu schreiben
Der Code unten holt die Überschriften automatisch aus den Zellen der
Zeile 1 gemäß festgelegter Spaltenliste. Hier also B1,D1,F1,H1,M1.
Wenn Du die Überschriften lieber manuell vorgeben willst, müssen wir
den Code noch leicht anpassen.
Flexibler und eleganter als eine feste Spalten-Liste wäre es, die zu
exportieren Spalten irgendwie zu kennzeichenen. Zum Beispiel durch ein
'X' in Zeile 2 oder eine andere Schriftfarbe in Zeile 1.
Der Code gehört zu einem Button 'cmdExport'. Beim Klicken muss die
Markierung bestehen.
Peter
Private Sub cmdExport_Click()
'Erwartet eine bestehende Markierung
'--------------------------------------------------
Dim fso As Object
Dim fp As Object
Dim zeile_von As Integer
Dim zeile_bis As Integer
Dim z As Integer
Dim s As Variant
Dim spalten As Variant
Dim text As String
Dim filename As String
Const filepath As String = "C:\"
'ggf. an das Lexware-Import-Format anpassen
'--------------------------------------------------
Const begrenzer As String = """"
Const separator As String = ","
Const maskierer As String = "\"
'Nicht gut. Besser über die Tabelle auswählen
'--------------------------------------------------
spalten = Array(2, 4, 6, 8, 13) 'B,D,F,H,M
'File oeffnen
'--------------------------------------------------
filename = "Kreditoren_" _
& Format(Now(), "dd.mm.yy") & "_" _
& Format(Now(), "hh.nn") & ".txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set fp = fso.CreateTextFile(filepath & filename, True)
'Spaltenkoepfe/Ueberschriften ausgeben
'--------------------------------------------------
text = ""
For Each s In spalten
text = text & separator
text = text & begrenzer
text = text & Replace(Cells(1, s), begrenzer, _
maskierer & begrenzer)
text = text & begrenzer
Next
fp.WriteLine Mid(text, Len(separator) + 1)
'Zeilen des markierten Bereichs ausgeben
'--------------------------------------------------
zeile_von = Selection.Row
zeile_bis = Selection.Rows.Count + zeile_von - 1
For z = zeile_von To zeile_bis
text = ""
For Each s In spalten
text = text & separator
text = text & begrenzer
text = text & Replace(Cells(z, s), begrenzer, _
maskierer & begrenzer)
text = text & begrenzer
Next
fp.WriteLine Mid(text, Len(separator) + 1)
Next
Set fp = Nothing
Set fso = Nothing
End Sub
[...]
[...]
Peter, ich weiß gar nicht was ich sagen soll... Perfekt! Vielen herzlichen
Dank! Ganz Klasse!
Es läuft genau so wie ich mir das vorgestellt habe!
Die Überschriften habe ich "hartcodiert", weil die in der Excel-Tabelle
anders lauten als Lexware sie verarbeitet.
So ist es besser, die in Lexware identischen Begriffe zu verwenden und
dadurch eine Importspezifikation bzw. Fehler zu vermeiden.
Ich sag nochmal ein ganz sakrisches Dankeschön für Deine tolle
Unterstützung, wünsche Dir noch einen schönen Nachmittag und einen
erholsamen (Rest-)urlaub!