Supportnet / Forum / Tabellenkalkulation
mit Makro/VBA genaue Rechtecke zeichnen
Frage
Hallo,
vielleicht kann mir jemand bei meinem Problem helfen, denn bei Google & Co komme ich mittlerweile auch nicht mehr weiter, eventuell habe ich auch nur einen Denkfehler drin und es ist so überhaupt nicht möglich.
Mein Problem ist, dass ich kein genaues Rechteck mit VBA hinbekomme. Es soll 90mm Breit und 60mm Hoch sein.
[code]
With ActiveSheet.Shapes("Rechteck1")
.Width = Application.CentimetersToPoints(9)
.Height = Application.CentimetersToPoints(6)
End With
[/code]
Damit wird mein Rechteck 95x59mm. Wenn ich jetzt die gefundenen Makros (Zeilenhöhe/Spaltenbreite in cm) auf eine Zelle anwende, wird diese korrekt auf 90x60mm formatiert.
[code]
Sub Spaltenbreite_in_cm()
Dim sBreite As Single
Dim sAktuell As Single
Dim strText As String
Dim strAntwort As String
sAktuell = (Selection.ColumnWidth + 0.71) / 5.1425
strText = "Aktuelle Spaltenbreite: " & _
Format(sAktuell, "###0.00 cm") & Chr(13) _
& "Geben Sie die gewünschte Spaltenbreite für die " & _
"aktuelle Spalte oder Markierung in cm ein:"
strAntwort = InputBox(strText, "Neue Spaltenbreite festlegen", _
Format(sAktuell, "###0.00"))
If strAntwort <> "" Then
sBreite = CSng(strAntwort)
Selection.ColumnWidth = -0.71 + 5.1425 * sBreite
End If
End Sub
Sub Zeilenhoehe_In_cm()
Dim sHoehe As Single
Dim sAktuell As Single
Dim strText As String
Dim strAntwort As String
sAktuell = Selection.RowHeight / 29.5
strText = "Aktuelle Zeilenhöhe: " & Format(sAktuell, "###0.00 cm") _
& Chr(13) & "Geben Sie die gewünschte Zeilenhöhe für die " & _
"aktuelle Zeile oder Markierung in cm ein:"
strAntwort = InputBox(strText, "Neue Zeilenhöhe festlegen", _
Format(sAktuell, "###0.00"))
If strAntwort <> "" Then
sHoehe = CSng(strAntwort)
Selection.RowHeight = sHoehe * 29.5
End If
End Sub
[/code]
Wenn ich dann den Code umschreibe und für meine Zwecke missbrauche, wird es sogar nur noch 17x60mm groß.
[code]
With ActiveSheet.Shapes("Rechteck1")
.Width = -0.71 + 5.1425 * 9
.Height = 6 * 29.5
End With
[/code]
Ist es überhaupt möglich so etwas zu realisieren oder habe ich mich total verfahren und die falsche Excel-Abzweigung genommen?
Für jede Hilfe oder Denkanstoß bin ich dankbar.
P.S.: Verwende Office 2002 SP3 und Win XP
Need Help
Chmumann
Antwort 1 von ChatAlligator
Auch wenn das Rechteck auf den Punkt genau definiert werden kann, benutzt die entsprechende Anwendung ein Raster für dessen Ausgabe. Die Vorgabe wird somit auf die Werte des Rasters gerundet, was die Vorstellung einer punktgenauen Ausgabe hinfällig macht. Übrigens ist das Raster unter Excel genauer als das unter Word.
Antwort 2 von Chmumann
Mit gewissen Toleranzen (+- 1-2mm) könnte ich leben, nur das ich halt 9cm reinstecke und 9,5cm dann rauskommen, kann ich halt nicht gebrauchen. Zumal das später keine festen Werte sind sondern Variablen und es nicht nur bei einem Rechteck bleiben wird. :(
Antwort 3 von ChatAlligator
Wie gesagt:
Excel und Word benutzen unterschiedliche Raster (also keine stufenlose Größeneinstellung)
Aber wie wär es, wenn du mit Frontpage (auch ein Bestandteil von MS-Office) das entsprechende Ausgabeblatt als Webseite definierst ?
Eine Webseite wird als reine Textdatei gespeichert, in der die Formatbefehle (Tags) in spitzen Klammern <> stehen um den betreffenden Abschnitt einzuleiten und zu beenden.
Hier können die Zellen wenigstens relativ genau und trotzdem individuell definiert werden.
Wenn du dir im Quelltext die entsprechenden Stellen für Zeilen oder Zellen anschaust, so kannst du diese füe ein makro übernehmen. So kannst du per Makro z.B. die Webseite generieren lasssen - eine Vorlage hast du ja dann durch den Quelltext des Entwurfs (musst nur die Inhalte anpassen).
So hab ich eine Zeit lang Webseiten aus einer Access-Datenbank mittels VBA generieren lassen. Gschrieben wird die Datei mit dem Befehl "OPEN". Um die reine Textdatei als Webseite zu interpretieren dient nur die Dateiendung ".htm".
Auch wenn dieser Vorschlag dein Problem nicht behebt, so halte ich es für eine Alternative, das Problem zu umgehen.
Excel und Word benutzen unterschiedliche Raster (also keine stufenlose Größeneinstellung)
Aber wie wär es, wenn du mit Frontpage (auch ein Bestandteil von MS-Office) das entsprechende Ausgabeblatt als Webseite definierst ?
Eine Webseite wird als reine Textdatei gespeichert, in der die Formatbefehle (Tags) in spitzen Klammern <> stehen um den betreffenden Abschnitt einzuleiten und zu beenden.
Hier können die Zellen wenigstens relativ genau und trotzdem individuell definiert werden.
Wenn du dir im Quelltext die entsprechenden Stellen für Zeilen oder Zellen anschaust, so kannst du diese füe ein makro übernehmen. So kannst du per Makro z.B. die Webseite generieren lasssen - eine Vorlage hast du ja dann durch den Quelltext des Entwurfs (musst nur die Inhalte anpassen).
So hab ich eine Zeit lang Webseiten aus einer Access-Datenbank mittels VBA generieren lassen. Gschrieben wird die Datei mit dem Befehl "OPEN". Um die reine Textdatei als Webseite zu interpretieren dient nur die Dateiendung ".htm".
Auch wenn dieser Vorschlag dein Problem nicht behebt, so halte ich es für eine Alternative, das Problem zu umgehen.
Antwort 4 von Chmumann
Leider nütz es in meinen Fall nichts das Problem zu umgehen, zumal das Excel-Endprodukt keine Möglichkeiten hat Frontpage beim Anwender zu nutzen, da dort zu 99% diese Anwendung überhaupt nicht installiert ist.
Doch durch ein wenig probieren und berechnen, bin ich zu einer bis jetzt recht zufriedenstellenden Ergebnis gekommen.
Durch diese kleine Modifikation durch eine kleine Funktion sind die Abstände nur noch stellenweise bei max. +1mm -0mm. Damit könnte man, so finde ich, schon recht gut leben und man bleibt innerhalb von Excel. Werde aber dieses noch einen ausgiebigen Praxistest unterziehen und später auch die endgültige Lösung präsentieren.
Trotzdem vielen Dank an ChatAlligator für Deine Lösungsvorschläge/Denkanstöße.
Doch durch ein wenig probieren und berechnen, bin ich zu einer bis jetzt recht zufriedenstellenden Ergebnis gekommen.
Public Function SBreite_ZHöhe_2Punkt(ByRef ZeileSpalte As String, ByRef Wert_in_mm As Single) As Single
Dim Berechnung As Single
Select Case ZeileSpalte
Case "Zeile"
Berechnung = Application.CentimetersToPoints(Wert_in_mm / 10) + _
0.0375 * Application.CentimetersToPoints(Wert_in_mm / 10) + 0.0545
Case "Spalte"
Berechnung = Application.CentimetersToPoints(Wert_in_mm / 10) - _
0.045 * Application.CentimetersToPoints(Wert_in_mm / 10) + 0.1012
End Select
SBreite_ZHöhe_2Punkt = Berechnung
End Function
Durch diese kleine Modifikation durch eine kleine Funktion sind die Abstände nur noch stellenweise bei max. +1mm -0mm. Damit könnte man, so finde ich, schon recht gut leben und man bleibt innerhalb von Excel. Werde aber dieses noch einen ausgiebigen Praxistest unterziehen und später auch die endgültige Lösung präsentieren.
Trotzdem vielen Dank an ChatAlligator für Deine Lösungsvorschläge/Denkanstöße.

