Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Bitte kurz drüber schauen: copy, paste letzte Zeile
Gehe zu Seite 1, 2  Weiter
zurück: Userform Textbox als Datum übergeben weiter: Erweiterung CountIf Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Antwort Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Kentucky288
Im Profil kannst Du frei den Rang ändern


Verfasst am:
02. Apr 2014, 13:08
Rufname:

Bitte kurz drüber schauen: copy, paste letzte Zeile - Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo,

ich möchte von Tabellenblatt 2 (bei mir "2") bestimmte Felder kopieren und dann in Tabellenblatt 1 ("1") in der letzten freien Zeile (plus einer zusätzlichen Leerzeile) einfügen. Ich habe in einem alten Beitrag folgenden Code gefunden:

----
Private Sub CheckBox1_Click()

Dim Quelle, Ziel As Worksheet
Dim Variable1 As Long, Variable2 As Long

Set Quelle = ThisWorkbook.Worksheets("2")
Set Ziel = ThisWorkbook.Worksheets("1")

Variable1 = Quelle.Cells(Rows.Count, 1).End(xlUp).Row 'letzte gefüllte in "A" von Quelle
Variable2 = Ziel.Cells(Rows.Count, 1).End(xlUp).Row 'letzte gefüllte in "A" von Ziel
If Variable1 > 2 Then
Quelle.Range("A1:B1" & Variable1).Copy Ziel.Range("A" & Variable2 + 1)
End If

End Sub
----

Ich habe Tabellenblattnamen und Variablennamen nach meinen Bedürfnissen geändert, aber der Code an sich ist der gleiche.
Dieser Code kopiert aber nicht bestimmte Zellen, sondern alle beschrieben.

Also meine Kopiervorlage sieht vom Schema her so aus:
A 1
2
3
4

B1
2
3
4

C...

Ich möchte halt nur die einzelnen Blöcke makieren (im Endeffekt gibt es pro Block eine CheckBox).

Ich habe schon versucht die Zeile "Variable1=Quelle...." so zu schreiben:
"Variable1 = Quelle.Range(A1:B4)" (weil ich ja nur die Felder A1 bis B4 haben will), aber da zeigt sich halt gleich meine große Unkenntnis in VBA, sprich es geht nicht.

Wäre toll wenn mir da jmd. weiterhelfen könnte.

Achso, noch was: eigentlich versteh ich schon was jeder einzelne Befehl so macht, bis auf dieses "If Variable1 > 2". Also eine If-Bedingung ist mir schon klar, aber wie kann die Variable1 größer 2 sein? Der wird doch kein Zahlenwert zugeordnet.

Wie gesagt, freue mich über jede Hilfe und jeden Erklärungsversuch.
Danke im vorraus und beste Grüße,

Kentucky
Heinz Schweigert
.


Verfasst am:
02. Apr 2014, 18:17
Rufname: Heinz


AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Kentucky

Code:
Variable1 = Quelle.Cells(Rows.Count, 1).End(xlUp).Row

ermittelt die Letzte beschriebene Zelle der Spalte A. Zurückgegeben wird eine Ganzzahl die in der Variablen "Variable1" gespeichert wird.

Die Abfrage ob nun Variable1 > 2 ist macht schon Sinn, da der Ersteller des Codes nur Eintragungen übernehmen will, wenn auch Daten ab Zeile 3 stehen (vermutlich stehen in den ersten 2 Zeilen Überschriften.)

Damit werden dann aber auch die Überschriften kopiert:
Code:
Quelle.Range("A1:B1" & Variable1).Copy Ziel.Range("A" & Variable2 + 1)

Aber: Ist Unsinn, denn würde beim Wert von Variable1 = 3 den Bereich
Quelle.Range("A1:B13") kopieren, was vermutlich nicht beabsichtigt ist. Die Zusammensetzung ist gewöhnlich:
Code:
Quelle.Range("A1:B" & Variable1).Copy

Bei der Zielrange hast dus richtig gemacht, ausser dass keine Leerzeile zwischen dem letzten Eintrag und dem neu kopierten eingehalten wird.

Hoff dir hilft das weiter

Grüße Heinz
Kentucky288
Im Profil kannst Du frei den Rang ändern


Verfasst am:
03. Apr 2014, 14:53
Rufname:

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Heinz,

ich bin dir ewig dankbar!!!!!
Durch deine Erklärung hab ichs verstanden und konnte den Code so umschreiben und kürzen wie ich Ihne jetzt brauche.

Der Unsinn der dir da aufgefallen ist ("A1:B3") war von mir, im Originalcode hieß es tatsächlich ("A1:B").


Ich würde mich sehr freuen wenn du mir beim nächsten Problem auch noch mal helfen könntest.


Zunächst mal der jetzt funktionierende Code (ist deutlich schlanker geworden Smile)

Code:

Private Sub CheckBox1_Click()

Dim Variable As Long

If CheckBox1.Value = True Then
    Variable = Worksheets("1").Cells(Rows.Count, 2).End(xlUp).Row           'letzte gefüllte in "A" von Ziel
    Worksheets("2").Range("A1:B5").Copy Worksheets("1").Range("A" & Variable + 2)
  Else
    Worksheets("1").Range("A3:B6").Delete 
       
End If
   
End Sub


Das ganze gibt es fünf mal. Also für die Checkboxen 1 bis 5

Wenn ich den Haken in der CheckBox1 setze fügt es den Range A1:B5 hinzu und wenn ich den Haken entferne löscht es den Range (A3:B6 weil es oben noch 2 Leerzeilen einfügt).
Wenn ich die 5 Checkboxen der Reihe nach anklicke und dann einen Haken wieder entferne passt auch noch alles, aber wenn ich die Haken durcheinander setze (z.B. 5,3,4,1) und dann den Haken entferne stimmt natürlich der Zellbereich nicht mehr mit dem eingefügten Inhalt über ein.


Ich habe heute erfolglos versucht, Excel zu sagen:
wenn Haken (z.B.) 3 entfernt,
dann vergleiche auf Worksheet "1" den UsedRange mit dem Range A11:B15 (das ist der Range wo die 3. Einfügegruppe steht) auf Worksheet "2"
und dann lösche den Range (also auf "1")

Mit Range vergleichen meine ich, dass er den Text der in den Ranges steht mit einander vergleicht.

Hoffentlich ist verständlich was ich meine und hoffentlich hast du mir nochmal so einen entscheidenden Tipp wie gestern.

Evtl. ist auch meine Denkweise komplett falsch, so dass ich das Problem mit einer anderen Taktik angehen muss.


Code:
    For i = 1 To Sheets("1").UsedRange.Rows.Count
        'For i2 = 1 To Sheets("2").UsedRange.Rows.Count <-- alter original Code
        For i2 = 1 To Sheets("2").Range("A1:B4")
            If Sheets("1").Range("A" & i) = Sheets("2").Range("A" & i2) Then
                Sheets("1").Range("A" & i2).Delete
            End If
        Next i2
    Next i


(Das ist der Code für Checkbox1)

Also eigentlich wieder wie gestern. Ich hab einen Code gefunden der eigentlich ganz gut passt und scheitere jetzt mal wieder an der Anpassung.
Diesen neuen Code hab ich oben in die Zeile: "Worksheets("1").Range("A3:B6").Delete" eingefügt.

Ich versteh schon wieder nicht so wirklich warum meine Idee nicht fruchtet.

Wäre toll wenn du mir noch mal so toll helfen könntest.

Nochmals vielen Dank für deine Hilfe.

Gruß Kentucky
Heinz Schweigert
.


Verfasst am:
03. Apr 2014, 18:39
Rufname: Heinz

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Kentucky

Ich würd mich da nicht groß mit Suchen und vergleichen abmühen. Schaffe 5 öffentliche Variablen, für jede Checkbox eine. In die schreibst du beim Setzen des Hakens, die Zeile in der die Kopie eingefügt wird.
Wird der Haken weggenommen, verwendest du den Inhalt der Variable um auf den entsprechenden Bereich zuzugreifen, und ihn zu löschen. In der Form funktioniert das natürlich nur, wenn die Bereiche immer gleich groß sind die kopiert sind, und auch keine Leerzeile am Ende jedes Blocks vorkommt. Hier mal ein Beispiel mit 2 Checkboxen:
Code:
Option Explicit

Private lngChB1 As Long
Private lngChB2 As Long

Private Sub CheckBox1_Click()
If CheckBox1 Then
    lngChB1 = Worksheets("1").Cells(Rows.Count, 2).End(xlUp).Row + 2
    Worksheets("2").Range("A1:B5").Copy Worksheets("1").Range("A" & lngChB1)
Else
    Worksheets("1").Range("A" & lngChB1).Resize(5, 2).Delete
End If
     
End Sub

Private Sub CheckBox2_Click()
If CheckBox2 Then
    lngChB2 = Worksheets("1").Cells(Rows.Count, 2).End(xlUp).Row + 2
    Worksheets("2").Range("A6:B10").Copy Worksheets("1").Range("A" & lngChB2)
Else
    Worksheets("1").Range("A" & lngChB2).Resize(5, 2).Delete
End If
     
End Sub


Dies halt entsprechend fortführen.

Grüße Heinz
Gast



Verfasst am:
07. Apr 2014, 15:30
Rufname:


AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Heinz,

vielen Dank für deine Antwort! Deine Taktik ist wirklich einfacher. Da hab ich zu kompliziert gedacht.

Kannst du mir diesen Resize-Befehl erklären? Wozu brauch ich den? Ich hab schon gesehen wenn man den wegglässt kommt Käse raus und ich hab auch die Hilfe durchgelesen, aber ich verstehs nicht (zumal da der Befehl anderst aufgebaut ist: objListObj.Resize Range("A1:B10"))

Das Ganze hat leider noch eine Schwachstelle. Wenn man zuerst aus CB1 den Haken entfernt verschwindet der 1. Block und der 2. rückt auf. Entfernt man dann den 2. Haken, bleibt der 2. Block vorhanden.
Was ja logisch ist, da die zugewiesenen Zellen nach dem aufrutschen nicht mehr mit den aktuellen über einstimmen.

Ich experimentier grad ein bisschen mit rum:

Code:
Private lngChB1, lngChB2, lngChB3, lngChB4, lngChB5 As Long
Dim i, j, k, l, m, n As Byte


Private Sub CheckBox1_Click()

If CheckBox1.Value = True Then
    lngChB1 = Worksheets("1").Cells(Rows.Count, 2).End(xlUp).Row + 2
    Worksheets("2").Range("A1:B5").Copy Worksheets("1").Range("A" & lngChB1)
    j = 0
Else
    CheckBox1.Value = False
    Worksheets("1").Range("A" & lngChB1 - j).Resize(5, 2).Delete
    i = 6
    j = j + i
End If
     
End Sub


Private Sub CheckBox2_Click()

If CheckBox2.Value = True Then
    lngChB2 = Worksheets("1").Cells(Rows.Count, 2).End(xlUp).Row + 2
    Worksheets("2").Range("A6:B10").Copy Worksheets("1").Range("A" & lngChB2)
    j = 0
Else
    CheckBox2.Value = False
    Worksheets("1").Range("A" & lngChB2 - j).Resize(5, 2).Delete
    k = 6
    j = k + i
End If
     
End Sub


Das degt schon ein bisschen mehr ab aber es gibt immer noch Reihenfolgen die zum Fehler führen.

Irgendwie muss es da doch eine Funktion geben die das hinzufügen und entfernen in unterschiedlicher Reihenfolge berechnen kann.

Ich werde noch mal einen Tag rein investieren und falls du deinen "Rettungs-Hattrick" perfekt machen willst, würd ich mich riesig freuen.
Falls es dafür keine Lösung gibt werde ich einfach einen "Clear-Sheet" Button machen.
Diese Haken-entfernen-Geschichte müsste man eingentlich nicht zum Exzess treiben, da es eigentlich nur den "Hups, verklickt"-Fall abdecken soll (und wie gesagt ein Reset-Button tuts im Notfall auch)


Auf jeden Fall mal wieder vielen vielen Dank, dass du mir noch mal weiter geholfen hast.

Beste Grüße

Kentucky
Heinz Schweigert
.


Verfasst am:
07. Apr 2014, 17:19
Rufname: Heinz

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Kentucky

Hm, da hast du recht mit deinem Einwand, dass sich die Zeilen ja verschieben. Zudem fällt mir grad ein, dass die Inhalte der Variablen spätestens beim Schließen der Datei verloren gehen.
Wo hast du eigentlich deine Checkboxen? Direkt im Tabellenblatt oder auf ner UserForm?

Resize ist eigentlich ganz einfach:
Du nimmst die erste Zelle also z.B. Range("A5") und vergrößerst den Bereich mit
.Resize("Anzahl Zeilen", "Anzahl Spalten").

Grüße Heinz
Kentucky288
Im Profil kannst Du frei den Rang ändern


Verfasst am:
08. Apr 2014, 16:19
Rufname:

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Heinz,

die CheckBoxen sind in einer UserForm.

Ich glaube ich habe eine sehr viel versprechende Lösung gefunden. Nämlich die UCase Function. Also ich will das nach dem Text gesucht wird und der Bereich dann entfernt wird.
Zuerst hatte ich die Like Funktion entdeckt, aber so wie ich das herausgefunden habe, kann die nur mit einzelnen Buchstaben oder Buchstabenbereichen ([A-Z]) arbeiten und nicht gezielt mit Worten. Als Gruppentitel hab ich natürlich nicht nur A und B sonder ganze Worte. Jetzt fürs Bsp. hab ich mal "Wort" (=A), "Begriff"(=B), "Text"(=C) eingesetzt.

Außerdem hab ich den Codeteil zum finden und entfernen erstmal in eine extra UserForm mit einem CommandButton reingeschrieben. So tu ich mir etwas leichter beim ausprobieren.


Code:

Private Sub CommandButton1_Click()


Dim wks1 As Worksheet, wks2 As Worksheet
Dim lastrow1, lastrow2, lastcell, i As Long

Set wks1 = ActiveWorkbook.Sheets("1")

lastrow1 = wks1.Cells(wks1.Rows.Count, 1).End(xlUp).Row


For i = lastrow1 To 100 Step -1
    If UCase(wks1.Cells(i, 1).Text) = "*Wort*" Then
                wks1.Range("i:1).Resize(5,2).Delete
    End If
Next i


End Sub



Also ich find ja meine Idee genial, aber das Programm halt nicht.
Wieso geht das nicht??? Ich habe es auch mit verschiedenen Foren-Themen verglichen und das Prinzip müsste so stimmen.
Ich bekomm noch nicht mal einen Fehler angezeigt, es passiert halt einfach nichts.

Könntest du mir noch zwei Dinge erklären?
1.
Code:
lastrow1 = wks1.Cells(wks1.Rows.Count, 1).End(xlUp).Row

Kann es sein das dieses End(xlUp) bei der ersten Leerzeile schon sagt hier ist der letzte Eintrag oder zählt es wirklich bis zum letzten Eintrag?

2. Ich hab in einigen Forenbeiträgen das hier gesehen "<>", was bedeutet das?



Wieder einmal würde ich mich auf eine deiner sehr hilfreichen (und motivierenden) Antworten sehr freuen.


Beste Grüße
Kentucky
Heinz Schweigert
.


Verfasst am:
08. Apr 2014, 19:06
Rufname: Heinz

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Kentucky

Also bisher gings eigentlich darum, Kopiere auf Anforderung/Lösche das Kopierte. Jetzt scheint es mir in eine andere Richtung zu gehen, oder weshalb willst du mit Like oder UCase arbeiten?

Platzhalter in einem normalen Vergleich wie du ihn darstellst, sind nicht möglich (oder sind die Sterne Bestandteil des Suchbegriffs?). Platzhalter kannst du verwenden, wenn du statt "=" "Like" verwendest.
Wo hast du denn das Beispiel verglichen? Kann ich mir nicht vorstellen, dass man das so findet.
"Wort" soll vermutlich jetzt eine Variable sein, um sie mit Platzhaltern zu verbinden mußt du das dann auch entsprechend verbinden:
Code:
    If UCase(wks1.Cells(i, 1).Text) Like "*" & Wort & "*" Then

...in deinem Beispiel wird explicit nach "*Wort*" gesucht. (Dies kann obendrein niemals gutgehen, wenn der Vergleichstext mit UCase in Großbuchstaben vorliegt!)

Grüße Heinz
Kentucky288
Im Profil kannst Du frei den Rang ändern


Verfasst am:
09. Apr 2014, 11:56
Rufname:

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Heinz,

also es geht hier um eine Gefährdungscheckliste (gemäß EU-Richtlinie 2006/42/EG) diese umfasst ca. 10 Gefährdungsgruppen (u.a. mechanische Gefährdungen, elektrische Gefährdungen, thermische Gef., Gef. durch Strahlung, usw.). Diese Gruppen enthalten wieder verschiedene Punkte. Z.B. in der Gruppe meachansiche Gefährdungen: quetschen, scheren, stoßen, Verlust der Standfestigkeit, usw.

Wenn man jetzt die Gefährdungsliste für ein Produkt anwenden will, fliegen bestimmte Gruppen von vornherein gleich mal raus. Gefährdung durch Strahlung kommt z.B. nie vor, aber thermische Gefährdung wird bei einem Produkt benötigt beim andern nicht.

Ich will/soll dafür sorgen, dass Leute die sich nicht mit den ganzen EU-Richtlinien und Normen auskennen, trotzdem eine (sogenannte) Risikobeurteilung durchführen können.

Vom Prinzip her wird alles komplett hintelegt (also auf einem hinteren Tabellenblatt) und die Anwender erstellen sich per Mausklick (auf die einzelnen Gruppen/CheckBoxen in einer UserForm) ihre individuell angepasste Checkliste.

Problem: man muss das Programm "idiotensicher" machen, d.h. ich muss davon ausgehen das die Anwender sich (mehrmals) verklicken und dann wäre es schlecht wenn sich das Programm aufhängt.

Ist jetzt leider sehr viel Text geworden, aber jetzt hab ich das Problem vollständig dargelegt.


Ich kenne zwar das Ziel, aber nicht den Weg. D.h. du hast vollkommen recht das es jetzt in eine etwas andere Richtung geht, aber wie gesagt das Ziel ist das gleiche (die Guppe die mit dem setzen einer CheckBox einfügt wurde (in der letzten Zeile) durch rücksetzen der selben CB wieder zu entfernen (egal wo die Gruppe jetzt steht --> Aufrück-Problem))



Auf die UCase-Funktion bin ich in diesem Thread gestoßen:http://www.office-loesung.de/ftopic414189_0_0_asc.php
und dann hab ich diese Funktion in noch zwei anderen Beiträgen (andere Foren) in ähnlicher Konfiguration gefunden.

Heute hab ich gesehen, dass die VBA Hilfe die UCase Funktion tatsächlich anderst beschreibt als sie laut den Beiträgen funktionieren soll Sad

Das mit * war so gedacht: es heißt ja (u.a.) "thermische Gefährdungen" und ich wollte nur nach "thermische" suchen lassen. (Und dann mit Resize von der gefundenen Zelle aus den Auswahlbereich vergrößern, weil ja die Gruppengröße fix und bekannt ist)


Eigentlich kann es doch nicht so kompliziert sein, dem Computer zu sagen: Suche nach Zelle mit dem Inhalt "Thermische", mache Bereich um gefundene Zelle und entferne den Bereich.

Kannst du mir in dieser Richtung wieder weiter helfen?



Beste Grüße

Kentucky
Kentucky288
Im Profil kannst Du frei den Rang ändern


Verfasst am:
09. Apr 2014, 16:32
Rufname:

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Heinz,

habs jetzt tatsächlich geschafft.
Mit folgendem Code findet er einen Begriff macht einen Bereich und entfernt diesen.
Geh jetzt sehr zufrieden in den Feierabend Smile


Code:

Private Sub CommandButton1_Click()

Dim Suchtext
Dim Bereich, Suche As Range
Dim i As Long

Suchtext = "Thermische"

Set Bereich = Range("A1:A1000")

Set Suche = Bereich.Find(What:=Suchtext)

If Suche Is Nothing Then
MsgBox "Zonk"

Else

Suche.Resize(5, 2).Delete

i = i + 1

End If

End Sub




Morgen werd ich das alles mal zusammenbauen.

Könntest du mir noch erklären was dieses Symbol bedeutet? <>



Nochmals vielen, vielen Dank für deine Hilfeleistung bis hierher!



Beste Grüße

Kentucky
Heinz Schweigert
.


Verfasst am:
09. Apr 2014, 18:39
Rufname: Heinz

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Kentucky

Kaum macht man sich die Arbeit und beschreibt die Situation ausführlicher schon findet man die Lösung Laughing

Kleiner Tipp: Wenn die Find-Methode sich auf Teileinträge beziehen soll, brauchst du den Parameter Lookat:=xlPart

<> ist ein Operator und bedeutet "ungleich"

In dem Link, wird UCase aber auch richtig verwendet:
    Keine * oder ? als Platzhalter
    der dortige Suchbegriff ist ein fixer Text, der nicht in einer Variablen steht, und wird somit in ""-Zeichen eingebunden. Der Vergleichstext "CLOSED" ist groß geschrieben.


Grüße Heinz
Kentucky288
Im Profil kannst Du frei den Rang ändern


Verfasst am:
10. Apr 2014, 15:44
Rufname:

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Heinz,

das Zusammenbauen hat gut geklappt. Eine Kleigkeit ist mir noch aufgefallen die ich aber selber lösen konnte. Vllt. kannst du mir sagen ob das so stimmt wie ich mir folgendes Problem erklärt habe?


Bei der If-Anweisung brauche ich ja eigentlich kein Else-Anweisung.

Code:

If Suche Is Nothing Then
MsgBox "Zonk"     'das hier
Else                     'und das hier brauch ich nicht da das entfernen des Hakens sozusagen eine selbst erfüllende Bedingung ist
Suche.Resize(5, 2).Delete
i = i + 1
End If





Aber wenn ich einfach

Code:

If Suche Then
Suche.Resize(5,2).Delete
i=i+1
End If


schreibe geht es nicht.

Liegt das daran, dass die If-Anweisung nur erkennt ob True oder False, aber meine Variable "Suche" entweder "spezieller Wert" oder "False" ist?
Ist deshalb die einzige Möglichkeit um ohne Else auszukommen mit
dieser (etwas umständlichen) doppelten Verneinung?
Entwickelt sich bei mir langsam so etwas wie ein VBA Verständnis???

Code:

If Not Suche Is Nothing Then
Suche.Resize(5, 2).Delete
i = i + 1
End If



Würde mich wie immer sehr über eine Antwort freuen.

Beste Grüße

Kentucky
Heinz Schweigert
.


Verfasst am:
10. Apr 2014, 17:24
Rufname: Heinz

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Kentucky

Gehen wir mal davon aus:
Code:
Dim Suche As Range


Deine Variable "Suche" ist ein Objekt. Das Objekt hat Eigenschaften wie .Row, .Column, .Value, usw.
Die Eigenschaft .Value kann wahr oder falsch sein. Objekte haben (zumeist?) eine Default-Eigenschaft, was bei Suche in der Tat .Value ist. Deshalb kann man in einer Abfrage
Code:
If Suche Then

auf die explizite Nennung der Eigenschaft verzichten, was eigentlich
Code:
If Suche.Value Then

wäre. (Ich will hiermit nur klarstellen, dass du so nur eine Eigenschaft eines Objekts abfrägst)

Denn :
Bevor eine Eigenschaft eines Objekts zur Verfügung steht, muss das Objekt "vorhanden" sein, was in deinem Code über
Code:
Set Suche = Bereich.Find(...)

geschieht. Wird der Suchbegriff nicht gefunden, ist das Objekt "Nothing" soviel wie "nicht vorhanden" und hat damit auch keine Eigenschaften. Ein Zugriff auf die Eigenschaft ist somit nicht möglich und erzeugt einen Fehler.

Deshalb kannst du bei einem Objekt nur verifizieren ob es " Is Nothing" ist oder eben "Not ... Is Nothing" ist. Hört sich umständlich an, aber ist der korrekte Weg.

Noch als Zusatz für Variablen-Deklaration, weils mir grad in deinem Code auffiel:
Variablen müssen immer einzeln deklariert werden. Es genügt nicht, in einer Zeile Variablen-Namen mit Komma zu trennen und am Ende z.B. "As Range" zu setzen wie bei dir:
Code:
Dim Bereich, Suche As Range

Dies hat zur Folge, dass nur Suche ein Range-Objekt ist, Bereich dagegen ist ein Variant weil der Zusatz "As ..." fehlt, und die Default-Einstellung Variant ist.

Richtig ist also:
Code:
Dim Bereich As Range, Suche As Range


Dass dein Code trotzdem funktioniert, liegt daran, dass über die Set-Anweisung, eine Variablen-Definition erfolgt, was den Variant-Bereich in ein Objekt umwandelt. Das macht VBA aus reiner Gutmütigkeit ohne Fehler, ist aber nicht sauber programmiert.

Zu guter letzt:
In VBA gibt es eine Grauzone, was die Entladung von Objekt-Variablen betrifft die mit einer Set-Anweisung erstellt werden. Soll heißen, es ist nicht genau bekannt, manchmal bleiben die Variablen über die Laufzeit hinaus erhalten, und belegen weiterhin den Speicher. Dies hat zur Folge, dass Excel deshalb immer langsamer werden kann. (Nicht bei einer einmaligen Verwendung in diesem Umfang, aber wenn sich das häuft, durchaus).
Aus diesem Grund sollte man diese Objekt-Variablen, wenn sie nicht mehr benötigt werden, explizit löschen, in deinem Fall mit:
Code:
Set Bereich = Nothing
Set Suche = Nothing

Damit gibst du den belegten Speicherplatz wieder frei.

Grüße Heinz
Kentucky288
Im Profil kannst Du frei den Rang ändern


Verfasst am:
14. Apr 2014, 14:32
Rufname:

AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Heinz,

super und vielen Dank für die Tipps. Das sind echt wertvolle Infos. So grundlegende Sachen werden meistens gar nicht mehr erwähnt, aber für mich sind das sehr wichtige Basics.

Ich hätte wieder mal ne Frage.

Code:

If CheckBox2.Value = True Then
    lngChB2 = Worksheets("Aktuell").Cells(Rows.Count, 2).End(xlUp).Row + 2
    Worksheets("DIN EN 14466").Range("A13:F17").Copy Worksheets("Aktuell").Range("A" & lngChB2)
Else
...

Mit diesem Code kopiert er einen fest vorgegebenen Bereich und fügt ihn in der letzten freien Zeile ein.

Jetzt würd ich gerne versuchen, dass er automatisch in dem zu kopierenden Bereich die letzte beschriebene Spalte findet, so dass ich nicht so ewig viel ändern muss wenn ich noch eine Spalte einfüge oder rausschmeiße.

Mein Versuch sieht so aus:
Code:

If CheckBox1.Value = True Then
    lngChB1 = Worksheets("Aktuell").Cells(Rows.Count, 2).End(xlUp).Row + 2
    lngSpalte1 = Worksheets("DIN EN 14466").Cells(2, Columns.Count).End(xlToLeft).Column
    Worksheets("DIN EN 14466").Range(Cells(4, 1), Cells(4, lngSpalte1)).Copy Worksheets("Aktuell").Range("A" & lngChB1)
Else
...

lngChB2 und lngSpalte1 sind als long definiert.

Beim Ausführen kommt "Anwendungs- oder Objekt definierter Fehler" und er markiert die Zeile vor dem Else. Ach und mit dem was die Excelhilfe hergibt müsste ich Range(.Cells....) schreiben, aber den Punkt kreidet er mir auch sofort an.


Siehst du warum er es nicht ausführt? Für mich sieht der Code logisch aus.


Wäre für deinen Rat wie immer äußerst dankbar.


Beste Grüße

Kentucky
Heinz Schweigert
.


Verfasst am:
14. Apr 2014, 18:35
Rufname: Heinz


AW: Bitte kurz drüber schauen: copy, paste letzte Zeile - AW: Bitte kurz drüber schauen: copy, paste letzte Zeile

Nach oben
       Version: Office 2003

Hallo Kentucky

Auch die "Cells" müssen auf das entsprechende Worksheet referenziert werden:
Code:
Worksheets("DIN EN 14466").Range(Worksheets("DIN EN 14466").Cells(4, 1), Worksheets("DIN EN 14466").Cells(4, lngSpalte1)).Copy Worksheets("Aktuell").Range("A" & lngChB1)

Ums übersichtlicher zu machen (und auch aus Perfomance-Gründen), verwendet man dann With-Blöcke, dabei bindet man dann mehrere Abfragen die sich auf das gleiche Objekt beziehen mit ein:
Code:
With Worksheets("DIN EN 14466")
     lngSpalte1 = .Cells(2, Columns.Count).End(xlToLeft).Column
     .Range(.Cells(4, 1), .Cells(4, lngSpalte1)).Copy Worksheets("Aktuell").Range("A" & lngChB1)
End With

Daher stammt der Punkt den du wohl in der Hilfe gesehen hast, ohne den With-Block zu beachten.

.Cells(4, lngSpalte1) muss wohl lauten:
.Cells(lngChB1, lngSpalte1)


Grüße Heinz
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Gehe zu Seite 1, 2  Weiter
Diese Seite Freunden empfehlen

Seite 1 von 2
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Excel Formeln: Formeln automatisch in neu eingefügte Zeile übertragen 3 Ferencz 1727 27. Feb 2006, 15:22
Klaus-Dieter Formeln automatisch in neu eingefügte Zeile übertragen
Keine neuen Beiträge Excel Formeln: Wenn Bedingung erfüllt Zeile markieren 2 Moredread 2880 16. Feb 2006, 14:28
Moredread Wenn Bedingung erfüllt Zeile markieren
Keine neuen Beiträge Excel Formeln: voneinander unabhängige Kontrollkästchen trotz Copy & Pa 2 Marshall Bravestar 1214 22. Dez 2005, 10:46
Marshall Bravestar voneinander unabhängige Kontrollkästchen trotz Copy & Pa
Keine neuen Beiträge Excel Formeln: in Zeile aus Spalten schreiben??? 6 robert_de 2318 25. Nov 2005, 12:10
robert_de in Zeile aus Spalten schreiben???
Keine neuen Beiträge Excel Formeln: Formel für letzte gefüllte Zeile in Spalte 1 börse 9538 16. Nov 2005, 09:24
fridgenep Formel für letzte gefüllte Zeile in Spalte
Keine neuen Beiträge Excel Formeln: Zahlen in einer Zeile auswerten nach den Größtwerten 11 Nicole-Fun 908 26. Okt 2005, 09:44
ransi Zahlen in einer Zeile auswerten nach den Größtwerten
Keine neuen Beiträge Excel Formeln: Wenn Bedingung Zeile kopieren 1 marco1 1634 28. Jul 2005, 14:04
Günni Wenn Bedingung Zeile kopieren
Keine neuen Beiträge Excel Formeln: automatisch eine zeile einfügen... 4 nichtswisser 2156 17. Mai 2005, 10:36
fl618 automatisch eine zeile einfügen...
Keine neuen Beiträge Excel Formeln: Wenn Bedingung ganze Zeile in endere Arbeitsmappe kopieren 2 Unregistered7 1556 05. Mai 2005, 22:32
Gast Wenn Bedingung ganze Zeile in endere Arbeitsmappe kopieren
Keine neuen Beiträge Excel Formeln: Formel für Zusammenzählen jeder zweiten Zelle einer Zeile 2 toto_225 814 11. März 2005, 12:04
toto_225 Formel für Zusammenzählen jeder zweiten Zelle einer Zeile
Keine neuen Beiträge Excel Formeln: Summe mit automat. Hochzählen der Zeile 7 Excellehrling_Tom 1544 09. März 2005, 15:40
Excellehrling_Tom Summe mit automat. Hochzählen der Zeile
Keine neuen Beiträge Excel Formeln: Zeile einfügen mit Formel oder Makro? 2 original-m 2246 21. Feb 2005, 08:09
original-m Zeile einfügen mit Formel oder Makro?
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: JavaScript