# excel tabellier programm
#
#	F5	legt die Eingabezelle,
#	F6	die Ausgabezelle und
#	F7	den Spaltenbereich mit Werten fr die Eingabezelle fest.
#
#	F8	startet die Tabellierung und gibt die Werte der Ausgabezelle
#		spaltenweise ab der aktuellen Excel-Cursorposition aus.
#
#	Werfen Sie einen Blick in die get_range() Funktion, sie eignet
#	sich gut als Bibliotheksfunktion.
#
#	Das Programm sollte sich ohne groen Aufwand auf andere
#	Tabellenkalkulationen portieren lassen.
#	Setzen Sie dazu remoteDDE (BEGIN Section) auf den richtigen Wert
#	und ndern Sie die Belegung der shift+F2 Taste.
#

FUNCTION get_range(range) {
	local	file, top, bottom, left, right, x

	if (index(range, "!") == 0)
		return (1);
	else
		file = substr(range, 1, rstart-1);

	x = substr(range, rstart+1);			# ZaSb:ZcSd
	top = substr(x, 2) + 0;
	if (index(x, "S") == 0)
		return (1);
	else
		left = substr(x, rstart+1) + 0

	if (index(x, ":") == 0) {
		bottom = top;
		right = left;
		return (0);
		}

	x = substr(x, rstart+1) 			# ZcSd
	bottom = substr(x, 2) + 0
	if (index(x, "S") == 0)
		return (1);
	else
		right = substr(x, rstart+1) + 0

	return (0)
	}


FUNCTION celltest(cell) {
	k = index(cell, "!")
	if (k == 0)
		return ("")

	k = (y = substr(cell, k)) |:
	    index(":")
	if (k != 0)
		return ("")

	return (cell);
	}

FUNCTION coltest(col) {
	if (get_range(col) == 1)
		return ("");
	else if (get_range["right"] != get_range["left"])
		return ("")

	return (col)
	}

FUNCTION nocell() {
	inform(WINtext,
	       "Der von Ihnen markierte Bereich ist keine einzelne Zelle")
	}


/F5 "variablen zelle setzen"/ {
	x = (SEL |get)
	x = celltest(x)
	if (x == "")
		nocell()
	else {
		variabel = remoteDDE x
		status("variable zelle = " variabel)
		}
	}

/F6 "ergebnis zelle setzen"/ {
	if ((x = (SEL |get) |: celltest()) == "")
		nocell()
	else {
		ergebnis = remoteDDE x
		status("ergebnis zelle = " ergebnis)
		}
	}

/F7 "eingabe spalte setzen"/ {
	if ((x = (SEL |get) |: coltest()) == "")
		inform(WINtext, "Der markierte Bereich ist kein Spaltenbereich.")
	else {
		eingabe = x
		status("eingabe bereich = " eingabe)
		}
	}

/F8 "tabellieren"/ {
	if ((x = (SEL |get) |: celltest()) == "")
		inform(WINtext, "Der markierte Bereich ist kein Spaltenbereich.")
	else {
		get_range(x)
		outF = get_range["file"] "!"
		outZ = get_range["top"];
		outS = get_range["left"];

		get_range(eingabe)
		varF = get_range["file"] "!"	# Achtung !
		varZ = get_range["top"] + 0;	#    die Werte sind Strings!
		varS = get_range["left"];	#
		end  = get_range["bottom"] + 0;

		for (; varZ <= end; outZ++, varZ++) {
			(remoteDDE varF "Z" varZ "S" varS) |get x
			status(x)
			y = x | variabel : ergebnis | (remoteDDE outF "Z" outZ "S" outS);
			}
		}
	}


BEGIN {
	ctrl(2, "Excel Tabellierer", 3, 112)
	close("") |: status()

	remoteDDE = "excel|"
	SEL	  = remoteDDE "system!selection"
	}

/shift F2 "excel starten"/ {
	exec("excel", 1)
	}


/F3 "dialog"/ {
	x = paste("CF_TEXT") # |: tr("\n\r", "\t")	 # |: sq("\t")
	status(x)
	split(x, data, "\r\n");
	}
