In Excel Datei schreiben ohne sie zu öffnen (VBA)

Hallo,

ist es möglich mittels VBA Code in einer Excel Datei, eine Zeile in eine andere Excel Datei zu schreiben OHNE diese zu öffnen? Mit öffnen gehts, aber das dauert wie ich finde ziemlich lange, besonders wenn man in viele Dateien schreiben muss …

Hätte jemand eine Idee?

thx & mfg

Grüezi Wotan

ist es möglich mittels VBA Code in einer Excel Datei, eine
Zeile in eine andere Excel Datei zu schreiben OHNE diese zu
öffnen? Mit öffnen gehts, aber das dauert wie ich finde
ziemlich lange, besonders wenn man in viele Dateien schreiben
muss …

Hätte jemand eine Idee?

Zwei Fragen zum erweiterten Verständnis habe ich dazu :wink:

Wie bekommst Du 20 Geld-Scheine in deine Brieftasche ohne diese zu öffnen?

Was dauert länger, die 20 Geldscheine einzeln oder als Bündel in die Brieftache zu stecken?

Dasselbe gilt auch für Excel - ohne eine Mappe zu öffenen (auch wenn dies vielleicht im Hintergrund geschieht - kannst Du keine Werte reinschreiben.

Und wenn Du deine Werte ‚als Block‘, also als zusammenhängenden Bereich auf einmal in die Mappe einträgst statt jede Zelle einzeln anzusprechen, dauert es auch nicht mehr so lange.

Um hier aber konkret(er) raten zu können musst Du bitte dein Anliegen ausführlich(er) beschreiben und vor allem deinen bisherigen Code offenlegen.
Sinnvoll wäre es wohl, wenn Du eine Demo-Mappe zur Verfügung stellen, diese auf einen WebSpace hochladen und den Link dann hier nennen könntest.


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Ne ich hab nur gelesen, dass man ohne die Datei zu öffnen daraus lesen kann - jetzt dachte ich mir, vl gehts auch mit schreiben. Aber wenns nicht geht, ist nicht so schlimm. Da ich nur jeweils eine Zeile in eine Datei schreibe fällt das mit den Blöcken auch flach.

Wie mach ich eine Datei im Hintergrund auf? Im Moment mach ich das so, dabei geschieht aber alles im Vordergrund …

’ Datei öffnen
Set OpenWB = Workbooks.Open(ThisWorkbook.Path & „\retourniert.xls“)

OpenWB.Sheets(1).Cells(Zeile, 1).Select

'Daten schreiben
ActiveCell.Offset(0, 0) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 1).Value
ActiveCell.Offset(0, 1) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 2).Value

'Datei schließen
OpenWB.Close True

Danke für die schnelle Antwort!

Grüezi Wotan

Ne ich hab nur gelesen, dass man ohne die Datei zu öffnen
daraus lesen kann

Auch das ist nur bedingt richtig - wenn Du wissen willst wie viele Geldscheine in deiner Brieftasche stecken musst Du diese zumindest an einer Ecke leicht öffnen um hineinzusehen… :wink:

jetzt dachte ich mir, vl gehts auch mit
schreiben. Aber wenns nicht geht, ist nicht so schlimm. Da ich
nur jeweils eine Zeile in eine Datei schreibe fällt das mit
den Blöcken auch flach.

Wie mach ich eine Datei im Hintergrund auf? Im Moment mach ich
das so, dabei geschieht aber alles im Vordergrund …

’ Datei öffnen
Set OpenWB = Workbooks.Open(ThisWorkbook.Path &
„\retourniert.xls“)

Das passt soweit schon ganz gut…

OpenWB.Sheets(1).Cells(Zeile, 1).Select

'Daten schreiben
ActiveCell.Offset(0, 0) =
ThisWorkbook.Worksheets(1).Cells(Target.Row, 1).Value
ActiveCell.Offset(0, 1) =
ThisWorkbook.Worksheets(1).Cells(Target.Row, 2).Value

…aber ich denke, dass Du hier noch verbessern kannst.

Wie weit geht denn der Bereich in ‚Target.Row‘?
Wenn Du dies konkret spezifizieren kannst, dann kannst Du die ganze Zuweisung mit einem einzigen Befehl vornehmen, statt alle Zellen abzuklappern.

'Datei schließen
OpenWB.Close True

Danke für die schnelle Antwort!

Aber immer gerne doch :smile:


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Ok hier ist nun die ganze Sub … es geht dabei um eine Liste in der ausgeborgte Heilbehelfe (Rollstühle, Gehhilfen, etc) stehen, und wenn man auf eine Zelle(J) in einer Zeile klickt - kopiert er die Zeile in eine andere Datei und löscht sie aus der aktiven.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Target.Column = 10 Then

Dim wert As String
On Error GoTo errorline

wert = InputBox(„Geben Sie bitte das Datum der Retoure ein:“, „Datumseingabe“, Date)

If StrPtr(wert) = 0 Then
GoTo errorline
Else
’ Datei öffnen
Set OpenWB = Workbooks.Open(ThisWorkbook.Path & „\retourniert.xls“)

'Letzte Zeile in retour.xls suchen
Dim Zeile As Long
Zeile = Worksheets(1).Range(„A65536“).End(xlUp).Row + 1

OpenWB.Sheets(1).Cells(Zeile, 1).Select

'Daten schreiben
ActiveCell.Offset(0, 0) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 1).Value
ActiveCell.Offset(0, 1) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 2).Value
ActiveCell.Offset(0, 2) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 4).Value
ActiveCell.Offset(0, 3) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 5).Value
ActiveCell.Offset(0, 4) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 6).Value
ActiveCell.Offset(0, 5) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 7).Value
ActiveCell.Offset(0, 6) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 8).Value
ActiveCell.Offset(0, 8) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 9).Value
ActiveCell.Offset(0, 7) = wert

'Datei schließen
OpenWB.Close True

'Zeile löschen
Worksheets(1).Rows(Target.Row).EntireRow.Delete

Exit Sub
errorline: Worksheets(1).Cells(Target.Row, Target.Column).Value = „Fehler“
End If
End If
End Sub

Vorhin dachte ich mir, es kommt leicht spammig daher wenn ich jetzt alles reinkopier - aber ich hoff meine absichten sind nun klar :wink:

thx & mfg

Hallo Wotan,

Ne ich hab nur gelesen, dass man ohne die Datei zu öffnen
daraus lesen kann

nein. Sicher, mit einem alten EXCel4-Befehl kann man einen Zellwert aus einer Datei lesen ohne diese mit „Open“ zu öffnen, aber innerbetrieblich wird logischerweise die Datei dann doch geöffnet.

  • jetzt dachte ich mir, vl gehts auch mit
    schreiben.

Nein.

Wie mach ich eine Datei im Hintergrund auf? Im Moment mach ich
das so, dabei geschieht aber alles im Vordergrund …

Meinst du
Application.Screenupdating=False?

Ansonsten könntest du mit CreateObject eine neue Excel-Instanz starten und die ist dann automatisch Visible=false *glaub*
Abfangen mußt du dann Hinweise zur personl.xls u.ä.

Gruß
Reinhard

Hallo Reinhard!

Meinst du
Application.Screenupdating=False?

Fette Sache ^^ jetzt springen nicht mehr so viele Fenster auf und zu - und flotter gehts auch ein bisschen :wink:

Vielen Dank!

Und auch Vielen Dank an Thomas Ramel - wie ich das ganze in einen einzigen Befehl krieg, würde mich aber immer noch interessieren :smile:

mfg

Grüezi Wotan

Ok hier ist nun die ganze Sub … es geht dabei um eine Liste
in der ausgeborgte Heilbehelfe (Rollstühle, Gehhilfen, etc)
stehen, und wenn man auf eine Zelle(J) in einer Zeile klickt -
kopiert er die Zeile in eine andere Datei und löscht sie aus
der aktiven.

Vorhin dachte ich mir, es kommt leicht spammig daher wenn ich
jetzt alles reinkopier - aber ich hoff meine absichten sind
nun klar :wink:

Ja, ich denke schon - versuche es als mittleren Block mal wie folgt, wobei das bei dieser einen Aktion kaum einen nennenswerten Vorteil bringen wird:

'Letzte Zeile in retour.xls suchen
Dim rngNextRow As Range
 Set rngNextRow = Worksheets(1).Range("A65536").End(xlUp).Offset(1, 0)

'Daten schreiben
 With rngNextRow
 .Resize(1, 2).Value = ThisWorkbook.Worksheets(1).Cells(Target.Row, 1).Resize(1, 2).Value
 .Offset(0, 2).Resize(1, 5).Value = ThisWorkbook.Worksheets(1).Cells(Target.Row, 4).Resize(1, 5).Value
 .Offset(0, 7).Value = wert
 .Offset(0, 7).Value = ThisWorkbook.Worksheets(1).Cells(Target.Row, 9).Value
 End With


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüezi Wotan

Und auch Vielen Dank an Thomas Ramel - wie ich das ganze in
einen einzigen Befehl krieg, würde mich aber immer noch
interessieren :smile:

Sieh dir meinen anderen Beitrag an - leider liegen deine Zellen nicht allesamt beisammen sondern Du hast ungleiche Bereiche in den beiden Mappen drin, das macht es nicht gerade einfacher.

Wenn Du das Ganze umstrukturieren könntest, sodass die Spalten 1-8 in der einen Mappe gleich denen der anderen Mappe sind, geht in der Tat ein Einzeiler fürs kopieren.


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüezi Thomas,

.Offset(0, 7).Value = wert

scheint mir sehr kurzlebig zu sein :smile:

Gruß
Reinhard

Grüezi Reinhard

.Offset(0, 7).Value = wert

scheint mir sehr kurzlebig zu sein :smile:

Das scheint nur so… :wink:

Die Variable ‚wert‘ wird im bereits bestehenden Code weiter oben über eine Inputbox abgefragt.


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Was willst du mir damit sagen? ^^

mfg

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Jup, macht performancemäßig nicht wirklich einen Unterschied!

Aber ich betrachte meine Probleme bezüglich dieses VBA Codes als gelöst :smile:

Danke an alle!

.Offset(0, 7).Value = wert

scheint mir sehr kurzlebig zu sein :smile:

Das scheint nur so… :wink:

Die Variable ‚wert‘ wird im bereits bestehenden Code weiter
oben über eine Inputbox abgefragt.

Grüezi Thomas,

du irritierst mich grade sehr. Wenn du in .Offset(0, 7) etwas hineinschreibst und eine Codezeile darunter etwas anderes in di Zelle schreibst so ist doch der erste Eintrag kurzlebig *verblüfft schau*

Da spielen doch irgendwelche Inputboxen keine Rolle *find*

Gruß
Reinhard

Grüezi Reinhard

.Offset(0, 7).Value = wert

scheint mir sehr kurzlebig zu sein :smile:

Das scheint nur so… :wink:

Die Variable ‚wert‘ wird im bereits bestehenden Code weiter
oben über eine Inputbox abgefragt.

Grüezi Thomas,

du irritierst mich grade sehr. Wenn du in .Offset(0, 7) etwas
hineinschreibst und eine Codezeile darunter etwas anderes in
di Zelle schreibst so ist doch der erste Eintrag kurzlebig
*verblüfft schau*

Da spielen doch irgendwelche Inputboxen keine Rolle *find*

Ja, da findest Du richtig )und bei etwas höherem Detailgrad deines Kommentares wäre das auch ohne Nachfragen klar gewesen)

Die nachfolgende Zeile muss natürlich noch angepasst werden:

 .Offset(0, 7).Value = wert
 .Offset(0, 8).Value = ThisWorkbook.Worksheets(1).Cells(Target.Row, 9).Value

Da ich aber nicht den kopletten Datenaufbau nachgestellt habe (dazu fehlten noch ein paar Infos) habe/konnte ich das Ganze auch nicht ‚live‘ testen.


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Wie im Beitrag „Re^4:“ von mir ersichtlich stand da schon immer

ActiveCell.Offset(0, 8) = ThisWorkbook.Worksheets(1).Cells(Target.Row, 9).Value
ActiveCell.Offset(0, 7) = wert

funktioniert also alles einwandfrei :wink: Thomas hatte sich anscheinend nur vertippt ^^

mfg

Wie im Beitrag „Re^4:“

ich meine den vom 3.6.2009 11:23 Uhr - sry, war wohl schneller mit klicken als mit denken xd