Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
680to684
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
680to684
680to684
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Script soll eingefügte Zeile finden

Script soll eingefügte Zeile finden
17.10.2005 21:56:45
Nicole
Hallo !
Ich hätte folgendes Problem:
Das nachfolgende Script überprüft die Spalten B bis G im Tabellenblatt Rechnung und sucht die nächste freie Zeile.
Wenn sich dort in den Spalten B bis G kein Eintrag befindet wird die jeweilige Zeile aus dem aktiven Tabellenblatt kopiert und im Rechnungsblatt
dort in die leere Zeile eingefügt.
Füge ich nun aber zwischen zwei mit Text gefüllten Zeilen eine neu leere Zeile ein, so erkennt das Script diese nicht als leere Zeile und fügt neuen Text
nur am Blattende ein.
Kann man das Script so abändern, dass auch eine leere eingefügte Zeile erkannt wird und dann dort der neue Text aus dem anderen Tabellenblatt eingefügt wird ??
Ich hoffe, dass ich mich verständlich ausdrücken konnte und mir jemand helfen kann !

Sub inTabelleeinfuegen()
Dim shTarget As Worksheet
Dim intRow As Integer
Set shTarget = Worksheets("Rechnung")
For I = 2 To 7
If shTarget.Cells(Rows.Count, I).End(xlUp).Row + 1 > intRow Then
intRow = shTarget.Cells(Rows.Count, I).End(xlUp).Row + 1
End If
Next I
Rows(ActiveCell.Row).Copy shTarget.Rows(intRow)
Application.CutCopyMode = False
Cancel = True
End Sub


Gruß Nicole

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Script soll eingefügte Zeile finden
17.10.2005 22:03:29
Ramses
Hallo
Probier mal
Option Explicit

Sub inTabelleeinfuegen()
    Dim shTarget As Worksheet
    Dim intRow As Integer, i As Integer
    Set shTarget = Worksheets("Tabelle2")
    For i = 2 To shTarget.Cells(Rows.Count, 1).End(xlUp).Row + 1
        If Len(Cells(i, 1) & Cells(i, 2) & Cells(i, 3)) = 0 Then
            intRow = i
            Exit For
        End If
    Next i
    Rows(ActiveCell.Row).Copy shTarget.Rows(intRow)
    Application.CutCopyMode = False
End Sub

Gruss Rainer
Anzeige
AW: Script soll eingefügte Zeile finden
17.10.2005 22:53:09
Nicole
Hallo Rainer
Vielen Dank für Deine Antwort
Nach meinem Test fügt Dein Script jetzt die jeweilige Zeile
immer in die gleiche Zeile ein.
Es wird also nicht mehr die nächste freie Zeile gesucht.
Dies soll aber auf jedenfall sein.
Die Prüfung ob sich in einer der Spalten von B bis H ein Eintrag
in dieser Zeile ist, ist für mich wichtig.
Gruß Nicole
AW: Script soll eingefügte Zeile finden
17.10.2005 23:02:22
Ramses
Hallo
Das ist aus deinem Script nicht ersichtlich gewesen dass von B bis H gesucht werden soll
Option Explicit

Sub inTabelleeinfuegen()
    Dim shTarget As Worksheet
    Dim intRow As Integer, i As Integer
    Dim startC As Integer
    startC = 2 'Spalte B
    Set shTarget = Worksheets("Tabelle2")
    For i = 2 To shTarget.Cells(Rows.Count, 1).End(xlUp).Row + 1
        If Application.WorksheetFunction.CountA(Range(Cells(i, startC), Cells(i, startC + 6))) = 0 Then
            intRow = i
            Exit For
        End If
    Next i
    Rows(ActiveCell.Row).Copy shTarget.Rows(intRow)
    Application.CutCopyMode = False
End Sub

Gruss Rainer
Anzeige
AW: Script soll eingefügte Zeile finden
17.10.2005 23:31:56
Nicole
Hallo Rainer
erstmal vielen Dank für Deine Mühe
Vielleicht ist mein Problem etwas schwierig zu beschreiben
aber ich versuche es noch einmal:
Zeilen, die z.B in Tabelle1 stehen sollen in Tabelle2 untereinander
eingetragen werden und zwar jeweils die Zeile in der gerade eine Zelle makiert
ist (also wo gerade der Cursor steht).
In Der Tabelle2 werden die Zeilen überprüft und nur wenn alle Zellen von B bis H
frei sind wird dort die Zeile aus Tabelle1eingefügt.
Dies klappt mit meinem Script schon sehr gut ich würde halt
gerne zwischendurch eine Leerzeile einfügen und diese soll
dann auch so erkannt werden und dort dann die makierte Zeile
aus Tabelle1 eingefügt werden.
Bei Deinem Script wird bei meinem Test immer in die gleiche
Zeile eingefügt.
Gruß Nicole
Anzeige
Genau das macht das Script....
18.10.2005 00:00:43
Ramses
Hallo
... hätte allerdings erwartet, dass du den kleinen Fehler selbst bemerkst
For i = 2 To shTarget.Cells(Rows.Count, startC).End(xlUp).Row + 1
Das Script begann in Spalte 1 die letzte freie Zelle zu suchen.

"....Bei Deinem Script wird bei meinem Test immer in die gleiche..."
Das ist nicht nachvollziehbar.
Gruss Rainer
AW: Genau das macht das Script....
18.10.2005 00:30:56
Nicole
Hallo Rainer
tut mir leid vielleicht stehe ich ja auf der Leitung,
aber bei mir macht das Script trotzdem nicht was ich möchte
es benutzt nicht die nächste freie Zeile zum einfügen,
sondern immer die gleiche.
Trotzdem DANKE
Kann mir das nicht erklären.
Gruß Nicole
Anzeige
anderer Vorschlag..
18.10.2005 10:12:56
RolfK
Hallo Nicole,
ändere Deine Script wie folgt ab:

Sub inTabelleeinfuegen()
Dim shTarget As Worksheet
Dim intRow As Integer, i As Integer
Set shTarget = Worksheets("Rechnung")
For i = 2 To 7
If shTarget.Cells(1, i).End(xlDown).Row + 1 > intRow Then
intRow = shTarget.Cells(1, i).End(xlDown).Row + 1
End If
Next i
Rows(ActiveCell.Row).Copy shTarget.Rows(intRow)
Application.CutCopyMode = False
Cancel = True
End Sub

In Deiner Überlegung gehst Du mit shTarget.Cells(Rows.Count, 1) auf die letzte Zelle (Zeile65556) der Spalte und dann mit .End(xlUp) nach oben bis zur ersten nicht leeren Zelle. Damit landest Du zwangsläufig immer untehalb des letzten Eintrages.
Mit shTarget.Cells(1, 1) und .End(xlDown) beginnt die Suche ober in der ersten Zeile und geht dann nach unten bis zur ersten leeren zelle. So findest Du dann auch eine nachträglich eingefügte leere Zeile.
mfg Rolf
Anzeige
AW: anderer Vorschlag..
18.10.2005 10:48:20
Nicole
Hallo Rolf
Danke, dass Du dich meinem Problem angenommen hast.
Habe Deinen Vorschlag ausprobiert und bekomme leider
für die Zeile:
intRow = shTarget.Cells(1, i).End(xlDown).Row + 1
eine Fehlermeldung: Laufzeitfehler6 "Überlauf"
vielleicht kannst Du mir da noch weiterhelfen.
Gruß Nicole
AW: anderer Vorschlag..
18.10.2005 13:41:42
RolfK
Hallo Nicole,
einzige Vermutung die ich dazu habe ist, dass es evtl. eine Spalte in dem zu überprüfenden Bereich geben kann, in der keine Einträge sind. Dann findet .End(xlDown) nur die Zeile 65536 und die ist natürlich in einer Integervariablen nicht mehr zu speichern.
Eine Alternative dazu wäre ggf. die folgende Procedur:

Sub inTabelleeinfuegen()
Dim shTarget As Worksheet
Dim intRow As Integer, i As Integer
Set shTarget = Worksheets("Rechnung")
intRow = shTarget.Range("A1").CurrentRegion.Rows.Count
Rows(ActiveCell.Row).Copy shTarget.Rows(intRow + 1)
Application.CutCopyMode = False
Cancel = True
End Sub

shTarget.Range("A1").CurrentRegion.Rows.Count ermittelt darin die Anzahl der größten zusammenhängenden Zeilen um einen Bereich, hier A1, herum. Aber Achtung, das funktioniert nur wenn die Spalte zumindest immer eine Überschrift hat und eine freie Spalte zu evtl. weiteren Einträgen hat (eine typische Listenform also).
Ansonsten müsstest Du die Variable als long dimensionieren und die Ergebnisse einzeln prüfen und beim Ergebnis 65536 diese nicht neu setzen.
mfg Rolf
Anzeige
Das ist völliger Quatsch...
18.10.2005 11:08:44
Ramses
Hallo
1. Ist es egal ob von Oben oder Unten gesucht wird. Du erhältst auf jeden Fall die LETZTE Freie Zelle in der Spalte
2. überprüfst du nur die Spalten auf freie Zellen und nicht die freien Zeilen !!!
Die Anforderung lautet "von B-H" dürfen KEINE Einträge vorhanden sein
3. Es wird überhaupt nicht geprüft ob eine freie Zeile dazwischen ist.
4.

For i = 2 To 7
If shTarget.Cells(1, i).End(xlDown).Row + 1 > intRow Then
intRow = shTarget.Cells(1, i).End(xlDown).Row + 1
End If
Next i

Warum musst du sieben mal prüfen und dann "intRow" jeweils einen anderen Wert zuweisen ?
So erhältst du unter Umständen 7 unterschiedliche "intRow" Werte. Aber welche ist nun der richtige, und es ist nicht sichergestellt, dass "B-H" in der GLEICHEN Zeile frei sind ?
Gruss Rainer
Anzeige
coooool ......
18.10.2005 13:50:04
RolfK
Hallo Rainer,
eine solche Reaktion kenne ich ja garnicht Dir.
Selbstverständlich hast Du Recht, dass es im Prinzip egal ist, ob ich die erste freie Zelle von oben oder von unten suche. Aber nach dem Schilderungen von Nicole
- kann es sein dass die einzelnen Spalten unterschiedlich lange Einträge haben und daher einzeln durchsucht werden sollen (oder mein Vorschlag evtl. mit CurrentRegion zu arbeiten)
- und kann eine neue Zeile innerhalb bereits bestehender Einträge eingefügt werden, dann nutzt logischerweise die Suche von unten nichts
daher mein alternativer Vorschlag.
mfg Rolf
Anzeige
AW: coooool ......
18.10.2005 15:02:38
Ramses
Hallo
Tut mir leid, aber die Antwort und deine Lösung treffen das problem nun mal nicht.
Ich habe meinen Code einige Male geprüft und er macht genau das was Nicole fordert.
Es wäre besser wenn Sie die Beispielmappe mal hochlädt.
"...kann es sein dass die einzelnen Spalten unterschiedlich lange Einträge haben ..."
Das ist nicht gefordert. Die forderung lautet eindeutig:
"...In Der Tabelle2 werden die Zeilen überprüft und nur wenn alle Zellen von B bis H frei sind wird dort die Zeile aus Tabelle1 eingefügt..."
Das macht weder dein Code, noch der ursprüngliche Code von Nicole.
CurrentRegion bringt in diesem Fall nichts, allfalls
For i = 2 to ActiveSheet.UsedRange.Rows.Count
um die maximale Anzahl der Zeilen festzulegen, wenn die Einträge nicht durchgehend sind.
Mein Code geht die spalte B von Zeile 2 bis zum letzten Eintrag durch und prüft dann mit CountIf ob von B-H Einträge vorhanden sind, wenn nicht wird die nächtste Zeile geprüft.
Ist die Anzahl der Einträge von B-H = 0 dann wird die Zeile eingefügt.
Das funktioniert 100%.
Gruss Rainer
Anzeige
Test....
18.10.2005 17:08:29
RolfK
Hallo Rainer,
leider läuft Deine Alternative in meinem Beispiel

Die Datei https://www.herber.de/bbs/user/27604.xls wurde aus Datenschutzgründen gelöscht

nicht. Ich vermute, das liegt an
Application.WorksheetFunction.CountA(Range(Cells(i, startC), Cells(i, startC + 6)))
die greift so nicht auf das Worksheet shTarget zu, fügt man dies an, brettert man jedoch auf einen Fehler. Hab ich nicht weiter untersucht!
Schau Dir doch mal die Lösung mit CurrentRegion an. Das funktioniert so ganz o.k. Denn mit UsedRange werden möglichweise auch Datenbereiche eingeschlossen, die nicht zur Liste (zusammenhängende Zellen) gehören.
Ich denke wir sollten hier die Diskussion beenden.
mfg Rolf
AW: Hier eine Beispieldatei
18.10.2005 17:29:47
Nicole
Hallo Jungs
ihr seit ja wirklich fleißig :-)
hier eine kleine Beispieldatei für Euch:
https://www.herber.de/bbs/user/27605.xls
vielleicht hilft es fürs Verständnis.
Ich arbeite übrigens schon eine Weile in meiner Rechnungsvorlage
mit dem Script und es läuft gut leider ignoriert es wie gesagt
eingefügte leere Zeilen
Gruß Nicole
Geht doch....
18.10.2005 20:23:35
Ramses
Hallo
unter dem gegebenen Beispiel (andere aktive Tabelle) musste bloss die Anweisung
With ShTarget
End With
eingefügt werden, und dann macht das Makro genau das was es soll und was ich immer gesagt habe..
Um alle eventualitäten abzufangen wurde "UsedRange" verwendet.
https://www.herber.de/bbs/user/27610.xls
Gruss Rainer
AW: Danke für die Mühe ! KLAPPT :-))
18.10.2005 22:32:26
Nicole
Hallo Rainer und Rolf
Gut dass Ihr so geduldig mit Anfängern seit
Klappt gut.
Habt mir sehr geholfen.
Gruß Nicole
Na, wer sagt es denn...
19.10.2005 09:50:12
rolfK
Hallo Nicole und Rainer,
bekanntlich führen immer mehrere Wege nach Rom, selten gibt es dabei den einzig Richtigen.
mfg Rolf

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige