Microsoft Excel

Herbers Excel/VBA-Archiv

Hajo, CallByName, CountLarge ? | Herbers Excel-Forum


Betrifft: Hajo, CallByName, CountLarge ? von: Reinhard
Geschrieben am: 27.01.2012 17:49:17

Hallo Wissende,

Hajo hat als Antwort zu einer Anfrage folgenden Code gezeigt:

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If CallByName(Selection, IIf(Val(Application.Version) > 11, "CountLarge", "Count") _
, VbGet) = 1 Then
  If Target <> "Überschrift" Then
    Range(Cells(AlteZeile, 1), Cells(AlteZeile, 2)).Interior.ColorIndex = xlColorIndexNone
  End If
End If
End Sub

Frage1 zu CountLarge:
Was ist der Unterschied zwischen Count und CountLarge?
Bei ZellBereich.Count und ZellBereich.CountLarge sah ich keinen.

Frage2 zu CallByName:
Wählt man Count so steht ja da die Codezeile:
If CallByName(Selection, "Count", VbGet) = 1 Then
Und in der Hilfe sieht man Beispiele wie
CallByName Text1, "MousePointer", vbLet, vbCrosshair
CallByName Text1, "Move", vbMethod, 100, 100

Ich habe das jetzt schon soweit durchblickt daß ich sehr annehm daß diese drei Codezeilen auch so ausführbar wären im Pseudocode:
If Selection.Count = 1 Then
Text1.Mousepointer=vbCrosshair
Text1.Move 100, 100

Wenn dem so ist, welchen Vorteil hat denn da CallByname?
Und woher bekomme ich eine Liste was es da so alles gibt außer vbLet, vbMethod, vbGet?

PS: Wenn ich in meinem XL 2007 VB-Editor den Cursor auf CountLarge stelle und F1 drücke, so kommt Hilfe zu Chart.ApplyLayout-Methode. Bringt das eigentlich das geringste wenn ich das an MS maile?
Oder ein MVP?

Danke ^ Gruß
Reinhard




  

Betrifft: AW: Hajo, CallByName, CountLarge ? von: Hajo_Zi
Geschrieben am: 27.01.2012 17:52:46

Hallo Reinhard,

ab Excel 2007 reicht Count nicht, falls die gesamte Tabelle markiert wird.

GrußformelHomepage


  

Betrifft: Danke, Frage1 geklärt von: Reinhard
Geschrieben am: 27.01.2012 18:17:54

Hallo Hajo,

sehr schön, danke dir.
Jetzt wo ich weiß warum, ist das irgendwie naheliegend, theoretisch hätte ich darauf kommen können.
Aber irgendwie dachte ich wieder mal viel zu kompliziert *seufz*

Gruß
Reinhard


  

Betrifft: CallByName habe ich schon mal in einem ... von: Luc:-?
Geschrieben am: 27.01.2012 18:17:58

…gewissen, sicherheitsrelevanten Zusammenhang erwähnt, Reinhard;
viell erinnerst du dich. Gedacht war es sicher für Fälle, in denen man den Namen der Objekteigenschaft bzw -methode zwingend als Text übergeben muss oder aber will (Wiki-Stichwort Obfuszierung).
Gruß Luc :-?
PS: Wenn du darauf Lust hast, kann ich dir ja mal einen obfuszierten BspCode einstellen und du sagst mir, was der macht! ;-)


  

Betrifft: Frage2 und PS noch offen von: Reinhard
Geschrieben am: 27.01.2012 18:33:52

Hallo Luc,

"""gewissen, sicherheitsrelevanten Zusammenhang erwähnt, Reinhard,viell erinnerst du dich"""

sorry nein. Beim Schreiben der Anfrage hatte/habe ich schon im Hinterkopf daß ich ...Byname
schon kenne, von Open Office bzw. StarBasic.
Da bezieht man sich auf z.B. Zellen mit GetByName()
In Beziehung zu Vba bzw. Hans bzw. Dir klingelte da nix.

"sicherheitsrelevant"? Sicherheit vor wem, was, warum?

"""Gedacht war es sicher für Fälle, in denen man den Namen der Objekteigenschaft bzw -methode zwingend als Text übergeben muss oder aber will (Wiki-Stichwort Obfuszierung)"""

Nie gehört. Klingt irgendwie als ob Konfuzius obduziert hätte :-))

PS: Wenn du darauf Lust hast, kann ich dir ja mal einen obfuszierten BspCode einstellen und du sagst mir, was der macht! ;-)

Gerne, ich bin es ja hier schon jahrelang gewöhnt mit meiner Null Ahnung Vba-Rätsel zu lösen *gg*

Gruß
Reinhard


  

Betrifft: VBA-Rätsel zum WE: Abgesehen mal ... von: Luc:-?
Geschrieben am: 27.01.2012 20:18:51

…davon, Reinhard,
dass in deinem Bsp (von Hajo) durchaus Selection durch Target ersetzt wdn könnte, denn beides repräsentiert hier letztlich ein Range-Objekt, funktioniert es doch. Warum Hajo nun gerade die Variante mit vbFkt IIf, der das letztl wohl geschuldet ist, und nicht die „klassische” Form gewählt hat, musst du ihn fragen — viell hatte er sich ja gerade mit CallByName auseinandergesetzt, dessen Parameter3-Möglichkeiten du selbstverständlich alle per VBE-Objektmanager finden kannst, wozu dann auch vbSet gehört, für das ich allerdings keine fktionable Anwendung finden konnte, weshalb ich u.a. dafür CallMyName geschrieben hatte, was neben CallByName auch im versprochenen und nun folgenden CodeBsp verwendet wird.

Function DecNova(ByVal vglZN As String, ByVal vglFN As String, ByVal KVs) As Boolean
    Dim i As Long, n As Long, s As Long, shz() As Long, plc As Object
    On Error Resume Next
    CallMyName Me.Parent, Krypt("RcUMFneSFdVoAB%s", KVs(3), 3, 2, 1), 8, plc
    If IsError(CallByName(plc, Join(VPart(Evaluate("transpose(char(code(Sprite(""" & Inlet & _
        """,""""))-" & AnzAMBxAnim & "))"), 0, 0), ""), 2)) Then DecNova = vglZN <> vglFN
    If DecNova Then
        n = CallMyName(Me.Parent, Krypt("h[oYhRhQVnxkoExs", KVs(1), 3, 2, 1), 2, _
            Krypt("5]EoNb7olb187", KVs(1), 3, 2))
        s = CallByName(plc, Krypt("csQ}Or22Lrj3", KVs(3), 3, 2), 2, n, lOrBlIdx)
        CallByName plc, Krypt("y[ng^GvxZKdgd", KVs(1), 3, 1, 1), 4, 0
        CallByName plc, Krypt("bVsXWhXjQJoXaR", KVs(2), 3, 1, 1), 4, 0
        CallByName plc, Krypt("ygLM`QsqN_jg", KVs(3), 3, 1, 1), 4, 0
        Set plc = Nothing
        ReDim shz(1 To s)
        For i = 1 To s
                shz(i) = i
                CallMyName Me.Parent, Krypt("tbU`2Y3Xmu%rgEn4", KVs(2), 3, 2, 1), 4, i, _
                    Krypt("OUp[lnQYUJ+]VNZ:8", KVs(1), 3, 2, 1), -1
        Next i
        If n <= lOrBlIdx Then
            CallMyName Me.Parent, Krypt("[YRQnk", KVs(1), 3, , 1), 1, 1, _
                Krypt("EbJZegaXGS%teIEA", KVs(2), 3, 2, 1)
            CallMyName Me.Parent, Krypt("B„w„H‰IˆXifjG4", KVs(2), 3, 2), 1, _
                Krypt("g†OXCWLNgTnC18n", KVs(2), 3, 2, 1)
        End If
        CallMyName Me.Parent, Krypt("5]S[iT8Slpxm727A", KVs(3), 3, 2, 1), 1, shz, _
            Krypt("d{SUab%S%pCQ:%2o", KVs(3), 3, 2, 1)
    End If
End Function
Natürl sind hierin noch einige andere Dinge enthalten, die sich dem uneingeweihten Betrachter kaum erschließen, aber das ist ja so gewollt. ;-)
Deshalb habe ich auch nicht die natürl vorhandenen Enumerationsnamen bestimmter Argumente der Fkt Krypt verwendet, das schon wäre ggf zu verräterisch.
Ansonsten hatte ich ja angedeutet, dass du den einen Grund unter dem von mir genannten Stichwort auf Wikipedia findest. Konfuzius hat damit gar nichts zu tun, eher die alten Römer. Man könnte das aber auch Camouflage oder CrunchCode (der sieht aber idR viel wüster aus → Spaghetti und möglichst viele Befehle in einer Zeile) nennen — viell sind dir diese Begriffe vertrauter. ;-)
Na, dann knobel mal! ;-))
Gruß + schöWE, Luc :-?
PS: Übrigens ließe sich der Code noch ein klein wenig mehr „obfuszieren”, wie ich soeben feststellen konnte. Wer den Code ausprobieren will → keine Gefahr, er läuft nicht. Aber in passender Umgebung schon…


  

Betrifft: arrgs, *jammeraber ich bin selbst schuld, denn ... von: Reinhard
Geschrieben am: 27.01.2012 21:06:57

...ich hab ja nachgefragt :-)

Hallo Luc,

um Zeit zu schinden sag ich mal keck, ich habe den Code nur kurz überflogen.
Da der Code von CallMyname unbekannt ist beginne ich erst gar nicht diese Knobelaufgabe zu lösen.
Liegt der Code vor so erkläre ich dir 5 Minuten später wie da was abläuft, kein Akt.

Okay, ich erahne voraus dann beginnt ggfs. eine Diskussion was eine Minute ist. Duwirst sicher kleinbürgerlich von Erd-Minuten ausgehen. Ich sehe sowas global galaktisch und werd schon einen Planeten oder sonstwas was da rumschwirrt finden wo eine dortige Minute 20 Erdjahre lang ist *lächel*

Gruß
Reinhard


  

Betrifft: OT@Reinhard : Gute Antwort ;-) _oT von: NoNet
Geschrieben am: 27.01.2012 21:11:50

_oT


  

Betrifft: Warum so klein-klein, Reinhard, stürz ... von: Luc:-?
Geschrieben am: 27.01.2012 22:00:05

…dich in die dunkle Strömung und erkunde das Multiversum! Warum denn auch nur in unserer Universumsblase verharren, wo sie doch anscheinend viele Geschwister hat? Zeit wird dann sowas von relativ - das glaubst du gar nicht… ;-))
Übrigens fkt CallMyName im Prinzip fast genauso wie CallByName, das es intern auch enthält, nur eben auch mit vbSet. Das Problem dürfte hier doch wohl eher die Fkt Krypt sein!
Ansonsten habe ich dem Sascha-Thread, zu dem du ja auch was sehr Langes geschrieben hast (mit CP undso), mal ein reguläres CallByName-Bsp zugesellt, denn das wäre nach seiner ursprgl Intention ein Anwendungsfall dafür.
Ein (natürl frdl) lachender Luc :-?


  

Betrifft: AW: Hajo, CallByName, CountLarge ? von: Hajo_Zi
Geschrieben am: 27.01.2012 18:42:59

Hallo Reinhard,

frage 2 ist beantwortet da Selection.Count ein Fehler bringt falls gesamte Tabelle markiert.

Gruß Hajo


  

Betrifft: AW: Hajo, CallByName, CountLarge ? von: Reinhard
Geschrieben am: 27.01.2012 18:49:16

Hallo Hajo,

bitte ersetze in Frage2 Count durch CountLarge.
Aber so oder so sehe ich Frage2 noch nicht als beantwortet an.

Gruß
Reinhard