Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1480to1484
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Coede-Erweiterung

Coede-Erweiterung
12.03.2016 15:06:57
Guesa
Hallo Forum
Habe folgenden Code hier gefunden und möchte diesen auf Spalten bzw. Zeilen begrenzen z.B. A3:C10. Hab aber keinen Plan wie das umgeschrieben werden muss.
Für Eure Hilfe vorab ein Danke
Gruß, Guesa
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sTxt As String
If Target.Column  6 Then Exit Sub
If IsEmpty(Target) Or Selection.Cells.Count > 1 Then Exit Sub
sTxt = CStr(Target.Value)
Select Case Len(sTxt)
Case 3: sTxt = "0" & sTxt & "00"
Case 4: sTxt = sTxt & "00"
Case 5: sTxt = "0" & sTxt
End Select
sTxt = Left(sTxt, 2) & ":" & Mid(sTxt, 3, 2) & ":" & Right(sTxt, 2)
On Error GoTo ERRORHANDLER
Application.EnableEvents = False
Target.Value = TimeValue(sTxt)
Application.EnableEvents = True
Exit Sub
ERRORHANDLER:
ActiveCell.ClearContents
Application.EnableEvents = True
End Sub

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Coede-Erweiterung
12.03.2016 15:15:23
Hajo_Zi

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sTxt As String
If CallByName(Selection, IIf(Val( _
Application.Version) > 11, "CountLarge", "Count"), VbGet) = 1 Then
If Not IsEmpty(Target) Then
sTxt = CStr(Target.Value)
Select Case Len(sTxt)
Case 3: sTxt = "0" & sTxt & "00"
Case 4: sTxt = sTxt & "00"
Case 5: sTxt = "0" & sTxt
End Select
sTxt = Left(sTxt, 2) & ":" & Mid(sTxt, 3, 2) & ":" & Right(sTxt, 2)
On Error GoTo ERRORHANDLER
Application.EnableEvents = False
Target.Value = TimeValue(sTxt)
Application.EnableEvents = True
Exit Sub
End If
End If
ERRORHANDLER:
ActiveCell.ClearContents
Application.EnableEvents = True
End Sub
ich habe mich jetzt in groben Zügen an Deinen Code gehalten.

Anzeige
AW: Coede-Erweiterung
12.03.2016 15:47:56
Guesa
Hallo Hajo
Danke für die schnelle Antwort. Hab ich gerade mal getestet, die Eingaben werden jetzt im ganzen Tabellenblatt geändert. Ich möchte gerne das ganze auf einen Bereich reduzieren A3:C10 oder halt einen anderen Bereich. Oder muss ich in Deinem Beispiel noch die entsprechenden Spalten/Zeilen definieren? und wenn ja Wo? :-)
Gruß, Guesa

AW: Coede-Erweiterung
12.03.2016 15:51:27
Hajo_Zi
die Zeile habe ich wohl gelöscht.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sTxt As String
If CallByName(Selection, IIf(Val( _
Application.Version) > 11, "CountLarge", "Count"), VbGet) = 1 Then
If Not IsEmpty(Target) Then
If Target.Column = 3 And Target.Row 

Gruß Hajo

Anzeige
AW: Coede-Erweiterung
12.03.2016 16:05:59
Guesa
Danke Dir Hajo funktioniert
Gruß, Guesa

@ Hajo: OT: CountLarge
13.03.2016 16:39:29
Michael
Hallo Hajo,
ich habe dem CountLarge etwas hintergesucht und wundere mich, daß die untere Anweisung im Lokal-Fenster
: v : 17179869184 : Variant/[Nichtunterstützter Variant-Typ]

auswirft, während die 1., auskommentierte Anweisung an einem "Überlauf" hängenbleibt: der Wert ist doch exakt der Gleiche?!
Sub test()
Dim v
'v = Rows.Count * Columns.Count
v = Sheets(1).Cells.CountLarge
MsgBox v
End Sub
Oder liegt das daran, daß die Multiplikation implizit ein long statt eines variant "erwartet"?
Schöne Grüße,
Michael

Anzeige
AW: @ Hajo: OT: CountLarge
13.03.2016 16:48:52
Hajo_Zi
Hallo Michael,
keine Ahnung was Du mir mitteilen willst.
Die Funktion ist notwendig da ein Spalte 1.048.576 Zellen hat.
Gruß Hajo

AW: @ Hajo: OT: CountLarge
13.03.2016 17:07:28
Michael
Hallo Hajo,
ich wollte wissen, warum die auskommentierte Zeile einen Fehler erzeugt - wenn man das ' entfernt, natürlich ...
In beiden Fällen beträgt der Wert 17.179.869.184 - ist mehr als long, klar, aber im unteren Fall zickt Excel eben nicht.
Schöne Grüße,
Michael

Wegen 'CountLarge', '.Rows.Count' dürfte ...
14.03.2016 14:24:34
Luc:-?
…diese vbMethode hier schon überfordern, Michael!
Gruß, Luc :-?
Besser informiert mit …

Anzeige
Siehe auch ...
14.03.2016 15:46:32
Luc:-?
v = ActiveSheet.Rows.CountLarge * ActiveSheet.Columns.Count
Es liegt also an der ZählMethode allein, denn .Count ist auf den Datentyp Long begrenzt, während .CountLarge einen geeigneteren benutzen wird. Das erspart dir die DatentypKonvertierung.
Ansonsten hat's ja Daniel (wieder mal) ausführlichst erklärt… ;-]
Long * Long = Long, also bei dir ein Variant mit dem UnterTyp Long, bei Daniel einer mit dem UnterTyp Double.
Luc :-?

ja, naja,
14.03.2016 19:40:00
Michael
Luc:-?,
der Knackpunkt ist halt dieser "geeignetere Datentyp", den es eigentlich gar nicht gibt - weshalb er im Lokalfenster als "nicht unterstützt" angezeigt wird, wiewohl er offensichtlich vorhanden ist...
DEN würde ich zu gerne mal "anpacken" können.
Aber die ganze Geschichte ist eh a bissala philosophisch - das Wort "esoterisch" möchte ich nicht benutzen, seit ich mir mal ein paar Minuten lang die Syntax von Brainfuck angesehen habe.
https://de.wikipedia.org/wiki/Esoterische_Programmiersprache
Abgesehen davon: die Recherche nach countlarge hat einen älteren Thread getroffen, in dem Du Dich mal über Obfuskation ausgelassen hast: hübsch "bahnhofig", hehe.
https://www.herber.de/forum/archiv/1248to1252/1248307_Hajo_CallByName_CountLarge.html
Ist das das nächste Osterrätsel?
Schöne Grüße,
Michael

Anzeige
Nee, nee, für Ostern hatte ich vor, was schon ...
15.03.2016 00:41:45
Luc:-?
…zu Weihnachten fertig sein sollte, Michael,
aber jetzt sieht's doch eher nach kommendem Weihnachten aus (nicht wirklich Zeit dafür und wenig Lust, weil ständig Neues ablenkt).
Das damals gezeigte Pgm ist quasi ein DateiSchutz gg einfaches Kopieren → die Datei ist ohne aktivierte Makros wertlos und beim Öffnen mit aktivierten Makros in falscher Umgebung wird sie unbrauchbar, so dass Xl abstürzt. Hierbei wird ausgenutzt, dass CallByName die Namen von Methoden und Eigenschaften von Objekten als Text übergeben wdn können. Diese Texte wurden kryptisiert und wdn erst im Moment ihrer Anwendung entschlüsselt (von der TextLänge kann man nicht auf das Original schließen!). (Nebenbei: vbSet fktioniert genauso wie vbLet, nur für Objekte!)
So etwas mache ich natürlich nicht zum Gegenstand eines allgemeinen Rätsels mit genauer Auflösung, weil ich dann Dinge beschreiben müsste, deren Preisgabe letztlich kontraproduktiv wäre… ;-)
Aber, falls dich so etwas interessiert — ich hatte vor Jahren auch mal ein Bsp für eine verschlüsselte Tabelle hier eingestellt, die mit einer MutterTabelle kommuniziert, wenn man mit einer Lupe die richtigen Werte lesen will. Fehlt die Kommunikation, ist die Leselupe nicht benutzbar. Dabei kann man auch so weit gehen, echte Berechnungen auf der Tabelle nicht nur mit verschlüsseltem Original-Ergebnis, sondern (ggf mit neutralen Fktsnamen* scheinbar) echt darzustellen.
Später hatte ich noch eine ähnliche Methode auf der Basis einer speziellen UDF entwickelt. Unter dem RECHERCHE-Stichwort Halloween findest du bestimmt auch noch die 3.Methode → gestapelte Tabellen, also die Abbildung eines 3d-TabellenKubus auf eine 2d-Tabelle, die auf ihrer sichtbaren Oberfläche scheinbar sinnvolle Dummy-Werte enthalten kann.
* Dafür hatte ich damals einen FktsGenerator entwickelt.
Gruß, Luc :-?

Anzeige
Halloween statt Osterhasi
16.03.2016 15:33:08
Michael
Hi Luc:-?,
sorry, ich hab mir eben erst die Zeit genommen, mal nach Halloween zu suchen.
So ganz ist mir nicht klar, was da im Einzelnen passiert, aber verblüffend finde ich den Effekt, mit callbyname einer Variablen einen Wert zuzuweisen. Erinnert an Klassen.
Ist halt immer so ne Sache: ich weiß so Vieles nicht, aber irgendwas ohne konkreten Bedarf anzugehen, ist auch witzlos. Insofern kommt die Geschichte mal auf die "im Hinterkopf behalten"-Liste.
Ich denke aber immer wieder nebenbei darüber nach, wie man ein Programm "sicher" machen könnte - wobei ich da eher an eine Kommunikation mit dem WWW denke: Seitenaufruf mit Parameter und Entschlüsselung mit dem dort ausgelesenen Wert oder so: ich HASSE so Zeug, seit man X2003 registrieren mußte, aber heute hat ja wirklich jeder die Kiste am Netz: die Schlapphüte freut's.
Aha, Besuch kommt, schöne Grüße,
Michael

Anzeige
Kurze Replik
18.03.2016 04:15:59
Luc:-?
Ja, Michael,
CallByName ist eigentlich eine (die idR seltener benutzte) von 3 VariablenAufrufMethoden, deren bekannteste CallByReference und CallByValue sind, die du sicher von der ParameterDeklaration von VBA-Prozeduren kennst. Die gab es ggf schon im ursprünglichen Basic, während o.g. wohl erst mit VisualBasic hinzukam und evtl deshalb bzw wg Realisierung erst zur Laufzeit (weshalb das wohl in manchen PgmierSprachen völlig fehlt) als Methode angelegt wurde.
Beim Halloween-Rätsel handelt es sich um eine sinnvolle Nutzung von VerbundZellen, wobei in der verborgenen Zelle eine Fml mit einer MatrixKonstanten steckt, deren 1.Wert ein LeerText ist, so dass die VerbundZellen bei einer EinzelAbfrage (fast) normal aussehen (wäre er 0, würde das Ergebnis ganz normal aussehen, bei Auflösen des ZellVerbunds allerdings nicht, es sei denn 0 wird benutzerdefiniert wegformatiert). Allerdings wird bei aktivierten Makros bei Auflösung eines einzelnen ZellVerbunds aus diesem ein ganz normaler, so dass der 2.Wert verlorengeht. Leider hatte ich damals IsNull(.MergeCells) nicht berücksichtigt, so dass man für alle Zellen auf einmal den Verbund unbeschadet auflösen kann. Das wird beim nächsten Mal nicht mehr möglich sein… ;-)
Gruß, Luc :-?

Anzeige
AW: Kurze Replik
18.03.2016 12:21:50
Michael
Hi Luc:-?,
na, dann wundert mich nix mehr - ich habe mich erst seit Excel mit Basic beschäftigt, vorher halt intensiv mit Pascal und a bissl hie und da neigeschnuppert, vor allem Datenbankzeug.
Die Arrays (z.B. ={"";545}) hatte ich schon gesehen... Hat das auch was damit zu tun, "mehrere Werte in eine Zelle" zu schreiben? Ich vermute mal, ja, aber im Moment hab ich auch andere Probleme...
Der Besuch hat die Waschmaschine repariert, dann ging sie am nächsten Tag doch wieder nicht, aber das war nur der Stecker, weil das Kabel etwas knapp war. Manchmal nervt die "Materie".
... bzw. keine Geduld, mich da zu vertiefen.
Abgesehen davon, das Wetter schreit danach, die Kiste runterzufahren.
Schönen Tag,
Gruß,
Michael

Anzeige
Nachtrag zu Halloween 2013
20.03.2016 01:40:13
Luc:-?
Habe mal meine UDF MxJoin auf Version 1.3 geupdatet, Michael;
dann ist die von mir (unter L.A.C.) damals gepostete Aufgabe mit folgd Fml einfach lösbar:
=SUMME(VSplit(MxJoin(A1:C6;;;1);;1))
Der o.g. UDF wurde ein optionales 4.Argument mitgegeben (ohne dieses rechnet sie wie Version 1.2), das dann auch die Auswertung von Ausdrücken (TeilFmln u.MatrixKonstanten als Fml) veranlasst. In solchen einfachen AufgabenFällen ergibt sich dann die gesuchte Lösung, hier wie dort schon genannt 12068.
Luc :-?

Fehler 6 Überlauf bei Berechnungen
14.03.2016 15:21:25
Daniel
Hi
v = Rows.Count * Columns.Count
wirft dir aus folgendem Grund einen Fehler aus:
VBA verwendet Intern für Zwischenergebnisse der Berechnung ebenfalls die bekannten Datentypen Integer, Long, Double.
Dabei versucht es immer den kleinstmöglichen Datendatentyp, der zur Berechnung passt, zu verwenden. Da diese Entscheidung vor der eigentlichen Berechnung stattfinden muss, werden hierbei die Datentypen der Parameter und die Berechnungsmethode zur Entscheidungsfindung herangezogen.
Dh wenn du zwei Integerzahlen addierst oder multiplizierst, geht VBA auch von einem Integerergebnis aus.
Wenn jetzt das Ergebnis grösser ist, kommt es zu dem Überlauf.
In deinem Fall hast du zwei LONG-Werte, daher wird auch ein LONG-Ergebnis angenommen.
die Lösung wäre hier dafür zu sorgen, dass VBA von DOUBLE-Werten ausgeht, um somit einen passenden Datentyp für das Ergebnis bereit zu stellen.
Das kannst du mit der Funktion CDbl() erreichen oder damit, dass du den ersten Wert durch 1 teilst, weil bei einer Division automatsich der Datentyp Double angenommen wird (bei einer Division kommt ja normalerweise keine Ganzzahl als Ergebnis raus):
v = Rows.Count / 1 * Columns.count
v = CDbl(Rows.count) * Columns.count

bei festen Zahlen kann man auch durch die Raute festlegen, dass auch Ganzzahlen als Double erkannt werden:
v = 1048576# * 16384
Gruß Daniel

hm, hm,
14.03.2016 16:15:40
Michael
Hallo zusammen,
jetzt hatte ich gedacht, ich hätte Excel überlistet, aber die Verfolgung von
Sub test()
Dim v
'v = Rows.Count * Columns.Count
v = Sheets(1).Cells.CountLarge
MsgBox v
v = Rows.Count / v * Columns.Count * v
MsgBox v
End Sub

ergibt, daß v in der Zeile mit /v automatisch als double weiterrechnet, auch wenn v/v=1 ist.
Was das von Daniel Gesagte bestätigt.
Vielen Dank für Euer Interesse, schöne Grüße,
Michael

AW: hm, hm,
14.03.2016 16:31:22
Daniel
wie gesagt, VBA muss sich auf einen Datentyp für die Berechnung festlegen, bevor es das Berechnungsergebnis kennt.
Bei Addtion oder Mulitiplikation von Ganzzahlen ist das Ergebnis immer eine Ganzzahl.
Bei einer Division von Ganzzahlen kann aber auch eine Kommazahl das Ergebnis sein, also muss es bei einer Division auch einen Datentyp verwenden, der für Kommazahlen tauglich ist.
Gruß Daniel

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige