SoftMaker.de

Deutschsprachiges Diskussionsforum
Aktuelle Zeit: 26.05.2013 04:50:31

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: 24.08.2008 15:07:15 
Offline
SoftMaker Volunteers
SoftMaker Volunteers

Registriert: 06.02.2007 14:01:47
Beiträge: 959
Das Makro ist u.a. für kaufmännische Anwendungen gedacht.

Es summiert eine Tabelle z.B. mit Umsätzen, die nach Artikelgruppen sortiert sind. Beim Wechsel der Artikelgruppe wird in eine neu eingefügte Zelle der aufaddierte Umsatz der Gruppe geschrieben und am Schluß wird eine Totalsumme ausgewiesen.

Cursor (im Beispiel) in Zelle „A2“ setzen. Man kann natürlich auch mit der Definition einer Range arbeiten, aber so ist das Makro flexibler, weil ja man nicht immer weiß wie groß die Tabelle ist bzw. jedes Mal die Definiton der Range im Makro anpassen müßte.. Man muß nur daran denken, den Cursor in die richtige Zelle zu sezen.

Eine Testdatei habe ich beigefügt, so daß man das Makro gleich ausprobieren kann.

Code:
' Planmaker-Makro für summieren von Werte in einer Tabelle
' mit Zwischensummen z.B. eine Umsatzstatistik
' Stand: 22.08.2008
'
' Makro addiert die Werte z.B.  in einer Umsatztabelle
' bei jedem Wechsel der Artikelgruppe wird eine neue Zelle eingefügt
' in die der aufsummierte Umsatz geschrieben wird
' am Ende der Tabelle wird der Gesamtumsatz ausgewiesen

' Cursor ist in die erste Zelle der erste Zeile zu stellen
' die addiert werden soll


Dim pm as Object
dim  i, agr, agrz,x  as integer
dim su as integer            ' Summe pro Gruppe
dim sut as integer           ' Summe Total

Set pm = CreateObject("PlanMaker.Application")  ' Verbindung aufbauen
pm.Application.Visible = True

i = 2

agrz = pm.ActiveSheet.Selection(i, 1).Value   ' Artikelgruppe zwischenspeichern zum Vergleichen
agr = pm.ActiveSheet.Selection(i, 1).Value     ' Artikelgruppe


DO while agr > 0

agr = pm.ActiveSheet.Selection(i, 1).Value     ' Artikelgruppe


If agr <> agrz Then

pm.ActiveSheet.Selection(i, 1).insert
pm.ActiveSheet.Selection(i, 2).insert
pm.ActiveSheet.Selection(i, 3).insert
pm.ActiveSheet.Selection(i, 3).Value=su
pm.ActiveSheet.Selection(i, 3).Font.Bold=True
pm.ActiveSheet.Selection(i, 3).Borders(pmBorderTop).Type = pmLineStyleSingle
pm.ActiveSheet.Selection(i, 3).Borders(pmBorderBottom).Type = pmLineStyleDouble
i = i + 1
pm.ActiveSheet.Selection(i, 1).insert
pm.ActiveSheet.Selection(i, 2).insert
pm.ActiveSheet.Selection(i, 3).insert

sut = sut + su
su = 0

agrz = agr
End If

su  = su + pm.ActiveSheet.Selection(i, 3).Value  ' Artikelumsätze addieren
i = i + 1

loop


pm.ActiveSheet.Selection(i, 1).Value="TOTAL"
pm.ActiveSheet.Selection(i, 1).Font.Bold=True

pm.ActiveSheet.Selection(i, 3).Value=sut
pm.ActiveSheet.Selection(i, 3).Font.Bold=True
pm.ActiveSheet.Selection(i, 3).Borders(pmBorderBottom).Type = pmLineStyleDouble


Set pm = Nothing ' Verbindung aufheben


Dateianhänge:
Dateikommentar: Tabelle zum Testen des Makros
PMUmsTest.zip [2.48 KiB]
99-mal heruntergeladen
Nach oben
 Profil  
 
BeitragVerfasst: 25.08.2008 08:55:51 
Ein prima Beispiel, besonders, weil es einfach ist und dabei "viel macht". Es demonstriert sehr gut, wozu solche Makros taugen.


Nach oben
  
 
BeitragVerfasst: 25.08.2008 09:53:14 
Offline
SoftMaker Team
SoftMaker Team

Registriert: 03.12.2003 14:32:06
Beiträge: 2977
Das ist wirklich ein schönes Makro. Dürfen wir es eventuell als Beispielmakro bei unserer Software mitliefern?

_________________
Martin Kotulla
SoftMaker Software GmbH


Nach oben
 Profil  
 
BeitragVerfasst: 25.08.2008 11:27:08 
Stopf! :wink:

Ich bemerke gerade, dass augenscheinlich in der ersten Artikelgruppe verkehrt gerechnet wird...?! Da kommen mit der Beispiel-Tabelle 27 statt 28 heraus. Habe ich recht?

Aufgefallen ist es mir, weil ich meine Ruby-Version nicht dazu bringen konnte, 27 zu berechnen:

Code:
#!/usr/local/ruby
require 'logger'
require 'win32ole'

$LOG = Logger.new(STDOUT)
$LOG.level = Logger::DEBUG

=begin
' Planmaker-Makro für summieren von Werte in einer Tabelle
' mit Zwischensummen z.B. eine Umsatzstatistik
'
' Makro addiert die Werte z.B.  in einer Umsatztabelle
' bei jedem Wechsel der Artikelgruppe wird eine neue Zelle eingefügt
' in die der aufsummierte Umsatz geschrieben wird
' am Ende der Tabelle wird der Gesamtumsatz ausgewiesen

' Cursor ist in die erste Zelle der erste Zeile zu stellen
' die addiert werden soll
' c 2008/Dewes
' Ruby-Version: 2008, Monsterslayer
' In dieser Version kann der Cursor initial stehen, wo er will.
' Die relevanten Zeilen ergeben sich aus der Voreinstellung im
' Skript.
=end

# TODO: Modul erzeugen, und PM-spezifische Methoden,
# Eigenschaften und Konstanten mappen
pm = WIN32OLE.new("PlanMaker.Application")
pm.Application.Visible = true
Sheet = pm.ActiveSheet
BorderTop = -1
BorderBottom = -3
LineStyleSingle = 1
LineStyleDouble = 2


# ==   Veränderbare Werte   ==
First_Row = 2
Group_Col = 'A'
Last_Col = 'C'
Sum_Col = 'C'
# ==  ENDE Veränderbare Werte ==


# Zeile einfügen unter Zeile #r_index
def insert_row(r_index)
   lc = col_index(Last_Col)
   until lc == 0
      Sheet.Selection(r_index, lc).insert   
      lc -= 1
   end
end

# Index einer Spalte zwischen 'A' und 'ZZ' ermitteln
def col_index(col)
   ('A'..'ZZ').to_a.each_with_index {|c, i| return (i + 1) if col == c}
end

# Summen-Stil auf Zelle (oder Range) 'cell' anwenden
def style_as_sum(cell)
   cell.Font.Bold = true
   cell.Borders(BorderTop).Type = LineStyleSingle
   cell.Borders(BorderBottom).Type = LineStyleDouble

end

First_Group = "#{Group_Col}#{First_Row}" # erste Gruppen-Zelle
GC_Index = col_index(Group_Col) # index der Gruppen-Spalte
S_Index = col_index(Sum_Col) # index der Summen-Spalte

Sheet.Range(First_Group).Select # selektiere gleich die erste Gruppen-Zelle

$LOG.debug("First Group in #{First_Group}")

compare_grp = nil
grp_sum = 0
total_sum = 0
row_count = Sheet.Rows.Count

# dieses Array wird die Zeilennummern der Summenzeilen
# enthalten, damit eingefügte Leerzeilen nicht den
# vorzeitigen Abbruch des Skriptes bewirken.
# Leerzeilen werden damit erst am Ende eingefügt.
s_rows = Array.new

# Diese Zählschleife nicht zu leicht nehmen!
# row_count ist eine Referenz und ändert ihren Wert!
row_count.times do |i|
   # Beginne die Arbeit erst in Zeile "First_row"
   if(i >= (First_Row - 1) ) # Array startet mit 0
      art_grp = Sheet.Selection(i, GC_Index).Value

      compare_grp = art_grp if compare_grp == nil

      # 1. Fall: innerhalb der Vergleichsgruppe
      if(art_grp && (art_grp == compare_grp) )
         grp_sum += Sheet.Selection(i, S_Index).Value.to_i

      # 2. Fall: Wechsel der Gruppe
      elsif(compare_grp != art_grp )
         compare_grp = art_grp
         insert_row(i)      
         sum_cell = Sheet.Selection(i, S_Index)
         sum_cell.Value = grp_sum
         style_as_sum(sum_cell)
         total_sum += grp_sum
         s_rows << i
         grp_sum = 0
      end
      # 3. Fall: Keine Gruppe mehr gelesen
      if(art_grp == nil || art_grp.to_s.length == 0)
         t_row = i + 1
         t_cell = Sheet.Selection(t_row, 1)
         t_cell.Value = "TOTAL"
         t_cell.Font.Bold = true
         t_cell = Sheet.Selection(t_row, S_Index)
         t_cell.Value = total_sum
         t_cell.Font.Bold = true
         t_cell.Borders(BorderBottom).Type = LineStyleDouble
         
         # Hübsch machen: Leerzeilen einfügen.
         # Damit ist das Skript ohnehin am Ende und die
         # Indizes sind verbrannt.
         if(!s_rows.empty?)
            incr = 1
            s_rows.each do |i|
               insert_row(i + incr)
               incr += 1
            end
         end
         # und tschüss...
         exit 0
      end
   end
end


Kritik der Ruby-Version:
Einige PM-spezifische Konstanten, Eigenschaften und Methoden sollten in ein Modul gekappselt werden. Das kömmt noch. Danach schauen die Skripte dann auch nicht mehr so kompliziert aus. :shock:

Edit: Kommentiert


Zuletzt geändert von Monsterslayer am 25.08.2008 16:52:14, insgesamt 3-mal geändert.

Nach oben
  
 
BeitragVerfasst: 25.08.2008 11:39:49 
Offline
SoftMaker Volunteers
SoftMaker Volunteers

Registriert: 23.02.2007 08:37:26
Beiträge: 2940
Monsterslayer hat geschrieben:
Aufgefallen ist es mir, weil ich meine Ruby-Version nicht dazu bringen konnte, 27 zu berechnen:

Kann mir mal jemand kurz erklären, was eine "Ruby auf Schienen"-Version mit dem BasicMaker zu tun hat?

Ich fände es doch sehr gut, wenn man sich wirklich darauf beschränken könnte, Skripte für das Programm zu diskutieren, das hier Topic ist... Für den Anwender ist die Hürde BM schon nicht niedrig. Wie genau soll man ihm nun verklickern, dass er offenbar mit dem BasicMaker gar nichts anfangen kann, sondern erst noch irgendwelchen Programmiersumms auf seinen Rechner installieren muss? Wer diesen Punkt bereits überschritten hat, der wird keine große Mühe damit haben, ein vorhandenes BM-Skript in die Programmiersprache seiner Wahl zu übersetzen.

Die OLE-Automatisierung der einzelnen Anwendungen aus der Office-Suite selbst hat mit dem BasicMaker nichts zu tun und betrifft wirklich jede einzelne Anwendung für sich. Das war vermutlich auch genau der Grund, warum SoftMaker erst kein eigenes Forum dafür schaffen wollte...

Also bitte hier wirklich nur Sachen, die den BasicMaker betreffen (und das sind Skripte, die auch davon ausgeführt werden können), sonst blickt nach sehr kurzer Zeit kein Mensch mehr durch.


Nach oben
 Profil  
 
BeitragVerfasst: 25.08.2008 11:45:31 
Zitat:
Fehlerberichte, Hilfe und Anregungen zu BasicMaker 2008 für Windows und zum Scripting von SoftMaker Office 2008 allgemein


Nicht so aggressiv bitte. Und von Schienen ist hier weit und breit nix zu sehen. Cool bleiben.
Mir schwillt ja selten der Kamm aber das hier musste wohl mal kommen. Das Forum lebt noch gar nicht lange genug, um gegen den Sinn der obigen Zweckbeschreibung eine rigorose Reglementierung gegen "Skripting allgemein" zu formulieren. Noch dazu, bevor eine ansehnliche Anzahl von Beiträgen und darin enthalten, Kritk und Diskussion der abgelieferten Skripte, sichtbar sind.

Ich verstehe PBKs Kritik nicht im Sinne einer Warnung vor Zweckentfremdung sondern anders. Darauf möchte ich aber nicht eingehen. Wenn beschlossen ist, dass Ruby- und andere (nicht-VB) Skripten hier nichts zu suchen haben, möchte ich das in Schriftform.

Danke.


Zuletzt geändert von Monsterslayer am 25.08.2008 12:50:14, insgesamt 1-mal geändert.

Nach oben
  
 
BeitragVerfasst: 25.08.2008 12:13:06 
Offline
SoftMaker Team
SoftMaker Team

Registriert: 03.12.2003 14:32:06
Beiträge: 2977
Also, ich habe nichts dagegen, wenn auch über andere Scriptingsprachen diskutiert wird. Ich bin über alle Diskussionen zum Scripting froh, weil es da doch sehr ruhig ist und wir manchmal nicht wirklich wissen, ob sich der Aufwand mit der Automation von SoftMaker Office überhaupt lohnt.

Man sollte aber immer deutlich darauf hinweisen, um welche Sprache es gerade in einem Posting geht und dass das mit BasicMaker direkt nichts zu tun hat.

Vielleicht kann man das mit Tags in den Überschriften der Threads verdeutlichen:

[Ruby] Script zum Automatisieren der Heizkostenabrechnung
[C++] Fragen zur OLE Automation mit SoftMaker Office

Wenn sich's um BasicMaker handelt, kann man sich das Tag schenken.

_________________
Martin Kotulla
SoftMaker Software GmbH


Nach oben
 Profil  
 
BeitragVerfasst: 25.08.2008 12:45:01 
Alles klar. Danke.


Nach oben
  
 
BeitragVerfasst: 25.08.2008 13:16:37 
Offline
SoftMaker Volunteers
SoftMaker Volunteers
Benutzeravatar

Registriert: 03.10.2007 12:58:39
Beiträge: 1854
Dewes hat geschrieben:
......

[code]' Planmaker-Makro für summieren von Werte in einer Tabelle
' mit Zwischensummen z.B. eine Umsatzstatistik
' Stand: 22.08.2008
'
......
Dim pm as Object
dim i, agr, agrz,x as integer
dim su as integer ' Summe pro Gruppe
dim sut as integer ' Summe Total

Set pm = CreateObject("PlanMaker.Application") ' Verbindung aufbauen
pm.Application.Visible = True

i = 2



Super, das kann man gut gebrauchen.
Bezüglich des Rechenfehlers bei der 1. Artikelgruppe, müsste m.E. "i = 2" in
"i = 1" geändert werden.
Zumindest bei mir funktioniert das dann.


Nach oben
 Profil  
 
BeitragVerfasst: 25.08.2008 13:20:59 
greifenklau hat geschrieben:
Bezüglich des Rechenfehlers bei der 1. Artikelgruppe, müsste m.E. "i = 2" in
"i = 1" geändert werden.
Zumindest bei mir funktioniert das dann.


Jetza! Ich habe mir den Kopf zerbrochen. =D>

@Dewes: Mein PM vergessen. Es liegt daran, dass in der Selection die i-te Zeile gelesen wird; das ist die dritte, wenn die Selection in der zweiten steht.


Nach oben
  
 
BeitragVerfasst: 25.08.2008 16:03:44 
Offline
SoftMaker Volunteers
SoftMaker Volunteers

Registriert: 06.02.2007 14:01:47
Beiträge: 959
Zitat:
Bezüglich des Rechenfehlers bei der 1. Artikelgruppe, müsste m.E. "i = 2" in
"i = 1" geändert werden.
.

Asche auf mein Haupt, dreimal im Kopf nachgerechnet und dann das
es muß wirklich "i=1" heißen

Vielen Dank für die Tipps


Nach oben
 Profil  
 
BeitragVerfasst: 25.08.2008 16:07:51 
Offline
SoftMaker Volunteers
SoftMaker Volunteers

Registriert: 06.02.2007 14:01:47
Beiträge: 959
Zitat:
Das ist wirklich ein schönes Makro. Dürfen wir es eventuell als Beispielmakro bei unserer Software mitliefern?

Selbstverständlich, nichts dagegen, aber bitte den diskutierten Fehler korrigieren.

Wenn gewünscht kann ich noch ein Makro bauen, das die Beispieldatei aufbaut, dann muß man keine Musterdatei mitliefern.


Nach oben
 Profil  
 
BeitragVerfasst: 26.08.2008 16:34:38 
Offline
SoftMaker Volunteers
SoftMaker Volunteers

Registriert: 23.02.2007 08:37:26
Beiträge: 2940
martin-k hat geschrieben:
Ich bin über alle Diskussionen zum Scripting froh, weil es da doch sehr ruhig ist und wir manchmal nicht wirklich wissen, ob sich der Aufwand mit der Automation von SoftMaker Office überhaupt lohnt.


Ich bin davon überzeugt, dass es sich lohnt. Allerdings muss man natürlich ganz klar sagen, dass wir heute in einer Zeit leben, in der ein Durchschnitts-Anwender eines Office-Paketes weder mit Programmiersprachen noch Skripting etwas "am Hut hat". Alles, was das Thema Automatisierung betrifft, wird man im Consumerbereich eher selten finden (Lieschen Müller bastelt auch mit MS-Office kein VBA-Skript zusammen). Wenn, dann wird es interessant, wo mehrere Anwendungen zusammenspielen müssen und die OLE-Funktionalität die einzige Chance ist, die Daten zu transportieren (dazu hatte ich ja an anderer Stelle schon einmal etwas geschrieben, was die MS-Office-Ersetzbarkeit anging). Da sind wir dann allerdings im geschäftlichen Bereich angekommen und da ist eher weniger zu erwarten, dass diese Informationen frei zugänglich irgendwo gepostet werden.

Ich finde, dass die Beispiele, die im Programmpaket enthalten sind wenig Lust darauf machen, sich mit dem Skripting näher zu befassen. Es fehlen einfach Skripte, mit einem "Aha!"-Effekt, die den Anwender anfixen sich auch einmal selbst zu versuchen. Erst wenn man sieht, dass es einem selbst einen Vorteil bringt wird man es benutzen.

Dann gibt es im Forum ein paar Nachfragen von Kunden bezüglich "exotischer" Funktionswünsche, die nicht massentauglich sind, aber möglicherweise mit einem kleinen Stück Skript umgesetzt werden könnten. Ein Beispiel ist die Sache mit dem Drucken aller Dateien in einem Verzeichnis aus dem Programm heraus. Wenn da (und ich denke hier primär an den Hersteller, weil man ihm unterstellt, dass er am Besten überschauen kann, was geht und was nicht geht (um es dann ggf. gängig zu machen)) entsprechende Lösungsschnipsel bspw. hier angeboten würden und die auch hinreichend dokumentiert wären, dann bin ich davon überzeugt, dass es das Interesse weckt. Außerdem vergrößert sich so der Fundus an Skript-Schnipseln quasi automatisch.

Wenn aber bei den Beispieldateien wie dialog.bas beim Ausführen sofort ein "Error in line: 25 - ActiveX component can't create object" erscheint, dann führt das nicht zum gewünschten Effekt und schreckt doch eher ab. Leider befinden sich auch keine Informationen zu Rahmenbedingungen, die für die Ausführung nötig sind, in den Kommentaren im Programm. Das fiel mir gerade parallel zum Tippen dieses Postings auf...


Nach oben
 Profil  
 
BeitragVerfasst: 26.08.2008 16:54:52 
Offline
SoftMaker Volunteers
SoftMaker Volunteers
Benutzeravatar

Registriert: 03.10.2007 12:58:39
Beiträge: 1854
pbk hat geschrieben:
martin-k hat geschrieben:
Ich bin über alle Diskussionen zum Scripting froh, weil es da doch sehr ruhig ist und wir manchmal nicht wirklich wissen, ob sich der Aufwand mit der Automation von SoftMaker Office überhaupt lohnt.


Ich bin davon überzeugt, dass es sich lohnt. Allerdings muss man natürlich ganz klar sagen, dass wir heute in einer Zeit leben, in der ein Durchschnitts-Anwender eines Office-Paketes weder mit Programmiersprachen noch Skripting etwas "am Hut hat". Alles, was das Thema Automatisierung betrifft, wird man im Consumerbereich eher selten finden (Lieschen Müller bastelt auch mit MS-Office kein VBA-Skript zusammen). .....

Ich finde, dass die Beispiele, die im Programmpaket enthalten sind wenig Lust darauf machen, sich mit dem Skripting näher zu befassen. Es fehlen einfach Skripte, mit einem "Aha!"-Effekt, die den Anwender anfixen sich auch einmal selbst zu versuchen. Erst wenn man sieht, dass es einem selbst einen Vorteil bringt wird man es benutzen.

......

Wenn aber bei den Beispieldateien wie dialog.bas beim Ausführen sofort ein "Error in line: 25 - ActiveX component can't create object" erscheint, dann führt das nicht zum gewünschten Effekt und schreckt doch eher ab. Leider befinden sich auch keine Informationen zu Rahmenbedingungen, die für die Ausführung nötig sind, in den Kommentaren im Programm. Das fiel mir gerade parallel zum Tippen dieses Postings auf...


Guter und vernünftiger Beitrag. Du sprichst mir da aus der Seele. [-o<


Nach oben
 Profil  
 
BeitragVerfasst: 27.08.2008 13:32:28 
Offline
SoftMaker Volunteers
SoftMaker Volunteers

Registriert: 06.02.2007 14:01:47
Beiträge: 959
Dem kann ich mich auch nur anschließen.

Auch wenn die Einarbeitung in BM eigentlich leicht ist, stimmt diese Aussagen nur für Anwender die schon Erfahrung haben. Für den ahnungslosen Anwender wie Lieschen Müller wird das schon schwieriger und schreckt viele wahrscheinlich ab.

Ich würde vorschlagen, daß man im BM-Manual auch eine Tour einführt, ähnlich wie bei TextMaker und PlanMaker. Ich habe diese nicht „durchgespielt“ so daß ich über die Qualität nicht urteilen kann.

Es ist auch richtig, daß man Beispiele aufführen sollte, die Bezug zur Praxis haben und Appetit auf mehr machen sprich: sich in BM einzuarbeiten. Dem Anwender muß man demonstrieren, daß er sich mit intelligenten Scripten viele Routinearbeiten ersparen kann.

Auch die Dokumentation der Scripte ist ein wichtiger Faktor. Ich will hier wirklich kein Eigenlob betreiben, aber ich bemühe mich grundsätzlich im Kopf eines Scriptes die Aufgaben des Scriptes zu beschreiben. Das ist für den Anwender gedacht, aber auch für mich selbst. Wenn man ein Script ein Jahr später wieder „in die Hand nimmt“, weiß man in der Regel auch nicht mehr so genau, was da läuft.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste

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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de