Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1908to1912
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
Inhaltsverzeichnis

Makro - Vergleich vor und nach ausführen

Makro - Vergleich vor und nach ausführen
16.12.2022 12:54:18
Christian
Hallo,
ich bitte um euren Rat, ob und wie so etwas möglich ist. Ich habe ein bestehendes und funktionierendes Makro, welches Dateinamen aus zwei Verzeichnissen auflistet.
außerdem die Formel
=ZÄHLENWENN(Dateien!A:A;"*"&B2&"*")+ZÄHLENWENN(Dateien!C:C;"*"&B2&"*")
im Blatt Punkte, Bereich H2:H4000, welche zählt, wie häufig der Suchbegriff in Spalte B in den Dateinamen vorkommt.
Jetzt zu meiner Frage, ist es möglich, dass sich das Makro merkt, welche Suchbegriffe vor dem Ausführen noch nicht gefunden wurden, jedoch nach dem Ausführen gefunden werden und in den betroffenen Zeilen in Spalte D das Datum des letzten Dienstags einträgt (aktuelles Datum wenn das Makro an einem Dienstag ausgeführt wird).
Habe noch versucht eine Beispieldatei zu basteln, weiß aber nicht wirklich wie viel sie hilft, da euer Dateisystem und die Dateien, die in den Ordnern gespeichert sind, sicherlich ander ist als bei mir.
Lasst euch nicht drch die auskommentierten Zeilen im Makro verwirren, die muss ich noch anpassen.
Gruß und Danke
Christian
https://www.herber.de/bbs/user/156777.xlsm

24
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Lasst euch nicht drch...
16.12.2022 14:47:07
UweD
&GT&GT Lasst euch nicht drch die auskommentierten Zeilen im Makro verwirren, die muss ich noch anpassen.
Ich sehe keine einzige Zeile Code.
LG UweD
AW: Makro - Vergleich vor und nach ausführen
16.12.2022 14:50:18
Yal
Hallo Christian,
zur Frage 1: Stand vor der Aktualisierung speichern.
Kopiere die Spalte B und füge diese als Werte in eine freie Spalte.
"sich etwas zu merken" ist in Computer-Sprache Daten speichern. Es ist dabei immer eine Frage des "wo". Wichtig ist auch wie diese Daten weiterverwendet werden.
VG
Yal
diesmal hoffentlich mit Code
16.12.2022 15:44:03
Christian
Hallo ihr beiden, danke für eure Rückmeldung
https://www.herber.de/bbs/user/156785.xlsm
sorry hab den Code anscheinend vergessen zu speichern, aber wie ihr ja seht, der Code listet nur die Dateinamen auf.
Zu Yal,
eine Lösung mit Formeln und Hilfsspalten ist klar, das würde funktionieren. Mit viel Mühe bekomme ich es sicher auch hin, ein entsprechend aufgezeichnetes Makro für meine Zwecke abzuändern, sodass es auch automatisiert geht. Ich hatte halt gehofft, per VBA gibt es auch Wege ohne Formeln und Hilfsspalten,keine Ahnung in dem man die Zahlen in vorher in ein Array schreibt, die Zahlen danach in ein anderes Array und dann vergleicht, aber da hören dann halt meine VBA Kenntnisse auf.
Gruß
Christian
Anzeige
Selbstversuch
16.12.2022 17:25:15
Christian
wenn es nicht anders geht, als mit Hilfsspalten, sorry aber mehr geben meine VBA Kenntnisse nicht her, zumindest läuft das Makro

Sub Makro3()
Application.ScreenUpdate = False
With Worksheets("Punkte")
LZA = Cells(Rows.Count, 1).End(xlUp).Row
Columns("I:I").Insert
Columns("E:E").Insert
Range("I2:I" & LZA).Copy
Range("J2:J" & LZA).PasteSpecial Paste:=xlPasteValues
Call Tabelle6.DateienAuflisten
With .Range("E2:E" & LZA)
.FormulaLocal = "=WENN(UND(J2=0;I2>0);KÜRZEN((HEUTE()-WOCHENTAG(HEUTE();2)+2-3)/7)*7+3;D2)"
End With
Range("E2:E" & LZA).Copy
Range("D2:D" & LZA).PasteSpecial Paste:=xlPasteValues
Range("E:E,J:J").Delete
End With
Application.ScreenUpdate = True
End Sub
was meint ihr dazu?
Danke
Christian
Anzeige
AW: Selbstversuch
16.12.2022 17:59:28
Daniel
Ist doch ne super Lösung.
Ein einfacher Code, den auch ein Anfänger wie du erstellen kann, ohne Schleifen, Verzweigungen und Variablen, dabei sehr schnell in Ausführung.
Die Formel kann man auch ohne das Makro erstellen und testen.
Viel besser gehts doch nicht.
Ein Makro, das ohne die Hilfsspalte auskommen wollte, wäre auf jeden Fall aufwendiger.
Dazu müsste man die alten Werte in einem Array speichern, das man dann in einer Schleife durcharbeiten muss, geht auch, ist aber aufwendiger und erfordert etwas programmiererfahrung.
Gruß Daniel
AW: Selbstversuch
16.12.2022 18:05:08
Yal
Hallo Christian,
sehr gut.
2-3 "Observationen":
_ es funktioniert, weil Du zufällig gerade auf dem Blatt "Punkte" warst.
Ein "With" ist eine Verkürzung der Schreibweise. Anstatt

Worksheets("Punkte").Columns("I:I").Insert
Worksheets("Punkte").Columns("E:E").Insert
wird

With Worksheets("Punkte")
.Columns("I:I").Insert
.Columns("E:E").Insert
End With
geschrieben.
Sehr wichtig sind die Punkte vor dem "Columns". Genau diese Punkt sagen, dass es sich auf dem "With" bezieht. Ohne gilt diese Anweisung für das aktuell aktiven Blatt (in dem Fall hier, weil "Columns" eine Eigenschaft, der sich auf einem Blatt bezieht. Ein Objekt vom Typ Blatt ("Worksheet") ist immer der Parent von einem Objekt vom Typ Column)
_ auch richtig gemacht: die Reihenfolge des Einfügens: zuerst "I:I" dann "E:E". Umgekehrt ist fehler anfällig: wenn man ein neues "E:E" einfügt, ist "I:I" der ehemalige "H:H" !!
_ ein "Copy-PasteValue" kann so verkürzt:

.Range("J2:J" & LZA) = .Range("I2:I" & LZA).Value
Quelle und Ziel müssen dieselbe Anzahl an Zeilen und Anzahl an Spalten.
Ein Copy-PasteValue könnte wiederum so gekürzt werden:

    .Range("I2:I" & LZA).Copy
.Range("J2").PasteSpecial Paste:=xlPasteValues
Relevant in dem Fall ist nur die Anker-Zelle (Hier J2).
_ Wenn Du die Spalte E:E, J:J nicht löscht, sondern nur deren Inhalt, dann müsstest Du nicht sie wieder erzeugen

    .Range("E:E,J:J").ClearContents
Hier auch: entweder beide Spalten gleichzeitig löschen (hast Du gemacht), oder zuerst die weiteste rechts, dann weiter nach links. Wenn E:E zuerst gelöscht wäre, müsste man I:I löschen, um die bisherige J:J zu löschen.
Der Rest kann ich nicht beurteilen. Heute funktioniert es und kann nichts entdecken, warum es morgen nicht funkionieren sollte (immer das grosse Problem mit VBA!)
Also ausser die Punkten, alles super gemacht. Weiter so.
Noch ein paar Klugscheisserei am Freitag (Freitag ist KS-Tag):
_ immer zuerst Makrorekorder verwenden (mache ich immer noch). Kurze Aufnahme machen und Code anschauen.
_ Code im Schritt-Modus laufen lassen (F8)
_ dabei das Lokalfenster offen halten (Ansicht, Lokalfenster), um den Zustand und die Struktur der Variablen (Objekt-Modell) zu sehen.
_ neugierig sein: was steht in dem Objekt hinter dem "+"
_ Überwachungsausdrücke verwenden: Variable oder Ausdruck markieren, Rechtsklick auf "Überwachung hinzufügen..."
_ Variable (theoretisch so viel wie nötig, aber so wenig wie möglich, aber nicht im Lern-Modus) verwenden, nur um deren Stand im Lokalfenster zu beobachten.
_ auch gut: Debug.Print xxVariableName, druckt den Zustand eine Variable in das Direktfenster. Ansicht, Direktfenster. Dort kann man der Inhalt der Variable beeinflussen.
_ wenn ein VBA-Begriff nicht bekannt ist, Cursor drauf platzieren und Strg+F1, um an der Online-Hilfe zu gelangen. Dort sich die Zeit nehmen, grundlich zu lesen (die Aufmachung ist nur am Anfang gewöhnungsbedürftig) und die gegebenen Beispiele anzuschauen.
_ wenn die erste Schritte schon gemacht sind, das Objektkatalog anschauen
VG
Yal
Anzeige
AW: Selbstversuch
16.12.2022 18:30:03
Christian
Hallo Yal,
ok, hab jetzt das mit den Punkten und dem kopieren berücksichtigt. Das mit dem Inhalt löschen hab ich nicht gemacht, weil mich wenn ich nicht grad das Makro ausführe die zusätzlichen Spalten nur stören würden.
Aber jetzt kommt die Meldung Objekt unterstützt diese Eigenschaft oder Methode nicht und gleich die zweite Zeile Appl.... wird gelb markiert, was mache ich falsch?

Sub Makro3()
Application.ScreenUpdate = False
With Worksheets("Punkte")
LZA = Cells(Rows.Count, 1).End(xlUp).Row
.Columns("I:I").Insert
.Columns("E:E").Insert
.Range("J2:J" & LZA) = .Range("I2:I" & LZA).Value
Call Tabelle6.DateienAuflisten
With .Range("E2:E" & LZA)
.FormulaLocal = "=WENN(UND(J2=0;I2>0);KÜRZEN((HEUTE()-WOCHENTAG(HEUTE();2)+2-3)/7)*7+3;D2)"
End With
.Range("D2:D" & LZA) = .Range("E2:E" & LZA).Value
.Range("E:E,J:J").Delete
End With
Application.ScreenUpdate = True
End Sub
Danke für die Tipps
Anzeige
AW: Selbstversuch
16.12.2022 18:43:45
Daniel
Hi
Es heißt nicht: "ScreenUpdate" sondern anders.
VBA hilft dir, wenn du die genaue Schreibweise nicht kennst.
Nutze die Intellsense. Tipps die ersten Buchstaben und drücke dann ALT+Leertaste, da werden Sie geholfen.
Oder lösche das mit dem ScreenUpdating ganz einfach, das bringt, wenn man richtig programmiert (und drin Code ist diesbezüglich schon sehr gut), in den meisten Fällen wenig bis nichts.
Außerdem hast du immer noch einen Punkt vergessen, nämlich in der ersten Zeile nach dem With.
Ansonsten sucht du die letzte Zeile nicht Aug dem Blatt "Punkte', sondern in dem.Blatt, das gerade aktiv ist.
Kann das richtige sein, muss aber nicht.
Prinzipiell würde ich auch Hilfsspalte, die ich nur temporär brauche, immer am Ende der Tabelle einfügen und nicht mitten drin. Die Tabelle bleibt dann so wie sie ist.
Gruß Daniel
Anzeige
AW: Selbstversuch
16.12.2022 19:12:31
Christian
Sorry aber das verstehe ich nicht,
in meinem zuerst geposteten Selbstversuch war das mit dem Screenupdate doch auch drin und da gab es keinen Fehler...
und wenn ich die Zeile rausnehme kommt der Fehler immer noch
Gruß
Christian
und zu den anderen Sachen
16.12.2022 19:16:39
Christian
das mit dem Punkt hab ich zugefügt.
Mit den Hilfsspalten gebe ich dir prinzipiell recht, aber geplant ist das jede Woche eine Spalte dazukommt, Ende offen. Da fange ich lieber kein Orakel an, wo ich die Hilfsspalte am besten hinpacke, sondern bleibe glaub besser bei dem jetzigen.
Eine Hilfsspalte am Hintern des Blattes bringt wenig wenn man mal was ändern will und dann erst dahin scrollen muss.
Gruß
Christian
Anzeige
AW: und zu den anderen Sachen
16.12.2022 19:56:18
Daniel
Hi
Also es geht um Hilfsspalte, die das Makro einfügt und wieder löscht.
Die sollten ans Ende und das geht am einfachsten so.
Die With-Klammer kennst du ja, die kann man auch für Zellbereiche einsetuen die man öfters benötigt.
Zuerst hole ich mir den verwendeten Zellbereich:

With ActiveSheet.UsedRange
Hiervon nehme ich die letzte Spalte und gehe davon eine Spalte nach rechts:
Jetzt habe ich als WITH-Objekt die erste leere Spalte neben der Tabelle, egal wie groß die Tabelle ist. Den Zeilenbereich hat man auch gleich automatisch mit ermittelt.
Wenn man mehrere Hilfsspalte braucht, und die Überschrift nicht dabei haben will, kommt noch resize dazu, hier für 3 Hilfsspalte ab Zeile 2:

With ActiveSheet.UsedRange
With .Columns(.Columns.Count).Offset(1, 1).Resize(.Rows.Count - 1, 3)
Die einzelnen Spalten dieses Hilfsspaltenblocks sprichst du dann mit
.Columns(1), .Columns(2) usw an, die Indizierung bezieht sich hier auf die Spaltennummer im Block, daher immer 1, 2, 3
Also als ganzes etwa so

With ActiveSheet.UsedRange
With .Columns(.Columns.Count).Offset(1, 1).Resize(.Rows.Count - 1, 3)
.Columns(1).FormulaR1C1 = "= ..."
.Columns(2).FormulaR1C1 = "= ..."
.ClearContents
End With
End With
Für die Formeln solltest du dir angewöhnen, die R1C1-Schreibweise anzuwenden (bzw Z1S1 auf deutsch).
Das hat den Vorteil, dass du die Adressen in der Formel meistens unabhängig von der Spalte schreiben kannst, in welcher die Formel steht.
Wie die Formel in R1C1 aussieht, kannst du leicht selber rausfinden:
Schreibe die Formel normal in eine Zelle und lass dir den Formeltext im Direktfenster mit ?Selection.FormulaR1C1 anzeigen.
Dabei solltest du in der Formel alle Zellbezüge, die nicht zwingend relativ sein müssen absolut setzen, das ist in R1C1 besser als anders rum.
Auch solltest du in den Hilfsspaltenformeln alle Dpaltenvezüge auf die Originaltanelle absolut setzen und alle Bezüge auf eine andere Hilfsspalte relativ. Wenn du das machst, past dein Formeltext auch weitern, auch wenn sich die Hilfsspalte verschieben weil die Haupttabelle wächst.
Gruß Daniel
Anzeige
Ein geburt, viel Helfer :-)
16.12.2022 20:03:52
Yal
Hallo Christian,
aus welchem Grund "Application.ScreenUpdate" beinm ersten Mal nicht angemekert wurde, ist mir schleierhaft.
Noch eine "Schönheitspunkte":
"So wenig wie möglich, so viel wie nötig" kann man auch die Länge des Codings anwenden. Je kurzer desto besser, aber die Lesbarkeit sollte nicht darunter leiden.
Ob die Version mit "With" in 3 Zeilen:

       With .Range("E2:E" & LZA)
.FormulaLocal = "=WENN(UND(J2=0;I2>0);KÜRZEN((HEUTE()-WOCHENTAG(HEUTE();2)+2-3)/7)*7+3;D2)"
End With
oder ohne, 1 Zeile aber länger:

.Range("E2:E" & LZA).FormulaLocal = "=WENN(UND(J2=0;I2>0);KÜRZEN((HEUTE()-WOCHENTAG(HEUTE();2)+2-3)/7)*7+3;D2)"
ist quasi Geschmacksache.
Aber wenn die Referenzierung zum With nur einmal verwendet wird, könnte man es sich sparen.
Ganz anders:

With ThisWorkbook.Worksheets("WieKannManSoBlödSeineTabelleSoLangeNamenZuGeben")
Set Rng = Intersect(Range(.Range("C1"), .Range(1, .Columns.count).End(xlToLeft)).EntireRow, Range(.Range("A1"), .Cells(.Rows.count, 14).End(xlUp)))
End With
(Bescheuerte Beispiel, gebe ich zu) Es sind 6 Referenzierung (davon 2 fast unnötig), also 6 mal müsste diese wunderschöne Tabellen-Referenz sich in die Zeile reinquätschen. Aua.
VG
Yal
Anzeige
AW: Ein geburt, viel Helfer :-)
17.12.2022 15:11:01
Christian
habe jetzt dies hier draus gemacht

Sub Makro3()
Application.ScreenUpdating = False
With Worksheets("Punkte")
LZA = Cells(Rows.Count, 1).End(xlUp).Row
.Columns("I:I").Insert
.Columns("E:E").Insert
.Range("J2:J" & LZA) = .Range("I2:I" & LZA).Value
Call Tabelle6.DateienAuflisten
With .Range("E2:E" & LZA)
.FormulaLocal = "=WENN(UND(J2=0;I2>0);KÜRZEN((HEUTE()-WOCHENTAG(HEUTE();2)+2-3)/7)*7+3;D2)"
End With
.Range("D2:D" & LZA) = .Range("E2:E" & LZA).Value
.Range("E:E,J:J").Delete
End With
Application.ScreenUpdating = True
End Sub
das andere was ihr vorgeschagen habt hat mir wenig gebracht oder im Fall von Ermitteln der letzten Spalte war es mir ehrlich gesagt zu kompliziert und das mit dem R1C1 hab ich zwar hinbekommen, jedoch wenn ich dann die Formel mal ändern will, stehe ich da auf weiter Flur weil ich die Schreibweise nicht kenne, also hab ich auch das bei dem alten belassen.
Jedoch, wenn ich jetzt den Punkt vor der Zeile LZA = ... setze bekomme ich wieder die Meldung und dann ist mir just in dem Moment eingefallen dass er ha nicht vor LZA sondern sinnvollerweise vor Cells muss
Ich lasse es denke ich so, so wie es jetzt ist kann ich es noch nachvollziehen und ich kann die Formel noch bei Bedarf ändern.
Gruß und danke
Christian
Anzeige
ausversehen Haken gesetzt owT
17.12.2022 15:11:32
Christian
.
AW: Ein geburt, viel Helfer :-)
17.12.2022 15:45:26
Daniel
Hi
R1C1 ist eigentlich ganz einfach
Das R steht für Zeile und das C für Spalte (in deutsch dann Z und S)
Danach folgt die Zeilen- oder Spaltennummer.
Das einzige was ungewohnt sein sollte ist das die Spalte jetzt auch eine Zahl ist, so wie die Zeile auch.
Aber die Zuordnung der Buchstaben zu den Zahlen sollte man zumindest für das Alphabet kennen.
Wenn die Zahl ganz fehlt, dann heißt das: gleiche Zeile oder gleiche Spalte.
Hat man relative Bezüge, dann setzt man diese in Klammern um anzuzeigen, dass es nicht die absolute Nummer ist, sondern ein versatzwert.
Kleines Beispiel:
Deine Formel:

.FormulaLocal = "=WENN(UND(J2=0;I2>0);KÜRZEN((HEUTE()-WOCHENTAG(HEUTE();2)+2-3)/7)*7+3;D2)"
Würde in Z1S1 umgeschrieben so aussehen:

.FormulaR1C1Local = "=WENN(UND(ZS10=0;ZS9>0);KÜRZEN((HEUTE()-WOCHENTAG(HEUTE();2)+2-3)/7)*7+3;ZS4)"
Würdest du jetzt eine zusätzliche Überschriftenzeile haben so dass die Daten in Zeile 3 beginnen, müsstest du in der A1-Schreibweise alle "2" der Zeilennummern in "3" ändern.
Bei der Z1S1-Schreibweise kannst du die Formel genau so lassen, weil das "_gleiche Zeile" ja immer noch korrekt ist.
Gruß Daniel
AW: Ein geburt, viel Helfer :-)
18.12.2022 16:09:44
Christian
Hallo Daniel, ich bekomme es einfach nicht hin.
Wollte jetzt zu einem anderen Zweck eine Formel in die erste Zeile der ersten freien Spalte schreiben,
aber mit

LZ1 = .Cells(1, 1000).End(xlToLeft).Column
With .Range(LZ1 + 1 & "1")
.FormulaLocal = "=ZÄHLENWENN(A$2:A$4000;"">0"")"
End With
schreibt mir die ersten 16 Zeilen komplett voll mit dieser Formel,
was mache ich nun wieder falsch?
Gruß
Christian
AW: Ein geburt, viel Helfer :-)
18.12.2022 20:35:03
Piet
Hallo
ohne den ganzen Trhead mit allen Fragen und Antworten gelesen zu haben sehe ich auf Anhieb deinen Denkfehler!
Beachte bitte den Unterschied zwischen Range und Cells Programmierung. Das kann man auch NICHT mischen!!
Die Variable LZ1 ist auch verwirrend, damit bezeichnet man LastZell = Zeilen! Für Spalten ist besser Col oder Spa = Spalten
Wenn du nach Column suchtst bekommt du einen Zahlenwert, den kannst du bei Range nicht als Spaltenadresse angeben!
Dafür ist es besser die Adresse mit Buchstaben als Textstring zu ermitteln . Dann kannst du die Spalte über Offset(0, 1) erreichen!
Beim benutzen von Cells(1,Spa) kannst du hinter den ermittelten Spaltenindex direkt + 1 für die naechste Spalte setzen. Sehr enfach.
Am anfang ist das fürAnfaenger verwirrend, aber mit etwas Übung begreift man diese feinen Unterschede schnell.
mfg Piet
  • 
    Sub test()
    'Variante über Spalten Adresse mit Range
    Spalte = .Cells(1, 1000).End(xlToLeft).Address
    With .Range(Spalte).Offset(0, 1)
    'Variante über Spalten Index mit Cells
    Spalte = .Cells(1, 1000).End(xlToLeft).Column
    With .Cells(1, LZ1 + 1)
    End Sub
    

  • AW: Ein geburt, viel Helfer :-)
    18.12.2022 23:21:33
    Christian
    Hallo Piet, hallo Gerd,
    beide Versionen funktionieren, vielen Dank.
    Wobei ich Piets Version nutzen werde, da Gerds Version den Wert einfügt, das war nicht so ganz in meinem Sinn, wollte die Formel.
    Habe aber mal noch eine Frage zu dem Offset 0, 1 bedeutet selbe Zeile, eine Spalte nach rechts, demnach würde 1,1 eine Zeile nach unten und eine Spalte nach rechts bedeuten oder?
    Gibt es auch eine Möglichkeit, statt der eins für die Zeile eine ganze Range anzugeben? ich sag jetzt einfach mal von Zeile 2 bis 301? dass also eine Formel in diese 300 Zellen der gesuchten Spalte geschrieben wird?
    War da jetzt den ganzen Abend am tüfteln aber irgendwie ist der Groschen nicht gefallen.
    Will ja auch was dazulernen
    Danke
    Christian
    AW: Ein geburt, viel Helfer :-)
    18.12.2022 23:39:03
    Daniel
    Hi
    Um die Größe eines Zellbereichs anzupassen, nimm .Resize(Anzahl Zeilen, Anzahl Spalten)
    Wenn einer der beiden Werte nicht angegeben wird, wird diese Größe des Startbereichs beibehalten.
    Gruß Daniel
    AW: Ein geburt, viel Helfer :-)
    19.12.2022 08:33:00
    Christian
    Hallo Daniel,
    habs jetzt mit
    
    LZA = .Cells(Rows.Count, 1).End(xlUp).Row
    Spalte = .Cells(1, 1000).End(xlToLeft).Address
    With .Range(Spalte).Offset(1, 1).Resize(LZA - 1, 0)
    .FormulaLocal = "=XVERWEIS(A2;Updates!C:C;Updates!A:A;"";0;1)"
    .Formula = .Value2
    End With
    
    versucht, wobei LZA die letzte Zeile ist und damit LZA - 1 doch den gesamten Bereich außer der Zeile 1 abdecken müsste. Aber es gibt anwendungs oder Objektorientierter Fehler... ebenfalls wenn ich 300 statt LZA-1 angebe.
    Gruß
    Christian
    AW: Ein geburt, viel Helfer :-)
    19.12.2022 09:17:24
    Daniel
    Einen Zellbereich mit der Spaltenanzahl 0 gibt es nicht.
    Gruß Daniel
    AW: Ein geburt, viel Helfer :-)
    19.12.2022 09:42:24
    Christian
    Hallo Daniel,
    keine Ahnung welcher Teufel mich zu diesem Denkfehler geritten hat, aber so funktioniert es. Vielen Dank.
    Gruß
    Christian
    AW: Ein geburt, viel Helfer :-)
    19.12.2022 10:52:54
    Yal
    Hallo zusammen,
    der Beitrag von Piet ist richtig, aber mMn nicht vollständig. Man kann Range oder Cells verwenden und auch vermischen. Muss man nur wissen wie.
    Ich würde die Unterschied anders machen:
    _ Variable/Funktion, die eine Werte enthalten oder zurückgeben (Integer, Long, String, ...) und
    _ Variablen/Funktion, die einen Objekt enthalten/zurückgeben. Letzteres in 2 Version: Einzelobjekt oder Auflistungsobjekt. "Cells" ist ein Einzelobjekt vom Type Zelle, Range kann Auflistung (Liste von Zellen) oder Einzelobjekt sein (eine Zelle. Wobei genau gesehen, eine Auflistung mit nur eine Zelle).
    _ Funktionen, die eine Werte liefern oder verwenden: ZeileNr, SpalteNr, Adresse
    meineZeile = Cells(1,2).Row 'ergibt 1 (Long)
    meineZelle_Adr = Cells(1,2).Address 'ergibt $B$1 (string)
    meineZelle_Adr = Cells(1,2).Address (True, False) 'ergibt B$1
    meineRangeErsteZeile_Nr = Range ("A1:B3").Row 'ergibt 1 (Long)
    meineRangeAnzZeilen = Range ("A1:B3").Rows.Count 'ergibt 3
    _ die Funktionen, die Objekte liefern/verwenden: Cells, Range
    Set myRng = Range("A1:B3").SpecialCells(xlCellTypeConstants, 2) 'ergibt einen Verweis auf einem Objekt, die alle Zelle in A1:B3, die einen festen Text beinhalten (keine Formel). Also Max 6 Zellen.
    Set myRng = Cells(1,1).Resize(3,1) 'ergibt eine Verweis auf dem Range A1:A3. Also Objekt vom Typ Auflistung von Zellen.
    Set myRng = Range ( Range("A1"), Cells(Rows.Count), 5).End(xlUp)).SpecialCells(xlCellTypeConstants) 'ergibt einen Verweis auf einem ... (Hausaufgabe ;-)
    Ich bevorzüge die Objekt zu verwenden, weil damit der Zugang zu allen Eigenschaften des Objekts weiterhin möglich ist, und nicht nur einen.
    Ausserdem das Denken in Objekte anstatt einzelne Wert erlaubt eine leichtere Abstraktion.
    VG
    Yal
    AW: Range-Makro
    18.12.2022 21:22:00
    GerdL
    Moin
    
    With ActiveSheet
    .Range(Split(.Cells(1, .Columns.Count).End(xlToLeft).Offset(0, 1).Address, "$")(1) & 1) = _
    WorksheetFunction.CountIf(.Range("A2:A4000"), ">0")
    End With
    
    Gruß Gerd

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige