Discussion:
Zellformatierung völlig selbstherrlich (97)
(zu alt für eine Antwort)
Eric March
2004-10-28 12:21:50 UTC
Permalink
Hallo…

Ich blicke nicht mehr durch.
Eine Arbeitsmappe mit 4 Blättern. Auf Blatt 1 ist (vorläufig) nur ein
Button der das Makro in Gang setzt. In Blatt 4 wird vom Makro eine
CSV-Datei eingelagert. Reintext, zufällig sieht Spalte 1 wie ein Datum aus
und Spalte 4 wie eine Zahl…
Dann Sortiert das Makro die Eingänge und (hier schießt das Datum quer -
s.u.) ich kopiere (die Zelle aus) Spalte 1 gesondert auf Blatt 2 und (die
Zellen der) Spalten 2-4 per Range. Dann wird beim Kopieren etwas
Mathematik betrieben, aber das macht nichts. Nun wird Blatt 4 noch mal
sortiert und dann mit dem selben Makro (For-Schleife…) Blatt 3 in Angriff
genommen.

Und hier verzweifele ich. Ich habe Blatt 3 nach Wunsch formatiert; alles
Text, Spalte 1 zentriert, 2-4 linksbündig, 5 und 6 (das „Rechen“ergebnis)
rechtsbündig. Lasse ich das Makro laufen bleibt diese Darstellung. Blatt 2
dagegen stellt sich stur und immer auf linksbündig. Ich habe das ganze
Blatt erfasst, formatiert (links) dann die Spalten 1, 5 & 6 angepasst.
Nach dem Makrolauf kann ich das und es ist IO. Lasse ich das Makro wieder
laufen die selbe Malaise. Blatt 2 alles auf links! Das Makro ist und
bleibt der selbe Code, einzig es wird Blatt 2 und dann Blatt 3 aktiviert,
auf dem Arbeits-Blatt 4 wird nur eine der Spalten 2 oder 3 als
Sortierkriterium neu gesetzt.
Zwar verwende ich Range(Cells(1, 1), Cells(500, 6)).Delete - ich hatte
erst Clear da stehen, und das müsste eigentlich auch tun, - bloß sind ja
gleichermaßen Blatt 2 und 3 betroffen und auf 3 ist (wissentlich..!)
nichts anders formatiert als auf 2. Ich habe 2 sogar neu erstellt - half
nichts.

Wie bekomme ich diese Übertagungspanne in den Griff?
Mir ist was aufgefallen: Wenn ich die Zelleneigenschaften der
korrumpierten Spalten prüfe ist bei der Textausrichtung nichts (!!)
eingetragen, die die links sein sollten haben dort auch links stehen!


Ebenfalls als sehr störend (zu der Zeit experimentierte ich zufällig noch
mit Blatt 3 allein) war diese Datumsgeschichte. Was als Datumähnlicher
Text in Blatt 4 einläuft (war natürlich vorher eins…) wird wenn ich mit
Variant-Variable=Range - Blattwechsel - Range=Variable kopiere stur ins
US-Format MM/TT/JJJJ konvertiert. Ich habe auf Experimente Verzichtet,
aber ich hätte es auf mein eignes JJJJ-MM-TT umstellen müssen - und analog
zu oben: Beim nächsten Lauf der selbe Mist.
Genauso kreativ ist die Übertragung wenn ich die 6. Spalte berechne. Aus
Minuten (eigentlich Text, Spalte 5) errechne ich ein String-Format H:MM
auf das das eingebaute Konvertier-Heinzelmännchen anspringt und mir prompt
HH:MM aufs Auge drückt.
Wozu habe ich Ranges wenn ich die zum Transfer nicht nutzen kann?? Aus
einem einzigen Befehl würde eine langsame Doppelschleife…
Ich liege doch richtig, dass zum Kopieren des Inhalts eines Ranges eine
Variant-Variable nötig ist und nicht eine vom Range-Typ?
--
Eric March
Thomas Ramel
2004-10-28 12:41:02 UTC
Permalink
Grüezi Eric

Eric March schrieb am 28.10.2004
Post by Eric March
Hallo…
'Wir' haben nun schon des öftern voneinander gehört ;-)
Post by Eric March
Eine Arbeitsmappe mit 4 Blättern. Auf Blatt 1 ist (vorläufig) nur ein
Button der das Makro in Gang setzt. In Blatt 4 wird vom Makro eine
CSV-Datei eingelagert. Reintext, zufällig sieht Spalte 1 wie ein Datum aus
und Spalte 4 wie eine Zahl…
...allerdings kennen wir weder deine Ursprungsdaten (wie stehen die Werte
in der .csv-Datei und welches Format hat diese), noch kenne wir dein makro
und die darin verwendeten Befehle.

So bleibt auch meine Kristallkugel (notabene aus Schweizer Berkristall
gefertigt ;-)) leider etwas trübe.
Post by Eric March
Und hier verzweifele ich. Ich habe Blatt 3 nach Wunsch formatiert; alles
Text, Spalte 1 zentriert, 2-4 linksbündig, 5 und 6 (das „Rechen“ergebnis)
rechtsbündig.
Willst du denn Text haben, oder lieber Datum und Zeit, wie weiter unten
geschildert?
Post by Eric March
Das Makro ist und bleibt der selbe Code
Wie lautet dieser denn?
Post by Eric March
Zwar verwende ich Range(Cells(1, 1), Cells(500, 6)).Delete - ich hatte
erst Clear da stehen, und das müsste eigentlich auch tun,
Nicht ganz; mit .Delete werden die ganzen Zellen gelöscht (und die
danebenliegenden werden hinzugeschoben), mit .Clear werden nur *Inhalte und
Formate* der Zellen gelöscht.
Näheres dazu in der Online-Hilfe, wenn Du den Cursor in den jeweiligen
Begriff stellst und dann F1 drückst.
Post by Eric March
Ebenfalls als sehr störend (zu der Zeit experimentierte ich zufällig noch
mit Blatt 3 allein) war diese Datumsgeschichte. Was als Datumähnlicher
Text in Blatt 4 einläuft (war natürlich vorher eins…) wird wenn ich mit
Variant-Variable=Range - Blattwechsel - Range=Variable kopiere stur ins
US-Format MM/TT/JJJJ konvertiert.
Weshalb machst Du den 'Umweg' über eine Variable?
Weise die Werte doch gleich direkt zu, dann kannst Du auch den Blattwechsel
umgehen:

Worksheets("Tabelle2").Range("A1:B10) =
Worksheets("Tabelle4").Range("A1:B10)
Post by Eric March
Genauso kreativ ist die Übertragung wenn ich die 6. Spalte berechne. Aus
Minuten (eigentlich Text, Spalte 5) errechne ich ein String-Format H:MM
auf das das eingebaute Konvertier-Heinzelmännchen anspringt und mir prompt
HH:MM aufs Auge drückt.
Dann rechen nicht mit strings sondern im Excel-Uhrzeitformat; damit kannst
Du die Umwenslung elegant umgehen.
Post by Eric March
Ich liege doch richtig, dass zum Kopieren des Inhalts eines Ranges eine
Variant-Variable nötig ist und nicht eine vom Range-Typ?
Wie oben geschrieben brauchs tDu in Wirklichkeit keine Scharnier-Variable,
sondern kannst die ganze Chose direkt 'erledigen'

IMO müsste der Import deiner .csv-Datei 'sauber' geregelt werden und dann
die Übertragung in die anderen Tabelelnblätter überarbeitet.
Auf diese Weise bekommst Du die Mappe bestimmt in der Griff.
--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win XP Pro SP-1 / xl2000 SP-3]
Eric March
2004-10-28 13:42:53 UTC
Permalink
Am Thu, 28 Oct 2004 14:41:02 +0200 schrieb Thomas Ramel <***@MVPs.org>:

[Schnipp - um den Wust etwas einzudämmen]
Post by Thomas Ramel
Post by Eric March
Eine Arbeitsmappe mit 4 Blättern. Auf Blatt 1 ist (vorläufig) nur ein
Button der das Makro in Gang setzt. In Blatt 4 wird vom Makro eine
CSV-Datei eingelagert. Reintext, zufällig sieht Spalte 1 wie ein Datum
aus >> und Spalte 4 wie eine Zahl…
...allerdings kennen wir weder deine Ursprungsdaten (wie stehen die Werte
in der .csv-Datei und welches Format hat diese), noch kenne wir dein makro
und die darin verwendeten Befehle.
Alles Text - "2004-20.21","Name","Ort","Tätigkeit","35"
So in einer Reintextdatei 1:1 zu lesen (mit Write# produziert, alles als
Text, Pos. 1 und 5 sehen halt "zufällig" wie ein Datum und eine Zahl aus…

Das Makro (ist etwas lang) sieht Strukurmäßig so aus:
Öffenen der obigen Reintextdatei und einzelnes Übertragen der 5 Positione
in einer Schleife mit INPUT# (ohne LINE) in sie Zeilen des Aktionsblattes
(#4) (INPUT liefert den Inahlt der in der CVS-Datei jeweils zwischen den
"" steht..!)
Dann eine Schleife FOR I = 2 To 3 was mir Spalten 2 und 3 als
Sortierkriterium festlegt und antürlich 2 Läufe verursacht.
Mit Select (besser so) lege ich den Blattnamen von je #2 und #3 fest um
das passende Blatt zu akti4en.
Dann wird Blatt 4 Zeile um Zile durchgegangen und das Datumsfeld einzeln
nebst dem Rest als Range auf das jeweilige Blatt 2 oder 3 verbracht. Es
wird geprüft ob der nächste Eintrag in der sotierten Spalte vom atuellen
abweicht, damit kann ich die Minuten zusammenzählen und in einer weiteren
Spalte formatiert nierderschreiben. Eine Trennzeile und weiter ghts, nur
Optik also.
Das wäre es, wenn wir durch sind wird der 2. Schelifendurchlauf mit
erneutem Sortieren gestartet.
Post by Thomas Ramel
Post by Eric March
Und hier verzweifele ich. Ich habe Blatt 3 nach Wunsch formatiert; alles
Text, Spalte 1 zentriert, 2-4 linksbündig, 5 und 6 (das
„Rechen“ergebnis)
rechtsbündig.
Willst du denn Text haben, oder lieber Datum und Zeit, wie weiter unten
geschildert?
Text reicht, soll eine Aufstellung sein…
Was mir nicht gelingt ist in ein vorfomatiertes Blatt (Spalte 1 Datum, 5
auf Zahl) diesen Reintext zu importieren und dann wirklich diese
Formatierung anch dem Import wiederzufinden. Wa sich (wenn ich nicht den
Spaltenkopf sondern einzelen Zellen angehe) wiederfinde ist "Standard"!
Oder schlimmer: Datum in der Spalte 1 bleibt Datum, aber dan wieder
rechtbündig zentret, die Minuten stnaden auf Zahl #0.00 und wurdne zu
Standrd. Auf em Aktionsblatt ist das ja noch realtiv egal.
Post by Thomas Ramel
Post by Eric March
Zwar verwende ich Range(Cells(1, 1), Cells(500, 6)).Delete - ich hatte
erst Clear da stehen, und das müsste eigentlich auch tun,
Nicht ganz; mit .Delete werden die ganzen Zellen gelöscht (und die
danebenliegenden werden hinzugeschoben), mit .Clear werden nur *Inhalte und
Formate* der Zellen gelöscht.
Näheres dazu in der Online-Hilfe, wenn Du den Cursor in den jeweiligen
Begriff stellst und dann F1 drückst.
Sehr aussagekräftig die Hilfe, haut mich um… OK, ich hab vorher schon
bemerkt, dass DELETE den Rest nachzieht und CLEAR nur löscht, aber das
ändert am Problem nichts:
Dieser Befehl wird sowohl auf Blatt 2 wie auf Blatt 3 angewandt - und nur
Blatt 2 hat dieses Eigenleben während auf 3 die Foramtierung bleibt die
ich eingstellt habe!!
Was ich mit dem Löschen will ist ja nur den Range von obsoleten alten
Datenwerten (die ich rüberkopierte) zu erleichtern - da ich ja nicht en
bloc sondern zeilenweise kopiere [ließe sich garantiert auch verbessern,
z.B. als jeweiliger Range erfassen…] muss ich vorher aufräumen.
Post by Thomas Ramel
Post by Eric March
Ebenfalls als sehr störend (zu der Zeit experimentierte ich zufällig noch
mit Blatt 3 allein) war diese Datumsgeschichte. Was als Datumähnlicher
Text in Blatt 4 einläuft (war natürlich vorher eins…) wird wenn ich mit
Variant-Variable=Range - Blattwechsel - Range=Variable kopiere stur ins
US-Format MM/TT/JJJJ konvertiert.
Weshalb machst Du den 'Umweg' über eine Variable?
Weise die Werte doch gleich direkt zu, dann kannst Du auch den
Blattwechsel
Worksheets("Tabelle2").Range("A1:B10) =
Worksheets("Tabelle4").Range("A1:B10)
Ha! :-))) Wenn das man immer so klappen würde würde ich es 1000% schon in
anderen Maßnahemn so gemnacht haben! (Mein erster Versuch damals in dieser
Richtung war genau dieser - und es ging eifach nicht ohne den Umweg mit
einer Transfervariable!)
Soweit - korriegiere mich hier - muss ich wenn der Code in einem Modul
steht immer diesen Variablenweg gehen, versuche ich den selben Code in
einer Tabelle kann ich keine andre aktivieren (evtl. woe oben
direktzuweisen??) und in der Arbeitsmappe ging was Anderes wieder nicht
(glaube auch wieder die Blattaktivierung).
Post by Thomas Ramel
Post by Eric March
Genauso kreativ ist die Übertragung wenn ich die 6. Spalte berechne. Aus
Minuten (eigentlich Text, Spalte 5) errechne ich ein String-Format H:MM
auf das das eingebaute Konvertier-Heinzelmännchen anspringt und mir prompt
HH:MM aufs Auge drückt.
Dann rechen nicht mit strings sondern im Excel-Uhrzeitformat; damit kannst
Du die Umwenslung elegant umgehen.
Tja - wenn Text reinkommt und das letztlich reine Zahlen (5, 45, 90, 120
usw. Minuten) sind und ein Zusammenstricken von Text zu H:MM mir
automatisch (ohne gefragt zu werden!!!) das HH:MM aufpfopft fühle ich mich
fürsorglich vergewaltigt.
Post by Thomas Ramel
Post by Eric March
Ich liege doch richtig, dass zum Kopieren des Inhalts eines Ranges eine
Variant-Variable nötig ist und nicht eine vom Range-Typ?
Wie oben geschrieben brauchs tDu in Wirklichkeit keine
Scharnier-Variable,
sondern kannst die ganze Chose direkt 'erledigen'
Excel ist anderer Meinung. Nach meinen Programmierveständnissen würde ich
auch gerne auf diese Variable pfeifen.
Post by Thomas Ramel
IMO müsste der Import deiner .csv-Datei 'sauber' geregelt werden und dann
die Übertragung in die anderen Tabelelnblätter überarbeitet.
Auf diese Weise bekommst Du die Mappe bestimmt in der Griff.
Der selbe Inahlt [egal wie genial die Quelle ist oder nicht] der auf Blatt
4 ist wird nur umsortiert - aber das Übertragen mit dem selben Code
verursacht auf 2 Blättern unterscheidliche Resultat in der Darstellung.
Das ist mein Problem. Mehr nicht und nicht weniger. Excel macht was es
will und hört nicht auf sein Herrchen!

Ich habe das Makro, damit nicht das Sortieren einen Unteschied machen
kann, eben rückwärts (von 3 nach 2 zählend) laufen lassen. Das Poblem ist
exakt dasselbe - und nicht von Blatt zu Blatt gewandert: Ein Blatt behält
die Formatierung, ein anderes ändert sie eigenmächtig.
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Thomas Ramel
2004-10-28 15:14:56 UTC
Permalink
Dieser beitrag ist möglicherweise unangemessen. Klicken sie auf, um es anzuzeigen.
Eric March
2004-10-28 15:55:25 UTC
Permalink
Post by Thomas Ramel
Grüezi Eric
Eric March schrieb am 28.10.2004
Post by Eric March
Am Thu, 28 Oct 2004 14:41:02 +0200 schrieb Thomas Ramel
Post by Thomas Ramel
...allerdings kennen wir weder deine Ursprungsdaten (wie stehen die Werte
in der .csv-Datei und welches Format hat diese), noch kenne wir dein
makro und die darin verwendeten Befehle.
Alles Text - "2004-20.21","Name","Ort","Tätigkeit","35"
So in einer Reintextdatei 1:1 zu lesen (mit Write# produziert, alles als
Text, Pos. 1 und 5 sehen halt "zufällig" wie ein Datum und eine Zahl aus…
Oben hast Du gesagt, dass Du gerne damit als Datum und Minuten rechnen
willst.
Ist es nun reiner Text, oder sollen we 'in echt' Datum/Minuten sein?
BTW: Unter "2004-20.21" kann ich mir kein schlaues Datum vorstellen.
Ich will mich nicht unnötig zitieren, aber ich schrieb: «Was als
Datumähnlicher Text…» und «…errechne ich ein String-Format H:MM…».
Mir reicht text völlig aus. EXCEL interpreteirt diese Daten _von_sich_aus_
- und genau dass _passt_mir_nicht_! Aber damit kann ich leben. Und, äh,
‹2004-10.21› hätte besser wie ‹2004-10-21› ausgesehen…
Post by Thomas Ramel
Vielleicht wäre es auch sinnvoll, die Routine fürs Ausschreiben zu
überdenken, damit die Daten strukturierter eingelesen werden können....
Die Struktur ist IO. Punkt! Sie sit delshalb IO weil - mein Problem - die
selben identischen besch. Daten biem Transfer auf Blatt 3 dort keine
Schadena nrichten, auf Batt 2 dagegen schon. Die Daten als solche (die
transfereirt werden) sind 1000% IO. Es geht
_einzig_um_das_Verändern_der_Formatierung_auf_Baltt_2_ während derselbe
Vorgan auf Baltt 3 das _nicht_ hervoruft.
Post by Thomas Ramel
Tja, die Sturktur alleine nüzt nicht viel; um von Zürich nach bern zu
gelangen kann ich zu fuss gehen, das Fahrrad, das Auto, die Eisenbahn oder
das Flugzeug benutzen. Wenn ich will, kann ich unterwegs auch das Fahrzeug
wechseln.
Wenn ich nun die Reisezeit optimieren will, muss ich zuerst wissen wie ich
bisher unterwegs war.....
Sammeln wird mit Sammeln("Eric") audgrufen.
Ein Write #1, Str(Cells(I, 1)), Cells(I, 2), Cells(I, 3), Cells(I, 4),
Cells(I, 5) erstellt in einem anderen Makro einer anderne Mappe unsere
"Sammel Eric.Dat" bie der eine Datensatz am Schluss so aussieht:
"2004-10-21","Kunde","Projekt","Aktion","90"


Public Sub Sammeln(Name As String)
Dim Eingang(5) As String
Dim Lauf As Integer
Dim Blatt As String
Dim I, J, K As Integer
Dim Trans As Variant
Dim Stunde As Single
Dim Minute As Single

Worksheets("Statusblatt").Activate
'Statusblatt ist Blatt 4, die eingelesenen Daten landen ab A1
Range(Cells(1, 1), Cells(500, 5)).Clear
Open "C:\Dokumente und Einstellungen\XXXXXXXXX\Eigene
Dateien\Tabellen\Sammel " + Name + ".dat" For Input As #1
I = 1
While Not EOF(1)
For J = 1 To 5
Input #1, Eingang(J)
Cells(I, J) = Eingang(J)
Next
I = I + 1
Wend
Close 1

For Lauf = 2 To 3
Select Case Lauf
Case 2
Blatt = Name + "-Kunde"
Eingang(0) = "B1"
Case 3
Blatt = Name + "-Projekt"
Eingang(0) = "C1"
End Select
'Eric-Kunde wäre Blatt2, Eric-Projekt Blattt 3 - beide eingentlich völlig
identisch…

Worksheets("Statusblatt").Activate
Columns("A:E").Select
Selection.Sort Key1:=Range(Eingang(0)), Order1:=xlAscending,
Header:=xlGuess, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom
Cells(1, 1).Select

Worksheets(Blatt).Activate
Range(Cells(1, 1), Cells(500, 6)).Delete
Worksheets("Statusblatt").Activate

J = 1: K = 0
For I = 1 To Range("A65536").End(xlUp).Row
Eingang(1) = Cells(I, Lauf)
Eingang(2) = Cells(I + 1, Lauf)
Eingang(0) = Cells(I, 1)
Trans = Range(Cells(I, 2), Cells(I, 5))
Worksheets(Blatt).Activate
Cells(J, 1) = Eingang(0)
Range(Cells(J, 2), Cells(J, 5)) = Trans
K = K + Val(Cells(J, 5))
If Eingang(2) <> Eingang(1) Then
Cells(J + 1, 5) = K
Stunde = Int(K / 60 + 0.05)
Minute = K - Stunde * 60
Eingang(3) = Trim(Str(Stunde)) + ":" + Right("00" + Trim(Str(Minute)), 2)
Cells(J + 1, 6) = Eingang(3)
J = J + 2
K = 0

'K zählt Minuten bis anderer Kunde/Projekt kommt. Aus z.B. 125 Minuten
werden "2:05". Eine Leerzeile extra - fertig.

End If
J = J + 1
Worksheets("Statusblatt").Activate
Next

Next
End Sub
Post by Thomas Ramel
Post by Eric March
Öffenen der obigen Reintextdatei und einzelnes Übertragen der 5 Positione
in einer Schleife mit INPUT# (ohne LINE) in sie Zeilen des
Aktionsblattes
(#4) (INPUT liefert den Inahlt der in der CVS-Datei jeweils zwischen den
"" steht..!)
Warum so 'umständlich'?
Ecel bietet recht komfortable Import-Möglichkeiten an. Wenn die Datei z.B.
als .txt vorliegt, kannst Du mit dem Import-Assistenetn auch gleich das
Spaltenformat festelgen...
Ich will aber nicht _importieren_ sondern per Makro sich änderende Quellen
des (der…) immer selben Namens reglemäßig einlesen.
Post by Thomas Ramel
Post by Eric March
Dann eine Schleife FOR I = 2 To 3 was mir Spalten 2 und 3 als
Sortierkriterium festlegt und antürlich 2 Läufe verursacht.
Da gibts auch die .Sort-Methode die zwei (sogar 3) Spalten beim Sortieren
berücksichtigen kann - das ist bestimmt optimaler, denke ich mal.
Nein, eigentlich nicht, da ich den Sermon einmal nach Kunde und dann nach
Projet sortieren und diese jeweieligen Ergebnisse aufarbeiten muss - das
sind immer 2 Durchläufe.
Post by Thomas Ramel
Post by Eric March
Mit Select (besser so) lege ich den Blattnamen von je #2 und #3 fest um
das passende Blatt zu akti4en.
Select und Activate sind in Excel zu 99% unnötig und benötigen bloss Zeit
und bringen den Monitor so schön zum Flackern.
http://www.herber.de/xlfaq/xlbasics/main_sel.htm
Wenns ohen ginge würde ich das wie gesagt liebend gerne tun. Aber gebe ich
solche Referenzen an kreige ich Fehlermeldungen um die Ohren geknallt. Ich
ahbe geflucht damals weil es enfach nicht gelang zu schreiben
WS("X").Range(AB)=WS("Y").Range(ST). Es gabt immer die selbe Fehlermeldung
die ich vergessen habe. Nur mit der Variable gelang der Transfer (in
natürlich gleiche Zielberieche.


ABRNORMAL END - muss eine Zug kriegen.
Post by Thomas Ramel
Post by Eric March
Dann wird Blatt 4 Zeile um Zile durchgegangen und das Datumsfeld einzeln
nebst dem Rest als Range auf das jeweilige Blatt 2 oder 3 verbracht. Es
wird geprüft ob der nächste Eintrag in der sotierten Spalte vom atuellen
abweicht, damit kann ich die Minuten zusammenzählen und in einer weiteren
Spalte formatiert nierderschreiben. Eine Trennzeile und weiter ghts, nur
Optik also.
Hier könnte ich mir (bei entsprechend konsistenten Daten9 eine
Pivot-Tabelle vorstellen, welche diese Konsolidierung in einem Rutsch
vornimmt.
Hmmm, ist es nun ein Datumsfeld, oder nur Text der zufällig so ausschaut?
Post by Eric March
Post by Thomas Ramel
Post by Eric March
Und hier verzweifele ich. Ich habe Blatt 3 nach Wunsch formatiert; alles
Text, Spalte 1 zentriert, 2-4 linksbündig, 5 und 6 (das
„Rechen“ergebnis) rechtsbündig.
Willst du denn Text haben, oder lieber Datum und Zeit, wie weiter unten
geschildert?
Text reicht, soll eine Aufstellung sein…
Was mir nicht gelingt ist in ein vorfomatiertes Blatt (Spalte 1 Datum, 5
auf Zahl) diesen Reintext zu importieren und dann wirklich diese
Formatierung anch dem Import wiederzufinden. Wa sich (wenn ich nicht den
Spaltenkopf sondern einzelen Zellen angehe) wiederfinde ist "Standard"!
Oder schlimmer: Datum in der Spalte 1 bleibt Datum, aber dan wieder
rechtbündig zentret, die Minuten stnaden auf Zahl #0.00 und wurdne zu
Standrd. Auf em Aktionsblatt ist das ja noch realtiv egal.
Schon da solltest Du auf konsistente Datenformate achten, da Du ansonsten
hinterher in den 'Hammer' läufst.
Post by Eric March
Post by Thomas Ramel
Post by Eric March
Zwar verwende ich Range(Cells(1, 1), Cells(500, 6)).Delete - ich hatte
erst Clear da stehen, und das müsste eigentlich auch tun,
Nicht ganz; mit .Delete werden die ganzen Zellen gelöscht (und die
danebenliegenden werden hinzugeschoben), mit .Clear werden nur *Inhalte und
Formate* der Zellen gelöscht.
Näheres dazu in der Online-Hilfe, wenn Du den Cursor in den jeweiligen
Begriff stellst und dann F1 drückst.
Sehr aussagekräftig die Hilfe, haut mich um…
Wie soll ich das nun auffassen???
ich versuche zu helfen und dir beizustehen, da wäre Ironie nicht am Platze,
wenn es denn solche gewesen sein soll....
Die Online-hilfe ist in der Regel besser als ihr Ruf - leider wird oft eher
in einer NG oder einem Forum nachgefragt, statt diese konsultiert.
(OK - ich mag den Klmmerkasper auch nicht, daher ist er bei mir
deinstalliert und ich siche dan jeweisl über den Index)
Post by Eric March
OK, ich hab vorher schon bemerkt, dass DELETE den Rest nachzieht und
Dieser Befehl wird sowohl auf Blatt 2 wie auf Blatt 3 angewandt - und nur
Blatt 2 hat dieses Eigenleben während auf 3 die Foramtierung bleibt die
ich eingstellt habe!!
Das kommt dann halt einerseits drauf an, wie die nachgezogenen Zellen
vorgängig formatiert sind/waren und andererseits wie Du die Werte nun
codemässig in die Zellen schreibst.
Post by Eric March
Post by Thomas Ramel
Worksheets("Tabelle2").Range("A1:B10) =
Worksheets("Tabelle4").Range("A1:B10)
Ha! :-))) Wenn das man immer so klappen würde würde ich es 1000% schon in
anderen Maßnahemn so gemnacht haben! (Mein erster Versuch damals in dieser
Richtung war genau dieser - und es ging eifach nicht ohne den Umweg mit
einer Transfervariable!)
Hier erlaube ich mir, das einfach mal nicht zu glauben ;-)
Worksheets("Tabelle2").Range("A1:B10") =
Worksheets("Tabelle4").Range("A1:B10").Text
Post by Eric March
Soweit - korriegiere mich hier - muss ich wenn der Code in einem Modul
steht immer diesen Variablenweg gehen, versuche ich den selben Code in
einer Tabelle kann ich keine andre aktivieren (evtl. woe oben
direktzuweisen??) und in der Arbeitsmappe ging was Anderes wieder nicht
(glaube auch wieder die Blattaktivierung).
Tja und auch hier weise ich nochmals auf mein Beispiel mit dem Weg von
Zürich nach Bern hin....
...ob der Code nun in einem eigenenModul stet oder im Codemodul des
Tabelelnbattes speilt keine Rolle, wenn die Bereiche sauber referenziert
sind. (Gehören tut socher Code in der Regel aber in ein eigenes Modul).
Post by Eric March
Post by Thomas Ramel
Post by Eric March
Genauso kreativ ist die Übertragung wenn ich die 6. Spalte berechne. Aus
Minuten (eigentlich Text, Spalte 5) errechne ich ein String-Format H:MM
auf das das eingebaute Konvertier-Heinzelmännchen anspringt und mir
prompt HH:MM aufs Auge drückt.
Dann rechen nicht mit strings sondern im Excel-Uhrzeitformat; damit
kannst Du die Umwenslung elegant umgehen.
Tja - wenn Text reinkommt und das letztlich reine Zahlen (5, 45, 90, 120
usw. Minuten) sind und ein Zusammenstricken von Text zu H:MM mir
automatisch (ohne gefragt zu werden!!!) das HH:MM aufpfopft fühle ich mich
fürsorglich vergewaltigt.
Dann verhindere dies indem Du *nicht* mit Stings rechnest, sonderen saubere
Umwandlungen vornimmst.
Excel ist bei der umwandlung son Strings in Zaheln manchmal rexht
eigenwillig - im Prinzip dürfte eine Verrechnung von Stings wegen des
Datentyps gar nicht klappen. Die ist ein Zugeständnis an den Anwender, das
acu ich nicht für sehr glücklich halte, es aber nicht ändern kann.
Post by Eric March
Post by Thomas Ramel
Post by Eric March
Ich liege doch richtig, dass zum Kopieren des Inhalts eines Ranges eine
Variant-Variable nötig ist und nicht eine vom Range-Typ?
Wie oben geschrieben brauchs tDu in Wirklichkeit keine
Scharnier-Variable,
sondern kannst die ganze Chose direkt 'erledigen'
Excel ist anderer Meinung. Nach meinen Programmierveständnissen würde ich
auch gerne auf diese Variable pfeifen.
Dann tus und lass dir dabi helfen indem Du deinen Code hier als Text in
einen Beitrag stellst!
Post by Eric March
Post by Thomas Ramel
IMO müsste der Import deiner .csv-Datei 'sauber' geregelt werden und dann
die Übertragung in die anderen Tabelelnblätter überarbeitet.
Auf diese Weise bekommst Du die Mappe bestimmt in der Griff.
Der selbe Inahlt [egal wie genial die Quelle ist oder nicht] der auf Blatt
4 ist wird nur umsortiert - aber das Übertragen mit dem selben Code
verursacht auf 2 Blättern unterscheidliche Resultat in der Darstellung.
Das ist mein Problem. Mehr nicht und nicht weniger. Excel macht was es
will und hört nicht auf sein Herrchen!
Ich habe das Makro, damit nicht das Sortieren einen Unteschied machen
kann, eben rückwärts (von 3 nach 2 zählend) laufen lassen. Das Poblem ist
exakt dasselbe - und nicht von Blatt zu Blatt gewandert: Ein Blatt behält
die Formatierung, ein anderes ändert sie eigenmächtig.
Dann schmeiss mal die beiden Blätter raus und füge neue 'sauber' hinzu.
Manchmal gehen die Dinger 'kaputt' und reagieren dann nicht mehr korrekt -
gerade wenn viel reingeschrieben, gelöscht und mit Code gearbeitet wird ist
das ganz gut mal möglich.
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Michael Schwimmer
2004-10-29 06:58:42 UTC
Permalink
Hallo Eric
Post by Eric March
Ich will mich nicht unnötig zitieren, aber ich schrieb: «Was als
Datumähnlicher Text…» und «…errechne ich ein String-Format H:MM…».
Mir reicht text völlig aus. EXCEL interpreteirt diese Daten _von
_sich_aus- und genau dass _passt_mir_nicht_! Aber damit kann
ich leben. Und, äh, ‹2004-10.21› hätte besser wie ‹2004-10-21›
ausgesehen…
Post by Thomas Ramel
Vielleicht wäre es auch sinnvoll, die Routine fürs
Ausschreiben zu überdenken, damit die Daten strukturierter
eingelesen werden können....
Die Struktur ist IO. Punkt!
es ist normalerweise nicht meine Art, zu kritisieren, aber
deine Antworten auf die Hinweise von Thomas stoßen mir etwas
sauer auf. Mir kommt es definitiv so vor, als ob du keine Hilfe
akzeptieren willst.
Deine gestellten Fragen sind auch nicht gerade so konkret, als
dass man ohne eine gut funktionierende Kristallkugel damit
etwas anfangen könnte.
Post by Eric March
Genauso kreativ ist die Übertragung wenn ich die 6. Spalte
berechne. Aus Minuten (eigentlich Text, Spalte 5) errechne
ich ein String-Format H:MM auf das das eingebaute
Konvertier-Heinzelmännchen anspringt und mir prompt
HH:MM aufs Auge drückt.
Ohne den Code, den du für deine Bemühungen einsetzt, kann man
dir dabei nicht weiterhelfen.
Post by Eric March
Wozu habe ich Ranges wenn ich die zum Transfer nicht nutzen
kann?? Aus einem einzigen Befehl würde eine langsame
Doppelschleife…
Ich liege doch richtig, dass zum Kopieren des Inhalts eines
Ranges eine Variant-Variable nötig ist und nicht eine vom
Range-Typ?
Viele Wege führen zum Ziel. Man kann auch einen Variant dafür
einsetzen, mit den bekannten Umwandlungsproblemen.


An deinem zuletzt Code fallen mir sofort einige Sachen negativ
auf, obwohl es sicherlich an deinen Problemen nicht viel ändert.
Es ist aber vielleicht einmal auch für die anderen Mitleser
interessant, zu erfahren, was daran IMO nicht in Ordnung ist.
Post by Eric March
Public Sub Sammeln(Name As String)
Als Variablennamen sollte man Eigenschaften und Methoden
(hier Name) tunlichst vermeiden. Einfach mal den Cursor
auf den Namen setzen und F1 drücken. Wenn die Hilfe etwas
liefert, sollte man einen anderen Namen benutzen. Besser
sind natürlich noch Präfixe für den Datentyp und die Gültigkeit.
Post by Eric March
Dim I, J, K As Integer
Dir ist sicherlich nicht klar, dass du nur K als Integer deklariert
hast. I und J sind in diesem Fall Variant.
Post by Eric March
Worksheets("Statusblatt").Activate
Range(Cells(1, 1), Cells(500, 5)).Clear
Aktivieren und Selektieren ist nur in den wenigsten Fällen notwendig.

Besser:
With Worksheets("Statusblatt")
.Range(.Cells(1, 1), .Cells(500, 5)).Clear
end With

Das ist sauber referenziert, sich darauf zu verlassen, dass das
richtige Blatt aktiv ist, sollte man sich schnell wieder abgewöhnen.
Post by Eric March
While Not EOF(1)
Obwohl es nicht verkehrt ist, While... Wend Anweisungen zu benutzen,
sollte man generell zu Do Loop übergehen. Sogar in der OH steht:

Tip°°°Die Do...Loop-Anweisung stellt eine strukturiertere
und flexiblere Möglichkeit zur Ausführung von Schleifen dar.
Post by Eric March
Blatt = Name + "-Kunde"
Strings sollte man immer mit dem kaufmännischen Und (&) verknüpfen,
obwohl es auch sehr oft mit Plus funktioniert.
Auf das mehr oder weniger zufällige Funktionieren möchte ich mich
nicht gerne verlassen.

Sub test2()
Dim varTest1 As Variant
Dim varTest2 As Variant
Dim varTest3 As Variant
Dim varTest4 As Variant

varTest1 = 10
varTest2 = "20"
varTest3 = varTest1 + varTest2
varTest4 = varTest1 & varTest2
MsgBox "+ = " & varTest3 & vbCrLf & "& = " & varTest4
End Sub
Post by Eric March
Worksheets("Statusblatt").Activate
Columns("A:E").Select
Selection.Sort Key1:=Range(Eingang(0)), Order1:=xlAscending,
Header:=xlGuess, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom
Auch hier wieder die völlig unnötige Selektiererei!
So ähnlich sollte das ohne funktionieren:

Worksheets("Statusblatt").Columns("A:E").Sort _
Key1:=Range("A1"), Order1:=xlAscending, _
Key2:=Range("B1"), Order2:=xlAscending, _
Key3:=Range("C1"), Order3:=xlAscending, _
Header:=xlGuess _
, OrderCustom:=1, MatchCase:=False _
, Orientation:=xlTopToBottom _
, DataOption1:=xlSortNormal _
, DataOption2:=xlSortNormal _
, DataOption3:=xlSortNormal
Post by Eric March
Trans = Range(Cells(I, 2), Cells(I, 5))
Worksheets(Blatt).Activate
Cells(J, 1) = Eingang(0)
Range(Cells(J, 2), Cells(J, 5)) = Trans
Aus was für einen Grund kopierst du erst einen Bereich in
einen Variant und dann wieder zurück? Du gibst dadurch die
Kontrolle aus der Hand ünd überlässt VBA die Auswahl des
Datentyps, der zur Speicherung als Variant benutzt wird.

Als eine Alternative von vielen funzt auch folgendes.

Sub test()
Worksheets("Tabelle1").Range("A1:E1").Copy
With Worksheets("Tabelle2")
.Paste .Range("A1")
End With
End Sub

Besser ist vielleicht sogar, direkt zuzuweisen, wie von
Post by Eric March
Stunde = Int(K / 60 + 0.05)
Minute = K - Stunde * 60
Eingang(3) = Trim(Str(Stunde)) + ":" + _
Right("00" + Trim(Str(Minute)), 2)
Cells(J + 1, 6) = Eingang(3)
Auch hier benutzt du wieder einen fehlerträchtigen Umweg
über eine Variable.
Weise der Zielzelle direkt einen Wert vom Typ Date zu und
formatiere die Zielzelle entsprechend.

With Worksheets(1).Cells(J + 1, 6)
.Value = k / 60 / 24
.NumberFormat = "[hh]:mm"
End With
Post by Eric March
ahbe geflucht damals weil es enfach nicht gelang
zu schreiben
WS("X").Range(AB)=WS("Y").Range(ST)
Es gabt immer die selbe Fehlermeldung
die ich vergessen habe. Nur mit der Variable gelang
der Transfer (in natürlich gleiche Zielberieche.
Was hindert dich daran, es noch einmal zu versuchen?
Aber diesmal bitte mit der richtigen Syntax. Diese Zeile
Post by Eric March
WS("X").Range(AB)=WS("Y").Range(ST)
ist natürlich völliger blödsinn!

Lass dir die Anmerkungen von Thomas und mir noch einmal
durch den Kopf gehen und wenn du weitere Fragen hast,
kannst du diese gerne in die NG posten.

MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home : http://michael-schwimmer.de
Eric March
2004-10-29 10:09:46 UTC
Permalink
Am Fri, 29 Oct 2004 08:58:42 +0200 schrieb Michael Schwimmer
Post by Michael Schwimmer
Hallo Eric
Post by Eric March
Ich will mich nicht unnötig zitieren, aber ich schrieb: «Was als
Datumähnlicher Text…» und «…errechne ich ein String-Format H:MM…».
Mir reicht text völlig aus. EXCEL interpreteirt diese Daten _von
_sich_aus- und genau dass _passt_mir_nicht_! Aber damit kann
ich leben. Und, äh, ‹2004-10.21› hätte besser wie ‹2004-10-21›
ausgesehen…
Post by Thomas Ramel
Vielleicht wäre es auch sinnvoll, die Routine fürs
Ausschreiben zu überdenken, damit die Daten strukturierter
eingelesen werden können....
Die Struktur ist IO. Punkt!
es ist normalerweise nicht meine Art, zu kritisieren, aber
deine Antworten auf die Hinweise von Thomas stoßen mir etwas
sauer auf. Mir kommt es definitiv so vor, als ob du keine Hilfe
akzeptieren willst.
Deine gestellten Fragen sind auch nicht gerade so konkret, als
dass man ohne eine gut funktionierende Kristallkugel damit
etwas anfangen könnte.
OK. Warum kapiert dann - ich bin jezt mal so direkt - ihr Helfer nicht,
dass ihr am Ziel vorbieschießt?
Der selbe identische Code mit den selben, nur umsortierten, Daten (aber
das wäre egal, habe ich geprüft) bewirkt auf 2 Arbeitbpalttern
_unterschiedliche_ Darstelleungn, korrekter: die auf dem eine Blatt
bleiben wie von mir voreingestellt, die auf dem anderen werden verändert!
Dass mir _grundsätzlich_ Excels Eigenmächtigkeit der Formatzuweisung
Schwierigekeiten amcht ist ein anderes Kapitel (deswegen, wenn du das
Originalposting findest, wirst du sehen, dass das ein zusätzlicher unterer
Absatz zum Hauptproblem war. Für jenes aber suchte ich eine Lösung - und
die bekam ich nicht. Soll mich so was fröhlich stimmen?)
Post by Michael Schwimmer
Post by Eric March
Genauso kreativ ist die Übertragung wenn ich die 6. Spalte
berechne. Aus Minuten (eigentlich Text, Spalte 5) errechne
ich ein String-Format H:MM auf das das eingebaute
Konvertier-Heinzelmännchen anspringt und mir prompt
HH:MM aufs Auge drückt.
Ohne den Code, den du für deine Bemühungen einsetzt, kann man
dir dabei nicht weiterhelfen.
Der ist weiter unten dann mitgeliefert gewesen.
Post by Michael Schwimmer
Post by Eric March
Wozu habe ich Ranges wenn ich die zum Transfer nicht nutzen
kann?? Aus einem einzigen Befehl würde eine langsame
Doppelschleife…
Ich liege doch richtig, dass zum Kopieren des Inhalts eines
Ranges eine Variant-Variable nötig ist und nicht eine vom
Range-Typ?
Viele Wege führen zum Ziel. Man kann auch einen Variant dafür
einsetzen, mit den bekannten Umwandlungsproblemen.
Ich habe keine Zeit (..!) für und auch überhaupt keine
Excel97-Enzyklopädie, ich kann mir nur die Hilfe antun und experimentieren.
Meine erste größere Aktion war eigntlich nur Daten zu verschieben bzw. zu
filtern / konvertieren. Da schon (vgl. ganz unten) habe ich von Excel
einen Tritt bekommen weil das Zuweisen so wie mir angeraten von mir selbst
instinktiv so versucht wurde nicht klappte. Erst der Weg mit der
Transfervariablen vom Variant-Typ hat das Problem, wenigstens bezüglich
einer einzigen Zeile, gelöst. Betrachte ich die Ergebnisse unten müsste
ich folgern, das direkte Zuweisen einzeln in einer Schleife zu verpacken -
das kanns doch wohl nicht sein?
Post by Michael Schwimmer
An deinem zuletzt Code fallen mir sofort einige Sachen negativ
auf, obwohl es sicherlich an deinen Problemen nicht viel ändert.
Es ist aber vielleicht einmal auch für die anderen Mitleser
interessant, zu erfahren, was daran IMO nicht in Ordnung ist.
Der Code ist noch nicht optimiert und aus Modulen zusammkopiert - da
sollte das nicht zu sehr wundern.
Post by Michael Schwimmer
Post by Eric March
Public Sub Sammeln(Name As String)
Als Variablennamen sollte man Eigenschaften und Methoden
(hier Name) tunlichst vermeiden. Einfach mal den Cursor
auf den Namen setzen und F1 drücken. Wenn die Hilfe etwas
liefert, sollte man einen anderen Namen benutzen. Besser
sind natürlich noch Präfixe für den Datentyp und die Gültigkeit.
Ich hatte Mist gebaut. Der Aufruf Sammeln(Eric) war natürlich Blösfug,
Sammeln("Eric") wäre besser gewesen. Und da ich dieses Modul gerade sah
(es kam "Leer" in Name an) wollte ich kurz festschreiben, dass Name ein
String sein sollte. Dann erst sah ich die wahre Ursache.
Post by Michael Schwimmer
Post by Eric March
Dim I, J, K As Integer
Dir ist sicherlich nicht klar, dass du nur K als Integer deklariert
hast. I und J sind in diesem Fall Variant.
Faszinierend. Das hatte ich so mal abgeschreiben, sonst habe ich die
eingentlich immer brav in einzelne DIMs verpackt. Die Variant-Warnung
werde ich mir hinter die Ohren Schreiben (sinnfälligerweise ist K ja als
Integer der die Minuten zählt durchgekommen und fiel deswegen nicht auf) -
sollte halt für Tests etwas schenller gehen. Habe das im Hauptcode soeben
korrigiert.
Post by Michael Schwimmer
Post by Eric March
Worksheets("Statusblatt").Activate
Range(Cells(1, 1), Cells(500, 5)).Clear
Aktivieren und Selektieren ist nur in den wenigsten Fällen notwendig.
With Worksheets("Statusblatt")
.Range(.Cells(1, 1), .Cells(500, 5)).Clear
end With
Das ist sauber referenziert, sich darauf zu verlassen, dass das
richtige Blatt aktiv ist, sollte man sich schnell wieder abgewöhnen.
Das ist mir etwas zu "hohe Mathematik" [die Syntax ist mir absolut kar].
Warum reicht
Worksheets("Statusblatt").Range(Cells(1, 1).Cells(500, 5)).Clear
nicht aus? Wassen Range als der das benannten Worksheets sollte gemeint
sein? Doch nicht der des zufällig aktiven Worksheets? Das wäre wieder mal
1000% eine von den Fallen die ide Hilfe nicht erklärt und die auch nicht
logisch sind (was ist logisch daran in diesen Fällen Bereiche des aktiven
Sheets zu greifen satt des referenzierten?)
Post by Michael Schwimmer
Post by Eric March
While Not EOF(1)
Obwohl es nicht verkehrt ist, While... Wend Anweisungen zu benutzen,
Tip°°°Die Do...Loop-Anweisung stellt eine strukturiertere
und flexiblere Möglichkeit zur Ausführung von Schleifen dar.
While-Wend ist normalerweise die KOPFgesteuert Schleife, Do-Loop, oder
eher Do-Until die FUSSgesteuerte. Do-While/Loop ist für mich deswegen
irgenwie absurd, auch wenn die Syntax das hergibt.
Wenn mir niemand vormacht, dass DO schneller ist werde ich mal bei WHILE
verbleiben (um strukturiert zu programmieren…).
Post by Michael Schwimmer
Post by Eric March
Blatt = Name + "-Kunde"
Strings sollte man immer mit dem kaufmännischen Und (&) verknüpfen,
obwohl es auch sehr oft mit Plus funktioniert.
Auf das mehr oder weniger zufällige Funktionieren möchte ich mich
nicht gerne verlassen.
Der Zufall hat Mehtode. Aber gegen Gewohnheiten sit nicht viel zu machen,
muss halt mehr an das & denken (obwohl ic es so langsam hier und da schon
einsetze). Mir ist das & immer so sehr ein beschreibendes Symbol (&auml;
z.B. oder L& was immer Symbol für LongInteger war).
Post by Michael Schwimmer
Sub test2()
Dim varTest1 As Variant
Dim varTest2 As Variant
Dim varTest3 As Variant
Dim varTest4 As Variant
varTest1 = 10
varTest2 = "20"
varTest3 = varTest1 + varTest2
varTest4 = varTest1 & varTest2
MsgBox "+ = " & varTest3 & vbCrLf & "& = " & varTest4
End Sub
Spieverderber. :-) Ich beschränke mich (von gewissen DIM-Unfällen
abgesehen) stets auf String-Variablen die ich mit + verklebe.
Aber ich ahbe die Warnung verstanden.
Post by Michael Schwimmer
Post by Eric March
Worksheets("Statusblatt").Activate
Columns("A:E").Select
Selection.Sort Key1:=Range(Eingang(0)), Order1:=xlAscending,
Header:=xlGuess, OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom
Auch hier wieder die völlig unnötige Selektiererei!
Worksheets("Statusblatt").Columns("A:E").Sort _
Key1:=Range("A1"), Order1:=xlAscending, _
Key2:=Range("B1"), Order2:=xlAscending, _
Key3:=Range("C1"), Order3:=xlAscending, _
Header:=xlGuess _
, OrderCustom:=1, MatchCase:=False _
, Orientation:=xlTopToBottom _
, DataOption1:=xlSortNormal _
, DataOption2:=xlSortNormal _
, DataOption3:=xlSortNormal
Post by Eric March
Trans = Range(Cells(I, 2), Cells(I, 5))
Worksheets(Blatt).Activate
Cells(J, 1) = Eingang(0)
Range(Cells(J, 2), Cells(J, 5)) = Trans
Ich hatte mich zwischendrin (danke, Excel, für den Absturz!) für das Ganze
mit Whith entschieden (um die Selektion mit der Aktivierung von A1
zurückzunehmen) - aber so sollte es gewiss auch tun.
Post by Michael Schwimmer
Aus was für einen Grund kopierst du erst einen Bereich in
einen Variant und dann wieder zurück? Du gibst dadurch die
Kontrolle aus der Hand ünd überlässt VBA die Auswahl des
Datentyps, der zur Speicherung als Variant benutzt wird.
Dass Variants offenbar mehr Macken haben als ich bislang dachte ist mir
auch schon klar geworden. So lange ich aber (unten…) nur Zelle um Zelle
statt ganzer Ranges kopieren kann fühle ich mich mit der Erbsenzählmehtode
auch nicht unbedingt wohl.
Post by Michael Schwimmer
Als eine Alternative von vielen funzt auch folgendes.
Sub test()
Worksheets("Tabelle1").Range("A1:E1").Copy
With Worksheets("Tabelle2")
.Paste .Range("A1")
End With
End Sub
Gegen Paste bin ich allergisch weil das _meine_ Zwischenablage ist in der
ich Makros nur äusserst ungern rumfumeln lasse :-)))
Post by Michael Schwimmer
Besser ist vielleicht sogar, direkt zuzuweisen, wie von
Das, wie gesagt, läuft wieder auf die Erbsenzählerei ruas. Aber offen
gesagt, hatte ich diese Idee (vor lauter Verzeiflung) auch schon, nur hat
mich die Hilfe hängen lassen wie ich eine Zelle auf "Datum" setze; das
Zuweisen von Do-It-Youself-Formaten wäre ja nicht das TProblem gewesen.
[Weder ärgere ich mich über die Hilfe schwarz. NumberForamt exisitert, und
ich ahbe es auch gefunden, aber was ich unter welchen Regeln zuweisen kann
- _das_ steht, wie so oft, nie beschrieben.]
Post by Michael Schwimmer
Post by Eric March
Stunde = Int(K / 60 + 0.05)
Minute = K - Stunde * 60
Eingang(3) = Trim(Str(Stunde)) + ":" + _
Right("00" + Trim(Str(Minute)), 2)
Cells(J + 1, 6) = Eingang(3)
Ich muss zugeben, dass der Code nicht berühmt ist; womöglich sit das
+ Schuld, da Null Minuten offenbar ncith die 0 sondern "" geliefert hatten.
Da das Ziel der Aktion auch nur eine schnelle optische Darstellung von 135
Minuten als 2:15 sein sollte mit der nichts weiter passiert habe ich mich
aufs Zusammenkleben als String beschränkt. Die Nebenwirkngen kamen dann
von Excel.
Ich wollte bewusst keine Urhezit und auch 08:15 mit der führenden Null war
nicht geplant. Dafür klappen bei mir 27:45 und es kommt nicht 3:45 raus
:-) denn mehr als diese Auskunft soll nicht erbracht werden: Soundsoviele
Stunden und Minuten (weil 1485 Minuten einfach zu unübersichtlich sind).
Wie man ggf. erkennt weise ich die Gesamtsumme der Minuten dennoch mit aus
- ob das nötig tut weiß ich im Augenblick gar nicht; mein
Übertragungsproblem hat dazwischengefunkt bevor die Datenausgabe in die
Finailisierung gehen konnte :-)
Post by Michael Schwimmer
Auch hier benutzt du wieder einen fehlerträchtigen Umweg
über eine Variable.
Weise der Zielzelle direkt einen Wert vom Typ Date zu und
formatiere die Zielzelle entsprechend.
With Worksheets(1).Cells(J + 1, 6)
.Value = k / 60 / 24
.NumberFormat = "[hh]:mm"
End With
Da die Zielzelle simpel Text ohne Format hatte sein brauchen [..?!?] habe
ich alte Erkenntnisse rekativiert und so Sunden + Minuten (Verzeihung:
Stunden & Minuten) mit dem Doppelpunkt dazwischen zusammengesetzt.
Wiederum ist die Hilfe nicht hilfreich weil ich nirgends ein Regel finde
wie ich mit den führendne Nullen umgehen müsste; und was die Eckigen
Klammern da sollen - wo (das wäre die Frage) wird das erklärt? Auf so was
kommt man nicht wenns keine instuktiven Beispiele gibt.
Post by Michael Schwimmer
Post by Eric March
ahbe geflucht damals weil es enfach nicht gelang
zu schreiben
WS("X").Range(AB)=WS("Y").Range(ST)
Es gabt immer die selbe Fehlermeldung
die ich vergessen habe. Nur mit der Variable gelang
der Transfer (in natürlich gleiche Zielberieche.
Was hindert dich daran, es noch einmal zu versuchen?
Aber diesmal bitte mit der richtigen Syntax. Diese Zeile
Post by Eric March
WS("X").Range(AB)=WS("Y").Range(ST)
ist natürlich völliger blödsinn!
Grmpf. Ich hatte etwas Zeitdruck und wollte nur auf eientlich verstehbare
Weinse rübergringen, dass ich Quell-Range so dierekt dem Ziel-Range
zuweisen wollte. die offizielle Zeile (siehe unten) wäre gewesen:
Worksheets("Begrüßungsblatt").Range(Cells(2, 1), Cells(3, 1)) =
Worksheets("statusblatt").Range(Cells(2, 1), Cells(3, 1))
Post by Michael Schwimmer
Lass dir die Anmerkungen von Thomas und mir noch einmal
durch den Kopf gehen und wenn du weitere Fragen hast,
kannst du diese gerne in die NG posten.
Einen Großteil davon habe ich schon mal umgestzt. Oder mehr hatte. Siehe
den netten Hinweis auf den Absturz; ich konnte nicht mal die Veränderunge
hier zitieren die ich mal erfolgreich probiert hatte.


Zum eigentlichen Problem: Ungelöst. Ich habe dann das ganze Baltt 3
markiert und in 2 reingeklebt. Siehe da, die Formatierung bleib wie ich es
wollte.
Wie kommt das alles? Ein Blatt hält die Vorgaben, das andere [die des
anderen] (8-ung) wird [werden] überschrieben.


Schlusakkord bezüglich Referenzieren:

In einem Modul, "Diese Arbeitmappe" oder dem Ziel-Arbeitsblatt:
Worksheets("BB").Cells(1, 1) = Worksheets("SB").Cells(1, 1) -> OK
Worksheets("BB").Range(Cells(2, 1)) = Worksheets("SB").Range(Cells(2, 1))
-> Error 1004
Worksheets("BB").Range(Cells(2, 1), Cells(3, 1)) =
Worksheets("").Range(Cells(2, 1)) -> Error 1004
Worksheets("BB").Range(Cells(2, 1), Cells(3, 1)) =
Worksheets("SB").Range(Cells(2, 1), Cells(3, 1)) -> Error 1004
Worksheets("BB").Range(Cells(2, 1), Cells(3, 1)) =
Worksheets("SB").Cells(2, 1) -> Nutzlos; Repetiert Quellzelle in alle
Zellen des Ziels
Worksheets("BB").Cells(2, 1) = Worksheets("SB").Range(Cells(2, 1),
Cells(3, 1)) -> Error 1004

In jedem anderen Arbeisblatt:
Worksheets("BB").Cells(1, 1) = Worksheets("SB").Cells(1, 1) -> OK
Worksheets("BB").Range(Cells(2, 1)) = Worksheets("SB").Range(Cells(2, 1))
-> Error 1004
Worksheets("BB").Range(Cells(2, 1), Cells(3, 1)) =
Worksheets("SB").Range(Cells(2, 1)) -> Error 1004
Worksheets("BB").Range(Cells(2, 1), Cells(3, 1)) =
Worksheets("SB").Range(Cells(2, 1), Cells(3, 1)) -> Error 1004
Worksheets("BB").Range(Cells(2, 1), Cells(3, 1)) =
Worksheets("SB").Cells(2, 1) -> Error 1004
Worksheets("BB").Cells(2, 1) = Worksheets("SB").Range(Cells(2, 1),
Cells(3, 1)) -> Error 1004

In der verblichenen Version musste ich micht einer zusätzlichen Variable
diesen Bereich (I ist eine Zählvariable die da Statusblatt abläuft, J ein
Zähler für das Ziel-Blatt, Eingang(0) ist ein wiederverwerteter String)
Worksheets("Statuslatt").Activate
Eingang(0) = Cells(I, 1)
Trans = Range(Cells(I, 2), Cells(I, 5))
Worksheets(Blatt).Activate
Cells(J, 1) = Eingang(0)
Range(Cells(J, 2), Cells(J, 5)) = Trans
in etwa so umstricken {Code aus der Hand getippt}:
With Worksheets("Statusblatt")

Eingang(0) = .Cells(I, 1)
Worksheets(Blatt).Cells(J, 1) = Eingang(0)
For L = 2 To 5
Worksheets(Blatt).Cells(J, L) = .Cells(I, 1)
Next
Das tat meine ich. Und ich könnte genau hier (nein eigentlich kann ich das
nicht so recht) die Formatierung zuweisen - aber die müsste dann ja in
einem String-Array vordefiniert sein dmait der Zähler die jeweils passende
erwischt. Da wäre mir schon ein Übertragen ohen Format (Offanbar ein
Variant-Problem, siehe die Verwendung von Eingang(0) wiel ich Spalte 1 da
rasgekoppelt hatte). Kann ich diese Übertagung in eine vorformatiete Zelle
bewerkstelligen, ohne dass _ungewollt_ die der Quellzelle mitgenommen
wird? (Originalformat analog zu oben zu übertragen wäre ja Penauts). In
die Kerbe fällt auch das Einlesen mit INPUT# [Line Input würde die ganze
Zeile erfassen, dann müsste ich akrobartisch die " und "," rausfummen,
Input liefert mir den nackten Inhalt - dafür muss ich mit der Zählschelife
losticken]. Kann ich die Input-Zielzelle ebeno behhandeln, vorformatiert,
ohnr dass Excel einfach so selber was zuweist?


Uff - schnluss für diesen Moment. ich will jetzt mal den Unfall
restaurieren und die Infos dort einfließen lassen
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Thomas Ramel
2004-10-30 13:03:04 UTC
Permalink
Grüezi Eric

Sodele, ich bin nun auch wieder hier.

Eric March schrieb am 29.10.2004
Post by Eric March
Am Fri, 29 Oct 2004 08:58:42 +0200 schrieb Michael Schwimmer
Post by Michael Schwimmer
Post by Eric March
Die Struktur ist IO. Punkt!
es ist normalerweise nicht meine Art, zu kritisieren, aber
deine Antworten auf die Hinweise von Thomas stoßen mir etwas
sauer auf. Mir kommt es definitiv so vor, als ob du keine Hilfe
akzeptieren willst.
OK. Warum kapiert dann - ich bin jezt mal so direkt - ihr Helfer nicht,
dass ihr am Ziel vorbieschießt?
Vielleicht wollen wir dir bloss auf die sanfte Art zeigen, dass es sich
lohnen könnte, das Ziel ein klein wenig zu verschieben....
Post by Eric March
Der selbe identische Code mit den selben, nur umsortierten, Daten (aber
das wäre egal, habe ich geprüft) bewirkt auf 2 Arbeitbpalttern
_unterschiedliche_ Darstelleungn, korrekter: die auf dem eine Blatt
bleiben wie von mir voreingestellt, die auf dem anderen werden verändert!
Dann werde ich nun ebenso direkt:
Wenn derselbe Coe bei unterschiedlichen Tabellenlbättern unterschielich
reagiert, dann ist die einzige Ursache in den Tabellenblättern selbst zu
suchen, sprich: Diese sind unterschiedlich formatiert!!
Post by Eric March
Ich habe keine Zeit (..!) für und auch überhaupt keine
Excel97-Enzyklopädie, ich kann mir nur die Hilfe antun und experimentieren.
Meine erste größere Aktion war eigntlich nur Daten zu verschieben bzw. zu
filtern / konvertieren. Da schon (vgl. ganz unten) habe ich von Excel
einen Tritt bekommen weil das Zuweisen so wie mir angeraten von mir selbst
instinktiv so versucht wurde nicht klappte.
Vielleicht wäre es angezeigt gewesen, schon dann in der NG nachzufragen?
Post by Eric March
Zum eigentlichen Problem: Ungelöst. Ich habe dann das ganze Baltt 3
markiert und in 2 reingeklebt. Siehe da, die Formatierung bleib wie ich es
wollte.
..was nun meine obige Aussage belegt, dass die Blätter unterschieldich
formatiert waren ;-)

Hier nun der (nicht komplett) überarbeitete und kommentierte Code, der das
von dir Gewünschte liefern dürfte.
Wie Du siehst, gehts mit direkten Zuweisungen doch ganz ordentlich:


Public Sub Sammeln(Name As String)
'Zuerst saubere Variablen-Definition
Dim Eingang(5) As String
Dim wsStat As Worksheet
Dim wsZiel As Worksheet
Dim I As Long
Dim J As Long
Dim K As Long
Dim Lauf As Integer
Dim dblSumme As Double

'Objekt-Vatiable setzen
Set wsStat = Worksheets("Statusblatt")

'Statusblatt vorbereiten
With wsStat
.Cells.ClearContents 'Inhalte löschen
.Cells.NumberFormat = "@" 'Format 'Text' einstellen

Open "C:\Dokumente und Einstellungen\XXXXXXXXX\Eigene Dateien" & _
"\Tabellen\Sammel " + Name + ".dat" For Input As #1

'Daten einlesen (unverändert)
I = 1
While Not EOF(1)
For J = 1 To 5
Input #1, Eingang(J)
.Cells(I, J) = Eingang(J)
Next
I = I + 1
Wend
Close 1

'Durchlauf für 2 Sortier-Vorgänge (soweit unverändert9
For Lauf = 2 To 3
Select Case Lauf
Case 2
'Objekt-Variable setzen anstelle reinem Namen
Set wsZiel = Worksheets(Name & "-Kunde")
Eingang(0) = "B1"
Case 3
'Objekt-Variable setzen anstelle reinem Namen
Set wsZiel = Worksheets(Name & "-Projekt")
Eingang(0) = "C1"
End Select

'Daten im Statusblatt sortieren
.Columns("A:E").Sort Key1:=.Range(Eingang(0)), Order1:=xlAscending

'Zielblatt vorbereiten
wsZiel.Cells.ClearContents 'Inhalte löschen
wsZiel.Cells.NumberFormat = "@" 'Format 'Text' einstellen

'Variablen setzen
I = 1 'Laufzeilen-Variable
K = 0 'Korrektur-Variable
dblSumme = 0 'Minuten-Summe

'Schleife, die alle zeilen durchläuft
Do
'Kopieren der aktuellen Zeile ins Zileblatt
.Cells(I, 1).Resize(1, 5).Copy wsZiel.Cells(I + K, 1)

'Summierung der Minuten (Umwandlung in Double)
dblSumme = dblSumme + CDbl(.Cells(I, 5))

'Wenn in sortierter Spalte ein anderer Wert folgt
If .Cells(I, Lauf) <> .Cells(I + 1, Lauf) Then

'Korrektur-Varible hochzählen
K = K + 1

'MinutenSumme eintragen
wsZiel.Cells(I + K, 5) = Format(dblSumme, "0")

'Minutensumme umformulieren und als Text eintragen
wsZiel.Cells(I + K, 6) = Int(dblSumme / 60) & ":" & _
Format(dblSumme Mod 60, "00")

'Korrektur-Varible hochzählen
K = K + 1

'Summenvarible zurücksetzen
dblSumme = 0
End If

'Laufvarible hochzählen
I = I + 1

'Abbruch wenn in Spalte A kein Wert mehr steht
Loop Until IsEmpty(.Cells(I, 1))
Next
End With
End Sub
--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win XP Pro SP-1 / xl2000 SP-3]
Eric March
2004-11-01 13:20:01 UTC
Permalink
Am Sat, 30 Oct 2004 15:03:04 +0200 schrieb Thomas Ramel <***@MVPs.org>:

Zuvor sei gesagt, dass das hier eine Büroproblem ist und ich am Wochenende
mal was Anderes vor hatte :-)
Post by Thomas Ramel
Grüezi Eric
Sodele, ich bin nun auch wieder hier.
Eric March schrieb am 29.10.2004
Post by Eric March
Am Fri, 29 Oct 2004 08:58:42 +0200 schrieb Michael Schwimmer
Post by Michael Schwimmer
Post by Eric March
Die Struktur ist IO. Punkt!
es ist normalerweise nicht meine Art, zu kritisieren, aber
deine Antworten auf die Hinweise von Thomas stoßen mir etwas
sauer auf. Mir kommt es definitiv so vor, als ob du keine Hilfe
akzeptieren willst.
OK. Warum kapiert dann - ich bin jezt mal so direkt - ihr Helfer nicht,
dass ihr am Ziel vorbieschießt?
Vielleicht wollen wir dir bloss auf die sanfte Art zeigen, dass es sich
lohnen könnte, das Ziel ein klein wenig zu verschieben....
Ich kann so wie so am Symptom doktern - aber was ich wissen will ist:
"Warum passiert das mal so und mal so?" Wo ist die Logik dieser
Eigenmächtigkeit? So betrachte kann ich mich auf nichts verlassen dass
einer Zelle ein Wert zugeweisen wird und dann stillschweigens & unerlaubt
ihr Format angepasst wird.
Post by Thomas Ramel
Post by Eric March
Der selbe identische Code mit den selben, nur umsortierten, Daten (aber
das wäre egal, habe ich geprüft) bewirkt auf 2 Arbeitsblättern
_unterschiedliche_ Darstelleungn, korrekter: die auf dem eine Blatt
bleiben wie von mir voreingestellt, die auf dem anderen werden verändert!
Wenn derselbe Coe bei unterschiedlichen Tabellenlbättern unterschielich
reagiert, dann ist die einzige Ursache in den Tabellenblättern selbst zu
suchen, sprich: Diese sind unterschiedlich formatiert!!
Faszinierend. So weit bin ich auch gekommen…
Also ganz langsam. Ich lasse das Makro laufen. Ich betrachte Blatt 3 und
bin zufrieden. Ich betrachte Blatt 2 und bin nicht zufrieden. Dann sehe
ich mir Blatt 3 an, welche Formatierungen ich "für die Spalten" gewählt
habe. Das merke ich mir. Nun gehe ich auf Blatt 2 und setzte die
Zellformate (per markeirter Spalte) auf das was auf Blatt 3 gegeben ist.
Blatt 2 sieht dann tatsächlich so aus wie Blatt 3. Nun starte ich das
Makro ernuet. Blatt 3 bleibt wie es war, Blatt 2 wurde von Excel nach
dessen Auffassung umformatiert.

Spannende Frage: Wieso geht das für Blatt 3 gut und bei 2 nicht? Da ist
nichts geschützt, gar nichts, Blatt 3 wurde damals wie 2 einfach als neues
Tabellenbaltt erstellt, formatiert und es war so wie ich wollte.
«Warum also dieses unterschiedliche Verhalten?» Mehr nicht und nicht
weniger will ich erklärt wissen.
Post by Thomas Ramel
Post by Eric March
Ich habe keine Zeit (..!) für und auch überhaupt keine
Excel97-Enzyklopädie, ich kann mir nur die Hilfe antun und
experimentieren.
Meine erste größere Aktion war eigntlich nur Daten zu verschieben bzw. zu
filtern / konvertieren. Da schon (vgl. ganz unten) habe ich von Excel
einen Tritt bekommen weil das Zuweisen so wie mir angeraten von mir selbst
instinktiv so versucht wurde nicht klappte.
Vielleicht wäre es angezeigt gewesen, schon dann in der NG nachzufragen?
Tjö… Bislang hatte eigentlich alles recht gut geklappt [jajaja, mein Code
war nicht der berühmteste] - ich habe erst dann Rauchzeichen gesandt als
ich nicht mehr weiter wusste und auch die Hilfe nichts rausspuckte was da
zutreffend war.
Und da meine Holzhammermethode mit den Transfer-Variant wenigstens klappte
- "Hilf dir slbst dann hilft dir Gates (oder so)".
Post by Thomas Ramel
Post by Eric March
Zum eigentlichen Problem: Ungelöst. Ich habe dann das ganze Baltt 3
markiert und in 2 reingeklebt. Siehe da, die Formatierung bleib wie ich es
wollte.
..was nun meine obige Aussage belegt, dass die Blätter unterschieldich
formatiert waren ;-)
Ja. Aber warum?
Post by Thomas Ramel
Hier nun der (nicht komplett) überarbeitete und kommentierte Code, der das
von dir Gewünschte liefern dürfte.
Public Sub Sammeln(Name As String)
'Zuerst saubere Variablen-Definition
Dim Eingang(5) As String
Dim wsStat As Worksheet
Dim wsZiel As Worksheet
Dim I As Long
Dim J As Long
Dim K As Long
Sollte nicht Integer reichen wenn ich nicht unbedingt 60.000 Aufträge
sammeln will?!
Post by Thomas Ramel
Dim Lauf As Integer
Dim dblSumme As Double
Hui - soooo viel arbeiten wolten wir aber nicht :-)))
Post by Thomas Ramel
'Objekt-Vatiable setzen
Set wsStat = Worksheets("Statusblatt")
'Statusblatt vorbereiten
With wsStat
.Cells.ClearContents 'Inhalte löschen
Das liefert zwar ein aufgzeichnetes Makro, aber in Beispielen bin ich
(analog Ranges zu Clearen oder Deleten) nicht auf diese varietät gestoßen.
Außerdem haut mir die Hilfe immer Range-Objekte um die Ohren. Die
Konstruktin Worksteets("X").Cells die das ganze Blatt erfasst ist für mich
sinnlos, da, wenn, gleich Worksheetes("X").ClearContents funktionieren
müsste.
Und woher bekomme ich din Info, dass der @ für das Format "Text" steht?
Wenigstens nicht von NumberFormat + F1…
Post by Thomas Ramel
Open "C:\Dokumente und Einstellungen\XXXXXXXXX\Eigene
Dateien\Tabellen\Sammel " + Name + ".dat" For Input As #1
'Daten einlesen (unverändert)
I = 1
While Not EOF(1)
For J = 1 To 5
Input #1, Eingang(J)
.Cells(I, J) = Eingang(J)
Next
I = I + 1
Wend
Close 1
REM Hier hatte ich mit den 5 einzelnen Eingängen noch was vor. Eine
einfache Vraiable ohne Index würde reichen.
Post by Thomas Ramel
'Durchlauf für 2 Sortier-Vorgänge (soweit unverändert)
For Lauf = 2 To 3
Select Case Lauf
Case 2
'Objekt-Variable setzen anstelle reinem Namen
Set wsZiel = Worksheets(Name & "-Kunde")
Eingang(0) = "B1"
Case 3
'Objekt-Variable setzen anstelle reinem Namen
Set wsZiel = Worksheets(Name & "-Projekt")
Eingang(0) = "C1"
End Select
REM Und hier missbrauche ich den zufällig übrig gebliebenen Eingang(0)
Post by Thomas Ramel
'Daten im Statusblatt sortieren
.Columns("A:E").Sort Key1:=.Range(Eingang(0)),
Order1:=xlAscending
'Zielblatt vorbereiten
wsZiel.Cells.ClearContents 'Inhalte löschen
Wieder dasselbe Dilemma von oben. Ein Cells das keien Logik ergibt und
dieser ominöse @ den ich nicht mal mit Debug.Print(Cells(1,1).NumberFormat
angezeigt bekomme auch wenn ich Zellen entsprechend formatiere. Wenigstens
habe ich rausbekommen was General ist…
Wo findet man nur Aufstellungen bzw. Regeln für diese Sorte
"Zustandsbeschreibungen"???
Post by Thomas Ramel
'Variablen setzen
I = 1 'Laufzeilen-Variable
K = 0 'Korrektur-Variable
dblSumme = 0 'Minuten-Summe
'Schleife, die alle zeilen durchläuft
Do
'Kopieren der aktuellen Zeile ins Zileblatt
.Cells(I, 1).Resize(1, 5).Copy wsZiel.Cells(I + K, 1)
??? Was tut da das Resisze? Nach der Hilfe hat esetws mit "Größe des
Diagramms" zu tun - Größe wovon, Fläche? Wertebereich? Dazu sagt die Hilfe
nichts. Und Das Copy ist mir auch nicht geheuer. Zwischenablage? Oder was
tut VBA hier genaues?
Post by Thomas Ramel
'Summierung der Minuten (Umwandlung in Double)
dblSumme = dblSumme + CDbl(.Cells(I, 5))
Das CDbl macht mir Sorgen. Warum ist/wäre es erforderlich, wenn Spalte 5
Zellen in Standard oder z.B. "#" formatiert hat? Ich verstehe das als eine
Hilfskrücke die macn braucht weil man sich auf die Quelle nicht verlassen
kann. Offenbar ist genau das(Formate der Quellen) mein großes Problem.
Post by Thomas Ramel
'Wenn in sortierter Spalte ein anderer Wert folgt
If .Cells(I, Lauf) <> .Cells(I + 1, Lauf) Then
'Korrektur-Varible hochzählen
K = K + 1
Müsste eigentlich mehr L statt K heißen; LeerZeilenLass-Varibale :-)
Post by Thomas Ramel
'MinutenSumme eintragen
wsZiel.Cells(I + K, 5) = Format(dblSumme, "0")
Mir nicht schlüssig. Wiederum sollte die Zeilspalte vorformatiert sein &
bleiben. Wo ist da nun wieder dr zählbare Uterschied eine Zelle mit
NumberForamt vorzuberieten und ihr einen Wert zuzuweisen? Oder geht das
hier in einem Rutsch? Die Hilfe zu FORMAT jedenfalls gab da nichts
Brauchbares her.
Post by Thomas Ramel
'Minutensumme umformulieren und als Text eintragen
wsZiel.Cells(I + K, 6) = Int(dblSumme / 60) & ":" &
Format(dblSumme Mod 60, "00")
Ich hatte hier [rein mathematisch] (K \ 60) & ":" & (K Mod 60) als Lösung
ausgemacht
Zudem - was überzeugt Excel davon, nicht die Konstruktion 5:53 als 05:35,
sprich hh:mm, zu interpretieren wenn die Zielzelle nicht so verobereitet
ist ([h]:mm) resprektive das zu überschreiben?
Post by Thomas Ramel
'Korrektur-Varible hochzählen
K = K + 1
'Summenvarible zurücksetzen
dblSumme = 0
End If
'Laufvarible hochzählen
I = I + 1
'Abbruch wenn in Spalte A kein Wert mehr steht
Loop Until IsEmpty(.Cells(I, 1))
Noch so eine Funktion bie der ich Buachweh bekomme. Until cells(I,1)=""
ist logisch dasselbe, aber nin - für alles unmöglich scheints Funktionen
zu geben, für das Mögliche offenbar nicht ["For Each Cells.value
IsNotEmpty in 'Range'" - wie oft muss man eine Spalte auswerten und kreigt
nie genau raus wo sie zuende ist?? Das wäre mal was Sinnvolles!]
Post by Thomas Ramel
Next
End With
End Sub
Estmal vielen Dank für die Mühe um den Code. Ich habe am Wochende doch
noch etwas Rumgebastelt. Und mit einem aktivierten Worksheet (aus dem
Workbook_Open Makro heraus) fummelte ich das hier zusammen, Aufruf wie
gehabt als Sammeln("Name"):

Public Sub Sammeln(Name)
Dim Eingang As String
Dim Lauf As Integer
Dim LaufSpalte As String
Dim Blatt As String
Dim I As Integer
Dim J As Integer
Dim K As Integer
Dim L As Integer

Open "C:\Eigene Dateien\Excel\Sammel " + Name + ".dat" For Input As #1
I = 0
Do While Not EOF(1)
I = I + 1
For J = 1 To 5
Input #1, Eingang
Cells(I, J) = Eingang
Select Case (J)
Case 1: Cells(I, J).NumberFormat = "YYYY-MM-DD"
Case 2, 3, 4: Cells(I, J).NumberFormat = "General"
Case 5: Cells(I, J).NumberFormat = "#"
End Select
Next
Loop
Close 1
--> Hier stellt sich die Frage ob dieses Vorbereiten des Formats beim
Einlesen überhaupt sinnvoll ist oder "nur" der Optik dient wenn man das
(aktivierte) Statublatt sichtet?!?
Plan ist, ein Format festzulegen und es dann später zu übertragen.

For Lauf = 2 To 3
Select Case Lauf
Case 2
Blatt = Name & "-Kunde"
LaufSpalte = "B1"
Case 3
Blatt = Name & "-Projekt"
LaufSpalte = "C1"
End Select
Columns("A:E").Sort Key1:=Range(LaufSpalte), Order1:=xlAscending
--> Könnte man wohl abscheiden :-) , Header:=xlGuess, OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom
Worksheets(Blatt).Range(Worksheets(Blatt).Cells(1, 1),
Worksheets(Blatt).Cells(500, 6)).Clear
--> Warum ich hier nur eine Bereich gezielt lösche? Vielleicht eine dumme
Angewohnheit existente Arrays zu initialisieren.
Worksheets(Blatt).Cells.ClearContents sollte dasselebe Resultat bringen.
J = 1: K = 0
For I = 1 To Range("A65536").End(xlUp).Row
--> Den hatte ich so mal aufgeschnappt. Mir war das Abklappern bis =""
bzw. IsEmpty zu blöde, vor allem, weil ich (immer noch auf FOR/NEXT
eingeschossen) gerne die echten Ober- und Untergrenzen hätte und nicht
immer wieder 1 abziehen mag.
For L = 1 To 5
Worksheets(Blatt).Cells(J, L) = Cells(I, L)
Worksheets(Blatt).Cells(J, L).NumberFormat = Cells(I, L).NumberFormat
--> Tja - das war eigentlich meine Lösungsidee: Formate vorgeben und dann
draufdrücken.
Next
K = K + Val(Cells(I, 5))
--> Da mich mich auf die Quelle verlassen kann nur Zahlen zu bekommen
meine ich reicht diese Einfachlösung doch?
If Cells(I, Lauf) <> Cells(I + 1, Lauf) Then
--> Hier griffe die "Korrektur" von oben; eigentlich wird nur eine
Zustaztzeile eingebracht die die Minutensumme hält und dann eine Leerzeile
der Optik halber eingstreut.
Worksheets(Blatt).Cells(J + 1, 5) = K
Worksheets(Blatt).Cells(J + 1, 6) = Trim(Str(K \ 60)) & ":" & Right("0"
& Trim(Str(K Mod 60)), 2)
Worksheets(Blatt).Cells(J + 1, 6).NumberFormat = "[h]:mm"
--> Effektiv ärgert mich diese [Notwendigkeit der] Zuweisung in 2 Stufen
schon mächtig da ich mich nicht darauf verlassen kann, dass ein
vorhandenes Format benutzt und nicht verändert wird…
J = J + 2
K = 0
End If
J = J + 1
Next
Next
End Sub


OK. Jetzt muss ich mal weiterwurschteln; ich hoffe sehr, dass wenigstsn
diese Auswertungsmappe die Änderungen die mein Chef erdachte überlebt.
Immerhin habe ich das eine oder andere gelernt. Und das müsste wichtiger
sein!
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Thomas Ramel
2004-11-01 14:03:56 UTC
Permalink
Grüezi Eric

Für mich hier der nun voröäufig letzte Beitrag zum Thread

Eric March schrieb am 01.11.2004
Post by Eric March
Post by Thomas Ramel
Vielleicht wollen wir dir bloss auf die sanfte Art zeigen, dass es sich
lohnen könnte, das Ziel ein klein wenig zu verschieben....
"Warum passiert das mal so und mal so?" Wo ist die Logik dieser
Eigenmächtigkeit? So betrachte kann ich mich auf nichts verlassen dass
einer Zelle ein Wert zugeweisen wird und dann stillschweigens & unerlaubt
ihr Format angepasst wird.
Wie schon mehrfach gesagt - im format 'Standard' 'denkt' Excel mit und beim
Variabltentyp 'Variant' ebenso.
Dies kannst Du nur umgehen, indem Du das Format selbst exakt defninierst.
Post by Eric March
Post by Thomas Ramel
Wenn derselbe Coe bei unterschiedlichen Tabellenlbättern unterschielich
reagiert, dann ist die einzige Ursache in den Tabellenblättern selbst zu
suchen, sprich: Diese sind unterschiedlich formatiert!!
Faszinierend. So weit bin ich auch gekommen…
Bitte behalte deinen Sarkasmus für dich, ja!
Post by Eric March
Spannende Frage: Wieso geht das für Blatt 3 gut und bei 2 nicht? Da ist
nichts geschützt, gar nichts, Blatt 3 wurde damals wie 2 einfach als neues
Tabellenbaltt erstellt, formatiert und es war so wie ich wollte.
«Warum also dieses unterschiedliche Verhalten?» Mehr nicht und nicht
weniger will ich erklärt wissen.
Das eine Blatt (Nr 3) war offenbar als 'Text' formatiert, das andere
zumindest teilweise als 'Standard' - so einfach kann (und muss) es sein....
Post by Eric March
Post by Thomas Ramel
Post by Eric March
Zum eigentlichen Problem: Ungelöst. Ich habe dann das ganze Baltt 3
markiert und in 2 reingeklebt. Siehe da, die Formatierung bleib wie ich
es wollte.
..was nun meine obige Aussage belegt, dass die Blätter unterschieldich
formatiert waren ;-)
Ja. Aber warum?
Weil Du es (irgendwann) mal so formatiert hast.
Post by Eric March
Post by Thomas Ramel
Hier nun der (nicht komplett) überarbeitete und kommentierte Code, der das
von dir Gewünschte liefern dürfte.
Public Sub Sammeln(Name As String)
'Zuerst saubere Variablen-Definition
Dim Eingang(5) As String
Dim wsStat As Worksheet
Dim wsZiel As Worksheet
Dim I As Long
Dim J As Long
Dim K As Long
Sollte nicht Integer reichen wenn ich nicht unbedingt 60.000 Aufträge
sammeln will?!
Das kann ich ja nicht wissen; Du stellst keine Infos über Grösse und Umfang
deiner Daten bereit.

Ich lege Variablen die auf zeilen zugreifen grundsälich als 'Long' fest,
dann bin ich auch bei Erweitrungen vor einem Überlauf gefeit.
Post by Eric March
Post by Thomas Ramel
Dim Lauf As Integer
Dim dblSumme As Double
Hui - soooo viel arbeiten wolten wir aber nicht :-)))
Das ist auch weniger wegen der Grösse, sondern eher wegen der
Genauigkeit....
Post by Eric March
Post by Thomas Ramel
'Objekt-Vatiable setzen
Set wsStat = Worksheets("Statusblatt")
'Statusblatt vorbereiten
With wsStat
.Cells.ClearContents 'Inhalte löschen
Das liefert zwar ein aufgzeichnetes Makro, aber in Beispielen bin ich
(analog Ranges zu Clearen oder Deleten) nicht auf diese varietät gestoßen.
...was nicht heissen will, dass es nicht auch eine Methode des
Range-Objektes ist.
Post by Eric March
Außerdem haut mir die Hilfe immer Range-Objekte um die Ohren. Die
Konstruktin Worksteets("X").Cells die das ganze Blatt erfasst ist für mich
sinnlos, da, wenn, gleich Worksheetes("X").ClearContents funktionieren
müsste.
Funktioniert es denn?
Die Zeile beansprucht nicht, das Non-plus-Ultra zu sein, sondern es wird
lediglich der gesamte Inhalt der zellen gelöscht, ohne das Format
anzutasten.
Es gibt auch hier mehrere Wege - ich habe einfach einen gewählt.
Post by Eric March
Wenigstens nicht von NumberFormat + F1…
Das Stichwort in der Online-Hilfe zu Excel (nicht Excel-VBA) lautet
'Zahlenformat' - dort findest Du dann mehr als genug Infos.
Eine Alternative ist auch der Makro-Recorder während Du eine Zelle als Text
formatierst.....

Hier geht es lediglich darum das Text-Format vorzugeben, um deine in der
Quell-Datei vorgegebenen Werte nicht umformatieren zu lassen.
Post by Eric March
Post by Thomas Ramel
'Variablen setzen
I = 1 'Laufzeilen-Variable
K = 0 'Korrektur-Variable
dblSumme = 0 'Minuten-Summe
'Schleife, die alle zeilen durchläuft
Do
'Kopieren der aktuellen Zeile ins Zileblatt
.Cells(I, 1).Resize(1, 5).Copy wsZiel.Cells(I + K, 1)
??? Was tut da das Resisze? Nach der Hilfe hat esetws mit "Größe des
Diagramms" zu tun - Größe wovon, Fläche? Wertebereich? Dazu sagt die Hilfe
nichts.
Ich weiss nun nicht war für eine Hilfe du hast; meine dagt dazu folgendes:

"Ändert die Größe des angegebenen Bereichs. Gibt ein Range-Objekt zurück,
das den geänderten Bereich darstellt."
Post by Eric March
Und Das Copy ist mir auch nicht geheuer. Zwischenablage? Oder was
tut VBA hier genaues?
Copy geht über die Zwischenablage - ja. Doch die dürfte innerhalb von Excel
nun ja wirklich kein Problem darstellen.
Post by Eric March
Post by Thomas Ramel
'Summierung der Minuten (Umwandlung in Double)
dblSumme = dblSumme + CDbl(.Cells(I, 5))
Das CDbl macht mir Sorgen. Warum ist/wäre es erforderlich, wenn Spalte 5
Zellen in Standard oder z.B. "#" formatiert hat? Ich verstehe das als eine
Hilfskrücke die macn braucht weil man sich auf die Quelle nicht verlassen
kann. Offenbar ist genau das(Formate der Quellen) mein großes Problem.
Ja, Du bist auf der richtigen Spur!
Da wir alles als 'Text' vorformatiert und daher auch so in den zellen
stehen haben, müssen wir halt eine saubere Umrechung vornehmen, welche
unter anderem mit CDbl() gemacht werden kann....
Post by Eric March
Post by Thomas Ramel
'Wenn in sortierter Spalte ein anderer Wert folgt
If .Cells(I, Lauf) <> .Cells(I + 1, Lauf) Then
'Korrektur-Varible hochzählen
K = K + 1
Müsste eigentlich mehr L statt K heißen; LeerZeilenLass-Varibale :-)
Ich hab halt genommen, was da schon vorhanden war.... ;-)
Post by Eric March
Post by Thomas Ramel
'MinutenSumme eintragen
wsZiel.Cells(I + K, 5) = Format(dblSumme, "0")
Mir nicht schlüssig. Wiederum sollte die Zeilspalte vorformatiert sein &
bleiben. Wo ist da nun wieder dr zählbare Uterschied eine Zelle mit
NumberForamt vorzuberieten und ihr einen Wert zuzuweisen? Oder geht das
hier in einem Rutsch? Die Hilfe zu FORMAT jedenfalls gab da nichts
Brauchbares her.
Du kannst gerne auch anderes ausprobieren....
....ich bina auf diese Weise aber sicher, dass ich einen formatierten Text
in die Zelle schreibe, dessen Aussehen ich bestimme.
Post by Eric March
Post by Thomas Ramel
'Minutensumme umformulieren und als Text eintragen
wsZiel.Cells(I + K, 6) = Int(dblSumme / 60) & ":" &
Format(dblSumme Mod 60, "00")
Zudem - was überzeugt Excel davon, nicht die Konstruktion 5:53 als 05:35,
sprich hh:mm, zu interpretieren wenn die Zielzelle nicht so verobereitet
ist ([h]:mm) resprektive das zu überschreiben?
Das Textformat mit dem die Zelle zuvor formatiert wurde und der String den
wir in der Zeile zusammenstzen - die passen ganz gut zusammen ;-)

(Mit den Zahlenformaten wolltest Du ja partout nicht arbeiten; das wäre
aber viel einfacher gewesen...)
Post by Eric March
Post by Thomas Ramel
'Korrektur-Varible hochzählen
K = K + 1
'Summenvarible zurücksetzen
dblSumme = 0
End If
'Laufvarible hochzählen
I = I + 1
'Abbruch wenn in Spalte A kein Wert mehr steht
Loop Until IsEmpty(.Cells(I, 1))
Noch so eine Funktion bie der ich Buachweh bekomme. Until cells(I,1)=""
ist logisch dasselbe, aber nin - für alles unmöglich scheints Funktionen
zu geben, für das Mögliche offenbar nicht ["For Each Cells.value
IsNotEmpty in 'Range'" - wie oft muss man eine Spalte auswerten und kreigt
nie genau raus wo sie zuende ist?? Das wäre mal was Sinnvolles!]
Es steht dir frei eine solche Funktoin zu programmieren und dann hier zur
Verfügung zu stellen.....
Post by Eric March
Post by Thomas Ramel
Next
End With
End Sub
Estmal vielen Dank für die Mühe um den Code.
Hast Du ihn ausprobiert?
Entspricht das Ergebnis (optisch) deinen Vorstellungen?
Post by Eric March
Ich habe am Wochende doch
noch etwas Rumgebastelt. Und mit einem aktivierten Worksheet (aus dem
Workbook_Open Makro heraus) fummelte ich das hier zusammen, Aufruf wie
Public Sub Sammeln(Name)
Dim Eingang As String
Dim Lauf As Integer
Dim LaufSpalte As String
Dim Blatt As String
Dim I As Integer
Dim J As Integer
Dim K As Integer
Dim L As Integer
Open "C:\Eigene Dateien\Excel\Sammel " + Name + ".dat" For Input As #1
Hmmm, wieder einen String mit '+' zusammengebaut?
Michael hatt IMO bereits darauf hingewiesen, dass der String-Operator das
'&' ist....
Post by Eric March
I = 0
Do While Not EOF(1)
I = I + 1
For J = 1 To 5
Input #1, Eingang
Cells(I, J) = Eingang
Select Case (J)
Case 1: Cells(I, J).NumberFormat = "YYYY-MM-DD"
Case 2, 3, 4: Cells(I, J).NumberFormat = "General"
Case 5: Cells(I, J).NumberFormat = "#"
End Select
Next
Loop
Close 1
--> Hier stellt sich die Frage ob dieses Vorbereiten des Formats beim
Einlesen überhaupt sinnvoll ist oder "nur" der Optik dient wenn man das
(aktivierte) Statublatt sichtet?!?
Plan ist, ein Format festzulegen und es dann später zu übertragen.
Ich stelle fest: Du hast Freude an den Zahlenformaten gefunden ;-)

Wenn Du weisst, welche Spalte(n) welches Format erhalten sollen, dan
formatiere einmas zu Beginn die gesamte(n) Spalte(n) - das geht einiges
schneller.
Post by Eric March
For Lauf = 2 To 3
Select Case Lauf
Case 2
Blatt = Name & "-Kunde"
LaufSpalte = "B1"
Case 3
Blatt = Name & "-Projekt"
LaufSpalte = "C1"
End Select
Columns("A:E").Sort Key1:=Range(LaufSpalte), Order1:=xlAscending
--> Könnte man wohl abscheiden :-) , Header:=xlGuess, OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom
Worksheets(Blatt).Range(Worksheets(Blatt).Cells(1, 1),
Worksheets(Blatt).Cells(500, 6)).Clear
--> Warum ich hier nur eine Bereich gezielt lösche? Vielleicht eine dumme
Angewohnheit existente Arrays zu initialisieren.
Worksheets(Blatt).Cells.ClearContents sollte dasselebe Resultat bringen.
J = 1: K = 0
For I = 1 To Range("A65536").End(xlUp).Row
--> Den hatte ich so mal aufgeschnappt. Mir war das Abklappern bis =""
bzw. IsEmpty zu blöde, vor allem, weil ich (immer noch auf FOR/NEXT
eingeschossen) gerne die echten Ober- und Untergrenzen hätte und nicht
immer wieder 1 abziehen mag.
For L = 1 To 5
Worksheets(Blatt).Cells(J, L) = Cells(I, L)
Worksheets(Blatt).Cells(J, L).NumberFormat = Cells(I, L).NumberFormat
--> Tja - das war eigentlich meine Lösungsidee: Formate vorgeben und dann
draufdrücken.
Next
K = K + Val(Cells(I, 5))
--> Da mich mich auf die Quelle verlassen kann nur Zahlen zu bekommen
meine ich reicht diese Einfachlösung doch?
If Cells(I, Lauf) <> Cells(I + 1, Lauf) Then
--> Hier griffe die "Korrektur" von oben; eigentlich wird nur eine
Zustaztzeile eingebracht die die Minutensumme hält und dann eine Leerzeile
der Optik halber eingstreut.
Worksheets(Blatt).Cells(J + 1, 5) = K
Worksheets(Blatt).Cells(J + 1, 6) = Trim(Str(K \ 60)) & ":" & Right("0"
& Trim(Str(K Mod 60)), 2)
Worksheets(Blatt).Cells(J + 1, 6).NumberFormat = "[h]:mm"
--> Effektiv ärgert mich diese [Notwendigkeit der] Zuweisung in 2 Stufen
schon mächtig da ich mich nicht darauf verlassen kann, dass ein
vorhandenes Format benutzt und nicht verändert wird…
Tja, wenn Du der Zelle einen Sting zuweist, darfst Du dich nicht wundern,
wenn Excel die Zelle auch als Text formatiert; Du erzwingst es ja
letztendlich selbst....
Wenn Du mit reinen Zahlen arbeitest, braucht es kenien String für die
Darstellung im Zeitformat folgendes klappt ohne erneutes Zuweisen eines
Formates ;-)

Worksheets(Blatt).Cells(J + 1, 6) = K/1440
Post by Eric March
J = J + 2
K = 0
End If
J = J + 1
Next
Next
End Sub
OK. Jetzt muss ich mal weiterwurschteln; ich hoffe sehr, dass wenigstsn
diese Auswertungsmappe die Änderungen die mein Chef erdachte überlebt.
Immerhin habe ich das eine oder andere gelernt. Und das müsste wichtiger
sein!
Das ist auch der Gedanke der NG hier - es freut uns, wenn dieses Ziel
einmal mehr erreicht worden ist.
--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win XP Pro SP-1 / xl2000 SP-3]
Michael Zimmermann
2004-11-01 15:32:28 UTC
Permalink
Hallo!
Post by Thomas Ramel
Post by Eric March
Sollte nicht Integer reichen wenn ich nicht unbedingt
60.000 Aufträge sammeln will?!
Das kann ich ja nicht wissen; Du stellst keine Infos über
Grösse und Umfang deiner Daten bereit.
Ich lege Variablen die auf zeilen zugreifen grundsälich
als 'Long' fest, dann bin ich auch bei Erweitrungen vor
einem Überlauf gefeit.
Hinweis: Da der Prozessor Long besser unterstützt als
Integer, gibt es für letzteren eh keinen sinnvollen Grund,
außer man wollte Zahlen > 32767 verhindern.

Gruß aus Mainz
Michael
Eric March
2004-11-02 13:10:22 UTC
Permalink
Am Mon, 1 Nov 2004 16:32:28 +0100 schrieb Michael Zimmermann
Post by Michael Zimmermann
Hallo!
Post by Thomas Ramel
Post by Eric March
Sollte nicht Integer reichen wenn ich nicht unbedingt
60.000 Aufträge sammeln will?!
Das kann ich ja nicht wissen; Du stellst keine Infos über
Grösse und Umfang deiner Daten bereit.
Ich lege Variablen die auf zeilen zugreifen grundsälich
als 'Long' fest, dann bin ich auch bei Erweitrungen vor
einem Überlauf gefeit.
Hinweis: Da der Prozessor Long besser unterstützt als
Integer, gibt es für letzteren eh keinen sinnvollen Grund,
außer man wollte Zahlen > 32767 verhindern.
Gruß aus Mainz
Michael
Das muss einem auch (ein)mal gesagt werden… :-)
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Eric March
2004-11-02 14:13:15 UTC
Permalink
Post by Thomas Ramel
Grüezi Eric
Ich setze mal die Schere an…
Post by Thomas Ramel
Post by Eric March
So betrachte kann ich mich auf nichts verlassen dass
einer Zelle ein Wert zugeweisen wird und dann stillschweigens & unerlaubt
ihr Format angepasst wird.
Wie schon mehrfach gesagt - im format 'Standard' 'denkt' Excel mit und
beim Variabltentyp 'Variant' ebenso.
Dies kannst Du nur umgehen, indem Du das Format selbst exakt defninierst.
Wo? Vorher in der Zelle? Oder während der Übertragung (vor dem
Werte-Schreiben oder danach)?
Post by Thomas Ramel
Post by Eric March
…sprich: Diese sind unterschiedlich formatiert!!
Faszinierend. So weit bin ich auch gekommen…
Bitte behalte deinen Sarkasmus für dich, ja!
Dann behalte du bitte für dich mir Dinge zu sagen die ich weiß. :-(
Die Frage war auch nicht _ob_ da etwas unterschiedlich formatiert ist -
sondern warum nach gewissen Foramtierungsmßnahmen die einmal erfolgreich
enden und imn anderen Falle nicht so ein durcheinander passiert.
_Wo_ist_ der Unterschied? Wo können sich solche Blääter unterscheiden um
_grundsätzlich_ diese unterschiedliche Verhalten zu begründen? Warum
überschreibt Excel einmal eine nachträgelich genänderte Formatierung nach
eingne Vorstellunge während die an andere Stelle unverändert bleibt?
Post by Thomas Ramel
Post by Eric March
Spannende Frage: Wieso geht das für Blatt 3 gut und bei 2 nicht? Da ist
nichts geschützt, gar nichts, Blatt 3 wurde damals wie 2 einfach als neues
Tabellenbaltt erstellt, formatiert und es war so wie ich wollte.
«Warum also dieses unterschiedliche Verhalten?» Mehr nicht und nicht
weniger will ich erklärt wissen.
Das eine Blatt (Nr 3) war offenbar als 'Text' formatiert, das andere
zumindest teilweise als 'Standard' - so einfach kann (und muss) es sein....
Wäre es so einfahc wäre es mir aufgefallen.

Sage mir wo ich irre:
Ich erstelle ein neues Blatt und habe eine altes. Die relevanten Spalten
(und nur die) markiere ich (Doppleklick Spaltenkopf) (nach dne Vorlagen
des alten) und lege die Formate fest. Das Makro läässt das alte Blatt in
Ruhe und revidiert das neue.
Muss ich irgenwie zeurst alle Zellen erfassen und einmal formatieren bevor
ich ändern darf?
Post by Thomas Ramel
Post by Eric March
..was nun meine obige Aussage belegt, dass die Blätter unterschieldich
formatiert waren ;-)
Ja. Aber warum?
Weil Du es (irgendwann) mal so formatiert hast.
Ich habe ex x-mal anders so formatiert wie es sein soll. Warum würde das
nicht fest übernommen? Wenns eine alte Formatirung gäbe, warum kommt die
zum Vorschein, wie ändere ich sie?
Post by Thomas Ramel
Post by Eric March
Dim K As Long
Sollte nicht Integer reichen wenn ich nicht unbedingt 60.000 Aufträge
sammeln will?!
Das kann ich ja nicht wissen; Du stellst keine Infos über Grösse und Umfang
deiner Daten bereit.
Ich lege Variablen die auf zeilen zugreifen grundsälich als 'Long' fest,
dann bin ich auch bei Erweitrungen vor einem Überlauf gefeit.
:-) Ich hab mittlerweile eine andere Begründung für LONG gelesen, aber da
Excel eh bei 65535 aufhört was faktisch 2x INTEGER ist sähe ich das nicht
als unbedingten Zwang an LONG zu verwenden da ich so eng planen muss, dass
mir das Blatt slebst nicht überläuft. INTEGER muss wohl eine Gewohnheit
für einfach Zählbereiche sein da sosnt eignetlich schon REAL (DOUBLE) käme
weils mathematisch würde.
Post by Thomas Ramel
Post by Eric March
Dim Lauf As Integer
Dim dblSumme As Double
Hui - soooo viel arbeiten wolten wir aber nicht :-)))
Das ist auch weniger wegen der Grösse, sondern eher wegen der
Genauigkeit....
Öh - ganze Minuten die einkommen sollte eigentlich als Integer zufrieden
sein :-)
Post by Thomas Ramel
Post by Eric March
'Objekt-Vatiable setzen
Set wsStat = Worksheets("Statusblatt")
'Statusblatt vorbereiten
With wsStat
.Cells.ClearContents 'Inhalte löschen
Das liefert zwar ein aufgzeichnetes Makro, aber in Beispielen bin ich
(analog Ranges zu Clearen oder Deleten) nicht auf diese varietät gestoßen.
...was nicht heissen will, dass es nicht auch eine Methode des
Range-Objektes ist.
-sprachlos- Mal ists eine Methode, dann nicht… Ich verleire da die
Übersicht. :-)
Post by Thomas Ramel
Post by Eric March
Außerdem haut mir die Hilfe immer Range-Objekte um die Ohren. Die
Konstruktin Worksteets("X").Cells die das ganze Blatt erfasst ist für mich
sinnlos, da, wenn, gleich Worksheetes("X").ClearContents funktionieren
müsste.
Funktioniert es denn?
Die Zeile beansprucht nicht, das Non-plus-Ultra zu sein, sondern es wird
lediglich der gesamte Inhalt der zellen gelöscht, ohne das Format
anzutasten.
Es gibt auch hier mehrere Wege - ich habe einfach einen gewählt.
Ich sehe den Nutzen nicht das Format anzutasten (meine Hintergedanke war,
obwohl nicht schalgkräftig, nicht dasn gnaze Blatt zu putzen sondern nur
einen bestimmten Bereich - bloß ist ausßerhalb desselben nichts mehr los…)
(Worksheetes("X").ClearContents - natürlich unterstützt das Objekt die
Methode nicht…)
Post by Thomas Ramel
Post by Eric March
Wenigstens nicht von NumberFormat + F1…
Das Stichwort in der Online-Hilfe zu Excel (nicht Excel-VBA) lautet
'Zahlenformat' - dort findest Du dann mehr als genug Infos.
Wenn ich die Klammer (oder mehr Albert) dsmait füttere kommt zwar was
raus, aber nicht die Liste die ich wollte…
Post by Thomas Ramel
Eine Alternative ist auch der Makro-Recorder während Du eine Zelle als
Text formatierst.....
Aber eine von der Sorte bei der einem ehrlich die Zehnägel hochklappen
müssen - durch so eine Hintertür diese Infos zu beschaffen… Das
diskreditiert die Hilfe total.
Post by Thomas Ramel
Hier geht es lediglich darum das Text-Format vorzugeben, um deine in der
Quell-Datei vorgegebenen Werte nicht umformatieren zu lassen.
Tja - wenn ich das aufzeichne kriege ich einen Weg gezeigt. Warum kann ich
das aber nicht genauso effektiv manuell erreichen? Oder mehr: Wenn ich den
manuellen Weg aufzeichne und wieder abbilee - warum sollte der manuelle
Weg versagen, seine Abbildung aber Erfolg zeichnen?
Post by Thomas Ramel
Post by Eric March
'Variablen setzen
I = 1 'Laufzeilen-Variable
K = 0 'Korrektur-Variable
dblSumme = 0 'Minuten-Summe
'Schleife, die alle zeilen durchläuft
Do
'Kopieren der aktuellen Zeile ins Zileblatt
.Cells(I, 1).Resize(1, 5).Copy wsZiel.Cells(I + K, 1)
??? Was tut da das Resisze? Nach der Hilfe hat esetws mit "Größe des
Diagramms" zu tun - Größe wovon, Fläche? Wertebereich? Dazu sagt die Hilfe
nichts.
F1… :-(
Post by Thomas Ramel
"Ändert die Größe des angegebenen Bereichs. Gibt ein Range-Objekt zurück,
das den geänderten Bereich darstellt."
Das ist Eine von den Hilfen die ich offen gesagt nicht kapiere. Warum
sollte ich mit Resize etwas verändern wenn die Quelle eine einzige Zelle
ist? Und _was_ wird denn vergrößert; wo ist der Anker, was war das Vorher,
welches Hinterher soll rauskommen?
Post by Thomas Ramel
Post by Eric March
Und Das Copy ist mir auch nicht geheuer. Zwischenablage? Oder was
tut VBA hier genaues?
Copy geht über die Zwischenablage - ja. Doch die dürfte innerhalb von Excel
nun ja wirklich kein Problem darstellen.
Wenn ich experiemntiere, oder mal von außerhalb was anderes darin habe und
Excel zwischehdrin beeutze, fände ich es nicht erbaulich wenn mir das
verloren geht.
Post by Thomas Ramel
Post by Eric March
'Summierung der Minuten (Umwandlung in Double)
dblSumme = dblSumme + CDbl(.Cells(I, 5))
Das CDbl macht mir Sorgen. Warum ist/wäre es erforderlich, wenn Spalte 5
Zellen in Standard oder z.B. "#" formatiert hat? Ich verstehe das als eine
Hilfskrücke die macn braucht weil man sich auf die Quelle nicht verlassen
kann. Offenbar ist genau das(Formate der Quellen) mein großes Problem.
Ja, Du bist auf der richtigen Spur!
Da wir alles als 'Text' vorformatiert und daher auch so in den zellen
stehen haben, müssen wir halt eine saubere Umrechung vornehmen, welche
unter anderem mit CDbl() gemacht werden kann....
Goldene Frage: Warum kann ich zu Fuß ein Blatt vormatieren wie ichs will
und jedes Makro das Werte einbringe pfuscht mir dazwischen? Das hieße im
Makro immer erst das Format des Ziels erfragen, kopieren und das gemerkte
Format draufzudrücken. 3 Schritte die als ein Einzelvorgang auch nur
Bruchteil eins Gesamtzuges sein sollten…
Post by Thomas Ramel
Post by Eric March
'Wenn in sortierter Spalte ein anderer Wert folgt
If .Cells(I, Lauf) <> .Cells(I + 1, Lauf) Then
'Korrektur-Varible hochzählen
K = K + 1
Müsste eigentlich mehr L statt K heißen; LeerZeilenLass-Varibale :-)
Ich hab halt genommen, was da schon vorhanden war.... ;-)
:-))
Post by Thomas Ramel
Post by Eric March
'MinutenSumme eintragen
wsZiel.Cells(I + K, 5) = Format(dblSumme, "0")
Mir nicht schlüssig. Wiederum sollte die Zeilspalte vorformatiert sein &
bleiben. Wo ist da nun wieder dr zählbare Uterschied eine Zelle mit
NumberForamt vorzuberieten und ihr einen Wert zuzuweisen? Oder geht das
hier in einem Rutsch? Die Hilfe zu FORMAT jedenfalls gab da nichts
Brauchbares her.
Du kannst gerne auch anderes ausprobieren....
....ich bina auf diese Weise aber sicher, dass ich einen formatierten Text
in die Zelle schreibe, dessen Aussehen ich bestimme.
…das ich macht mir Sogen… :-)))
Post by Thomas Ramel
Post by Eric March
'Minutensumme umformulieren und als Text eintragen
wsZiel.Cells(I + K, 6) = Int(dblSumme / 60) & ":" &
Format(dblSumme Mod 60, "00")
Zudem - was überzeugt Excel davon, nicht die Konstruktion 5:53 als 05:35,
sprich hh:mm, zu interpretieren wenn die Zielzelle nicht so verobereitet
ist ([h]:mm) resprektive das zu überschreiben?
Das Textformat mit dem die Zelle zuvor formatiert wurde und der String den
wir in der Zeile zusammenstzen - die passen ganz gut zusammen ;-)
(Mit den Zahlenformaten wolltest Du ja partout nicht arbeiten; das wäre
aber viel einfacher gewesen...)
Hmtja. "5:30" ist eben 5 : 3 0 und nicht halb Sechs [h]:mm… 5 Stunden und
30 Minuten. Könnte ja auch 35 Stunden und 45 Minuten sein - 53 Uhr 45
kommt nicht gut an.
Post by Thomas Ramel
Post by Eric March
'Korrektur-Varible hochzählen
K = K + 1
'Summenvarible zurücksetzen
dblSumme = 0
End If
'Laufvarible hochzählen
I = I + 1
'Abbruch wenn in Spalte A kein Wert mehr steht
Loop Until IsEmpty(.Cells(I, 1))
Noch so eine Funktion bie der ich Buachweh bekomme. Until cells(I,1)=""
ist logisch dasselbe, aber nin - für alles unmöglich scheints Funktionen
zu geben, für das Mögliche offenbar nicht ["For Each Cells.value
IsNotEmpty in 'Range'" - wie oft muss man eine Spalte auswerten und kreigt
nie genau raus wo sie zuende ist?? Das wäre mal was Sinnvolles!]
Es steht dir frei eine solche Funktoin zu programmieren und dann hier zur
Verfügung zu stellen.....
Hast du zufällig 'ne 38er da - ich eschieß mich besser… :-)
Post by Thomas Ramel
Post by Eric March
Next
End With
End Sub
Estmal vielen Dank für die Mühe um den Code.
Hast Du ihn ausprobiert?
Entspricht das Ergebnis (optisch) deinen Vorstellungen?
Schäm. Ich hatte es analog zu unten ja auch selber gelöst. Aber ich WEISS
dass das rauskommt was rauskommen soll. Dazu kann ich den Code gut genug
selbst interpertieren :-)
Post by Thomas Ramel
Post by Eric March
Ich habe am Wochende doch
noch etwas Rumgebastelt. Und mit einem aktivierten Worksheet (aus dem
Workbook_Open Makro heraus) fummelte ich das hier zusammen, Aufruf wie
Gerne. Ich hoffe sie fallen wo nötig deftig genug aus.
Post by Thomas Ramel
Post by Eric March
Public Sub Sammeln(Name)
Dim Eingang As String
Dim Lauf As Integer
Dim LaufSpalte As String
Dim Blatt As String
Dim I As Integer
Dim J As Integer
Dim K As Integer
Dim L As Integer
Open "C:\Eigene Dateien\Excel\Sammel " + Name + ".dat" For Input As #1
Hmmm, wieder einen String mit '+' zusammengebaut?
Michael hatt IMO bereits darauf hingewiesen, dass der String-Operator das
'&' ist....
Schon wieder den Kameraden vergessen? Oder ist mir hier die
auskommentierte Zeile der 98er-Testumgebung (mache wie man sieht ja mit
XP) reingekommen nachdem da ein Kopierunfall passierte?
Post by Thomas Ramel
Post by Eric March
I = 0
Do While Not EOF(1)
I = I + 1
For J = 1 To 5
Input #1, Eingang
Cells(I, J) = Eingang
Select Case (J)
Case 1: Cells(I, J).NumberFormat = "YYYY-MM-DD"
Case 2, 3, 4: Cells(I, J).NumberFormat = "General"
Case 5: Cells(I, J).NumberFormat = "#"
End Select
Next
Loop
Close 1
--> Hier stellt sich die Frage ob dieses Vorbereiten des Formats beim
Einlesen überhaupt sinnvoll ist oder "nur" der Optik dient wenn man das
(aktivierte) Statublatt sichtet?!?
Plan ist, ein Format festzulegen und es dann später zu übertragen.
Ich stelle fest: Du hast Freude an den Zahlenformaten gefunden ;-)
Wenn Du weisst, welche Spalte(n) welches Format erhalten sollen, dan
formatiere einmas zu Beginn die gesamte(n) Spalte(n) - das geht einiges
schneller.
Irgendwie hatte ich das ja per Hand vor. Aber Input# und Cells=Cells sind
da ja anderer Meinung :-(
Tue ich das nicht live kommen meine Bauchschmerzen…
Post by Thomas Ramel
Post by Eric March
For Lauf = 2 To 3
Select Case Lauf
Case 2
Blatt = Name & "-Kunde"
LaufSpalte = "B1"
Case 3
Blatt = Name & "-Projekt"
LaufSpalte = "C1"
End Select
Columns("A:E").Sort Key1:=Range(LaufSpalte), Order1:=xlAscending
--> Könnte man wohl abscheiden :-) , Header:=xlGuess, OrderCustom:=1,
MatchCase:=False, Orientation:=xlTopToBottom
Worksheets(Blatt).Range(Worksheets(Blatt).Cells(1, 1),
Worksheets(Blatt).Cells(500, 6)).Clear
--> Warum ich hier nur eine Bereich gezielt lösche? Vielleicht eine dumme
Angewohnheit existente Arrays zu initialisieren.
Worksheets(Blatt).Cells.ClearContents sollte dasselebe Resultat bringen.
J = 1: K = 0
For I = 1 To Range("A65536").End(xlUp).Row
--> Den hatte ich so mal aufgeschnappt. Mir war das Abklappern bis =""
bzw. IsEmpty zu blöde, vor allem, weil ich (immer noch auf FOR/NEXT
eingeschossen) gerne die echten Ober- und Untergrenzen hätte und nicht
immer wieder 1 abziehen mag.
For L = 1 To 5
Worksheets(Blatt).Cells(J, L) = Cells(I, L)
Worksheets(Blatt).Cells(J, L).NumberFormat = Cells(I,
L).NumberFormat
--> Tja - das war eigentlich meine Lösungsidee: Formate vorgeben und dann
draufdrücken.
Next
K = K + Val(Cells(I, 5))
--> Da mich mich auf die Quelle verlassen kann nur Zahlen zu bekommen
meine ich reicht diese Einfachlösung doch?
If Cells(I, Lauf) <> Cells(I + 1, Lauf) Then
--> Hier griffe die "Korrektur" von oben; eigentlich wird nur eine
Zustaztzeile eingebracht die die Minutensumme hält und dann eine Leerzeile
der Optik halber eingstreut.
Worksheets(Blatt).Cells(J + 1, 5) = K
Worksheets(Blatt).Cells(J + 1, 6) = Trim(Str(K \ 60)) & ":" & Right("0"
& Trim(Str(K Mod 60)), 2)
Worksheets(Blatt).Cells(J + 1, 6).NumberFormat = "[h]:mm"
--> Effektiv ärgert mich diese [Notwendigkeit der] Zuweisung in 2 Stufen
schon mächtig da ich mich nicht darauf verlassen kann, dass ein
vorhandenes Format benutzt und nicht verändert wird…
Tja, wenn Du der Zelle einen Sting zuweist, darfst Du dich nicht wundern,
wenn Excel die Zelle auch als Text formatiert; Du erzwingst es ja
letztendlich selbst....
Wenn Du mit reinen Zahlen arbeitest, braucht es kenien String für die
Darstellung im Zeitformat folgendes klappt ohne erneutes Zuweisen eines
Formates ;-)
Worksheets(Blatt).Cells(J + 1, 6) = K/1440
60x24 - das würde Tage bedeuten!?
Post by Thomas Ramel
Post by Eric March
J = J + 2
K = 0
End If
J = J + 1
Next
Next
End Sub
OK. Jetzt muss ich mal weiterwurschteln; ich hoffe sehr, dass wenigstsn
diese Auswertungsmappe die Änderungen die mein Chef erdachte überlebt.
Immerhin habe ich das eine oder andere gelernt. Und das müsste wichtiger
sein!
Das ist auch der Gedanke der NG hier - es freut uns, wenn dieses Ziel
einmal mehr erreicht worden ist.
Mal sehen wann der nächste VBA-Unfll lauert :-)
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Michael Schwimmer
2004-10-31 18:41:46 UTC
Permalink
Hallo Eric,
Post by Eric March
Das ist mir etwas zu "hohe Mathematik" [die Syntax ist
mir absolut kar].
Warum reicht
Worksheets("Statusblatt").Range(Cells(1, 1).Cells(500, 5)).Clear
nicht aus?
du hast immer noch nicht ganz verstanden, worum es dabei geht.
Du möchtest also mit dieser Zeile Formeln und Formatierungen
eines Bereiches löschen. Dazu musst du angeben, welcher Bereich
gemeint ist. Soweit ist sicherlich alles klar!
Nun referenzierst du aber einen Bereich des Tabellenblattes
"Statusblatt", bei dem du aber die erste und letzte Zelle des gerade
aktiven Tabellenblattes angibst. Das passiert, weil du nicht
richtig referenzierst. Wenn du eine Eigenschaft oder Methode
ohne Angabe des zugehörigen Objektes benutzt (Objekt.Eigenschaft),
wird das Standardobjekt angenommen und das ist halt das gerade
aktive Blatt.
Dein Code funktioniert also nur, wenn zufällig gerade das aktive
Blatt den Namen "Statusblatt" hat.
Beachte bitte bei folgendem Code die Punkte, beispielsweise die
vor "Cells". Das Objekt, auf dass sich in dem Fall "Cells" bezieht,
ist das Worksheets("Statusblatt"). Was es mit der With-Anweisung
auf sich hat, weißt du garantiert, kannst es aber auch noch einmal
in der Onlinehilfe nachlesen.

With Worksheets("Statusblatt")
.Range(.Cells(1, 1), .Cells(500, 5)).Clear
end With
Post by Eric March
While-Wend ist normalerweise die KOPFgesteuert Schleife,
Do-Loop, oder eher Do-Until die FUSSgesteuerte.
Do-While/Loop ist für mich deswegen irgenwie absurd,
auch wenn die Syntax das hergibt.
Wenn mir niemand vormacht, dass DO schneller ist werde
ich mal bei WHILE verbleiben (um strukturiert zu
programmieren…).
Du kannst natürlich weiterhin While Wend verwenden. Niemand
wird dir das übelnehmen.
Es bringt dir aber andererseits keinerlei Vorteile.
Und warum sollte man das dann noch einsetzen, wenn man mit
Do Loop alle möglichen Schleifen programmieren kann und
zudem noch mit Exit Do die Möglichkeit eines geordneten
Ausstieges hat.
Tradition? Alte Gewohnheiten?
Post by Eric March
Dass Variants offenbar mehr Macken haben als ich
bislang dachte ist mir auch schon klar geworden.
So lange ich aber (unten…) nur Zelle um Zelle
statt ganzer Ranges kopieren kann fühle ich mich mit der
Erbsenzählmehtode auch nicht unbedingt wohl.
Variants haben keine Macken, es sind eben Variants. Sie haben
eine begrenzte Zahl von Untertypen, in der ein Wert gespeichert
werden kann. In einen dieser Untertypen wird beispielsweise
ein Zellinhalt umgewandelt. Da ist kein Platz für Formate!
Wenn du einen Bereich in ein Variantarray umwandelst, gibst
du die Kontrolle bei der Umwandlung aus der Hand.
Umgekehrt ist es das gleiche, du legst beispielsweise
einen Stringwert in einer Zelle ab, den Excel wiederum als
Datum erkennt. Excel macht daraus eine Zahl und formatiert
diese Zelle entsprechend. genau so, als wenn du von Hand
ein Datum oder eine Zeit eingibst.

Mit der "Erbsenzählermethode" behältst du die volle Kontrolle,
und dabei fühle ich mich wohler. Und wenn du nicht gerade
hunterttausende von Zellen bearbeitest, merkst du auch keinen
großen Geschwindigkeitsunterschied.
Post by Eric March
Gegen Paste bin ich allergisch weil das _meine_ Zwischenablage
ist in der ich Makros nur äusserst ungern rumfumeln lasse :-)))
Paste benutze ich auch nicht gerne, in diesem Fall wird aber auch
die Formatierung mitgenommen.
Post by Eric March
mich die Hilfe hängen lassen wie ich eine Zelle auf
"Datum" setze; das Zuweisen von Do-It-Youself-Formaten
wäre ja nicht das TProblem gewesen.
[Weder ärgere ich mich über die Hilfe schwarz. NumberForamt
exisitert, und ich ahbe es auch gefunden, aber was ich
unter welchen Regeln zuweisen kann - _das_ steht, wie so
oft, nie beschrieben.
Ich zeichne oft mit dem Makrorekorder auf, bevor ich die
Hilfe benutze. Das hilft in vielen Fällen ungemein!
Post by Eric March
Worksheets("BB").Cells(1, 1) = _
Worksheets("SB").Cells(1, 1) -> OK
Worksheets("BB").Range(Cells(2, 1)) = _
Worksheets("SB").Range(Cells(2, 1))
-> Error 1004

Du hast wieder Cells ohne das zugehörige Objekt benutzt
und dann wird das Standardobjekt angenommen.
Und das ist ...
Post by Eric March
OK. Warum kapiert dann - ich bin jezt mal so
direkt - ihr Helfer nicht, dass ihr am Ziel vorbieschießt?
Alle diese Schüsse haben direkt mit deinem Problem zu tun.
Diese Probleme existieren, seit es XL 97 gibt, und
die sogenannten Helfer versuchen, dich von Irrwegen und
Sackgassen abzubringen.


MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home : http://michael-schwimmer.de
Eric March
2004-11-01 15:40:26 UTC
Permalink
Am Sun, 31 Oct 2004 19:41:46 +0100 schrieb Michael Schwimmer
Post by Michael Schwimmer
Hallo Eric,
Post by Eric March
Das ist mir etwas zu "hohe Mathematik" [die Syntax ist
mir absolut kar].
Warum reicht
Worksheets("Statusblatt").Range(Cells(1, 1).Cells(500, 5)).Clear
nicht aus?
du hast immer noch nicht ganz verstanden, worum es dabei geht.
Du möchtest also mit dieser Zeile Formeln und Formatierungen
eines Bereiches löschen. Dazu musst du angeben, welcher Bereich
gemeint ist. Soweit ist sicherlich alles klar!
Von 1,1 bis 500,5 - dachte ich. Da mir Excel ja dauernd Range-Objete um
die Ohren haut war ich der Meinung, dass es vernünftig wäre mit RANGE zu
hantieren.
Post by Michael Schwimmer
Nun referenzierst du aber einen Bereich des Tabellenblattes
"Statusblatt", bei dem du aber die erste und letzte Zelle des gerade
aktiven Tabellenblattes angibst. Das passiert, weil du nicht
richtig referenzierst. Wenn du eine Eigenschaft oder Methode
ohne Angabe des zugehörigen Objektes benutzt (Objekt.Eigenschaft),
wird das Standardobjekt angenommen und das ist halt das gerade
aktive Blatt.
Warum zum Kuckuck ist das so? Das ist mir einfahc zu hoch. Ich kann einer
Zelle X den Inhalt eine Zelle Y zuweisen und wenn Y "ohne Vormanen"
'zufällig' vom aktiv(iert)en Blatt ist macht das für mich Sinn. Da ich
genauso Worksheets("Statusblatt").Cells(1, 1)=Cells(3,45) schreiben muss
um das Zielblatt anzugeben -- warum wird ann angenommen, dass 1,1 zum
Zielblatt gehört? Oder anders: Warum wird dann ein Range nicht auch als
zum Zielblatt gehörend angenommen den ich nicht anders als mit dem (8-ung)
Schnlüsselwort CELLS, wenn ich Z,S mummerisch angebe, deklarieren kann.
Ich verstädne es, wenn in den Cells 1,1 und 500,5 des zufällig aktiven
Blattes Daten wie "A1" und "E500" ständen die dann als Bereichsgrenzen(!!)
für den Range angenommen würden - oder eben Müll. Aber innerhalb des
Ranges des Arbeitsblattes auf das er refernezeiert den Bereich
oder-was-auch-immer das zufällig aktiven Blattes anzunehmen ist einfach
nicht nachvollziehbar.
Ober mehr - die Hilfsbeispiele führen in die Irre.
Worksheets(X).Range(Cells(A1)) müsste ein Range im WS X sein der auf
Grenzen beeruht die in Zalle A1 des aktiven Blattes leigen. Midestens
sollte das einen Fehler geben wenn in A1 Müll ist. Worksheets(X).Cells(A1)
greift aber exakt die Zelle A1 unseres Arbeitsblattes X.
Worksheets(X).Range.Cells(A1) sollte das auch tun (?!). Aber wo wäre die
Logik bie dieser Konstruktion:
Worksheets("Statusblatt").Range(Worksheets("Statusblatt").Cells(1,
1),Worksheets("Statusblatt").Cells(500, 5)).Clear? Analog zum alten
Biespiel müsste der Range irgendiwe aus 2 Zellen seine Eck-Daten holen und
ob die vom aktiven oder einem referenzierten Blatt kommen wäre eigentlich
egal.
Wenns einen Denkfehler gibt - wo ist er?
Post by Michael Schwimmer
Dein Code funktioniert also nur, wenn zufällig gerade das aktive
Blatt den Namen "Statusblatt" hat.
Beachte bitte bei folgendem Code die Punkte, beispielsweise die
vor "Cells". Das Objekt, auf dass sich in dem Fall "Cells" bezieht,
ist das Worksheets("Statusblatt"). Was es mit der With-Anweisung
auf sich hat, weißt du garantiert, kannst es aber auch noch einmal
in der Onlinehilfe nachlesen.
With Worksheets("Statusblatt")
.Range(.Cells(1, 1), .Cells(500, 5)).Clear
end With
Yepp. With ist für mich aber eigentlich nur eine Gummikonstruktion die
TippeTippe erspart oder vielleicht eher der Übersicht dient, ein
Funktionsbefehl ist es nicht.
Post by Michael Schwimmer
Post by Eric March
While-Wend ist normalerweise die KOPFgesteuert Schleife,
Do-Loop, oder eher Do-Until die FUSSgesteuerte.
Do-While/Loop ist für mich deswegen irgenwie absurd,
auch wenn die Syntax das hergibt.
Wenn mir niemand vormacht, dass DO schneller ist werde
ich mal bei WHILE verbleiben (um strukturiert zu
programmieren…).
Du kannst natürlich weiterhin While Wend verwenden. Niemand
wird dir das übelnehmen.
Es bringt dir aber andererseits keinerlei Vorteile.
Wenns Nachteile brächte würde ich die durchaus umgehen wollen. Simples
BASIC wie While InKey$="":Wend um eine Weiter-Taste zu realisieren oder
While InKey$<>"":Wend um den Tastaturpuffer zu leeren sind geradezu genial.
Post by Michael Schwimmer
Und warum sollte man das dann noch einsetzen, wenn man mit
Do Loop alle möglichen Schleifen programmieren kann und
zudem noch mit Exit Do die Möglichkeit eines geordneten
Ausstieges hat.
Tradition? Alte Gewohnheiten?
Wie viel Kompatibilität muss man mitschleppen?
DO/LOOP oder WHILE/WEND, slebst FOR/NEXT lassen sich mit IF-GOTO abbilden.
DO/LOOP könnte dann alle anderen Konstruktionen (außer dem unsäglichen For
Each) ersetzen. Ich ziehe FOR/NEXT eingentlich prinzipiell vor… [Wenn ich
eine Spalte abklappern muss - warum gibts keinen Befhel der à la EACH
alles in der Spalte erfasst oder die unterste besetzte Zelle definiert?]
Zähle ich per UNTIL bis Zelle="" dann ist meine Zählvariable immer um 1
größer als der echte Wertebereich. DO WHILE Zelle<>"" würde Kopfgesteuert
laufen, hat aber das DO zu viel wenn ich Körper nur alternativ mit LOOP
oder WEND beenden würde. Nur habe ich da oft die Macke, dass ich bei der
Zählvariable bei 0 beginnen muss um wieder ohne eine um 1 zu hoch gezählte
Variable rauszukommen (wäre I+1 leer käme die Schleife nicht und I würde
nicht hochgezäht) - aber wehe man prüft eine Zelle (0,5) auf <>"" - Bums.
Tue ich das mit Zelle (I+1,5) geht mir die letzte Ziele flöten. Alles
nicht optimal, das… :-(
Post by Michael Schwimmer
Post by Eric March
Dass Variants offenbar mehr Macken haben als ich
bislang dachte ist mir auch schon klar geworden.
So lange ich aber (unten…) nur Zelle um Zelle
statt ganzer Ranges kopieren kann fühle ich mich mit der
Erbsenzählmehtode auch nicht unbedingt wohl.
Variants haben keine Macken, es sind eben Variants.
'Frauen haben keine Macken, es sind eben Frauen.'
--- Bitte streichen. ---
Post by Michael Schwimmer
Sie haben
eine begrenzte Zahl von Untertypen, in der ein Wert gespeichert
werden kann. In einen dieser Untertypen wird beispielsweise
ein Zellinhalt umgewandelt. Da ist kein Platz für Formate!
Wenn du einen Bereich in ein Variantarray umwandelst, gibst
du die Kontrolle bei der Umwandlung aus der Hand.
Umgekehrt ist es das gleiche, du legst beispielsweise
einen Stringwert in einer Zelle ab, den Excel wiederum als
Datum erkennt. Excel macht daraus eine Zahl und formatiert
diese Zelle entsprechend. genau so, als wenn du von Hand
ein Datum oder eine Zeit eingibst.
Aha. Wenn ich aber die Zelle vorformatiert (pfiffigerweise Text;
"Standard" müsüte eigentlich =Variant sein?!) habe müsste das passieren
was ICH will und nicht das was sich Excel erträumt?
Post by Michael Schwimmer
Mit der "Erbsenzählermethode" behältst du die volle Kontrolle,
und dabei fühle ich mich wohler. Und wenn du nicht gerade
hunterttausende von Zellen bearbeitest, merkst du auch keinen
großen Geschwindigkeitsunterschied.
Und genau da ist der Haken. Manche Blätter sind einfach groß und da dachte
ich bisher, dass interne Funktionen wie das Zuweisen eines Ranges in
Variant (wohin sonst?!) schneller sind als mit
"rate-mal-wo-die-Spalte-aufhört" bis "alle Spalten" abzählen.
Post by Michael Schwimmer
Post by Eric March
Gegen Paste bin ich allergisch weil das _meine_ Zwischenablage
ist in der ich Makros nur äusserst ungern rumfumeln lasse :-)))
Paste benutze ich auch nicht gerne, in diesem Fall wird aber auch
die Formatierung mitgenommen.
Gehts irgednwie ohne? (Paste, nicht Formatierung)
Post by Michael Schwimmer
Post by Eric March
mich die Hilfe hängen lassen wie ich eine Zelle auf
"Datum" setze; das Zuweisen von Do-It-Youself-Formaten
wäre ja nicht das TProblem gewesen.
[Weder ärgere ich mich über die Hilfe schwarz. NumberForamt
exisitert, und ich ahbe es auch gefunden, aber was ich
unter welchen Regeln zuweisen kann - _das_ steht, wie so
oft, nie beschrieben.
Ich zeichne oft mit dem Makrorekorder auf, bevor ich die
Hilfe benutze. Das hilft in vielen Fällen ungemein!
Ha-Ha-Ha - aus der Quelle habe ich reichlich Dinge bezogen die hier unter
die Räder kamen. :-)
Post by Michael Schwimmer
Post by Eric March
Worksheets("BB").Cells(1, 1) = _
Worksheets("SB").Cells(1, 1) -> OK
Worksheets("BB").Range(Cells(2, 1)) = _
Worksheets("SB").Range(Cells(2, 1))
-> Error 1004
Du hast wieder Cells ohne das zugehörige Objekt benutzt
und dann wird das Standardobjekt angenommen.
Und das ist ...
Ohne Worte. Diese Beispiele entstammen indirekt F1.
Post by Michael Schwimmer
Post by Eric March
OK. Warum kapiert dann - ich bin jezt mal so
direkt - ihr Helfer nicht, dass ihr am Ziel vorbieschießt?
Alle diese Schüsse haben direkt mit deinem Problem zu tun.
Diese Probleme existieren, seit es XL 97 gibt, und
die sogenannten Helfer versuchen, dich von Irrwegen und
Sackgassen abzubringen.
Sieht wohl so aus. Die Irrwege auf die mich F1 brachte…
Post by Michael Schwimmer
MfG
Michael
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Michael Schwimmer
2004-11-01 23:36:57 UTC
Permalink
Hallo Eric
Post by Eric March
Post by Michael Schwimmer
du hast immer noch nicht ganz verstanden, worum es dabei geht.
Du möchtest also mit dieser Zeile Formeln und Formatierungen
eines Bereiches löschen. Dazu musst du angeben, welcher Bereich
gemeint ist. Soweit ist sicherlich alles klar!
Von 1,1 bis 500,5 - dachte ich. Da mir Excel ja dauernd Range-Objete
um die Ohren haut war ich der Meinung, dass es vernünftig wäre mit
RANGE zu hantieren.
Post by Michael Schwimmer
Nun referenzierst du aber einen Bereich des Tabellenblattes
"Statusblatt", bei dem du aber die erste und letzte Zelle des
gerade aktiven Tabellenblattes angibst. Das passiert, weil du nicht
richtig referenzierst. Wenn du eine Eigenschaft oder Methode
ohne Angabe des zugehörigen Objektes benutzt (Objekt.Eigenschaft),
wird das Standardobjekt angenommen und das ist halt das gerade
aktive Blatt.
Warum zum Kuckuck ist das so? Das ist mir einfahc zu hoch. Ich kann
weil die Programmierer von VB(A) es für sinnvoll hielten, dass man das
Objekt angibt, mit dem man arbeiten will.
Post by Eric March
einer Zelle X den Inhalt eine Zelle Y zuweisen und wenn Y "ohne
Vormanen" 'zufällig' vom aktiv(iert)en Blatt ist macht das für mich
Sinn. Da ich genauso Worksheets("Statusblatt").Cells(1,
1)=Cells(3,45) schreiben muss um das Zielblatt anzugeben -- warum
Denke doch bitte in Ruhe noch einmal darüber nach. Du benutzt wieder
eine Eigenschaft (Cells) ohne die Angabe des zugehörigen Objektes.
Post by Eric March
Warum wird dann ein Range nicht auch als zum Zielblatt gehörend
angenommen den ich nicht anders als mit dem (8-ung) Schnlüsselwort
CELLS, wenn ich Z,S mummerisch angebe, deklarieren kann. Ich
verstädne es, wenn in den Cells 1,1 und 500,5 des zufällig aktiven
Blattes Daten wie "A1" und "E500" ständen die dann als
Bereichsgrenzen(!!) für den Range angenommen würden - oder eben
Müll. Aber innerhalb des Ranges des Arbeitsblattes auf das er
refernezeiert den Bereich oder-was-auch-immer das zufällig aktiven
Blattes anzunehmen ist einfach nicht nachvollziehbar. Ober mehr -
die Hilfsbeispiele führen in die Irre.
Es ist scheinbar sinnlos!
Post by Eric March
Worksheets(X).Range(Cells(A1)) müsste ein Range im WS X sein der auf
Grenzen beeruht die in Zalle A1 des aktiven Blattes leigen.
Midestens sollte das einen Fehler geben wenn in A1 Müll ist.
Worksheets(X).Cells(A1) greift aber exakt die Zelle A1 unseres
Arbeitsblattes X. Worksheets(X).Range.Cells(A1) sollte das auch tun
Worksheets("Statusblatt").Range(Worksheets("Statusblatt").Cells(1,
1),Worksheets("Statusblatt").Cells(500, 5)).Clear? Analog zum alten
Biespiel müsste der Range irgendiwe aus 2 Zellen seine Eck-Daten
holen und ob die vom aktiven oder einem referenzierten Blatt kommen
wäre eigentlich egal. Wenns einen Denkfehler gibt - wo ist er?
Du denkst, dass du ans Ziels kommst, indem du kritisierst, was du nicht
verstehst, anstatt zu versuchen, zu verstehen.
Post by Eric March
Post by Michael Schwimmer
Dein Code funktioniert also nur, wenn zufällig gerade das aktive
Blatt den Namen "Statusblatt" hat.
Beachte bitte bei folgendem Code die Punkte, beispielsweise die
vor "Cells". Das Objekt, auf dass sich in dem Fall "Cells" bezieht,
ist das Worksheets("Statusblatt"). Was es mit der With-Anweisung
auf sich hat, weißt du garantiert, kannst es aber auch noch einmal
in der Onlinehilfe nachlesen.
With Worksheets("Statusblatt")
.Range(.Cells(1, 1), .Cells(500, 5)).Clear
end With
Yepp. With ist für mich aber eigentlich nur eine Gummikonstruktion
die TippeTippe erspart oder vielleicht eher der Übersicht dient, ein
Funktionsbefehl ist es nicht.
Wo habe ich geschrieben, dass With ein Funktionsbefehl ist. Die With-
Anweisung macht den Code übersichtlicher und sogar etwas schneller. Die
Mühe, dich davon zu überzeugen, mache ich mir aber nicht mehr, du kannst
es ja selbst austesten.
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
While-Wend ist normalerweise die KOPFgesteuert Schleife,
Do-Loop, oder eher Do-Until die FUSSgesteuerte.
Do-While/Loop ist für mich deswegen irgenwie absurd,
auch wenn die Syntax das hergibt.
Wenn mir niemand vormacht, dass DO schneller ist werde
ich mal bei WHILE verbleiben (um strukturiert zu
programmieren…).
Du kannst natürlich weiterhin While Wend verwenden. Niemand
wird dir das übelnehmen.
Es bringt dir aber andererseits keinerlei Vorteile.
Wenns Nachteile brächte würde ich die durchaus umgehen wollen.
Simples BASIC wie While InKey$="":Wend um eine Weiter-Taste zu
realisieren oder While InKey$<>"":Wend um den Tastaturpuffer zu
leeren sind geradezu genial.
Was soll daran besonders genial sein. Mit was für einem Basic-Dialekt
(InKey) arbeitest du überhaupt, wir sprechen hier schließlich von VBA.
Ich kann auch über die Delphi- oder C-Syntax etwas posten, das führt
aber hier zu nichts. Übrigens, was ist an folgendem Code so überaus
Nachteilig gegenüber deinem?
Do While XYZ: Loop
Post by Eric March
Post by Michael Schwimmer
Und warum sollte man das dann noch einsetzen, wenn man mit
Do Loop alle möglichen Schleifen programmieren kann und
zudem noch mit Exit Do die Möglichkeit eines geordneten
Ausstieges hat.
Tradition? Alte Gewohnheiten?
Wie viel Kompatibilität muss man mitschleppen?
Ich frage mich auch manchmal, warum man While Wend noch mitschleift.
Könnte das vielleicht an der Kompatibilität liegen?
Post by Eric March
DO/LOOP oder WHILE/WEND, slebst FOR/NEXT lassen sich mit IF-GOTO
abbilden. DO/LOOP könnte dann alle anderen Konstruktionen (außer dem
Schleifen mit >>Do Loop<< sollen Schleifen mit >>While Wend<< ersetzen
und kein Ersatz für >>For Next<< sein!
Nur nebenbei, wenn es auf Geschwindigkeit ankommt, kann man mit einem
Nachbau von Funktionalitäten unter Umständen sehr viel Zeit sparen. Aber
warum sollte ich mir ohne Not so etwas antun?
Post by Eric March
unsäglichen For Each) ersetzen. Ich ziehe FOR/NEXT eingentlich
In sehr vielen Fällen ist For Each erheblich schneller. Und das ziehe
ich in diesen Fällen vor!
Post by Eric March
prinzipiell vor… [Wenn ich eine Spalte abklappern muss - warum gibts
keinen Befhel der à la EACH alles in der Spalte erfasst oder die
Dim rngZelle As Range
For Each rngZelle In Columns("B:B")
rngZelle.NumberFormat = "0.00"
Next
Post by Eric March
unterste besetzte Zelle definiert?] Zähle ich per UNTIL bis Zelle=""
dann ist meine Zählvariable immer um 1 größer als der echte
Wertebereich. DO WHILE Zelle<>"" würde Kopfgesteuert laufen, hat
aber das DO zu viel wenn ich Körper nur alternativ mit LOOP oder
WEND beenden würde. Nur habe ich da oft die Macke, dass ich bei der
Zählvariable bei 0 beginnen muss um wieder ohne eine um 1 zu hoch
gezählte Variable rauszukommen (wäre I+1 leer käme die Schleife
nicht und I würde nicht hochgezäht) - aber wehe man prüft eine Zelle
(0,5) auf <>"" - Bums. Tue ich das mit Zelle (I+1,5) geht mir die
letzte Ziele flöten. Alles nicht optimal, das… :-(
Programmiere am besten VBA neu und bitte Microsoft, alle Versionen
darauf abzudaten!
Mann, finde dich endlich mit dem ab, was du vorfindest und jammere nicht
herum!
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
Dass Variants offenbar mehr Macken haben als ich
bislang dachte ist mir auch schon klar geworden.
So lange ich aber (unten…) nur Zelle um Zelle
statt ganzer Ranges kopieren kann fühle ich mich mit der
Erbsenzählmehtode auch nicht unbedingt wohl.
Variants haben keine Macken, es sind eben Variants.
'Frauen haben keine Macken, es sind eben Frauen.'
--- Bitte streichen. ---
Du weisst anscheinend nicht, was der Datentyp Variant bedeutet und was
er für Daten aufnehmen kann. Und dieser Variant-Datentyp macht genau
das, was er soll und für was er programmiert ist, wo bitte sollen also
die Macken sein?
Deine Anmerkungen über Frauen solltest du am besten streichen!
Post by Eric March
Post by Michael Schwimmer
Sie haben
eine begrenzte Zahl von Untertypen, in der ein Wert gespeichert
werden kann. In einen dieser Untertypen wird beispielsweise
ein Zellinhalt umgewandelt. Da ist kein Platz für Formate!
Wenn du einen Bereich in ein Variantarray umwandelst, gibst
du die Kontrolle bei der Umwandlung aus der Hand.
Umgekehrt ist es das gleiche, du legst beispielsweise
einen Stringwert in einer Zelle ab, den Excel wiederum als
Datum erkennt. Excel macht daraus eine Zahl und formatiert
diese Zelle entsprechend. genau so, als wenn du von Hand
ein Datum oder eine Zeit eingibst.
Aha. Wenn ich aber die Zelle vorformatiert (pfiffigerweise Text;
"Standard" müsüte eigentlich =Variant sein?!) habe müsste das
passieren was ICH will und nicht das was sich Excel erträumt?
Post by Michael Schwimmer
Mit der "Erbsenzählermethode" behältst du die volle Kontrolle,
und dabei fühle ich mich wohler. Und wenn du nicht gerade
hunterttausende von Zellen bearbeitest, merkst du auch keinen
großen Geschwindigkeitsunterschied.
Und genau da ist der Haken. Manche Blätter sind einfach groß und da
dachte ich bisher, dass interne Funktionen wie das Zuweisen eines
Ranges in Variant (wohin sonst?!) schneller sind als mit
"rate-mal-wo-die-Spalte-aufhört" bis "alle Spalten" abzählen.
Man kann ohne Probleme ausprobieren, ob das, was man denkt, auch der
Wirklichkeit entspricht! In deinem Fall, ob der Zeitvorteil wirklich
relevant ist.
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
Gegen Paste bin ich allergisch weil das _meine_ Zwischenablage
ist in der ich Makros nur äusserst ungern rumfumeln lasse :-)))
Paste benutze ich auch nicht gerne, in diesem Fall wird aber auch
die Formatierung mitgenommen.
Gehts irgednwie ohne? (Paste, nicht Formatierung)
Post by Michael Schwimmer
Post by Eric March
mich die Hilfe hängen lassen wie ich eine Zelle auf
"Datum" setze; das Zuweisen von Do-It-Youself-Formaten
wäre ja nicht das TProblem gewesen.
[Weder ärgere ich mich über die Hilfe schwarz. NumberForamt
exisitert, und ich ahbe es auch gefunden, aber was ich
unter welchen Regeln zuweisen kann - _das_ steht, wie so
oft, nie beschrieben.
NumberFormat-Eigenschaft
NumberFormat-Eigenschaft, wie sie auf das CellFormat- und Range-Objekt
angewendet wird.

Der Formatierungscode hat dieselbe Zeichenfolge wie die Option
Formatierungscode im Dialogfeld Zellen formatieren. Die Zeichenfolge des
Formatierungscodes bei der Format-Funktion ist anders als bei den
Eigenschaften NumberFormat und NumberFormatLocal.

Was ist daran misszuverstehen?
Post by Eric March
Post by Michael Schwimmer
Ich zeichne oft mit dem Makrorekorder auf, bevor ich die
Hilfe benutze. Das hilft in vielen Fällen ungemein!
Ha-Ha-Ha - aus der Quelle habe ich reichlich Dinge bezogen die hier
unter die Räder kamen. :-)
Hättest du das mal gemacht, wärst du möglicherweise auf die
NumberFormat-Eigenschaft gestoßen.
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
Worksheets("BB").Cells(1, 1) = _
Worksheets("SB").Cells(1, 1) -> OK
Worksheets("BB").Range(Cells(2, 1)) = _
Worksheets("SB").Range(Cells(2, 1))
-> Error 1004
Du hast wieder Cells ohne das zugehörige Objekt benutzt
und dann wird das Standardobjekt angenommen.
Und das ist ...
Ohne Worte. Diese Beispiele entstammen indirekt F1.
Mir bleibt wieder einmal die Spucke weg, wie du deine Fehler auf die OH,
VBA oder Excel abwälzt, deshalb gehe ich darauf auch nicht mehr näher
ein!
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
OK. Warum kapiert dann - ich bin jezt mal so
direkt - ihr Helfer nicht, dass ihr am Ziel vorbieschießt?
Alle diese Schüsse haben direkt mit deinem Problem zu tun.
Diese Probleme existieren, seit es XL 97 gibt, und
die sogenannten Helfer versuchen, dich von Irrwegen und
Sackgassen abzubringen.
Sieht wohl so aus. Die Irrwege auf die mich F1 brachte…
Besorg dir bitte ein Buch über Excel-VBA, beschäftige dich ausgiebig
damit und benutze die Hilfe als das, was sie ist, nämlich als Hilfe und
nicht als Tutorial, um VBA zu lernen.

Es macht für mich einfach keinen Sinn mehr, jemanden zu helfen, der
Lernresistent ist und Fehler immer woanders sucht! Deshalb beenden wir
den Thread am besten an dieser Stelle

MfG
Michael
--
-------------------------------------------
Michael Schwimmer
Home : http://michael-schwimmer.de
Eric March
2004-11-02 13:08:36 UTC
Permalink
Am Tue, 2 Nov 2004 00:36:57 +0100 schrieb Michael Schwimmer
Post by Michael Schwimmer
Hallo Eric
Post by Eric March
Post by Michael Schwimmer
du hast immer noch nicht ganz verstanden, worum es dabei geht.
Du möchtest also mit dieser Zeile Formeln und Formatierungen
eines Bereiches löschen. Dazu musst du angeben, welcher Bereich
gemeint ist. Soweit ist sicherlich alles klar!
Von 1,1 bis 500,5 - dachte ich. Da mir Excel ja dauernd Range-Objete
um die Ohren haut war ich der Meinung, dass es vernünftig wäre mit
RANGE zu hantieren.
Post by Michael Schwimmer
Nun referenzierst du aber einen Bereich des Tabellenblattes
"Statusblatt", bei dem du aber die erste und letzte Zelle des
gerade aktiven Tabellenblattes angibst. Das passiert, weil du nicht
richtig referenzierst. Wenn du eine Eigenschaft oder Methode
ohne Angabe des zugehörigen Objektes benutzt (Objekt.Eigenschaft),
wird das Standardobjekt angenommen und das ist halt das gerade
aktive Blatt.
Warum zum Kuckuck ist das so? Das ist mir einfahc zu hoch. Ich kann
weil die Programmierer von VB(A) es für sinnvoll hielten, dass man das
Objekt angibt, mit dem man arbeiten will.
Post by Eric March
einer Zelle X den Inhalt eine Zelle Y zuweisen und wenn Y "ohne
Vormanen" 'zufällig' vom aktiv(iert)en Blatt ist macht das für mich
Sinn. Da ich genauso Worksheets("Statusblatt").Cells(1,
1)=Cells(3,45) schreiben muss um das Zielblatt anzugeben -- warum
Denke doch bitte in Ruhe noch einmal darüber nach. Du benutzt wieder
eine Eigenschaft (Cells) ohne die Angabe des zugehörigen Objektes.
Post by Eric March
Warum wird dann ein Range nicht auch als zum Zielblatt gehörend
angenommen den ich nicht anders als mit dem (8-ung) Schnlüsselwort
CELLS, wenn ich Z,S mummerisch angebe, deklarieren kann. Ich
verstädne es, wenn in den Cells 1,1 und 500,5 des zufällig aktiven
Blattes Daten wie "A1" und "E500" ständen die dann als
Bereichsgrenzen(!!) für den Range angenommen würden - oder eben
Müll. Aber innerhalb des Ranges des Arbeitsblattes auf das er
refernezeiert den Bereich oder-was-auch-immer das zufällig aktiven
Blattes anzunehmen ist einfach nicht nachvollziehbar. Ober mehr -
die Hilfsbeispiele führen in die Irre.
Es ist scheinbar sinnlos!
Post by Eric March
Worksheets(X).Range(Cells(A1)) müsste ein Range im WS X sein der auf
Grenzen beeruht die in Zalle A1 des aktiven Blattes leigen.
Midestens sollte das einen Fehler geben wenn in A1 Müll ist.
Worksheets(X).Cells(A1) greift aber exakt die Zelle A1 unseres
Arbeitsblattes X. Worksheets(X).Range.Cells(A1) sollte das auch tun
Worksheets("Statusblatt").Range(Worksheets("Statusblatt").Cells(1,
1),Worksheets("Statusblatt").Cells(500, 5)).Clear? Analog zum alten
Biespiel müsste der Range irgendiwe aus 2 Zellen seine Eck-Daten
holen und ob die vom aktiven oder einem referenzierten Blatt kommen
wäre eigentlich egal. Wenns einen Denkfehler gibt - wo ist er?
Du denkst, dass du ans Ziels kommst, indem du kritisierst, was du nicht
verstehst, anstatt zu versuchen, zu verstehen.
Wenn du mir verraten kannst wo die Logik in diesen beieden Dingen besteht
- bitte:
- Dummy = Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))
- Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) = Dummy
Funktioniert.
- Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) = _
Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))
Funktioniert nicht (mehr: es wird nichts übertragen).
Dass der Range ohne Referenzierung auf ein Objekt ("sein" Worksheet)
exisiteren kann ist nicht sher logisch.

Aber weiter. In den Zellen A25 und A26 von stehen als Inhalt A2 und A3,
bie B in A14 und A15 je A12 und A13.
- Dummy = Range(Worksheets(A).Cells(25, 1) & ":" & Worksheets(A).Cells(26,
1))
- Range(Worksheets(A).Cells(14, 1) & ":" & Worksheets(A).Cells(15, 1)) =
Dummy
Damit wird offenbar nur das aktive Blatt A bedient, die Inhalte dessen A2
und A3 landeten pflichtgemäß in A12 und A13.

Schritt 3. Selbe Hilfsinhalte wie oben.
- Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1) & ":" &
Worksheets(A).Cells(26, 1))
- Worksheets(B).Range(Worksheets(B).Cells(14, 1) & ":" &
Worksheets(B).Cells(15, 1)) = Dummy
Und siehe da - der Ihnalt von B aus A2 und A3 landet in A in A12 und A13
Das wäre _logisch_. Hier differenziert der Vorspann mit dem Arbeitsblatt
definitiv wessen Range erfasst wird - und bedeutet einen immensen
Unterschied. So kann ich das alles wunderbar verstehen und nachvollziehen.

Wenn du mir nun noch verrätst wie ich statt (zufällig aus Zellen
entnommene) Koordinaten im B12-Stil mathematische Koordinaten (12,2) als
"Grenzen" für den Range (das hat ja offenbar so funktionert wie ich es
dachte und hatte denken müssen) einbringen kann bin ich einen satten
Schritt weiter.

Und erkläre mir bitte, gegenüber meiner Syntax nun Strings zu verkuppeln,
warum die von mir bemängelte Logik…
- Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1),
Worksheets(A).Cells(26, 1))
- Worksheets(B).Range(Worksheets(B).Cells(14, 1), Worksheets(B).Cells(15,
1)) = Dummy
…überhaupt irgendwie funktioniert: Meine Hilfskoordinaten "A2" und "A3" -
also die Zellinahlte! - aus A A25/26 und in B A14/15 rausgekommen. 25,1
und 26,1 sowie 14,1 und 15,1 wurden (durch das WS referenziert) offenabar
selbst als Koordinaten genonnmen und _nicht_ der Inhalt diese Zellen
(.Value ist soweit ich weiß ja der Standard für 'Cells()')…
- Dummy = Range(Worksheets(A).Cells(25, 1), Worksheets(A).Cells(26, 1))
- Range(Worksheets(B).Cells(14, 1), Worksheets(B).Cells(15, 1)) = Dummy
…ist mit der lettzen Sysntax effektiv identisch. Hier bewirkt das
Vorspannen eines übergeordneten Objektes nichts.

Wo also sot die Logik, dass in eine Falle (Strings) Zell_inhalte_ als
Koordinaten verwendet werden, währen andersrum als "alternative" Angabe
mit 2xCells durch Komma getrennt deren matehmatische Wertigekiten in den
Klammen die Grenzen definieren?

Wenn - und das ist mir halt nicht begriflich - ein Range so in eine
Varible verpackt werden kann und aus dieser wiederum geefüllt, warum
funktioniert diese Syntax nicht?
- Range(Worksheets(B).Cells(14, 1), Worksheets(B).Cells(15, 1)) =
Range(Worksheets(A).Cells(25, 1), Worksheets(A).Cells(26, 1))
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Dein Code funktioniert also nur, wenn zufällig gerade das aktive
Blatt den Namen "Statusblatt" hat.
Beachte bitte bei folgendem Code die Punkte, beispielsweise die
vor "Cells". Das Objekt, auf dass sich in dem Fall "Cells" bezieht,
ist das Worksheets("Statusblatt"). Was es mit der With-Anweisung
auf sich hat, weißt du garantiert, kannst es aber auch noch einmal
in der Onlinehilfe nachlesen.
With Worksheets("Statusblatt")
.Range(.Cells(1, 1), .Cells(500, 5)).Clear
end With
Yepp. With ist für mich aber eigentlich nur eine Gummikonstruktion
die TippeTippe erspart oder vielleicht eher der Übersicht dient, ein
Funktionsbefehl ist es nicht.
Wo habe ich geschrieben, dass With ein Funktionsbefehl ist. [Schnipp]
Nirgends. Ich habe das geschreiben. Ich wollte damit bemängeln, dass ein
rein optischer Befehl der nichts mit der Logik zu tun hat eingespannt
werden "muss" damit man nicht total die Übersicht über diese als so
gelobete strukturierte OO-Programmierung verliert.
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
While-Wend ist normalerweise die KOPFgesteuert Schleife,
Do-Loop, oder eher Do-Until die FUSSgesteuerte.
Do-While/Loop ist für mich deswegen irgenwie absurd,
auch wenn die Syntax das hergibt.
Wenn mir niemand vormacht, dass DO schneller ist werde
ich mal bei WHILE verbleiben (um strukturiert zu
programmieren…).
Du kannst natürlich weiterhin While Wend verwenden. Niemand
wird dir das übelnehmen.
Es bringt dir aber andererseits keinerlei Vorteile.
Wenns Nachteile brächte würde ich die durchaus umgehen wollen.
Simples BASIC wie While InKey$="":Wend um eine Weiter-Taste zu
realisieren oder While InKey$<>"":Wend um den Tastaturpuffer zu
leeren sind geradezu genial.
Was soll daran besonders genial sein. Mit was für einem Basic-Dialekt
(InKey) arbeitest du überhaupt, wir sprechen hier schließlich von VBA.
ICh wollte nur dezetn darauf hinweisen, dass While-Wend nicht schlechter
Stil ist sondern ziemlich alt und bewährt.
Post by Michael Schwimmer
Ich kann auch über die Delphi- oder C-Syntax etwas posten,
/* lieber nicht. */ :-)
Post by Michael Schwimmer
das führt
aber hier zu nichts. Übrigens, was ist an folgendem Code so überaus
Nachteilig gegenüber deinem?
Do While XYZ: Loop
Die Existenz von spezilaisierten Befehlen die bestimmte logische
Strukturen (Kopf/Fusß-Steuerung) abbilden - und die nun durch Adaption DO
_WHILE_ abc : xyz LOOP statt WHILE abc DO xyz LOOP (oder IF abc BEGIN xyz
END) bestenfalls einen neumodishen Mischmach erzeugen der nichts mehr mit
Übersichtlichkeit zu tun hat… DO xyz LOOP _UNTIL_ abc ist REPEAT xyz UNTIL
abc. DO : LOOP ist eine Endlosschelife weil ich nicht gezwungen bin durch
einen korrespondierenden Ende-Befehl eine Schleife grundsätzlich
abbrechbar zu gestalten: While-Wend, Repeat-Until [Loop-Until, ggf. noch
Do-Loop+Until] und For-Next.
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Und warum sollte man das dann noch einsetzen, wenn man mit
Do Loop alle möglichen Schleifen programmieren kann und
zudem noch mit Exit Do die Möglichkeit eines geordneten
Ausstieges hat.
Tradition? Alte Gewohnheiten?
Wie viel Kompatibilität muss man mitschleppen?
Ich frage mich auch manchmal, warum man While Wend noch mitschleift.
Könnte das vielleicht an der Kompatibilität liegen?
Wahrscheinlich. Ich kann mich ja prinzipiell mit DO-LOOP abfinden
(wohlweißlich, dass mir DO WHILE … LOOP bzw. DO … LOOP UNTIL absolut nicht
schmecken weil ich je ein zusätzliches Schlüsselwort brauche um die
jeweilige Logik abzubilden).
Post by Michael Schwimmer
Post by Eric March
DO/LOOP oder WHILE/WEND, slebst FOR/NEXT lassen sich mit IF-GOTO
abbilden. DO/LOOP könnte dann alle anderen Konstruktionen (außer dem
Schleifen mit >>Do Loop<< sollen Schleifen mit >>While Wend<< ersetzen
und kein Ersatz für >>For Next<< sein!
Nur nebenbei, wenn es auf Geschwindigkeit ankommt, kann man mit einem
Nachbau von Funktionalitäten unter Umständen sehr viel Zeit sparen. Aber
warum sollte ich mir ohne Not so etwas antun?
sic.
Post by Michael Schwimmer
Post by Eric March
unsäglichen For Each) ersetzen. Ich ziehe FOR/NEXT eingentlich
In sehr vielen Fällen ist For Each erheblich schneller. Und das ziehe
ich in diesen Fällen vor!
Mit unsäglichmeinte ich auc mehr, dass ich offen bar alles als EACH nehmen
kann [solche undefienirten Mengenagaben gefallen mir grundsätzlich gar
nicht wenn sie so streng gekapselt sind] - nur nie das was ich brauche.
Post by Michael Schwimmer
Post by Eric March
prinzipiell vor… [Wenn ich eine Spalte abklappern muss - warum gibts
keinen Befhel der à la EACH alles in der Spalte erfasst oder die
Dim rngZelle As Range
For Each rngZelle In Columns("B:B")
rngZelle.NumberFormat = "0.00"
Next
Und wenn ich nur A2 bis A-weiter-unten abkalppern muss, in A1 aber ein
Titel steht?
Post by Michael Schwimmer
Post by Eric March
unterste besetzte Zelle definiert?] Zähle ich per UNTIL bis Zelle=""
dann ist meine Zählvariable immer um 1 größer als der echte
Wertebereich. DO WHILE Zelle<>"" würde Kopfgesteuert laufen, hat
aber das DO zu viel wenn ich Körper nur alternativ mit LOOP oder
WEND beenden würde. Nur habe ich da oft die Macke, dass ich bei der
Zählvariable bei 0 beginnen muss um wieder ohne eine um 1 zu hoch
gezählte Variable rauszukommen (wäre I+1 leer käme die Schleife
nicht und I würde nicht hochgezäht) - aber wehe man prüft eine Zelle
(0,5) auf <>"" - Bums. Tue ich das mit Zelle (I+1,5) geht mir die
letzte Ziele flöten. Alles nicht optimal, das… :-(
Programmiere am besten VBA neu und bitte Microsoft, alle Versionen
darauf abzudaten!
Mann, finde dich endlich mit dem ab, was du vorfindest und jammere nicht
herum!
Dann soll MS eine Hilfe rausgeben die Fragen beantwortet statt neue
aufzuwerfen.
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
Dass Variants offenbar mehr Macken haben als ich
bislang dachte ist mir auch schon klar geworden.
So lange ich aber (unten…) nur Zelle um Zelle
statt ganzer Ranges kopieren kann fühle ich mich mit der
Erbsenzählmehtode auch nicht unbedingt wohl.
Variants haben keine Macken, es sind eben Variants.
'Frauen haben keine Macken, es sind eben Frauen.'
--- Bitte streichen. ---
Du weisst anscheinend nicht, was der Datentyp Variant bedeutet und was
er für Daten aufnehmen kann. Und dieser Variant-Datentyp macht genau
das, was er soll und für was er programmiert ist, wo bitte sollen also
die Macken sein?
Deine Anmerkungen über Frauen solltest du am besten streichen!
Wenn du mir einen anderen Variablentypen nennst der en bloc (eine Logik
des Begriffes Range der sosnt obsolet wäre!) einen Breich 'rüberschaffen
kann wird er dankend angenommen.
(Was ich in der Hilfe las schloss das was wollte nicht aus. Dass etwas
nicht übertragen wird was ich - sinfälligerweise - auch gar nicht
übertragen haben wollte und das dennoch am Ziel Ärger macht hat wohl
nichts mit Varaint selbst zu tun.)
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Sie haben
eine begrenzte Zahl von Untertypen, in der ein Wert gespeichert
werden kann. In einen dieser Untertypen wird beispielsweise
ein Zellinhalt umgewandelt. Da ist kein Platz für Formate!
Wenn du einen Bereich in ein Variantarray umwandelst, gibst
du die Kontrolle bei der Umwandlung aus der Hand.
Umgekehrt ist es das gleiche, du legst beispielsweise
einen Stringwert in einer Zelle ab, den Excel wiederum als
Datum erkennt. Excel macht daraus eine Zahl und formatiert
diese Zelle entsprechend. genau so, als wenn du von Hand
ein Datum oder eine Zeit eingibst.
Aha. Wenn ich aber die Zelle vorformatiert (pfiffigerweise Text;
"Standard" müsüte eigentlich =Variant sein?!) habe müsste das
passieren was ICH will und nicht das was sich Excel erträumt?
Post by Michael Schwimmer
Mit der "Erbsenzählermethode" behältst du die volle Kontrolle,
und dabei fühle ich mich wohler. Und wenn du nicht gerade
hunterttausende von Zellen bearbeitest, merkst du auch keinen
großen Geschwindigkeitsunterschied.
Und genau da ist der Haken. Manche Blätter sind einfach groß und da
dachte ich bisher, dass interne Funktionen wie das Zuweisen eines
Ranges in Variant (wohin sonst?!) schneller sind als mit
"rate-mal-wo-die-Spalte-aufhört" bis "alle Spalten" abzählen.
Man kann ohne Probleme ausprobieren, ob das, was man denkt, auch der
Wirklichkeit entspricht! In deinem Fall, ob der Zeitvorteil wirklich
relevant ist.
Jedes Warten ist störend. Und bei aller hoch gepriesen OO-Programmierung
einen Range (wieder das böse Wort) von A1 nach Z25432 als zweizinkige
Schelifenstruktur einzeln abzuklappen ist wohl der absolute Hohn.
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
Gegen Paste bin ich allergisch weil das _meine_ Zwischenablage
ist in der ich Makros nur äusserst ungern rumfumeln lasse :-)))
Paste benutze ich auch nicht gerne, in diesem Fall wird aber auch
die Formatierung mitgenommen.
Gehts irgednwie ohne? (Paste, nicht Formatierung)
Post by Michael Schwimmer
Post by Eric March
mich die Hilfe hängen lassen wie ich eine Zelle auf
"Datum" setze; das Zuweisen von Do-It-Youself-Formaten
wäre ja nicht das TProblem gewesen.
[Weder ärgere ich mich über die Hilfe schwarz. NumberForamt
exisitert, und ich ahbe es auch gefunden, aber was ich
unter welchen Regeln zuweisen kann - _das_ steht, wie so
oft, nie beschrieben.
NumberFormat-Eigenschaft
NumberFormat-Eigenschaft, wie sie auf das CellFormat- und Range-Objekt
angewendet wird.
Der Formatierungscode hat dieselbe Zeichenfolge wie die Option
Formatierungscode im Dialogfeld Zellen formatieren. Die Zeichenfolge des
Formatierungscodes bei der Format-Funktion ist anders als bei den
Eigenschaften NumberFormat und NumberFormatLocal.
Was ist daran misszuverstehen?
Gegen "HH:MM:SS" etwa wehre ich mich nicht. Aber dass unser "Standard"
[immerhin ein gängiger Englischer Begriff] intern "General" heißt oder
"Text" als "@" defeinert werden muss - das fide ich nicht aufgelistet.
Misszuverstehen ist da nichts - es ist _gar_nicht_ zu verstehen: was man
nicht weiß kann man sich nicht aus den Fingenr Saugen. Ich brauche
pauschal "Text" und nicht etwas wie "[h]:mm" - das hätte ich anhand von F1
wahrlich selber geschafft.
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Ich zeichne oft mit dem Makrorekorder auf, bevor ich die
Hilfe benutze. Das hilft in vielen Fällen ungemein!
Ha-Ha-Ha - aus der Quelle habe ich reichlich Dinge bezogen die hier
unter die Räder kamen. :-)
Hättest du das mal gemacht, wärst du möglicherweise auf die
NumberFormat-Eigenschaft gestoßen.
ich habe bei NumberFormat mal fröhlich F1 gedrückt. Aber von "General" als
Systax-Synonym für dt. "Standard" steht da nix.
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
Worksheets("BB").Cells(1, 1) = _
Worksheets("SB").Cells(1, 1) -> OK
Worksheets("BB").Range(Cells(2, 1)) = _
Worksheets("SB").Range(Cells(2, 1))
-> Error 1004
Du hast wieder Cells ohne das zugehörige Objekt benutzt
und dann wird das Standardobjekt angenommen.
Und das ist ...
Ohne Worte. Diese Beispiele entstammen indirekt F1.
Mir bleibt wieder einmal die Spucke weg, wie du deine Fehler auf die OH,
VBA oder Excel abwälzt, deshalb gehe ich darauf auch nicht mehr näher
ein!
Wenn die Hilfe in die Irre führt und mit 1004 sehr instruktive
Feherlmeldungen rauskommen [toll, die ganze Zeile ist markiert, aber wo da
drin der Fehler ist wird nicht verraten] - was soll man machen?
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
OK. Warum kapiert dann - ich bin jezt mal so
direkt - ihr Helfer nicht, dass ihr am Ziel vorbieschießt?
Alle diese Schüsse haben direkt mit deinem Problem zu tun.
Diese Probleme existieren, seit es XL 97 gibt, und
die sogenannten Helfer versuchen, dich von Irrwegen und
Sackgassen abzubringen.
Sieht wohl so aus. Die Irrwege auf die mich F1 brachte…
Besorg dir bitte ein Buch über Excel-VBA, beschäftige dich ausgiebig
damit und benutze die Hilfe als das, was sie ist, nämlich als Hilfe und
nicht als Tutorial, um VBA zu lernen.
Es macht für mich einfach keinen Sinn mehr, jemanden zu helfen, der
Lernresistent ist und Fehler immer woanders sucht! Deshalb beenden wir
den Thread am besten an dieser Stelle
Und für mich ist es eine Freude von einem hochnäsigen Experten beraten zu
werden der auf die Fragen des kleinen dummen Trottels nicht einzugehen
gedenkt weil er zufällig irgenwo mal gelernt hat was man so nur gegen
teures Geld erfährt oder in 1000 Seiten Druckwerk verdauen muss.
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
unknown
2004-11-02 16:27:41 UTC
Permalink
Hallo Eric,
die Diskussion die du, Thomas und Michael bisher geführt habt ist hoch
interessant, und das meine ich nicht ironisch. Mir ist bisher kein
Artikel oder Buch bekannt das sich mit Programmcode im
"Grauzonenbereich" (ich nenne das jetzt mal so) beschäftigt. Code, der
syntaktisch und "defus-semantisch" korrekt ist, eventuell sogar ein
gewünschtes Ergebnis liefert, vielleicht auch in besonderen
Situationen zu einem Programmiertrick benutzt werden kann, aber
ansonsten "defus-semantische" kaum nachvollziehbare Ergebnisse oder
Fehler produziert.

Eine Anweisung wie:

Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) = _
Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))

ist syntaktisch und "defus-semantisch" korrekt.

Mit "defus-semantisch" meine ich die Progranmmierung von Code, der
augenscheinlich ein korrektes Ergebnis liefert/liefern solte und ohne
ersichtbaren Grund ins "Leere" läuft. Diese Art Fehler zu ermitteln
ist - aus meiner Erfahrung - meist nur mit einem imensen Aufwand oder
aber mit Erfahrung beizukommen. Diese "Grauzonen-Programmierung"
versuche ich zu vermeiden. Die obige Anweisung zu beschreiben und
ihre XL-Umgebungs- und XL-VBA-Abhängigkeiten, inklusive möglicher
Fehlerquellen zu nennen füllt viele, viele Zeilen Text (wie dieser
Thread auch zeigt).

Daher mein Angebot:
Beschäftige dich nicht weiter mit der Grauzonenprogrammierung (es sei
denn genau dieses Thema interessiert dich), sondern programmiere
direkt mit der genauen Referenzierung. Obige Anweisung lautet daher:

Workbooks("Auswertung.xls").Worksheets("Tabelle2"). _
Range("A12:A13").Value = _
Workbooks("Auswertung.xls").Worksheets("Tabelle1"). _
Range("A2:A3").Value

MfG Frank
_____________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
Website: http://www.xl-faq.de; Auftragsprogrammierung
Eric March
2004-11-03 14:23:48 UTC
Permalink
Post by Michael Schwimmer
Hallo Eric,
die Diskussion die du, Thomas und Michael bisher geführt habt ist hoch
interessant, und das meine ich nicht ironisch. Mir ist bisher kein
Artikel oder Buch bekannt das sich mit Programmcode im
"Grauzonenbereich" (ich nenne das jetzt mal so) beschäftigt. Code, der
syntaktisch und "defus-semantisch" korrekt ist, eventuell sogar ein
gewünschtes Ergebnis liefert, vielleicht auch in besonderen
Situationen zu einem Programmiertrick benutzt werden kann, aber
ansonsten "defus-semantische" kaum nachvollziehbare Ergebnisse oder
Fehler produziert.
Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) = _
Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))
ist syntaktisch und "defus-semantisch" korrekt.
Mit "defus-semantisch" meine ich die Progranmmierung von Code, der
augenscheinlich ein korrektes Ergebnis liefert/liefern solte und ohne
ersichtbaren Grund ins "Leere" läuft. Diese Art Fehler zu ermitteln
ist - aus meiner Erfahrung - meist nur mit einem imensen Aufwand oder
aber mit Erfahrung beizukommen. Diese "Grauzonen-Programmierung"
versuche ich zu vermeiden. Die obige Anweisung zu beschreiben und
ihre XL-Umgebungs- und XL-VBA-Abhängigkeiten, inklusive möglicher
Fehlerquellen zu nennen füllt viele, viele Zeilen Text (wie dieser
Thread auch zeigt).
Beschäftige dich nicht weiter mit der Grauzonenprogrammierung (es sei
denn genau dieses Thema interessiert dich), sondern programmiere
Workbooks("Auswertung.xls").Worksheets("Tabelle2"). _
Range("A12:A13").Value = _
Workbooks("Auswertung.xls").Worksheets("Tabelle1"). _
Range("A2:A3").Value
MfG Frank
_____________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
Website: http://www.xl-faq.de; Auftragsprogrammierung
Und wenn sie nicht gestorben sind referenzieren sie noch heute… Seufz…

OK; so langsam weiß ich, wo ich den Kameraden packen muss. Jetet rauchen
die Gehrinwidungen die Programmlogik auf die Reihe zu bekommen. :-)
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Michael Schwimmer
2004-11-03 02:33:27 UTC
Permalink
Hallo Eric,
Post by Eric March
Wenn du mir verraten kannst wo die Logik in diesen beieden Dingen
- Dummy = Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))
- Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) =
Dummy Funktioniert.
Du wandelst zuerst einen Range in ein zweidimensionales Variantarray um.
Da ein Variant nur bestimmte Datentypen speichern kann, wird jeder
Zellinhalt (nur der Wert) in einen der Datentypen umgewandelt, der in
einem Variant gespeichert werden kann. Bei dieser Umwandlung ist
nicht sichergestellt, dass ein Wert als der Datentyp gespeichert wird,
in der er in der Zelle d a r g e s t e l l t wird.

Welcher Typ anschließend benutzt wurde, kann man mit VarType
herausfinden:

Konstante Wert Beschreibung
vbEmpty 0 Empty (nicht initialisiert)
vbNull 1 Null (keine gültigen Daten)
vbInteger 2 Ganzzahl (Integer)
vbLong 3 Ganzzahl (Long)
vbSingle 4 Fließkommazahl einfacher Genauigkeit
vbDouble 5 Fließkommazahl doppelter Genauigkeit
vbCurrency 6 Währungsbetrag (Currency)
vbDate 7 Datumswert (Date)
vbString 8 Zeichenfolge (String)
vbObject 9 Objekt
vbError 10 Fehlerwert
vbBoolean 11 Boolescher Wert (Boolean)
vbVariant 12 Variant (nur bei Datenfeldern mit Variant-Werten)
vbDataObject 13 Ein Datenzugriffsobjekt
vbDecimal 14 Dezimalwert
vbByte 17 Byte-Wert
vbArray 8192 Datenfeld (Array)

Dort ist definitiv kein Platz mehr für Formatierungen!

Umgekehrt beamst du den Inhalt des Variantarrays in einen Bereich.
Die Datentypen jeden einzelnen Elementes des Variantarrays stehen
zu diesem Zeitpunkt bereits fest.
Die Frage ist nun, wie eine Zelle, die irgendwann einmal mit
einem Format belegt wurde, einen ihr zugewiesenen Wert interpretiert.
Diese ursprüngliche Formatierung wird in der Biff-Struktur der
Datei gespeichert und mitgeschleift, bis die Zelle endgültig
gelöscht wird.
Ist diese als Datum formatiert, wird beispielsweise ein Double
als Datum angezeigt.
Selbst wenn die Zelle kein bestimmtes Format besitzt, kann ein
String, der ein Datum darstellt, als Datum interpretiert werden
und intern im Datumsformat, also als serielle Zahl gespeichert
werden. Du gibst ja auch beispielsweise in eine Zelle 11:45 ein
und erwartest von Excel, dass das als Zeit gespeichert wird und
nicht als Text.
Post by Eric March
- Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) = _
Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))
Funktioniert nicht (mehr: es wird nichts übertragen).
Stimmt, das geht auch nicht. Es ist einfach so, dass folgendes
Konstrukt nicht funktioniert:

Worksheets(2).Range("A1:B10") = Worksheets(1).Range("A1:B10")

Ob das nun logisch ist, oder nicht, spielt keine Rolle, man
muss sich leider damit abfinden.
Post by Eric March
Dass der Range ohne Referenzierung auf ein Objekt ("sein" Worksheet)
exisiteren kann ist nicht sher logisch.
Wie schon angeführt, wird ohne die explizite Angabe des Objektes
das Standardobjekt benutzt. Ein Fehler, wie >>Objekt erforderlich<<
wäre mir auch lieber, ich kann es aber nicht erzwingen und muss
mich auch mit dieser "Arbeitserleicherung" abfinden.
Post by Eric March
Aber weiter. In den Zellen A25 und A26 von stehen als Inhalt A2 und
A3, bie B in A14 und A15 je A12 und A13.
- Dummy = Range(Worksheets(A).Cells(25, 1) & ":" &
Worksheets(A).Cells(26, 1))
- Range(Worksheets(A).Cells(14, 1) & ":" & Worksheets(A).Cells(15,
1)) = Dummy
Damit wird offenbar nur das aktive Blatt A bedient, die Inhalte
dessen A2 und A3 landeten pflichtgemäß in A12 und A13.
Was erwartest du überhaupt?

Worksheets(A).Cells(25, 1) & ":" & Worksheets(A).Cells(26, 1)
liefert nur den den String "A25:A26", den du anschließend
weiterbenutzt.

Du referenzierst also den Range "A25:A26" des gerade aktiven Blattes
Dummy = Range(
weil du wieder bei "Range" das zugehörige Objekt nicht angibst!
Das gleiche machst du auch im umgekehrten Fall.
Post by Eric March
Schritt 3. Selbe Hilfsinhalte wie oben.
- Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1) & ":" &
Worksheets(A).Cells(26, 1))
- Worksheets(B).Range(Worksheets(B).Cells(14, 1) & ":" &
Worksheets(B).Cells(15, 1)) = Dummy
Und siehe da - der Ihnalt von B aus A2 und A3 landet in A in A12 und
A13 Das wäre _logisch_. Hier differenziert der Vorspann mit dem
Arbeitsblatt definitiv wessen Range erfasst wird - und bedeutet
einen immensen Unterschied. So kann ich das alles wunderbar
verstehen und nachvollziehen.
Diesmal gibst du ja auch das zugehörige Objekt an, wie ich es dir
schon seit meinem ersten Posting klarmachen will.
Post by Eric March
Wenn du mir nun noch verrätst wie ich statt (zufällig aus Zellen
entnommene) Koordinaten im B12-Stil mathematische Koordinaten (12,2)
als "Grenzen" für den Range (das hat ja offenbar so funktionert wie
ich es dachte und hatte denken müssen) einbringen kann bin ich einen
satten Schritt weiter.
Jetzt weiß ich wirklich nicht, was du erwartest?

Aus einer Adresse die Zeile und Spalte machen?

Dim lngZeile As Long
Dim lngSpalte As Long
lngZeile = Range("A2").Row
lngSpalte = Range("A2").Column

oder gar einen Bereich definieren?

Statt in A25 und A26 als Inhalt A2 und A3
Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1) & _
":" & Worksheets(A).Cells(26, 1))

With Worksheets(A)
Dummy = .Range(.Cells(2, 1), .Cells(3, 1))
End With
Post by Eric March
Und erkläre mir bitte, gegenüber meiner Syntax nun Strings zu
verkuppeln, warum die von mir bemängelte Logik…
- Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1),
Worksheets(A).Cells(26, 1))
Schau dir doch einmal im Lokalfenster den Inhalt des
Arrays Dummy an.

Einmal hast du ein Array, in dem das Element (1,1) den Inhalt
der Zelle "A2" und (1,2) den Inhalt der Zelle "A3" enthält.
Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1) & _
":" & Worksheets(A).Cells(26, 1))

Im anderen Fall bekommst du ein Array, in dem das Element (1,1)
den Text "A2" und (2,1) den Text"A3" enthält. Beachte dabei
auch die Dimensionen.
Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1), _
Worksheets(A).Cells(26, 1))
Post by Eric March
- Worksheets(B).Range(Worksheets(B).Cells(14, 1),
Worksheets(B).Cells(15, 1)) = Dummy
…überhaupt irgendwie funktioniert: Meine Hilfskoordinaten "A2" und
"A3" - also die Zellinahlte! - aus A A25/26 und in B A14/15
rausgekommen. 25,1 und 26,1 sowie 14,1 und 15,1 wurden (durch das WS
referenziert) offenabar selbst als Koordinaten genonnmen und _nicht_
der Inhalt diese Zellen (.Value ist soweit ich weiß ja der Standard
für 'Cells()')… - Dummy = Range(Worksheets(A).Cells(25, 1),
Worksheets(A).Cells(26, 1)) - Range(Worksheets(B).Cells(14, 1),
Worksheets(B).Cells(15, 1)) = Dummy …ist mit der lettzen Sysntax
effektiv identisch. Hier bewirkt das Vorspannen eines übergeordneten
Objektes nichts.
Wo also sot die Logik, dass in eine Falle (Strings) Zell_inhalte_ als
Koordinaten verwendet werden, währen andersrum als "alternative"
Angabe mit 2xCells durch Komma getrennt deren matehmatische
Wertigekiten in den Klammen die Grenzen definieren?
Wenn - und das ist mir halt nicht begriflich - ein Range so in eine
Varible verpackt werden kann und aus dieser wiederum geefüllt, warum
funktioniert diese Syntax nicht?
- Range(Worksheets(B).Cells(14, 1), Worksheets(B).Cells(15, 1)) =
Range(Worksheets(A).Cells(25, 1), Worksheets(A).Cells(26, 1))
Wie oft soll ich mich denn noch wiederholen?
Versuch doch erst einmal, das bisher gepostete zu verstehen,
dann erübrigen sich die meisten Fragen.
Post by Eric March
Post by Michael Schwimmer
Wo habe ich geschrieben, dass With ein Funktionsbefehl ist.
[Schnipp]
Nirgends. Ich habe das geschreiben. Ich wollte damit bemängeln, dass
ein rein optischer Befehl der nichts mit der Logik zu tun hat
eingespannt werden "muss" damit man nicht total die Übersicht über
diese als so gelobete strukturierte OO-Programmierung verliert.
Was verstehst du unter einem rein optischen Befehl?

Mit Do Loop kann ich alle möglichen Schleifen programmieren, die
zudem noch sauber aussehen und auch nicht langsamer sind.

Do While XYZ: Loop
Do Until XYZ: Loop
Do While XYZ: If ABC Then Exit Do: Loop
Do Until XYZ: If ABC Then Exit Do: Loop
Do: Loop While XYZ
Do: Loop Until XYZ
Do: If ABC Then Exit Do: Loop Until XYZ
Do: If ABC Then Exit Do: Loop While XYZ

Was ist an diesen Schleifen unlogisch, oder gar unübersichtlich?
Versuch das mal mit While und Wend zu machen.
Post by Eric March
Post by Michael Schwimmer
Was soll daran besonders genial sein. Mit was für einem
Basic-Dialekt (InKey) arbeitest du überhaupt, wir sprechen hier
schließlich von VBA.
ICh wollte nur dezetn darauf hinweisen, dass While-Wend nicht
schlechter Stil ist sondern ziemlich alt und bewährt.
Ziemlich alt und durch >>do loop<< total unnötig!
Post by Eric March
Die Existenz von spezilaisierten Befehlen die bestimmte logische
Strukturen (Kopf/Fusß-Steuerung) abbilden - und die nun durch
Adaption DO _WHILE_ abc : xyz LOOP statt WHILE abc DO xyz LOOP (oder
IF abc BEGIN xyz END) bestenfalls einen neumodishen Mischmach
erzeugen der nichts mehr mit Übersichtlichkeit zu tun hat… DO xyz
LOOP _UNTIL_ abc ist REPEAT xyz UNTIL abc. DO : LOOP ist eine
Endlosschelife weil ich nicht gezwungen bin durch einen
korrespondierenden Ende-Befehl eine Schleife grundsätzlich
abbrechbar zu gestalten: While-Wend, Repeat-Until [Loop-Until, ggf.
noch Do-Loop+Until] und For-Next.
Wenn also neue (in diesem Fall bereits ziemlich alte) Sprachelemente
hinzukommen, sollte man diese deiner Ansicht nach nicht benutzen.
Das kannst du gerne machen.
Post by Eric March
Wahrscheinlich. Ich kann mich ja prinzipiell mit DO-LOOP abfinden
(wohlweißlich, dass mir DO WHILE … LOOP bzw. DO … LOOP UNTIL absolut
nicht schmecken weil ich je ein zusätzliches Schlüsselwort brauche
um die jeweilige Logik abzubilden).
Bereitet dir das Eintippen eines zusätzlichen Schlüsselwortes
wirklich so viele Probleme?
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
prinzipiell vor… [Wenn ich eine Spalte abklappern muss - warum
gibts keinen Befhel der à la EACH alles in der Spalte erfasst
oder die
Dim rngZelle As Range
For Each rngZelle In Columns("B:B")
rngZelle.NumberFormat = "0.00"
Next
Und wenn ich nur A2 bis A-weiter-unten abkalppern muss, in A1 aber
ein Titel steht?
Dim rngZelle As Range
For Each rngZelle In Worksheets(2).Range("A2:A65536")
rngZelle.NumberFormat = "0.00"
Next
Post by Eric March
Post by Michael Schwimmer
Programmiere am besten VBA neu und bitte Microsoft, alle Versionen
darauf abzudaten!
Mann, finde dich endlich mit dem ab, was du vorfindest und jammere
nicht herum!
Dann soll MS eine Hilfe rausgeben die Fragen beantwortet statt neue
aufzuwerfen.
Ich komme mit der Hilfe hervorragend zurecht! Die hat mir schon
so manche Fragen beantwortet.
Post by Eric March
Post by Michael Schwimmer
Man kann ohne Probleme ausprobieren, ob das, was man denkt, auch
der Wirklichkeit entspricht! In deinem Fall, ob der Zeitvorteil
wirklich relevant ist.
Jedes Warten ist störend. Und bei aller hoch gepriesen
OO-Programmierung einen Range (wieder das böse Wort) von A1 nach
Z25432 als zweizinkige Schelifenstruktur einzeln abzuklappen ist
wohl der absolute Hohn.
Mag ja alles sein, wenn du es aber richtig machen willst, bleibt
dir nichts anderes übrig.
Da hilft kein Sarkasmus und auch kein Gejammer, finde dich damit ab.
Vogel friss, oder stirb!
Ich habe VBA und Excel nicht programmiert und musste mich
auch an die Gegebenheiten anpassen.
Post by Eric March
Post by Michael Schwimmer
Besorg dir bitte ein Buch über Excel-VBA, beschäftige dich
ausgiebig damit und benutze die Hilfe als das, was sie ist,
nämlich als Hilfe und nicht als Tutorial, um VBA zu lernen.
Es macht für mich einfach keinen Sinn mehr, jemanden zu helfen, der
Lernresistent ist und Fehler immer woanders sucht! Deshalb beenden
wir den Thread am besten an dieser Stelle
Und für mich ist es eine Freude von einem hochnäsigen Experten
beraten zu werden der auf die Fragen des kleinen dummen Trottels
nicht einzugehen gedenkt weil er zufällig irgenwo mal gelernt hat
was man so nur gegen teures Geld erfährt oder in 1000 Seiten
Druckwerk verdauen muss.
Ich bin in mehreren Postings auf deine Fragen eingegangen.
Du willst oder kannst aber mit den Antworten scheinbar nichts
anfangen und versuchst, weiterhin mit dem Kopf durch die Wand
zu gehen.

Ein Mann fliegt einen Heißluftballon und realisiert, daß er
die Orientierung verloren hat. Er reduziert seine Höhe und
macht schließlich einen Mann am Boden aus.
Er läßt den Ballon noch weiter sinken und ruft:
"Entschuldigung, können Sie mir helfen? Ich versprach
meinem Freund, ihn vor einer halben Stunde zu treffen,
aber ich weiß nicht, wo ich mich befinde."
Der Mann am Boden sagt: "Ja, sie befinden sich in einem
Heißluftballon. Ihre Position ist zwischen 40 und 42 Grad
nördlicher Breite und zwischen 58 und 60 Grad westlicher
Länge."
"Sie müssen ein hochnäsiger Experte sein", sagt der
Ballonfahrer.
"Bin ich", antwortet der Mann. "Wie haben Sie das gewußt?"
"Sehen Sie", sagt der Ballonfahrer, "alles, was Sie mir
gesagt haben, ist technisch korrekt, aber ich habe keine
Ahnung, was ich mit Ihren Informationen anfangen soll und
ich weiß immer noch nicht, wo ich bin."
Der Experte sagt hierauf: "Sie müssen ein Projekt-Manager
sein."
"Bin ich", antwortet der Ballonfahrer, "Wie haben Sie das
gewußt?"
"Sehen Sie", sagt der Experte "Sie wissen nicht, wo Sie
sind oder wohin Sie gehen. Sie haben ein Versprechen gegeben,
von dem Sie keine Ahnung haben, wie Sie es einhalten können
und Sie erwarten, daß ich Ihnen dieses Problem löse.
Tatsache ist: Sie befinden sich in exakt derselben Position,
in der Sie waren, bevor wir uns getroffen haben aber irgendwie
ist jetzt alles meine Schuld."


MfG
Der hochnäsige Experte
--
-------------------------------------------
Michael Schwimmer
Home : http://michael-schwimmer.de
Thomas Ramel
2004-11-03 05:45:10 UTC
Permalink
Grüezi Michael

Michael Schwimmer schrieb am 03.11.2004

[Experten-Manager-Treffen gesnippt]

*LOL*

Schön, diesen Dialog mal wieder zu lesen.

(Wenn ichs sehr deftig formulieren wollte käme mir etwas mit Perlmuttkugeln
und rosafarbenen Tieren in den Sinn)
Post by Michael Schwimmer
MfG
Der hochnäsige Experte
Ach lass nur - für mich war EOT schon vorgestern.
--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win XP Pro SP-1 / xl2000 SP-3]
Michael Schwimmer
2004-11-03 23:48:30 UTC
Permalink
Hallo Thomas,
Post by Thomas Ramel
Ach lass nur - für mich war EOT schon vorgestern.
EOT ist klar, aber ich hätte nie gedacht, dass ich
jemals ein Plonck benutzen muss, und schon gar
nicht in dieser Newsgroup ;-(
Das ist hoffentlich das erste und letzte Mal.
Aber was solls, solche Beiträge zu ingorieren ist
auch kein wirklicher Verlust. Da tue ich mir dann
schon lieber Tuvok an ;-)


Viele Grüße
Michael
--
-------------------------------------------
Michael Schwimmer
Home : http://michael-schwimmer.de
Eric March
2004-11-03 15:38:32 UTC
Permalink
Am Wed, 3 Nov 2004 03:33:27 +0100 schrieb Michael Schwimmer
Post by Michael Schwimmer
Hallo Eric,
Post by Eric March
Wenn du mir verraten kannst wo die Logik in diesen beieden Dingen
- Dummy = Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))
- Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) =
Dummy Funktioniert.
Du wandelst zuerst einen Range in ein zweidimensionales Variantarray um.
Da ein Variant nur bestimmte Datentypen speichern kann, wird jeder
Zellinhalt (nur der Wert) in einen der Datentypen umgewandelt, der in
einem Variant gespeichert werden kann. Bei dieser Umwandlung ist
nicht sichergestellt, dass ein Wert als der Datentyp gespeichert wird,
in der er in der Zelle d a r g e s t e l l t wird.
Welcher Typ anschließend benutzt wurde, kann man mit VarType
Konstante Wert Beschreibung
vbEmpty 0 Empty (nicht initialisiert)
vbNull 1 Null (keine gültigen Daten)
vbInteger 2 Ganzzahl (Integer)
vbLong 3 Ganzzahl (Long)
vbSingle 4 Fließkommazahl einfacher Genauigkeit
vbDouble 5 Fließkommazahl doppelter Genauigkeit
vbCurrency 6 Währungsbetrag (Currency)
vbDate 7 Datumswert (Date)
vbString 8 Zeichenfolge (String)
vbObject 9 Objekt
vbError 10 Fehlerwert
vbBoolean 11 Boolescher Wert (Boolean)
vbVariant 12 Variant (nur bei Datenfeldern mit Variant-Werten)
vbDataObject 13 Ein Datenzugriffsobjekt
vbDecimal 14 Dezimalwert
vbByte 17 Byte-Wert
vbArray 8192 Datenfeld (Array)
Dort ist definitiv kein Platz mehr für Formatierungen!
Verrrückterweise ist ja das das was ich gern hätte - »reine Rohdaten ohen
Brimborium« (ich erlaube mir mal das so auszudrücken).
Post by Michael Schwimmer
Umgekehrt beamst du den Inhalt des Variantarrays in einen Bereich.
Die Datentypen jeden einzelnen Elementes des Variantarrays stehen
zu diesem Zeitpunkt bereits fest.
Das sollte heißen, wenn String im Variant gelandet war dann wird auch
String abgeliefert - mit anderen Worten: Die Vorgaben aus der Quelle,
mithin dann unser Varinnt, sind das was die Zielzelle würde verdauen
müssen (damit greife ich dem nächsten Absatz vor).
Post by Michael Schwimmer
Die Frage ist nun, wie eine Zelle, die irgendwann einmal mit
einem Format belegt wurde, einen ihr zugewiesenen Wert interpretiert.
Diese ursprüngliche Formatierung wird in der Biff-Struktur der
Datei gespeichert und mitgeschleift, bis die Zelle endgültig
gelöscht wird.
Ich habe nur zu oft den Eindruck, dass da was verändert wird. Mehr noch;
wenn hinterher als Formatierung sprichwörtlich "Nichts", nicht mal
Standard, angegeben wird wenn ich eine so veränderte Zelle darauf prüfe
stehe ich eingentlich ttoal im Wald.
Jedenfalls _wurde_ etwas verändert und es _wurden_nicht_ einkommende
Rohdaten die konvertierbar wären auf den Zielzelltyp (d.h. die letzte
mauelle Formatierung) angepasst (mehr das Gegenteil passierte).
Post by Michael Schwimmer
Ist diese als Datum formatiert, wird beispielsweise ein Double
als Datum angezeigt.
Diese Logik ergäbe für mich Sinn, da ja das Datum auch "nur" als
›soundsoviele Tage nach dem Stichtag‹ gezählt wird. Damit wird Zahl zu
Datum - oder ein so eingegebenes Datum zu Zahl.
Post by Michael Schwimmer
Selbst wenn die Zelle kein bestimmtes Format besitzt, kann ein
String, der ein Datum darstellt, als Datum interpretiert werden
und intern im Datumsformat, also als serielle Zahl gespeichert
werden. Du gibst ja auch beispielsweise in eine Zelle 11:45 ein
und erwartest von Excel, dass das als Zeit gespeichert wird und
nicht als Text.
Ich erwarte das eigentlich nicht; wenn ich eine Zelle vorfomatiert habe
(und das ute ich gewöhnlich eben justament deswegen) dann soll 11:35 ein
arme Hanballergebnis sein, aber keine Uhrzeit.
Bei allen Fällen in dene ich diverse Dinge einzutippen hatte
(Telefonnummern, mit fühernder Null…) musste ich immer vorher mit
passender Foramtierung vorgreifen weil mir die Art wie Excel etwas
interpretiert seltenst zusagt.
Post by Michael Schwimmer
Post by Eric March
- Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) = _
Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))
Funktioniert nicht (mehr: es wird nichts übertragen).
Stimmt, das geht auch nicht. Es ist einfach so, dass folgendes
Worksheets(2).Range("A1:B10") = Worksheets(1).Range("A1:B10")
Ob das nun logisch ist, oder nicht, spielt keine Rolle, man
muss sich leider damit abfinden.
OK; nur wäre es halt sinnvoll wenn man eine Fehlermeldung bekäme nun nicht
- Nichts.
Post by Michael Schwimmer
Post by Eric March
Dass der Range ohne Referenzierung auf ein Objekt ("sein" Worksheet)
exisiteren kann ist nicht sher logisch.
Wie schon angeführt, wird ohne die explizite Angabe des Objektes
das Standardobjekt benutzt. Ein Fehler, wie >>Objekt erforderlich<<
wäre mir auch lieber, ich kann es aber nicht erzwingen und muss
mich auch mit dieser "Arbeitserleicherung" abfinden.
Die "" sprechen Bände.
Post by Michael Schwimmer
Post by Eric March
Aber weiter. In den Zellen A25 und A26 von stehen als Inhalt A2 und
A3, bie B in A14 und A15 je A12 und A13.
- Dummy = Range(Worksheets(A).Cells(25, 1) & ":" &
Worksheets(A).Cells(26, 1))
- Range(Worksheets(A).Cells(14, 1) & ":" & Worksheets(A).Cells(15,
1)) = Dummy
Damit wird offenbar nur das aktive Blatt A bedient, die Inhalte
dessen A2 und A3 landeten pflichtgemäß in A12 und A13.
Was erwartest du überhaupt?
Einmal wird der _Inhalt_ der Zellen pflichtgemäß erfasst, heißt: ein Sring
der ‹A2:A3› lautet und as Bereichsangabe tut. Habe ich aber reine
mathematische Koordinaten für die Zellen (z.B. aus Zählschleifen) kann ich
den Range offensichtlich gar nicht so (=dadurch, damit) erfassen -
‹Cells(m,n),Cells(r,s)› gibt nicht deren Inhalt wieder [was also in den
Zellen nm und sr des aktiven Blatts stände] sondern legt Kooridinaten fest
- die offenbar die Eckdaten des echten Bereiches auf dem aktiven [..!!]
Blatt sind. Anders als es zu aktivieren könnte ich mit den
Systaxmöglichkeiten (oder höherer Stringmathematik) nicht über rein
mathematische Eckkoordinaten einen Range erfassen. Auf diese Boshaftigkeit
weist die Hilfe nicht (offensichtlich) hin.
Post by Michael Schwimmer
Worksheets(A).Cells(25, 1) & ":" & Worksheets(A).Cells(26, 1)
liefert nur den den String "A25:A26", den du anschließend
weiterbenutzt.
Du referenzierst also den Range "A25:A26" des gerade aktiven Blattes
Dummy = Range(
weil du wieder bei "Range" das zugehörige Objekt nicht angibst!
Das gleiche machst du auch im umgekehrten Fall.
Was zu beweisen war.
Post by Michael Schwimmer
Post by Eric March
Schritt 3. Selbe Hilfsinhalte wie oben.
- Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1) & ":" &
Worksheets(A).Cells(26, 1))
- Worksheets(B).Range(Worksheets(B).Cells(14, 1) & ":" &
Worksheets(B).Cells(15, 1)) = Dummy
Und siehe da - der Ihnalt von B aus A2 und A3 landet in A in A12 und
A13 Das wäre _logisch_. Hier differenziert der Vorspann mit dem
Arbeitsblatt definitiv wessen Range erfasst wird - und bedeutet
einen immensen Unterschied. So kann ich das alles wunderbar
verstehen und nachvollziehen.
Diesmal gibst du ja auch das zugehörige Objekt an, wie ich es dir
schon seit meinem ersten Posting klarmachen will.
Ich wollte alle Wege dokumentieren und nachprüfen.
Post by Michael Schwimmer
Post by Eric March
Wenn du mir nun noch verrätst wie ich statt (zufällig aus Zellen
entnommene) Koordinaten im B12-Stil mathematische Koordinaten (12,2)
als "Grenzen" für den Range (das hat ja offenbar so funktionert wie
ich es dachte und hatte denken müssen) einbringen kann bin ich einen
satten Schritt weiter.
Jetzt weiß ich wirklich nicht, was du erwartest?
Aus einer Adresse die Zeile und Spalte machen?
Dim lngZeile As Long
Dim lngSpalte As Long
lngZeile = Range("A2").Row
lngSpalte = Range("A2").Column
oder gar einen Bereich definieren?
Statt in A25 und A26 als Inhalt A2 und A3
Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1) & _
":" & Worksheets(A).Cells(26, 1))
With Worksheets(A)
Dummy = .Range(.Cells(2, 1), .Cells(3, 1))
End With
Nein. Aus 25,1 müsste automatisch A25 werden - ich will nichts mehr oder
weniger als die Koodinalten Zeile 25 Spalte 1 als gültige Angeben
erfassbar sind ohen sie als String A25 interpretieren lassen zu müssen.
Post by Michael Schwimmer
Post by Eric March
Und erkläre mir bitte, gegenüber meiner Syntax nun Strings zu
verkuppeln, warum die von mir bemängelte Logik…
- Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1),
Worksheets(A).Cells(26, 1))
Schau dir doch einmal im Lokalfenster den Inhalt des
Arrays Dummy an.
Einmal hast du ein Array, in dem das Element (1,1) den Inhalt
der Zelle "A2" und (1,2) den Inhalt der Zelle "A3" enthält.
Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1) & _
":" & Worksheets(A).Cells(26, 1))
Im anderen Fall bekommst du ein Array, in dem das Element (1,1)
den Text "A2" und (2,1) den Text"A3" enthält. Beachte dabei
auch die Dimensionen.
Dummy = Worksheets(A).Range(Worksheets(A).Cells(25, 1), _
Worksheets(A).Cells(26, 1))
Das ist für mich jetzt nicht schlüssig was du sagen willst. "A2" und "A3"
sind Strings die in den Zellen 25,1 und 26,1 liegen und, indem ich die
Inhalte von 25,1 und 26,1 Stringmatehematisch zu "A2:A3" kombiniere einen
für Range verwertbaren Befehslcode ergeben.
Das ist im obigen Beipsiel der Fall. Im unteren dagegen die Fallen-Syntax
die mit oder ohen Referenzierung offenbar absolut den Range von 25,1 bis
26,1 des aktiven Blattes esfasst. Demnach ewische ich entweder (A) nur das
aktive Blatt, oder (B) ich aknn Zellinhalte auswerten die rein zufällig
Koordinaten ergeben, oder (C) ich müsste 25,1 mit einer Routine zu A25
machen - und genau diese Funktionalität (die ich bie einem
Tabellenprogramm als essentiell voraussetze, oder mehr erst gar nicht
voraussetzten müsste) fehlt.
Das Loch in das ich von der Hilfe geführt wurde war, dass es unmöglich ist
mit der Syntax direkt mathematische Koordinaten zum Erfassen eines Ragens
benutzen zu können.
Post by Michael Schwimmer
Post by Eric March
- Worksheets(B).Range(Worksheets(B).Cells(14, 1),
Worksheets(B).Cells(15, 1)) = Dummy
…überhaupt irgendwie funktioniert: Meine Hilfskoordinaten "A2" und
"A3" - also die Zellinahlte! - aus A A25/26 und in B A14/15
rausgekommen. 25,1 und 26,1 sowie 14,1 und 15,1 wurden (durch das WS
referenziert) offenabar selbst als Koordinaten genonnmen und _nicht_
der Inhalt diese Zellen (.Value ist soweit ich weiß ja der Standard
für 'Cells()')… - Dummy = Range(Worksheets(A).Cells(25, 1),
Worksheets(A).Cells(26, 1)) - Range(Worksheets(B).Cells(14, 1),
Worksheets(B).Cells(15, 1)) = Dummy …ist mit der lettzen Sysntax
effektiv identisch. Hier bewirkt das Vorspannen eines übergeordneten
Objektes nichts.
Wo also sot die Logik, dass in eine Falle (Strings) Zell_inhalte_ als
Koordinaten verwendet werden, währen andersrum als "alternative"
Angabe mit 2xCells durch Komma getrennt deren matehmatische
Wertigekiten in den Klammen die Grenzen definieren?
Wenn - und das ist mir halt nicht begriflich - ein Range so in eine
Varible verpackt werden kann und aus dieser wiederum geefüllt, warum
funktioniert diese Syntax nicht?
- Range(Worksheets(B).Cells(14, 1), Worksheets(B).Cells(15, 1)) =
Range(Worksheets(A).Cells(25, 1), Worksheets(A).Cells(26, 1))
Wie oft soll ich mich denn noch wiederholen?
Versuch doch erst einmal, das bisher gepostete zu verstehen,
dann erübrigen sich die meisten Fragen.
Nein. Denn es gibt da _nichts_ zu _verstehen_ (bestenfalls zu _lernen_)
weil es keine F1 gibt die en gnau auf diese Feinheiten hinweist. Mit der
Hife in diesme Thread habe ich wenigsten heruasbekommen was da für eine
übles Spiel mit dme User gespielt wird.
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Wo habe ich geschrieben, dass With ein Funktionsbefehl ist.
[Schnipp]
Nirgends. Ich habe das geschreiben. Ich wollte damit bemängeln, dass
ein rein optischer Befehl der nichts mit der Logik zu tun hat
eingespannt werden "muss" damit man nicht total die Übersicht über
diese als so gelobete strukturierte OO-Programmierung verliert.
Was verstehst du unter einem rein optischen Befehl?
Ein Befehl der nichts mit der Programmlogik zu tun hat sondern nur den
Buchstabenwust etwas reduziert.
Post by Michael Schwimmer
Mit Do Loop kann ich alle möglichen Schleifen programmieren, die
zudem noch sauber aussehen und auch nicht langsamer sind.
---enuffgeschnibbelt---
Post by Michael Schwimmer
Was ist an diesen Schleifen unlogisch, oder gar unübersichtlich?
Versuch das mal mit While und Wend zu machen.
Do While XYZ: Loop
Do Until XYZ: Loop
Ich kenne nur Do : Loop Until. Aber wenn ich erhlich sein soll - so eine
Do-Until in der Schreibweise wäre mir (weil stringenter: Befehl -
Bedingung - Schleife - Ende) eingentlich recht genehm.
Post by Michael Schwimmer
Do While XYZ: If ABC Then Exit Do: Loop
Do Until XYZ: If ABC Then Exit Do: Loop
AARGH!!! {Meine Herztabletten! Schnell!} Exit Do ist das _Allerletzte_ was
man bei _strukturirrter_Programmierung_ gebrauchen kann.
Post by Michael Schwimmer
Do: Loop While XYZ
Do: Loop Until XYZ
Hier träfe dasselbe wie beim ersten Besipiel zu: Wenn die Grundsyntax
(Befehl - Schleife - Bedingung - Ende) immer dieselbe wäre ergäbe das
schon Sinn. Aber wenn schon dann richtige Kopf- und Fußsteuerung [While
Bedingung Do : Loop / Do : Loop While {nicht Until..! :-) ) Bedingung -
While/Until unterscheiden sich ja nur durch ein NOT] :-)
Post by Michael Schwimmer
Do: If ABC Then Exit Do: Loop Until XYZ
Do: If ABC Then Exit Do: Loop While XYZ
(Gut dass die Tabeltten da waren…)

Mit While-Wend konstruiere ich ausschließlich kopfgesteuerte Schleifen.
Und selbst damit ließe sich das Fußsteuerungsprinzip im Groben und Ganzen
abbilden. Z.B. Label1; If Bedingung Goto Label2; Befehl-Befehl-Goto
Label1; Label2 - das würde man als übelstes C64-Spagetti-Basic einstufen.
Nichts anderes tun While-Wend, Do-Loop und sogar For-Next.
Ich brauche nicht 5 verschieden Syntaxen die mir dasselbe liefern. Bislang
bin ich mit While-Wend immer gut hingekommen weil ich in den seltensten
Fällen Fußgesteuerte Schleifen brauchte (wie gesagt, einmal NOT und sie
ist Kopfgesteuert). Die Spagetti-Syntax um Do-Loop jedenfalls regt bei mir
keinen Appetiut an.
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Was soll daran besonders genial sein. Mit was für einem
Basic-Dialekt (InKey) arbeitest du überhaupt, wir sprechen hier
schließlich von VBA.
ICh wollte nur dezetn darauf hinweisen, dass While-Wend nicht
schlechter Stil ist sondern ziemlich alt und bewährt.
Ziemlich alt und durch >>do loop<< total unnötig!
Nur weil das Zeug neu ist muss es nicht besser sein. Im Gegenteil. Do-Loop
ist alt - und in aller Regel war es immer nur Do - Loop Until (bevor ihm
ein While aufgebrummt wurde) und das Gegeteil zu While-Wend (oder sogar
While Do - Loop). WW kommt nämlich mit 2 Schlüsselwörten aus. Ich habe
vorher (ob du's glaubst oder nicht) mit Do While - Loop gearbeitet. Als
ich While-Wend (aus der Hilfe) kennen lernte nahm ich das als sich
bewährende Verbeserung hin.
Post by Michael Schwimmer
Post by Eric March
Die Existenz von spezilaisierten Befehlen die bestimmte logische
Strukturen (Kopf/Fusß-Steuerung) abbilden - und die nun durch
Adaption DO _WHILE_ abc : xyz LOOP statt WHILE abc DO xyz LOOP (oder
IF abc BEGIN xyz END) bestenfalls einen neumodishen Mischmach
erzeugen der nichts mehr mit Übersichtlichkeit zu tun hat… DO xyz
LOOP _UNTIL_ abc ist REPEAT xyz UNTIL abc. DO : LOOP ist eine
Endlosschelife weil ich nicht gezwungen bin durch einen
korrespondierenden Ende-Befehl eine Schleife grundsätzlich
abbrechbar zu gestalten: While-Wend, Repeat-Until [Loop-Until, ggf.
noch Do-Loop+Until] und For-Next.
Wenn also neue (in diesem Fall bereits ziemlich alte) Sprachelemente
hinzukommen, sollte man diese deiner Ansicht nach nicht benutzen.
Das kannst du gerne machen.
Siehe oben: Das Neue muss nicht besser sein. Es kommt der Faulehit der
Programmiere entgegen und verschlimmert die Codelesbarkeit.
Post by Michael Schwimmer
Post by Eric March
Wahrscheinlich. Ich kann mich ja prinzipiell mit DO-LOOP abfinden
(wohlweißlich, dass mir DO WHILE … LOOP bzw. DO … LOOP UNTIL absolut
nicht schmecken weil ich je ein zusätzliches Schlüsselwort brauche
um die jeweilige Logik abzubilden).
Bereitet dir das Eintippen eines zusätzlichen Schlüsselwortes
wirklich so viele Probleme?
Ja. Weils einfach üblrr zu lesen ist wenn/weil es auch die Endlosschleife
Do-Loop gibt die Keksperten mit Exit Do verlassen.
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
prinzipiell vor… [Wenn ich eine Spalte abklappern muss - warum
gibts keinen Befhel der à la EACH alles in der Spalte erfasst
oder die
Dim rngZelle As Range
For Each rngZelle In Columns("B:B")
rngZelle.NumberFormat = "0.00"
Next
Und wenn ich nur A2 bis A-weiter-unten abkalppern muss, in A1 aber
ein Titel steht?
Dim rngZelle As Range
For Each rngZelle In Worksheets(2).Range("A2:A65536")
rngZelle.NumberFormat = "0.00"
Next
Und wieder klappern wir alles einzeln ab - wir scheißen sogar übers Ziel
raus. (Die alte Frage: Wozu gibts dann überhaupt Range?)
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Programmiere am besten VBA neu und bitte Microsoft, alle Versionen
darauf abzudaten!
Mann, finde dich endlich mit dem ab, was du vorfindest und jammere
nicht herum!
Dann soll MS eine Hilfe rausgeben die Fragen beantwortet statt neue
aufzuwerfen.
Ich komme mit der Hilfe hervorragend zurecht! Die hat mir schon
so manche Fragen beantwortet.
Und noch viele mehr offen galseen :-)
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Man kann ohne Probleme ausprobieren, ob das, was man denkt, auch
der Wirklichkeit entspricht! In deinem Fall, ob der Zeitvorteil
wirklich relevant ist.
Jedes Warten ist störend. Und bei aller hoch gepriesen
OO-Programmierung einen Range (wieder das böse Wort) von A1 nach
Z25432 als zweizinkige Schelifenstruktur einzeln abzuklappen ist
wohl der absolute Hohn.
Mag ja alles sein, wenn du es aber richtig machen willst, bleibt
dir nichts anderes übrig.
Da hilft kein Sarkasmus und auch kein Gejammer, finde dich damit ab.
Vogel friss, oder stirb!
Ich habe VBA und Excel nicht programmiert und musste mich
auch an die Gegebenheiten anpassen.
(Mampf - mampf - mampf. :-) )
Post by Michael Schwimmer
Post by Eric March
Post by Michael Schwimmer
Besorg dir bitte ein Buch über Excel-VBA, beschäftige dich
ausgiebig damit und benutze die Hilfe als das, was sie ist,
nämlich als Hilfe und nicht als Tutorial, um VBA zu lernen.
Es macht für mich einfach keinen Sinn mehr, jemanden zu helfen, der
Lernresistent ist und Fehler immer woanders sucht! Deshalb beenden
wir den Thread am besten an dieser Stelle
Und für mich ist es eine Freude von einem hochnäsigen Experten
beraten zu werden der auf die Fragen des kleinen dummen Trottels
nicht einzugehen gedenkt weil er zufällig irgenwo mal gelernt hat
was man so nur gegen teures Geld erfährt oder in 1000 Seiten
Druckwerk verdauen muss.
Ich bin in mehreren Postings auf deine Fragen eingegangen.
Du willst oder kannst aber mit den Antworten scheinbar nichts
anfangen und versuchst, weiterhin mit dem Kopf durch die Wand
zu gehen.
Ein Mann fliegt einen Heißluftballon und realisiert, daß er
die Orientierung verloren hat. Er reduziert seine Höhe und
macht schließlich einen Mann am Boden aus.
"Entschuldigung, können Sie mir helfen? Ich versprach
meinem Freund, ihn vor einer halben Stunde zu treffen,
aber ich weiß nicht, wo ich mich befinde."
Der Mann am Boden sagt: "Ja, sie befinden sich in einem
Heißluftballon. Ihre Position ist zwischen 40 und 42 Grad
nördlicher Breite und zwischen 58 und 60 Grad westlicher
Länge."
"Sie müssen ein hochnäsiger Experte sein", sagt der
Ballonfahrer.
"Bin ich", antwortet der Mann. "Wie haben Sie das gewußt?"
"Sehen Sie", sagt der Ballonfahrer, "alles, was Sie mir
gesagt haben, ist technisch korrekt, aber ich habe keine
Ahnung, was ich mit Ihren Informationen anfangen soll und
ich weiß immer noch nicht, wo ich bin."
Der Experte sagt hierauf: "Sie müssen ein Projekt-Manager
sein."
"Bin ich", antwortet der Ballonfahrer, "Wie haben Sie das
gewußt?"
"Sehen Sie", sagt der Experte "Sie wissen nicht, wo Sie
sind oder wohin Sie gehen. Sie haben ein Versprechen gegeben,
von dem Sie keine Ahnung haben, wie Sie es einhalten können
und Sie erwarten, daß ich Ihnen dieses Problem löse.
Tatsache ist: Sie befinden sich in exakt derselben Position,
in der Sie waren, bevor wir uns getroffen haben aber irgendwie
ist jetzt alles meine Schuld."
Ich finde die zivilisierte Variante hübescher. Ich jedenfalls gehöre zu
denen die auf einfache Frgen sinnvolle Antworten haben wollen - ohen so
dumm zu sein sich planlos in Gefahr zu begeben (und anderen _die_ Schuld
zu geben die von noch anderer Seite auf mich einstürzte).
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Thomas Ramel
2004-11-03 19:41:15 UTC
Permalink
Grüezi Eric

Eric March schrieb am 03.11.2004
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
Und wenn ich nur A2 bis A-weiter-unten abkalppern muss, in A1 aber
ein Titel steht?
Dim rngZelle As Range
For Each rngZelle In Worksheets(2).Range("A2:A65536")
rngZelle.NumberFormat = "0.00"
Next
Und wieder klappern wir alles einzeln ab - wir scheißen sogar übers Ziel
raus. (Die alte Frage: Wozu gibts dann überhaupt Range?)
Eine direkte Variante wäre hier die folgende; sauber referenziert und ohne
das Tabellenblatt zu aktivieren:

Dim lngLastRow As Long
With Worksheets(1)
lngLastRow = IIf(.Cells(.Rows.Count, 1) <> "", _
.Rows.Count, .Cells(.Rows.Count, 1).End(xlUp).Row)
.Range("A2:A" & lngLastRow).NumberFormat = "0.00"
End With
--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win XP Pro SP-1 / xl2000 SP-3]
Eric March
2004-11-04 13:55:12 UTC
Permalink
Post by Thomas Ramel
Grüezi Eric
Eric March schrieb am 03.11.2004
Post by Eric March
Post by Michael Schwimmer
Post by Eric March
Und wenn ich nur A2 bis A-weiter-unten abkalppern muss, in A1 aber
ein Titel steht?
Dim rngZelle As Range
For Each rngZelle In Worksheets(2).Range("A2:A65536")
rngZelle.NumberFormat = "0.00"
Next
Und wieder klappern wir alles einzeln ab - wir scheißen sogar übers Ziel
raus. (Die alte Frage: Wozu gibts dann überhaupt Range?)
Eine direkte Variante wäre hier die folgende; sauber referenziert und ohne
Dim lngLastRow As Long
With Worksheets(1)
lngLastRow = IIf(.Cells(.Rows.Count, 1) <> "", _
.Rows.Count, .Cells(.Rows.Count, 1).End(xlUp).Row)
.Range("A2:A" & lngLastRow).NumberFormat = "0.00"
End With
Hätte nie nach so was wie IIF gesucht… :-)
OK, ich dachte eingtlich an eine Vermeidung der Verwendung von "A:A" und
dann der Zuweisung einess Formats weil das ja eine ganze Spalte erfasst
und diese (diese Programmierflexibilität will ich zur Verfügung haben) je
nach dem eine Kopfzeile (Kopfzelle) enthält.

Weiterhin habe ich Probleme mit dem Rows.Count. Liege ich falsch, dass
diese Rückgabe den Bereich erfasst der irgendwie mal auf dem Blatt
getätigt wurde? Ich verwendete ja .Range("C65536").End(xlUp).Row und
kriege deswegen wohl die 65536 als Antwort zurück - was ja nicht recht
hilfreich ist.
Falls ja - wie bekommt man diese nicht mehr bneutzten Areale aus der
Zählung wieder raus?
Und, so sehe ich das, liefert diese Funktion doch immer nur die 'erste
Spalte' zurück? Bzw. kann ich nicht gezielt (Verweis auf das
Hilfe-Beispiel mit For Each in dem Area) mir eine Spalte rauspicken.

Abschließend interessiert mich noch die Tatsache, dass
"A2:A"&ZahlenVariable mir tatsächlich etwas wie 'A2:A99' zurückgibt ohne
ein mich immer wieder belästigendes Leerzeichen von Zahlen (in dem das
Vorzeichen geparkt wird). Sollte das so einfach sein hätte ich an
bestimmten Stellen bislang mit Kanonen auf Spatzen geschossen. Oder was
der Dummfug den ich da baute die Verwendung von + statt & um Strings (auch
per "String" + Str(Zahl) ) zu verkuppeln?
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Thomas Ramel
2004-11-04 15:34:54 UTC
Permalink
Grüezi Eric

Eric March schrieb am 04.11.2004
Post by Eric March
Hätte nie nach so was wie IIF gesucht… :-)
Das ist ja auch bloss eine Variante um eine If...Then-Schleife zu umgehen
;-)
Post by Eric March
Weiterhin habe ich Probleme mit dem Rows.Count. Liege ich falsch, dass
diese Rückgabe den Bereich erfasst der irgendwie mal auf dem Blatt
getätigt wurde?
Ja, hier liegst du falsch - was Du meinst ist der UsedRange.

Activesheet.Rows.Count liefert einfach die Gesamtzahl der Zeilen des
Tabellenblattes.
Post by Eric March
Ich verwendete ja .Range("C65536").End(xlUp).Row und
kriege deswegen wohl die 65536 als Antwort zurück - was ja nicht recht
hilfreich ist.
Das bekommst Du nur, wenn C65536 nict leer ist....
Post by Eric March
Falls ja - wie bekommt man diese nicht mehr bneutzten Areale aus der
Zählung wieder raus?
Alle 'unnötigen' Zeilen (anschliessend auch die Spalten) markieren -->
Rechtsklick --> Zellen löschen --> [x] Ganze Zeile (Spalte) --> [OK]

Nun die Mappe speichen, Schliessen und wieder öffnen!!
Post by Eric March
Und, so sehe ich das, liefert diese Funktion doch immer nur die 'erste
Spalte' zurück? Bzw. kann ich nicht gezielt (Verweis auf das
Hilfe-Beispiel mit For Each in dem Area) mir eine Spalte rauspicken.
Du kannst in einer Schleife die iinteresseinenden Spalten durhclaufen und
dann jeweils eine Variable für die SPalte benutzen, den Wert jeweils
zwischenspeichern und dan grössten dann verwednen - doch das ist schon
wieder ein anderes Tutorial..... ;-)
Post by Eric March
Abschließend interessiert mich noch die Tatsache, dass
"A2:A"&ZahlenVariable mir tatsächlich etwas wie 'A2:A99' zurückgibt ohne
ein mich immer wieder belästigendes Leerzeichen von Zahlen (in dem das
Vorzeichen geparkt wird). Sollte das so einfach sein hätte ich an
bestimmten Stellen bislang mit Kanonen auf Spatzen geschossen.
Das hast Du in der Tat
Post by Eric March
Oder was der Dummfug den ich da baute die Verwendung von + statt & um
Strings (auch per "String" + Str(Zahl) ) zu verkuppeln?
...vermutlich schon, ja.
--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win XP Pro SP-1 / xl2000 SP-3]
Eric March
2004-11-05 14:27:40 UTC
Permalink
Post by Thomas Ramel
Grüezi Eric
Eric March schrieb am 04.11.2004
Am Wed, 3 Nov 2004 20:41:15 +0100 schrieb Thomas Ramel
Hätte nie nach so was wie IIF gesucht… :-)
Das ist ja auch bloss eine Variante um eine If...Then-Schleife zu umgehen
;-)
Ich geb zu ich hab das zuerst für eine TTippfehler ggehalten…
(Ein fröhliches ELSE dann und wann hielte ich aber für übersichtlicher;
leichter lesbar)
Post by Thomas Ramel
Weiterhin habe ich Probleme mit dem Rows.Count. Liege ich falsch, dass
diese Rückgabe den Bereich erfasst der irgendwie mal auf dem Blatt
getätigt wurde?
Ja, hier liegst du falsch - was Du meinst ist der UsedRange.
Was es nicht alles gibt… Nie von gehört.
Post by Thomas Ramel
Activesheet.Rows.Count liefert einfach die Gesamtzahl der Zeilen des
Tabellenblattes.
Dann wäen das aber immer diese 65536, mir deucht aber, dass nur dieser
UsedRange dafür zuständig sein könnte :-)
Post by Thomas Ramel
Ich verwendete ja .Range("C65536").End(xlUp).Row und
kriege deswegen wohl die 65536 als Antwort zurück - was ja nicht recht
hilfreich ist.
Das bekommst Du nur, wenn C65536 nict leer ist....
Grins. Offenbar ist die wohl schon leer, wenigstens habe ich nie was
reingetan. Ich nehem an der o.g. Range erklärt den Bereich als benutzt.
Post by Thomas Ramel
Falls ja - wie bekommt man diese nicht mehr bneutzten Areale aus der
Zählung wieder raus?
Alle 'unnötigen' Zeilen (anschliessend auch die Spalten) markieren -->
Rechtsklick --> Zellen löschen --> [x] Ganze Zeile (Spalte) --> [OK]
Nun die Mappe speichen, Schliessen und wieder öffnen!!
Schön wäre das. Dummerweise kommt das immer wieder vor, dass die Lücken
sich nach Laune in Spalten verteilen und die Spalten selbst nichts
miteienader zu tun haben: Einkommende Daten aus verschiedene Quellen die
letztlich verwurstet werden sollen. Seufz…
Post by Thomas Ramel
Und, so sehe ich das, liefert diese Funktion doch immer nur die 'erste
Spalte' zurück? Bzw. kann ich nicht gezielt (Verweis auf das
Hilfe-Beispiel mit For Each in dem Area) mir eine Spalte rauspicken.
Du kannst in einer Schleife die iinteresseinenden Spalten durhclaufen und
dann jeweils eine Variable für die SPalte benutzen, den Wert jeweils
zwischenspeichern und dan grössten dann verwednen - doch das ist schon
wieder ein anderes Tutorial..... ;-)
Oder gnaz brutal zählen bis Ultimo (weil man ja nicht weiß ob das ei oder
10 Lückenzellen sind - das ist ja der Ärger) und Trejjer in einer
Hilfsspalte ohne Luftpolster sammeln…
Post by Thomas Ramel
Abschließend interessiert mich noch die Tatsache, dass
"A2:A"&ZahlenVariable mir tatsächlich etwas wie 'A2:A99' zurückgibt ohne
ein mich immer wieder belästigendes Leerzeichen von Zahlen (in dem das
Vorzeichen geparkt wird). Sollte das so einfach sein hätte ich an
bestimmten Stellen bislang mit Kanonen auf Spatzen geschossen.
Das hast Du in der Tat
Schiet.
Post by Thomas Ramel
Oder was der Dummfug den ich da baute die Verwendung von + statt & um
Strings (auch per "String" + Str(Zahl) ) zu verkuppeln?
...vermutlich schon, ja.
Ich fürchte mehr: "Ganz bestimmt."
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Thomas Ramel
2004-11-05 16:42:37 UTC
Permalink
Grüezi Eric

Eric March schrieb am 05.11.2004
Post by Eric March
Post by Thomas Ramel
Grüezi Eric
Eric March schrieb am 04.11.2004
Am Wed, 3 Nov 2004 20:41:15 +0100 schrieb Thomas Ramel
Hätte nie nach so was wie IIF gesucht… :-)
Das ist ja auch bloss eine Variante um eine If...Then-Schleife zu umgehen
;-)
Ich geb zu ich hab das zuerst für eine TTippfehler ggehalten…
...und gar nicht erst getestet, bevor Du hier moniert hast?
Das ist aber gar nicht nett - die meisten AntworterInnen hier testen ihre
Konstruktie bevor sie sie hierhin stellen. Daher laufen die viele auch auf
Anhieb, wie diverse Kommentare belegen.
Post by Eric March
(Ein fröhliches ELSE dann und wann hielte ich aber für übersichtlicher;
leichter lesbar)
Aber nicht wenns so schön kurz ist ;-)
Post by Eric March
Post by Thomas Ramel
Weiterhin habe ich Probleme mit dem Rows.Count. Liege ich falsch, dass
diese Rückgabe den Bereich erfasst der irgendwie mal auf dem Blatt
getätigt wurde?
Ja, hier liegst du falsch - was Du meinst ist der UsedRange.
Was es nicht alles gibt… Nie von gehört.
Dass wirds höchste zeit, dich ernsthaft mit dem Excel-Objektmodell zu
befassen wenn Du erfolgreich damit weiterprogrammieren willst.
Post by Eric March
Post by Thomas Ramel
Activesheet.Rows.Count liefert einfach die Gesamtzahl der Zeilen des
Tabellenblattes.
Dann wäen das aber immer diese 65536, mir deucht aber, dass nur dieser
UsedRange dafür zuständig sein könnte :-)
Der UsedRange gibt den von den im Tabellenblatt eingetragenen Daten
benutzten Bereich wieder.
Es soll auch vorkommen, dass dieser nach dem Eintragen und Löschen eines
Wertes oder eines Formates nicht sauber zurückgesetzt wird....
Post by Eric March
Post by Thomas Ramel
Ich verwendete ja .Range("C65536").End(xlUp).Row und
kriege deswegen wohl die 65536 als Antwort zurück - was ja nicht recht
hilfreich ist.
Das bekommst Du nur, wenn C65536 nict leer ist....
Grins. Offenbar ist die wohl schon leer, wenigstens habe ich nie was
reingetan. Ich nehem an der o.g. Range erklärt den Bereich als benutzt.
Aber vielleicht die Spalte mal komplett markiert und formatiert?

Lass mal die folgende Zeile laifen:

MsgBox UsedRange.Address
Post by Eric March
Post by Thomas Ramel
Falls ja - wie bekommt man diese nicht mehr bneutzten Areale aus der
Zählung wieder raus?
Alle 'unnötigen' Zeilen (anschliessend auch die Spalten) markieren -->
Rechtsklick --> Zellen löschen --> [x] Ganze Zeile (Spalte) --> [OK]
Nun die Mappe speichen, Schliessen und wieder öffnen!!
Schön wäre das.
Weshalb im Konjunktiv?
Das ist so - eine der Varianten (ohne VBA) den UsedRange zurückzusetzen.
Post by Eric March
Dummerweise kommt das immer wieder vor, dass die Lücken
sich nach Laune in Spalten verteilen und die Spalten selbst nichts
miteienader zu tun haben: Einkommende Daten aus verschiedene Quellen die
letztlich verwurstet werden sollen. Seufz…
Das ist dann aber kaum das 'Problem' von Excel, als vielmehr die des
Datenhanglings.
Weshalb nicht einfa jeweils ein neues Tabellenblatt einfügen, die Daten
einlesen und bearbeiten, ans Ziel kopieren und das Dummy-Blatt wieder
löschen?
Post by Eric March
Post by Thomas Ramel
Und, so sehe ich das, liefert diese Funktion doch immer nur die 'erste
Spalte' zurück? Bzw. kann ich nicht gezielt (Verweis auf das
Hilfe-Beispiel mit For Each in dem Area) mir eine Spalte rauspicken.
Du kannst in einer Schleife die interesseinenden Spalten durhclaufen und
dann jeweils eine Variable für die SPalte benutzen, den Wert jeweils
zwischenspeichern und dan grössten dann verwednen - doch das ist schon
wieder ein anderes Tutorial..... ;-)
Oder gnaz brutal zählen bis Ultimo (weil man ja nicht weiß ob das ei oder
10 Lückenzellen sind - das ist ja der Ärger) und Trejjer in einer
Hilfsspalte ohne Luftpolster sammeln…
Der Phantasie und Kreativität sind hier kaum Grenzen gesetzt - das kannst
Du handhaben wie Du möchtest ;-)
--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win XP Pro SP-1 / xl2000 SP-3]
Eric March
2004-11-08 11:51:27 UTC
Permalink
Post by Thomas Ramel
Grüezi Eric
Eric March schrieb am 05.11.2004
Am Thu, 4 Nov 2004 16:34:54 +0100 schrieb Thomas Ramel
Post by Thomas Ramel
Grüezi Eric
Eric March schrieb am 04.11.2004
Am Wed, 3 Nov 2004 20:41:15 +0100 schrieb Thomas Ramel
Hätte nie nach so was wie IIF gesucht… :-)
Das ist ja auch bloss eine Variante um eine If...Then-Schleife zu umgehen
;-)
Ich geb zu ich hab das zuerst für eine TTippfehler ggehalten…
(zuerst = beim lesen)
Post by Thomas Ramel
...und gar nicht erst getestet, bevor Du hier moniert hast?
Das ist aber gar nicht nett - die meisten AntworterInnen hier testen ihre
Konstruktie bevor sie sie hierhin stellen. Daher laufen die viele auch auf
Anhieb, wie diverse Kommentare belegen.
(So, das Wochenende wäre mal wieder rum…)
Doch, doch, ich habe es so(fort) eingegeben und dann F1 drauf angesetzt :-)
Sie Syntax war mir etwas zu unbekannt um nach näherem Hingucken in dem
Doppel-I nicht doch Methode zu erkennen.
Post by Thomas Ramel
(Ein fröhliches ELSE dann und wann hielte ich aber für übersichtlicher;
leichter lesbar)
Aber nicht wenns so schön kurz ist ;-)
Jein. Mir wären die Fälle zu selten wo ich wirklich nur ein je einaliges
Entweder und Oder habe, da bleibe ich lieber beim übersichtlicheren ELSE.
Post by Thomas Ramel
Post by Thomas Ramel
Weiterhin habe ich Probleme mit dem Rows.Count. Liege ich falsch, dass
diese Rückgabe den Bereich erfasst der irgendwie mal auf dem Blatt
getätigt wurde?
Ja, hier liegst du falsch - was Du meinst ist der UsedRange.
Was es nicht alles gibt… Nie von gehört.
Dass wirds höchste zeit, dich ernsthaft mit dem Excel-Objektmodell zu
befassen wenn Du erfolgreich damit weiterprogrammieren willst.
(Hat irgendjemand eine gute Ausrede für mich..?)

Offen gesagt - ich bemängele an VB udn VBA, dass es 100.000
schwülstigbenamste (aber dann wieder sehr ähnlich klingende) Befehle und
Optionen gibt, aber keine brauchbare Übersicht die einem wirklich hilft.
Wenn ich das Objekt A habe das zufällig die Methode X kann - dann wird es
zur Qual aus der Liste dieses X herauszufischen und dann noch aus der
Hilfe die Optionen zu ersehen die man braucht weil deren Essentielles in
der Textflut absäuft. Diese Flut mag US-Amerikanischer Stil sein; offenbar
will man allen Missverständnissen die man sich denken kann vorgreifen
[vgl. McDonalds-Urteil wegen heißen Kaffees, oder Gravuren in asphärischen
Außenspiegeln mit dem Hinweis, dass Entfernung falsch eingechättz werden
könnten…]
Post by Thomas Ramel
Post by Thomas Ramel
Activesheet.Rows.Count liefert einfach die Gesamtzahl der Zeilen des
Tabellenblattes.
Dann wäen das aber immer diese 65536, mir deucht aber, dass nur dieser
UsedRange dafür zuständig sein könnte :-)
Der UsedRange gibt den von den im Tabellenblatt eingetragenen Daten
benutzten Bereich wieder.
Es soll auch vorkommen, dass dieser nach dem Eintragen und Löschen eines
Wertes oder eines Formates nicht sauber zurückgesetzt wird....
Ich würde behaupten, dass mir das dauernd passiert (habe ich 700 Einträge
die ich um 500 unten ergänze, sotiere und dann 600 unten rauwerfe lande
ich immer wieder bei 1200 und nicht bei 600). Naja, bringt einen nicht um.
Post by Thomas Ramel
Post by Thomas Ramel
Ich verwendete ja .Range("C65536").End(xlUp).Row und
kriege deswegen wohl die 65536 als Antwort zurück - was ja nicht recht
hilfreich ist.
Das bekommst Du nur, wenn C65536 nict leer ist....
Grins. Offenbar ist die wohl schon leer, wenigstens habe ich nie was
reingetan. Ich nehem an der o.g. Range erklärt den Bereich als benutzt.
Aber vielleicht die Spalte mal komplett markiert und formatiert?
Das allein hätte es sein können. Grüblel…
Post by Thomas Ramel
MsgBox UsedRange.Address
Selbt mit den () drumrum mag er nicht; auch ein
ActiveSheet.UsedRange.Selecet (was eine recht eindutige Darstellung im
Bltt hervorruft) - angeregt duch ein Beispiel mit dem activateten
Worksheet - bringt die Biene nicht auf die Blüte.
Post by Thomas Ramel
Post by Thomas Ramel
Falls ja - wie bekommt man diese nicht mehr bneutzten Areale aus der
Zählung wieder raus?
Alle 'unnötigen' Zeilen (anschliessend auch die Spalten) markieren -->
Rechtsklick --> Zellen löschen --> [x] Ganze Zeile (Spalte) --> [OK]
Nun die Mappe speichen, Schliessen und wieder öffnen!!
Schön wäre das.
Weshalb im Konjunktiv?
Das ist so - eine der Varianten (ohne VBA) den UsedRange zurückzusetzen.
Das scheitert wenn ich unterschiedlich lange Spalten habe (also auch in
benachbarten Spalten wildern würde…)
Post by Thomas Ramel
Dummerweise kommt das immer wieder vor, dass die Lücken
sich nach Laune in Spalten verteilen und die Spalten selbst nichts
miteienader zu tun haben: Einkommende Daten aus verschiedene Quellen die
letztlich verwurstet werden sollen. Seufz…
Das ist dann aber kaum das 'Problem' von Excel, als vielmehr die des
Datenhanglings.
Weshalb nicht einfa jeweils ein neues Tabellenblatt einfügen, die Daten
einlesen und bearbeiten, ans Ziel kopieren und das Dummy-Blatt wieder
löschen?
Wenn das Projet fertig ist - kein Problem. Aber mittendrin ist dieses
»ungezielte per Taatatur Markierenkönnen« doch recht nervig.
Post by Thomas Ramel
Post by Thomas Ramel
Und, so sehe ich das, liefert diese Funktion doch immer nur die 'erste
Spalte' zurück? Bzw. kann ich nicht gezielt (Verweis auf das
Hilfe-Beispiel mit For Each in dem Area) mir eine Spalte rauspicken.
Du kannst in einer Schleife die interesseinenden Spalten durhclaufen und
dann jeweils eine Variable für die SPalte benutzen, den Wert jeweils
zwischenspeichern und dan grössten dann verwednen - doch das ist schon
wieder ein anderes Tutorial..... ;-)
Oder gnaz brutal zählen bis Ultimo (weil man ja nicht weiß ob das ei oder
10 Lückenzellen sind - das ist ja der Ärger) und Trejjer in einer
Hilfsspalte ohne Luftpolster sammeln…
Der Phantasie und Kreativität sind hier kaum Grenzen gesetzt - das kannst
Du handhaben wie Du möchtest ;-)
Möchten möchte ich es so, dass es für diese (meiner Meinung nach) ja
äußert selten vorkommede Gelegenheit eine Funktion gäbe.
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Thomas Ramel
2004-11-08 13:25:22 UTC
Permalink
Grüezi Eric

Eric March schrieb am 08.11.2004
Post by Eric March
Doch, doch, ich habe es so(fort) eingegeben und dann F1 drauf angesetzt :-)
Sie Syntax war mir etwas zu unbekannt um nach näherem Hingucken in dem
Doppel-I nicht doch Methode zu erkennen.
Ahhh, fein, dann hat mein Input ja doch wieder was gebracht ;-)
Post by Eric March
Post by Thomas Ramel
Post by Eric March
(Ein fröhliches ELSE dann und wann hielte ich aber für übersichtlicher;
leichter lesbar)
Aber nicht wenns so schön kurz ist ;-)
Jein. Mir wären die Fälle zu selten wo ich wirklich nur ein je einaliges
Entweder und Oder habe, da bleibe ich lieber beim übersichtlicheren ELSE.
Wie gesagt - in obigem Zusammenhang verwende ich die Zeile recht gerne,
will jedoch niemandem meine Präferenzen aufnötigen.
Post by Eric March
Post by Thomas Ramel
Dass wirds höchste zeit, dich ernsthaft mit dem Excel-Objektmodell zu
befassen wenn Du erfolgreich damit weiterprogrammieren willst.
(Hat irgendjemand eine gute Ausrede für mich..?)
Bis Du dich näher mit dem Objekt-Modell auskennst ist dies ein Endless-Loop
;-)
Post by Eric March
Offen gesagt - ich bemängele an VB udn VBA, dass es 100.000
schwülstigbenamste (aber dann wieder sehr ähnlich klingende) Befehle und
Optionen gibt, aber keine brauchbare Übersicht die einem wirklich hilft.
Ich behaupte mal, dass Du sie bloss noch nicht gefunden hast....

...gibst Du in der Online-Hilfe von Excel-VBA (ohne den Klammerkasper und
seine Kumpane) den Begriff 'Objekt' ein wird als 4.Ergebins 'Microsoft
Excel-obejkte' geliefert, wo sich das Objektmodell schön hierarchisch
dahinter verbirgt (zumindest in xl2000 ist dem so; Du müsstest es aber auch
in den anderen Versionen finden).

Alternativ gibts für Interessierte auch Quellen direkt bei Micorsoft:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odc_vsto2003_ta/html/ExcelObj.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_wrcore/html/wroriautomatingexcelusingexcelobjectmodel.asp

Google liefert mit den entsprechenden Begriffen bestimmt noch eniges mehr.
Post by Eric March
Wenn ich das Objekt A habe das zufällig die Methode X kann - dann wird es
zur Qual aus der Liste dieses X herauszufischen und dann noch aus der
Hilfe die Optionen zu ersehen die man braucht weil deren Essentielles in
der Textflut absäuft.
Vergleiche es mit dem Erlernen einer Fremdsprache (im weitesen Sinne ist es
dies ja auch):
Mit grösserem Fortschritt weredn Zusammenhänge klar, die erst nicht
ergründlich scheinen...
Post by Eric March
Post by Thomas Ramel
Aber vielleicht die Spalte mal komplett markiert und formatiert?
Das allein hätte es sein können. Grüblel…
Siehste ;-)
Post by Eric March
Post by Thomas Ramel
MsgBox UsedRange.Address
Selbt mit den () drumrum mag er nicht;
Asche auf mein Haupt - vergass ich doch, das Tabellenblatt zu referenzieren
:-(
Post by Eric March
auch ein
ActiveSheet.UsedRange.Selecet (was eine recht eindutige Darstellung im
Bltt hervorruft) - angeregt duch ein Beispiel mit dem activateten
Worksheet - bringt die Biene nicht auf die Blüte.
So wird sie landen:

MsgBox ActiveSheet.UsedRange.Address
Post by Eric March
Post by Thomas Ramel
Post by Eric March
Post by Thomas Ramel
Post by Eric March
Falls ja - wie bekommt man diese nicht mehr bneutzten Areale aus der
Zählung wieder raus?
Alle 'unnötigen' Zeilen (anschliessend auch die Spalten) markieren -->
Rechtsklick --> Zellen löschen --> [x] Ganze Zeile (Spalte) --> [OK]
Nun die Mappe speichen, Schliessen und wieder öffnen!!
Schön wäre das.
Weshalb im Konjunktiv?
Das ist so - eine der Varianten (ohne VBA) den UsedRange zurückzusetzen.
Das scheitert wenn ich unterschiedlich lange Spalten habe (also auch in
benachbarten Spalten wildern würde…)
Immer die unterste Zeile und rechteste Spalte wird im Usedrange erfasst -
pro Tabellenblatt und nicht pro Spalte/Zeile
Post by Eric March
Post by Thomas Ramel
Weshalb nicht einfa jeweils ein neues Tabellenblatt einfügen, die Daten
einlesen und bearbeiten, ans Ziel kopieren und das Dummy-Blatt wieder
löschen?
Wenn das Projet fertig ist - kein Problem. Aber mittendrin ist dieses
»ungezielte per Taatatur Markierenkönnen« doch recht nervig.
Tja, wenn das Einfügen/Entfernen mal hinzugefügt ist, hast Du immer
dieselben Verhältnisse - daher wäre es (gerade im test) sinnvoll, diesen
Schritt gleich zu Beginn mit einzubauen....
Post by Eric March
Post by Thomas Ramel
Der Phantasie und Kreativität sind hier kaum Grenzen gesetzt - das kannst
Du handhaben wie Du möchtest ;-)
Möchten möchte ich es so, dass es für diese (meiner Meinung nach) ja
äußert selten vorkommede Gelegenheit eine Funktion gäbe.
Ja, das wollen (wir) alle - alles was wir im *Moment* benötigen halten wir
dann für absolut notwendig und fragen uns, warum der/die Entwickler dies
nicht gleich mit eingebracht haben.

...sie haben es insofern, als die gute Möglichkeit besteht solche
Funktionen selbst zu programmieren.... ;-)
--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win XP Pro SP-1 / xl2000 SP-3]
Melanie Breden
2004-11-04 00:13:16 UTC
Permalink
Hallo Michael,
Post by Michael Schwimmer
Post by Eric March
- Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) = _
Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))
Funktioniert nicht (mehr: es wird nichts übertragen).
Stimmt, das geht auch nicht. Es ist einfach so, dass folgendes
Worksheets(2).Range("A1:B10") = Worksheets(1).Range("A1:B10")
Ob das nun logisch ist, oder nicht, spielt keine Rolle, man
muss sich leider damit abfinden.
man *muss* sich nicht damit abfinden, denn es funktioniert, indem man
die gewünschte Eigenschaft mitgibt, anstatt von Excel zu erwarten, dass
sie automatisch angenommen wird:

Worksheets(2).Range("A1:B10").Value = Worksheets(1).Range("A1:B10").Value
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Michael Schwimmer
2004-11-04 01:12:30 UTC
Permalink
Hallo Melanie,
Post by Melanie Breden
Hallo Michael,
Post by Michael Schwimmer
Ob das nun logisch ist, oder nicht, spielt keine Rolle, man
muss sich leider damit abfinden.
man *muss* sich nicht damit abfinden, denn es funktioniert, indem man
die gewünschte Eigenschaft mitgibt, anstatt von Excel zu erwarten,
Worksheets(2).Range("A1:B10").Value =
Worksheets(1).Range("A1:B10").Value
da hast du vollkommen recht, herzlichen Dank für den Hinweis! Du hast
damit in meinen Augen die Ehre von Excel wiederhergestellt!
Ich bin einfach davon ausgegangen, dass Value die Standardeigenschaft
von der Klasse Range ist und habe gar nicht weiter probiert, explizit
die Eigenschaft mit anzugeben.

Mit ein Grund mehr, sich niemals auf Standardeigenschaften- und Objekte
zu verlassen.

Damit sind natürlich erst recht alle Umwege von Eric über Variantarrays
hinfällig. Mit der Angabe der entsprechenden Eigenschaft können dann
auch Formatierungen blockweise in einen Zielbereich kopiert werden, auch
ohne die Zwischenablage zu benutzen.

Aber nur, wenn er sich nicht weiterhin auf ein Standardobjekt oder eine
Standardeigenschaft verlässt und sauber referenziert :-)


Viele Grüße
Michael
--
-------------------------------------------
Michael Schwimmer
Home : http://michael-schwimmer.de
Melanie Breden
2004-11-04 07:25:04 UTC
Permalink
Hallo Michael,
Post by Michael Schwimmer
Post by Melanie Breden
man *muss* sich nicht damit abfinden, denn es funktioniert, indem man
die gewünschte Eigenschaft mitgibt, anstatt von Excel zu erwarten,
Worksheets(2).Range("A1:B10").Value =
Worksheets(1).Range("A1:B10").Value
da hast du vollkommen recht, herzlichen Dank für den Hinweis! Du hast
damit in meinen Augen die Ehre von Excel wiederhergestellt!
Das freut mich ungemein :-)
Post by Michael Schwimmer
Ich bin einfach davon ausgegangen, dass Value die Standardeigenschaft
von der Klasse Range ist und habe gar nicht weiter probiert, explizit
die Eigenschaft mit anzugeben.
Mit dem Weglassen von Standardeigenschaften kann es noch andere
böse Überraschungen geben.
Hier noch ein kleines Beispiel:
Man stelle das 1904-Datumssystem ein und schreibe in die Zelle A1 ein Datum,
z.B. 04.11.2004, oder =HEUTE()

Im Direktfenster dann folgende Befehle ausführen:
1)
Range("A2") = Range("A1")
liefert 05.11.2008

2)
Range("A2") = Range("A1").Value
oder
Range("A2").Value = Range("A1").Value
liefert 04.11.2004

3)
Range("A2").Value = Range("A1").Text
liefert 04.11.2004

Durch die Texteigenschaft wird aus dem Datums-, bzw. Formelwerten der reine Textwert übertragen.
Das hat den Vorteil, dass Formate wie z.B. "DDDD DD.MM.JJJJ"
genauso als Text ausgegeben werden, ohne dass ein entsprechends Format hinterlegt sein muss.
Post by Michael Schwimmer
Mit ein Grund mehr, sich niemals auf Standardeigenschaften- und Objekte
zu verlassen.
Meine Rede :-)
Post by Michael Schwimmer
Damit sind natürlich erst recht alle Umwege von Eric über Variantarrays
hinfällig. Mit der Angabe der entsprechenden Eigenschaft können dann
auch Formatierungen blockweise in einen Zielbereich kopiert werden, auch
ohne die Zwischenablage zu benutzen.
Zu dem bisherigen Verlauf des Threads nehme ich lieber keine Stellung....
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Eric March
2004-11-04 14:04:55 UTC
Permalink
Am Thu, 4 Nov 2004 08:25:04 +0100 schrieb Melanie Breden
<***@SPAMmvps.org>:

Ich erlaube mir mal die Schere anzusetzen, obschon das was ich rausnehme
sehr interessant ist!
Post by Melanie Breden
Post by Michael Schwimmer
Mit ein Grund mehr, sich niemals auf Standardeigenschaften- und Objekte
zu verlassen.
Meine Rede :-)
Ich hatte zu Beginn meiner Versuche mit VB und VBA auch aufgezeichente
Makros und Beschreibungen übernommen in denen diese Standardeigenschaften
(.Vlaue im Speziellen) dabei waren.
Eben weil die Hilfe auf den "Standard" verwies entfernte ich diese
Einträge wieder und die Programme liefen weiterhin störungsfrei. Offenbar
Zufall, weil ich kritische Möglichkeiten nicht verwendete.

(
Post by Melanie Breden
Post by Michael Schwimmer
Damit sind natürlich erst recht alle Umwege von Eric über Variantarrays
hinfällig. Mit der Angabe der entsprechenden Eigenschaft können dann
auch Formatierungen blockweise in einen Zielbereich kopiert werden, auch
ohne die Zwischenablage zu benutzen.
Zu dem bisherigen Verlauf des Threads nehme ich lieber keine Stellung....
)
Feigling.
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Melanie Breden
2004-11-04 15:01:14 UTC
Permalink
Hallo Eric,
Post by Eric March
Post by Melanie Breden
Zu dem bisherigen Verlauf des Threads nehme ich lieber keine Stellung....
)
Feigling.
»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
würde ich den thread bestimmt noch einmal lesen und Stellung nehmen.
Aber den Wust an BlaBlaBla tue ich mir nicht noch mal an,
um Zitate deiner Aggresionen gegen die Antworter aufzuzeigen.
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Eric March
2004-11-05 10:25:35 UTC
Permalink
Am Thu, 4 Nov 2004 16:01:14 +0100 schrieb Melanie Breden
Post by Michael Schwimmer
Hallo Eric,
Post by Eric March
Post by Melanie Breden
Zu dem bisherigen Verlauf des Threads nehme ich lieber keine
Stellung....
)
Feigling.
»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Ich hatte _ausführlich_ genug mein Problem geschildert. Dass das mehr
wurde kann passieren.
Post by Michael Schwimmer
würde ich den thread bestimmt noch einmal lesen und Stellung nehmen.
Aber den Wust an BlaBlaBla tue ich mir nicht noch mal an,
um Zitate deiner Aggresionen gegen die Antworter aufzuzeigen.
Wenn dir die Antwort entgangen ist, die sinngemäß meinte, ›dass ich über
ausführliche Antworten die nur ein Randproblem betreffen nicht _so_
glücklich bin wenn das Hauptproblem weiter einer Lösung harrt‹ müsstest du
mir zustimmen, dass dir ein Rat zu Sandalen nichts hilft wenn du ein Loch
im Halbschuh hast.
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Eric March
2004-11-04 13:59:16 UTC
Permalink
Am Thu, 4 Nov 2004 01:13:16 +0100 schrieb Melanie Breden
Post by Melanie Breden
Hallo Michael,
Post by Michael Schwimmer
Post by Eric March
- Range(Worksheets(B).Cells(12, 1), Worksheets(B).Cells(13, 1)) = _
Range(Worksheets(A).Cells(2, 1), Worksheets(A).Cells(3, 1))
Funktioniert nicht (mehr: es wird nichts übertragen).
Stimmt, das geht auch nicht. Es ist einfach so, dass folgendes
Worksheets(2).Range("A1:B10") = Worksheets(1).Range("A1:B10")
Ob das nun logisch ist, oder nicht, spielt keine Rolle, man
muss sich leider damit abfinden.
man *muss* sich nicht damit abfinden, denn es funktioniert, indem man
die gewünschte Eigenschaft mitgibt, anstatt von Excel zu erwarten, dass
Worksheets(2).Range("A1:B10").Value = Worksheets(1).Range("A1:B10").Value
An dem Value habe ich auch geknabbert; in einem Beispiel (wars sogar das
oben?) hatte ich die Zellen jewiels um .Value ergänzt und das hatte keine
Auswirkung. Mit Pech geschah das da wo es wirklich nichts ausmacht. Da
.Value ja Standard ist _dürfte_ seine An- oder Abwesenheit jeweils keinen
Unterschied machen?! »Ein Unterschied der keinen Unterschied bewirkt ist
kein Unterschied«
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Melanie Breden
2004-11-04 15:02:45 UTC
Permalink
Hallo Eric,
Post by Eric March
Post by Melanie Breden
man *muss* sich nicht damit abfinden, denn es funktioniert, indem man
die gewünschte Eigenschaft mitgibt, anstatt von Excel zu erwarten, dass
Worksheets(2).Range("A1:B10").Value = Worksheets(1).Range("A1:B10").Value
An dem Value habe ich auch geknabbert; in einem Beispiel (wars sogar das
oben?) hatte ich die Zellen jewiels um .Value ergänzt und das hatte keine
Auswirkung. Mit Pech geschah das da wo es wirklich nichts ausmacht. Da
.Value ja Standard ist _dürfte_ seine An- oder Abwesenheit jeweils keinen
Unterschied machen?! »Ein Unterschied der keinen Unterschied bewirkt ist
kein Unterschied«
du behauptest also, dass bei diesen beiden Syntaxen das Ergebnis gleich ist,
wenn in Blatt 1 A1:B10 Werte stehen?

Worksheets(2).Range("A1:B10") = Worksheets(1).Range("A1:B10")
Worksheets(2).Range("A1:B10").Value = Worksheets(1).Range("A1:B10").Value

Füge die beiden Ausdrücke mal im Überwachungsfenster ein und staune über das Ergebnis:
Worksheets(2).Range("A1:B10")
Worksheets(1).Range("A1:B10").Value

Anhand deiner Aussage hast du zudem mein Beispiel mit dem 1904-Datumswert nicht getestet,
sonst würdest du den Unterscheid erkennen!
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Melanie Breden
2004-11-04 15:05:05 UTC
Permalink
Hallo Eric,

Nachtrag:

Natürlich den gleichen Bereich im Überwachungsfenster einfügen:
Worksheets(1).Range("A1:B10")
Worksheets(1).Range("A1:B10").Value
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Eric March
2004-11-05 10:35:43 UTC
Permalink
Am Thu, 4 Nov 2004 16:05:05 +0100 schrieb Melanie Breden
Post by Michael Schwimmer
Hallo Eric,
Worksheets(1).Range("A1:B10")
Worksheets(1).Range("A1:B10").Value
Egg logical (Ei, logisch :-) )
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Eric March
2004-11-05 10:35:07 UTC
Permalink
Am Thu, 4 Nov 2004 16:02:45 +0100 schrieb Melanie Breden
Post by Michael Schwimmer
Hallo Eric,
Post by Eric March
Post by Melanie Breden
man *muss* sich nicht damit abfinden, denn es funktioniert, indem man
die gewünschte Eigenschaft mitgibt, anstatt von Excel zu erwarten, dass
Worksheets(2).Range("A1:B10").Value =
Worksheets(1).Range("A1:B10").Value
An dem Value habe ich auch geknabbert; in einem Beispiel (wars sogar das
oben?) hatte ich die Zellen jewiels um .Value ergänzt und das hatte keine
Auswirkung. Mit Pech geschah das da wo es wirklich nichts ausmacht. Da
.Value ja Standard ist _dürfte_ seine An- oder Abwesenheit jeweils keinen
Unterschied machen?! »Ein Unterschied der keinen Unterschied bewirkt ist
kein Unterschied«
du behauptest also, dass bei diesen beiden Syntaxen das Ergebnis gleich ist,
wenn in Blatt 1 A1:B10 Werte stehen?
Worksheets(2).Range("A1:B10") = Worksheets(1).Range("A1:B10")
Worksheets(2).Range("A1:B10").Value = Worksheets(1).Range("A1:B10").Value
Worksheets(2).Range("A1:B10")
Worksheets(1).Range("A1:B10").Value
Behaupte ich ja nicht. Allerdings macht es mich halt stutzig wenn einmal
ein Standard gilt und er in anderen Fällen nicht gilt.
Das Dumme ist halt, dass man sich auf Gelesenes verlässt und dann nicht
eruieren kann wo der Fehler ist wenn es laut Doku keinen zu geben hat.
Post by Michael Schwimmer
Anhand deiner Aussage hast du zudem mein Beispiel mit dem
1904-Datumswert nicht getestet,
sonst würdest du den Unterscheid erkennen!
Ich habe es nicht getestet. Allein das Lesen des Codes hat gereicht mich
die Zusammenhänge klar zu machen.

Dass der Verlass auf das "Weglassenkönnen" von Standards wie .Value
offenbar nach hinten losgehen kann - das habe ich wahrlich gelernt.
--
Eric March

»Schreibe kurz - und sie werden es lesen. Schreibe klar und sie werden es
verstehen. Schreibe bildhaft - und sie werden es im Gedächtnis behalten.«
Joseph Pulitzer
Eric March
2004-10-29 07:10:31 UTC
Permalink
Am Thu, 28 Oct 2004 17:14:56 +0200 schrieb Thomas Ramel <***@MVPs.org>:

Pro Forma: Ich hatte auf obige Frage wie gewöhnlich geantwortet und es
scheint ein Problem dieser NG zu sein, dass solche Antworten plötzlich als
eigener Thread auftauchen.
Irre ich da oder ist das bekannt?
--
Eric March
Thomas Ramel
2004-10-29 17:37:24 UTC
Permalink
Grüezi Eric

Eric March schrieb am 29.10.2004
Post by Eric March
Pro Forma: Ich hatte auf obige Frage wie gewöhnlich geantwortet und es
scheint ein Problem dieser NG zu sein, dass solche Antworten plötzlich als
eigener Thread auftauchen.
Irre ich da oder ist das bekannt?
Du irrst - es kommt vermutlich auf den verwendeten Newsreader an.
Meiner fügt alles sauber in einen Thread ein.

Ich melde mich hier nur mal kurz um zu zeiden, dass ich noch dran bin. War
aber heute den ganzen Tag in der Schule und erst jetzt wieder da.
Die zweite Hälfte des Codes geh ich morgen früh durch und poste dan hier
mal eine Variante, die so läuft wie du es dir vermutluich vorstellst.
--
Mit freundlichen Grüssen

Thomas Ramel
- MVP für Microsoft-Excel -

[Win XP Pro SP-1 / xl2000 SP-3]
Eric March
2004-11-01 15:43:22 UTC
Permalink
Post by Thomas Ramel
Grüezi Eric
Eric March schrieb am 29.10.2004
Post by Eric March
Pro Forma: Ich hatte auf obige Frage wie gewöhnlich geantwortet und es
scheint ein Problem dieser NG zu sein, dass solche Antworten plötzlich als
eigener Thread auftauchen.
Irre ich da oder ist das bekannt?
Du irrst - es kommt vermutlich auf den verwendeten Newsreader an.
Meiner fügt alles sauber in einen Thread ein.
Nun ja - Opera schafft haargenau das in Win98.allgemein,
windowsxp.registry oder win95 einwandfrei. Nur in de.excel und
german.office erlebe ich diese immer wieder neu auftauchenden
Threadfortsetzungen. Der Wahnsinn hat offenbar Methode…
--
Eric March
Lesen Sie weiter auf narkive:
Loading...