SoftMaker.de

Deutschsprachiges Diskussionsforum
Aktuelle Zeit: 18.06.2013 22:02:41

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: PM Navigationsproblem
BeitragVerfasst: 17.10.2008 02:52:48 
Offline
SoftMaker Volunteers
SoftMaker Volunteers

Registriert: 27.08.2008 21:05:27
Beiträge: 250
Wohnort: Wiesbaden
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?

_________________
SMO rev. 670 + Win XP                    Times without money are better than times without Mini - the original ;)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: PM Navigationsproblem
BeitragVerfasst: 20.10.2008 09:09:30 
Offline
SoftMaker Team
SoftMaker Team

Registriert: 03.12.2003 14:32:06
Beiträge: 2985
1. Das erste Problem (Range.Select kollidiert mit Strg+Shift+End) konnte ich nachvollziehen und habe es an die Programmierer weitergeleitet.

2. Eine Adressierung über Zeilen- und Spaltennummer ist durchaus möglich. Sie erzeugen ein Range-Objekt von der Größe des Arbeitsblatts und übergeben dann an dessen Item-Eigenschaft die Zeilen- und Spaltennummer:

pm.ActiveSheet.Range("A1:AJ16384").Item(4,4).Select

Kürzer:
pm.ActiveSheet.Range("A1:AJ16384")(4,4).Select

3. Range.Name ist nur für benannte Bereiche zuständig. Wenn es ersatzweise eine Zelladresse zurückliefern würde, wäre das erstens nicht Excel-kompatibel und würde zweitens benannte Bereiche von unbenannten ununterscheidbar machen.

4. An der BASIC-Engine werden wir auf absehbare Zeit wenige Änderungen vornehmen (Fehlerkorrekturen ja, Featureerweiterungen eher nein). Die OLE Automation-Befehle von TextMaker und PlanMaker hingegen werden schon weiter ausgebaut. Daher sind wir für Berichte über Lücken in ihnen dankbar. Es ist aber auch ehrlicherweise anzumerken, dass gegenwärtig BasicMaker nicht dieselbe hohe Priorität wie TextMaker, PlanMaker oder Presentations hat -- unsere Manpower ist begrenzt, und da setzen wir die Prioritäten da, wo die Mehrzahl der Anwender ist.

_________________
Martin Kotulla
SoftMaker Software GmbH


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: PM Navigationsproblem
BeitragVerfasst: 20.10.2008 13:09:31 
Offline
SoftMaker Volunteers
SoftMaker Volunteers

Registriert: 27.08.2008 21:05:27
Beiträge: 250
Wohnort: Wiesbaden
Danke für diese Antwort!
Zitat:
unsere Manpower ist begrenzt
Meine Überzeugung ist, das nur deshalb wir solch ehrliche und verbindlich anmutende Antworten bekommen. Hoch lebe SoftMaker! Der Inhalt ist selten 100% zufriedenstellend, aber wenn dazu noch mangelnde Kompetenz einer Hotline und die Reserviertheit einer großen Firma sichtbar wird, untergräbt es meine Moral. "Heutzutage" wie ein kleiner Urlaub für mich, eine solche Antwort, Dankeschön!

Zitat:
pm.ActiveSheet.Range("A1:AJ16384")(4,4).Select
Jawohl, es geht auch ohne String: pm.ActiveSheet.Cells(4,4).Select. Mein Problem war aber, dass dies nur für einzelne Zellen gilt.
Nur zur Verdeutlichung, hier denkbare Lösungen (im OLE-Rahmen) für ganze Bereiche:

With pm.ActiveSheet

' als neuer Zeiger auf Objekt, analog zu .Range ("A1") ("Z100"):
      Set objvar = .Range (1, 1) (25, 100)

' oder als neue Methode .ExpandTo:
      Set objvar = .Cells (1,1)
      objvar.ExpandTo (25, 100)

' Oder mein Favorit, am einfachsten zu implementieren und universal sehr nützlich, die neue Eigenschaft .Address:
      Set objvar = .Range ( .Cells (1,1).Address) ( .Cells (25, 100).Address)
      If 2 = MsgBox ("Dieser Bereich OK? < " & objvar.Address & " >", 1) Then Exit Sub ' Dies ist momentan extrem aufwändig!

End With

End Hoffie :P

_________________
SMO rev. 670 + Win XP                    Times without money are better than times without Mini - the original ;)


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de