Am Fri, 29 Oct 2004 08:58:42 +0200 schrieb Michael Schwimmer
Post by Michael SchwimmerHallo Eric
Post by Eric MarchIch 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 RamelVielleicht 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 SchwimmerPost by Eric MarchGenauso 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 SchwimmerPost by Eric MarchWozu 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 SchwimmerAn 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 SchwimmerPost by Eric MarchPublic 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 SchwimmerPost by Eric MarchDim 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 SchwimmerPost by Eric MarchWorksheets("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 SchwimmerObwohl 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 SchwimmerPost by Eric MarchBlatt = 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 (ä
z.B. oder L& was immer Symbol für LongInteger war).
Post by Michael SchwimmerSub 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 SchwimmerPost by Eric MarchWorksheets("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 MarchTrans = 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 SchwimmerAus 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 SchwimmerAls 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 SchwimmerBesser 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 SchwimmerPost by Eric MarchStunde = 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 SchwimmerAuch 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 SchwimmerPost by Eric Marchahbe 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 MarchWS("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 SchwimmerLass 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