Es hat schon etwas von einer Krux mit dem Basic. Es fehlen jegliche Navigationsbefehle für den Zellzeiger. Man muss sich also mit SendKeys() begnügen, nicht gerade ein Ruhmesblatt. Aber auch dabei stoße ich auf folgendes Problem:
Ziel:
Der aktive Tabellenblattbereich soll erfasst werden als Range Objekt.
Randbedingung:
Oberste paar Zeilen könnten fixiert sein gegen scrollen.
Problem 1 :
Sowohl der PlanMaker-Tastaturbefehl [Strg][Pos1], als auch SendKeys("^{Home}") führen nicht zu A1, sondern zur obersten linken Ecke des scrollbaren Bereichs. Das ist zwar in Ordnung, aber gute Tabellenkalulationen bieten bei zweimaligem [Strg][Pos1] den Sprung nach A1 (
Bitte als Wunsch für PM vermerken!).
Problem 2 :
Mir bleibt also nur, die Zelle A1 zu selektieren, dann mit SendKeys den aktiven Bereich auszuwählen:
Code:
Dim pm As Object
Set pm = CreateObject("PlanMaker.Application")
pm.Application.Visible = True
pm.ActiveSheet.Range("A1").Select
pm.Application.Activate ' Zusatz für Haltepunkt - hier zu setzen
SendKeys("+^{End}"), True
End
Dabei offenbart sich, dass die Select Anweisung nur VISUELL, aber nicht WIRKLICH die vorherige Lage des Zellzeigers aufhebt. Lassen Sie obiges Skript mit Haltepunkt laufen (Schrittmodus geht mit SendKeys nicht) während z.B. C3 ausgewählt ist. Dann wird brav A1 ausgewählt, aber danach C3:Z100, anstatt A1:Z100, wenn z.B. Z100 die unterste rechte beschrieben Zelle ist
Was tun?
Die Lösung bringe ich ganz, um die oben erwähnte "Krux" , den Ernst der Sache, und ein weiteres Problem zu verdeutlichen:
Code:
Sub Main
Dim pm As Object, activearea As Object
Set pm = CreateObject("PlanMaker.Application")
pm.Application.Visible = True
SendKeys("^{End}"), True
Set activearea = pm.ActiveSheet.Range("A1:" & Address(pm.Selection))
End Sub
Function Address(ByVal rng As Objekt) As String
Dim begcol&, endcol& ' Zero based row and column numbers
begcol = -1 + rng.Column
endcol = -1 + begcol + rng.Columns.Count
If 25 < begcol Then Address = Chr(64 + begcol / 26)
Address = Address & Chr(65 + begcol - Int(begcol / 26) * 26) & CStr( rng.Row)
If 2 < rng.Columns.Count + rng.Rows.Count Then
Address = Address & ":"
If 25 < endcol Then Address = Address & Chr(64 + endcol / 26)
Address = Address & Chr(65 + endcol - Int(endcol / 26) * 26) & CStr(-1 + rng.Row + rng.Rows.Count)
End If
End Function
Das weitere Problem ist: Es lassen sich Range Objekte ausschließlich per Adress-String definieren (nicht per Row- und Column Integer). Aber es fehlt die Range-Eigenschaft
Range.Address! Und
Range.Name liefert einen Leerstring, wenn kein Name vergeben wurde. Fast keines meiner Skripte kommt ohne obige
Function Address() aus.
Eine grundsätzliche Frage liegt mir auf dem Herzen: Hat Softmaker die Möglichkeit, und vor Allem ein Interesse daran, das Enable Basic weiter auszubauen?