Evtl. neue FAQ:1581, Beispieltabellen darstellen

Hallo Interessierte,
Kurztest verlief erfolgreich, aber k.A. welche Bugs Features im Code noch enthalten sind. Wird sich im Laufe der Zeit rausstellen.
Bevor der Code in die FAQ aufgenommen werden kann wäre es gut er würde ausgetestet, einfach durch Benutzung.
Die erste Sub stellt ausgewählte Tabellenbereiche in w-w-w dar. Die zweite liest sie wieder aus und stellt sie in der aktuellen Tabelle dar.
Nachfolgend die Codes.
Gruß
Reinhard

Option Explicit

Sub Bereich2W\_W\_W()
' Programm zum formatierten Darstellen von Tabellenblattbereichen bei wer-weiss-was.
' November 2006 by Reinhard
'
' Getestet in XL97. Möglicherweise muss man in höheren Excelversionen wegen dem DataObject
' im Editor bei Extras--Verweise den Verweis auf "Microsoft Forms 2.0 Object Library" setzen.
'
' Code am besten in Modul1 der personl.xls bzw. personal.xls.
'
' Benutzung: gewünschten Tabellenblattbereich per Maus oder Tastatur markieren und Makro
' ausführen lassen. Im Eingabefeld von w-w-w dann Strg+V drücken.
'
Dim AnzS As Integer, AnzZ As Long, Z As Long, S As Integer
Dim Satz As String, Kurz As DataObject, Vorne As String, Hinten As String
Dim Trenn As String, Trenn2 As String, Linie2 As String, Linie3 As String, Trenn3 As String
Dim Formeln As String, AnzF, Namen, AnzN, LängeN, N
Application.Calculation = xlCalculationManual

Trenn = " " & ChrW(9474) & " " '9472 9532
Trenn2 = ChrW(9472) & ChrW(9532) & ChrW(9472)
Trenn3 = ChrW(9472) & ChrW(9524) & ChrW(9472)
With Selection
 AnzS = .Columns.Count 'Anzahl Spalten im markierten Tabellenbereich
 AnzZ = .Rows.Count 'Anzahl der Zeilen im markierten Tabellenbereich
 ReDim Breite(AnzS) 'jede Spalte hat eine ggfs unterschiedliche Breite
 ReDim Zeilensatz(AnzZ) 'die Zellen einer Zeile ergeben dann jeweils einen Zeilensatz
 Zeilensatz(0) = String(Len(.Cells(AnzZ, 1).Row), " ") ' Zeilensatz(0) bekommt vorne soviel Leerzeichen wie die Breite der größten Zeilennummer
 Linie2 = String(Len(.Cells(AnzZ, 1).Row), ChrW(9472))
 Linie3 = String(Len(.Cells(AnzZ, 1).Row), ChrW(9472))
 For Z = 1 To AnzZ ' jeder Zeilensatz erhält vorne die Zeilennummer
 Zeilensatz(Z) = Right(String(Len(Zeilensatz(0)), " ") & .Cells(Z, 1).Row, Len(Zeilensatz(0)))
 Next Z
 For S = 1 To AnzS 'Schleife um pro Spalte die jeweilig höchste Breite zu ermitteln
 Breite(S) = 0
 For Z = 1 To AnzZ
 If Len(.Cells(Z, S).Text) \> Breite(S) Then Breite(S) = Len(.Cells(Z, S).Text)
 Next Z
 If Breite(S) 0 Then Vorne = Vorne & " "
 Zeilensatz(0) = Zeilensatz(0) & Trenn & Vorne & Bezeichnung(.Cells(Z, S).Column) & Hinten
 Linie2 = Linie2 & Trenn2 & String(Breite(S), ChrW(9472))
 Linie3 = Linie3 & Trenn3 & String(Breite(S), ChrW(9472))
 Next S
 Zeilensatz(0) = Zeilensatz(0) & Trenn
 Linie2 = Linie2 & ChrW(9472) & ChrW(9508) '9524
 Linie3 = Linie3 & ChrW(9472) & ChrW(9496) '9524
 For S = 1 To AnzS ' die Zeilensätze erhalten Spalte für Spalte die Zellinhalte
 For Z = 1 To AnzZ
 Select Case TypeName(.Cells(Z, S).Value)
 Case "Error"
 Vorne = String(Int((Breite(S) - Len(.Cells(Z, S).Text)) / 2), " ")
 Hinten = Vorne
 If (Breite(S) - Len(.Cells(Z, S).Text)) Mod 2 0 Then Vorne = Vorne & " "
 Zeilensatz(Z) = Zeilensatz(Z) & Trenn & Vorne & .Cells(Z, S).Text & Hinten
 Case Else
 Vorne = String(Breite(S) - Len(Trim(.Cells(Z, S).Text)), " ")
 Zeilensatz(Z) = Zeilensatz(Z) & Trenn & Vorne & .Cells(Z, S).Text
 End Select
 Next Z
 Next S
 For Z = 1 To AnzZ
 Zeilensatz(Z) = Zeilensatz(Z) & Trenn
 For S = 1 To AnzS
 If .Cells(Z, S).HasFormula Then Formeln = Formeln & Left(.Cells(Z, S).Address(0, 0) & " ", Len(.Cells(AnzZ, AnzS).Address(0, 0))) & ": " & .Cells(Z, S).FormulaLocal & vbLf
 Next S
 Next Z
 AnzN = ActiveWorkbook.Names.Count 'Anzahl der im Workbook benutzten Namen ermitteln
 If AnzN \>= 1 Then 'Wenn es Namen gibt
 LängeN = Len(ActiveWorkbook.Names.Item(1).Name)
 For N = 1 To AnzN
 If LängeN "" Then Satz = Satz & ActiveWorkbook.Path & "\"
 Satz = Satz & "[" & ActiveWorkbook.Name & "]!" & ActiveSheet.Name & vbLf & vbLf
 ' die Zeilensätze werden in Satz gesammelt
 Satz = Satz & Zeilensatz(0) & vbLf & Linie2 & vbLf
 For Z = 1 To AnzZ
 Satz = Satz & Zeilensatz(Z) & vbLf
 Next Z
 Satz = Satz & Linie3 & vbLf
 If Formeln "" Then Satz = Satz & vbLf & "Benutzte Formeln:" & vbLf & Formeln
 If Namen "" Then Satz = Satz & vbLf & "Benutzte Namen:" & vbLf & Namen
 Satz = Satz & vbLf & "Tabellendarstellung erreicht mit dem Code in FAQ4711" & vbLf

 ' Satz erhält hinten den pre-Tag
 Satz = Satz & Chr(60) & "/pre" & Chr(62)
End With
' Satz wird in die Zwischenablage geschrieben
Set Kurz = New DataObject
Kurz.SetText Satz
Kurz.PutInClipboard
Set Kurz = Nothing
Application.Calculation = xlCalculationAutomatic
End Sub

Function Bezeichnung(Spalte As Integer) As String
Dim N As Byte, Adr As String
Adr = Cells(1, Spalte).Address
' die Spaltenbezeichnng wird aus der Adresse der obersten Zelle in der Spalte extrahiert
For N = 2 To InStr(2, Adr, "$") - 1
 Bezeichnung = Bezeichnung & Mid(Adr, N, 1)
Next N
End Function

Sub W\_W\_W2Bereich()
' Programm zum Zellenrichtigen Übertragen von Tabellenblattbereichen die mittels dem Makro
' "Bereich2W\_W\_W" bei w-w-w gepostet wurden.
' November 2006 by Reinhard
'
' Getestet in XL97. Möglicherweise muss man in höheren Excelversionen wegen dem DataObject
' im Editor bei Extras--Verweise den Verweis auf "Microsoft Forms 2.0 Object Library" setzen.
'
' Code am besten in Modul1 der personl.xls bzw. personal.xls.
'
' Benutzung: in w-w-w den geposteten Tabellenblattbereich inklusive möglicher Formeln und Namen
' per Maus oder Tastatur markieren und Strg+C drücken.
' In Excel dann dieses Makro ausführen lassen.
'
Dim AnzS As Integer, AnzZ As Long, Z As Long, S As Integer
Dim Satz As String, Kurz As DataObject, Vorne As String, Hinten As String, Spalten()
Dim Trenn As String, Trenn2 As String, Linie2 As String, Linie3 As String, Trenn3 As String
Dim Zeilensatz(), SatzN, SatzF, Such, Namen(), Formeln(), AnzF, AnzN, Mldg, N, Zeilen()
Dim Zellen(), von, lang, Bezug, Formel
Set Kurz = New DataObject
Kurz.GetFromClipboard
Satz = Kurz.GetText(1)
Such = "Benutzte Namen:"
If InStr(Satz, Such) Then ' Benutzte Namen extrahieren
 SatzN = Mid(Satz, InStr(Satz, Such) + Len(Such) + 2)
 Satz = Left(Satz, InStr(Satz, Such) - 1)
 While (InStr(SatzN, vbLf))
 AnzN = AnzN + 1
 ReDim Preserve Namen(AnzN)
 Namen(AnzN) = Left(SatzN, InStr(SatzN, vbLf) - 1)
 SatzN = Mid(SatzN, InStr(SatzN, vbLf) + 1)
 Wend
End If
Such = "Benutzte Formeln:"
If InStr(Satz, Such) Then ' Benutzte Formeln extrahieren
 SatzF = Mid(Satz, InStr(Satz, Such) + Len(Such) + 2)
 Satz = Left(Satz, InStr(Satz, Such) - 1)
 While (InStr(SatzF, vbLf))
 AnzF = AnzF + 1
 ReDim Preserve Formeln(AnzF)
 Formeln(AnzF) = Left(SatzF, InStr(SatzF, vbLf) - 1)
 SatzF = Mid(SatzF, InStr(SatzF, vbLf) + 1)
 Wend
End If
While (InStr(Satz, vbLf))
 AnzZ = AnzZ + 1
 ReDim Preserve Zeilensatz(AnzZ)
 Zeilensatz(AnzZ) = Left(Satz, InStr(Satz, vbLf) - 1)
 Satz = Mid(Satz, InStr(Satz, vbLf) + 1)
Wend
For Z = 1 To AnzZ
 If InStr(Zeilensatz(Z), ChrW(9474)) Then Exit For
Next Z
If Z \> AnzZ Then
 Mldg = "kein senkrechter Strich gefunden"
 GoTo Fehler
End If
AnzS = 0
For N = 1 To Len(Zeilensatz(Z)) 'ermittlung der Spaltenbezeichnungen Spalten()
 If Mid(Zeilensatz(Z), N, 1) \>= "A" And Mid(Zeilensatz(Z), N, 1) " " Then
 N = N + 1
 Spalten(AnzS) = Spalten(AnzS) & Mid(Zeilensatz(Z), N, 1)
 End If
 End If
Next N
Z = Z + 2
' Einlesen der Zellwerte
While (AscW(Left(Zeilensatz(Z), 1)) = "0" And Mid(Zeilensatz(Z), N, 1) 0 And InStr(InStr(N, Zeilensatz(Z), ChrW(9474)) + 1, Zeilensatz(Z), ChrW(9474)) \> 0)
 S = S + 1
 von = InStr(N, Zeilensatz(Z), ChrW(9474)) + 1
 lang = InStr(InStr(N, Zeilensatz(Z), ChrW(9474)) + 1, Zeilensatz(Z), ChrW(9474)) - von
 ActiveSheet.Range(Spalten(S) & CInt(Zeilen(AnzZ))) = Trim(Mid(Zeilensatz(Z), von, lang))
 N = InStr(N, Zeilensatz(Z), ChrW(9474)) + 1
 MsgBox ActiveSheet.Range(Spalten(S) & CInt(Zeilen(AnzZ))).Address
 Wend
 Z = Z + 1
Wend
For N = 1 To AnzN ' Einlesen der Namen
 Bezug = Mid(Namen(N), InStr(Namen(N), ":") + 3)
 Bezug = Left(Bezug, Len(Bezug) - 1)
 ActiveWorkbook.Names.Add Name:=Trim(Left(Namen(N), InStr(Namen(N), ":") - 1)), RefersTo:=Bezug
Next N
For N = 1 To AnzF ' Einlesen der Formeln
 If InStr(Formeln(N), "=") Then
 Formel = Mid(Formeln(N), InStr(Formeln(N), "="))
 Formel = Left(Formel, Len(Formel) - 1)
 Range(Trim(Left(Formeln(N), InStr(Formeln(N), ":") - 1))).FormulaLocal = Formel
 End If
Next N
Set Kurz = Nothing
Exit Sub
Fehler:
MsgBox Mldg
End Sub

Testtabelle zum Testen des 2ten Makros.

Tabelle:
[Mappe1]!Tabelle1

 │ AB │ AC │ AD │ AE │ 
───┼────────────┼──────────────┼────────────┼────────┤
 7 │ #DIV/0! │ 100,23 │ #DIV/0! │ 100,23 │ 
 8 │ 02.01.2006 │ saölkfjdölsa │ 02.01.2006 │ │ 
 9 │ 0 │ dfd │ #BEZUG! │ dfd │ 
10 │ #BEZUG! │ 345 │ #BEZUG! │ 345 │ 
11 │ #NV │ fggh │ #NV │ fggh │ 
12 │ 123456789 │ │ 123456789 │ │ 
───┴────────────┴──────────────┴────────────┴────────┘

Benutzte Formeln:
AB7 : =6/0
AD7 : =6/0
AB9 : =Z10+AA13
AD9 : =AB10+AC13
AB10: =Tabelle7!A1
AD10: =Tabelle7!C1
AB11: =SVERWEIS(A1;A2:A4;1;0)
AD11: =SVERWEIS(C1;C2:C4;1;0)

Benutzte Namen:
Bereich: =Tabelle1!$AB$7:blush:AE$12
xyz : =Tabelle1!$X$12:blush:X$18

Tabellendarstellung erreicht mit dem Code in FAQ4711

Beispieltabellen darstellen/auslesen, aktualisiert

Hallo Interessierte,

nachstehende Tabellendarstellung wurde mit dem nachfolgenden Makro
"Bereich2W\_W\_" erstellt.
Zum Auslesen und Einfügen des Beispiels in eine leere Tabelle um das 
Beispiel nicht nachstellen zu müssen wenn es eine Anfrage ist, dient 
das Makro "W\_W\_W2Bereich.
Erstellt wurde der Code in XL97. 

Mich würden Rückmeldungen aus anderen Excelversionen, von englischen 
Versionen, Excel im Netzwerk und Excel auf einem MAC oder dieses 
abgemagerte Excel für den Palm bzw Notebooks, sehr interessieren.

Es war bisher ein Haufen Arbeit und ich würde mich über Hilfen aller 
Art sehr freuen. 

Das Makro "W\_W\_2Bereich muss noch modular aufgebaut werden wie das 
Makro "Bereich2W\_W\_W".

Wenn dies geschehen ist, fehlt noch:

- Bedingte Formatierungen incl deren Formate auslesen
- Fehlerabfangungen
- Verbesserung der Codes hinsichtlich diesen Leerzeichenmanipulationen
 zur Formatierung,
 der Code ist dadurch sehr wartungsunfreundlich und unübersichtlich.
- Diagramme kann man nicht darstellen, aber man könnte alle Diagramminfos bei w-w-w posten
 und dann dies Infos auslesen um dann in einer Tabelle das Diagramm
 identisch nachzubauen uzm Fragen zu Diagramm direkter beantworten zu können.
- und alles was mir grad nicht einfällt :smile:

Gruß
Reinhard 

Tabelle:
[Mappe1]!Tabelle1

 │ Z │ AA │ AB │ 
───┼─────────┼─────────┼─────────┤
 8 │ #DIV/0! │ #DIV/0! │ 0 │ 
 9 │ #DIV/0! │ #DIV/0! │ #DIV/0! │ 
10 │ #BEZUG! │ #BEZUG! │ #BEZUG! │ 
11 │ ekjhle │ ekjhle │ ekjhle │ 
12 │ 222 │ 222 │ 222 │ 
───┴─────────┴─────────┴─────────┘

Benutzte Formeln:
Z9 : =6/0
AA9 : =6/0
AB9 : =6/0
Z10 : =tabelle7!Z8
AA10: =tabelle7!AA8
AB10: =tabelle7!AB8

Benutzte Matrixformeln:
(Matrixformeln nicht mit "Enter" sondern mit "Strg+Shift+Enter" eingeben.
Die Spezialklammern nicht manuell eingeben, sie werden von Excel erzeugt.)
Z8 : {=SUM(AA9:AA12)}
AA8 : {=SUM(AB9:AB12)}
AB8 : {=SUM(AC9:AC12)}

Benutzte Namen:
bereich1: =Tabelle1!$A$1

Tabellendarstellung erreicht mit dem Code in FAQ4711



In Modul1 der personl.xls:

Option Explicit
Public AnzS As Integer, AnzZ As Long, Formeln As String, Namen As String, AnzN As Integer
Public Matrixformeln As String, Satz As String, Breite(), Linie3 As String
Public Trenn As String, Trenn2 As String, Trenn3 As String, Linie2 As String
Public Namen2(), Formeln2()
Public Zeilensatz() As String, Vorne As String, Hinten As String
Private Const FM20\_GUID = "{0D452EE1-E08F-101A-852E-02608C4D0BB4}"

Sub Bereich2W\_W\_W()
' Programm zum formatierten Darstellen von Tabellenblattbereichen bei wer-weiss-was.
' Getestet auf XL97. November 2006 by Reinhard
'
' Code am besten in Modul1 der personl.xls (personal.xls bei engl. Excel) einfügen.
' Wie man Vba-Code einfügt und ausführt siehe FAQ4712
' Warnung, k.A. wie es geschah, durch Veränderung der personl.xls von XL97 ist meine
' personl.xls in XL2000 identisch. D.h. der alte Inhalt ist futsch :frowning:
' Falls sie sich eine personl.xls teilen muss man das beachten und ggfs. den zusätzlichen Startordner benutzen o.ä.
'
' Benutzung: gewünschten Tabellenblattbereich per Maus oder Tastatur markieren und Makro
' ausführen lassen. Im Eingabefeld von w-w-w dann Strg+V drücken.
'
' Versionen höher als XL8.0 (=XL97) benötigen den Verweis auf "Microsoft Forms 2.0 Object Library"
' Der Verweis wird benötigt für "DataObject"
If CInt(Left(Application.Version, InStr(Application.Version, ".") - 1)) \> 8 Then
 Call VerweisSetzen
End If
Dim Kurz As DataObject
Call Tabellengeruest
Call ZellenEinlesen
Call FormelMatrixNamenEinlesen
Call SatzErstellen
' Satz wird in die Zwischenablage geschrieben
Set Kurz = New DataObject
Kurz.SetText Satz
Kurz.PutInClipboard
Set Kurz = Nothing
End Sub

Function Bezeichnung(Spalte As Integer) As String
Dim N As Byte, Adr As String
Adr = Cells(1, Spalte).Address
' die Spaltenbezeichnng wird aus der Adresse der obersten Zelle in der Spalte extrahiert
For N = 2 To InStr(2, Adr, "$") - 1
 Bezeichnung = Bezeichnung & Mid(Adr, N, 1)
Next N
End Function

Sub Tabellengeruest()
' entsprechend der jeweils größten Zellbreite in einer Spalte wird das Tabellengerüst,
' also Kopfzeile mit Spaltenbezeichnungen sowie untereinander die Zeilennummern, erstellt.
' Das Ganze durch Strichlinien Tabellenartig formatiert.
Dim Z As Long, S As Integer
Trenn = " " & ChrW(9474) & " " ' " │ "
Trenn2 = ChrW(9472) & ChrW(9532) & ChrW(9472) ' "─┼─"
Trenn3 = ChrW(9472) & ChrW(9524) & ChrW(9472) ' "─┴─"
With Selection
 AnzS = .Columns.Count 'Anzahl Spalten im markierten Tabellenbereich
 AnzZ = .Rows.Count 'Anzahl der Zeilen im markierten Tabellenbereich
 ReDim Breite(AnzS) 'jede Spalte hat eine ggfs unterschiedliche Breite
 ReDim Zeilensatz(AnzZ) 'die Zellen einer Zeile ergeben dann jeweils einen Zeilensatz
 Zeilensatz(0) = String(Len(.Cells(AnzZ, 1).Row), " ") ' Zeilensatz(0) bekommt vorne soviel Leerzeichen wie die Breite der größten Zeilennummer
 Linie2 = String(Len(.Cells(AnzZ, 1).Row), ChrW(9472)) ' "─"
 Linie3 = String(Len(.Cells(AnzZ, 1).Row), ChrW(9472))
 For Z = 1 To AnzZ ' jeder Zeilensatz erhält vorne die Zeilennummer
 Zeilensatz(Z) = Right(String(Len(Zeilensatz(0)), " ") & .Cells(Z, 1).Row, Len(Zeilensatz(0)))
 Next Z
 For S = 1 To AnzS 'Schleife um pro Spalte die jeweilig höchste Breite zu ermitteln
 Breite(S) = 0
 For Z = 1 To AnzZ
 If Len(.Cells(Z, S).Text) \> Breite(S) Then Breite(S) = Len(.Cells(Z, S).Text)
 Next Z
 If Breite(S) 0 Then Vorne = Vorne & " "
 Zeilensatz(0) = Zeilensatz(0) & Trenn & Vorne & Bezeichnung(.Cells(Z, S).Column) & Hinten
 Linie2 = Linie2 & Trenn2 & String(Breite(S), ChrW(9472)) ' "─"
 Linie3 = Linie3 & Trenn3 & String(Breite(S), ChrW(9472))
 Next S
End With
Zeilensatz(0) = Zeilensatz(0) & Trenn ' ' " │ "
Linie2 = Linie2 & ChrW(9472) & ChrW(9508) ' "─┤"
Linie3 = Linie3 & ChrW(9472) & ChrW(9496) ' "┘"
End Sub

Sub ZellenEinlesen()
Dim S As Integer, Z As Long
With Selection
 For S = 1 To AnzS ' die Zeilensätze erhalten Spalte für Spalte die Zellinhalte
 For Z = 1 To AnzZ
 Select Case TypeName(.Cells(Z, S).Value)
 Case "Error"
 Vorne = String(Int((Breite(S) - Len(.Cells(Z, S).Text)) / 2), " ")
 Hinten = Vorne
 If (Breite(S) - Len(.Cells(Z, S).Text)) Mod 2 0 Then Vorne = Vorne & " "
 Zeilensatz(Z) = Zeilensatz(Z) & Trenn & Vorne & .Cells(Z, S).Text & Hinten
 Case Else
 Vorne = String(Breite(S) - Len(Trim(.Cells(Z, S).Text)), " ")
 Zeilensatz(Z) = Zeilensatz(Z) & Trenn & Vorne & .Cells(Z, S).Text
 End Select
 Next Z
 Next S
End With
End Sub

Sub FormelMatrixNamenEinlesen()
Dim S As Integer, Z As Long, AnzN As Integer, LängeN As Integer, N As Integer
Formeln = ""
Matrixformeln = ""
Namen = ""
With Selection
 For Z = 1 To AnzZ
 Zeilensatz(Z) = Zeilensatz(Z) & Trenn
 For S = 1 To AnzS
 If .Cells(Z, S).HasFormula And Not .Cells(Z, S).HasArray Then Formeln = Formeln & Left(.Cells(Z, S).Address(0, 0) & " ", Len(.Cells(AnzZ, AnzS).Address(0, 0))) & ": " & .Cells(Z, S).FormulaLocal & vbLf
 If .Cells(Z, S).HasArray Then Matrixformeln = Matrixformeln & Left(.Cells(Z, S).Address(0, 0) & " ", Len(.Cells(AnzZ, AnzS).Address(0, 0))) & ": " & "{" & .Cells(Z, S).FormulaArray & "}" & vbLf
 Next S
 Next Z
 AnzN = ActiveWorkbook.Names.Count 'Anzahl der im Workbook benutzten Namen ermitteln
 If AnzN \>= 1 Then 'Wenn es Namen gibt
 LängeN = Len(ActiveWorkbook.Names.Item(1).Name)
 For N = 2 To AnzN ' größte Namenslänge ermitteln
 If LängeN "" Then Satz = Satz & ActiveWorkbook.Path & "\"
 Satz = Satz & "[" & ActiveWorkbook.Name & "]!" & ActiveSheet.Name & vbLf & vbLf
 ' die Zeilensätze werden in Satz gesammelt
 Satz = Satz & Zeilensatz(0) & vbLf & Linie2 & vbLf
 For Z = 1 To AnzZ
 Satz = Satz & Zeilensatz(Z) & vbLf
 Next Z
 Satz = Satz & Linie3 & vbLf
 If Formeln "" Then Satz = Satz & vbLf & "Benutzte Formeln:" & vbLf & Formeln
 If Matrixformeln "" Then
 Satz = Satz & vbLf & "Benutzte Matrixformeln:" & vbLf
 Satz = Satz & "(Matrixformeln nicht mit " & Chr(34) & "Enter" & Chr(34) & " sondern mit " & Chr(34) & "Strg+Shift+Enter" & Chr(34) & " eingeben." & vbLf
 Satz = Satz & "Die Spezialklammern nicht manuell eingeben, sie werden von Excel erzeugt.)" & vbLf & Matrixformeln
 End If
 If Namen "" Then Satz = Satz & vbLf & "Benutzte Namen:" & vbLf & Namen
 Satz = Satz & vbLf & "Tabellendarstellung erreicht mit dem Code in FAQ4711" & vbLf
 ' Satz erhält hinten den pre-Tag
 Satz = Satz & Chr(60) & "/pre" & Chr(62)
End With
End Sub

Sub VerweisSetzen()
Dim intIndex As Integer, blnFound As Boolean
With objWorkbook.VBProject.References
 For intIndex = 1 To .Count
 If .Item(intIndex).GUID = FM20\_GUID Then
 If .Item(intIndex).IsBroken Then
 .Remove .Item(intIndex)
 Else
 blnFound = True
 End If
 End If
 Next
 If Not blnFound Then .AddFromGuid GUID:=FM20\_GUID, Major:=2, Minor:=0
End With
End Sub

Sub W\_W\_W2Bereich()
' Programm zum Zellenrichtigen Übertragen von Tabellenblattbereichen die mittels dem Makro
' "Bereich2W\_W\_W" bei w-w-w gepostet wurden.
' Getestet in XL97. November 2006 by Reinhard
'
' Code am besten in Modul1 der personl.xls bzw. personal.xls.
' Wie man Vba-Code einfügt und ausführt siehe FAQ4712
' siehe dazu die Warnung in Bereich2W\_W\_W !
'
' Benutzung: in w-w-w den geposteten Tabellenblattbereich inklusive möglicher Formeln und Namen
' per Maus oder Tastatur markieren und Strg+C drücken.
' In Excel dann dieses Makro ausführen lassen.
'
' Versionen höher als XL8.0 (=XL97) benötigen den Verweis auf "Microsoft Forms 2.0 Object Library"
' Der Verweis wird benötigt für "DataObject"
'
If CInt(Left(Application.Version, InStr(Application.Version, ".") - 1)) \> 8 Then
 Call VerweisSetzen
End If
Dim Z As Long, S As Integer, Kurz As DataObject, Spalten()
Dim SatzN As String, SatzF As String, Such As String, Mldg As String, Zeilen()
Dim Zellen(), von As Integer, lang As Integer, Bezug As String, Formel As String
Dim AnzF As Integer, N As Integer
Dim Matrixformeln2(), AnzM As Integer, SatzM As String, Matrixformel As String
' Bezugsfehler wegen z.B fehlenden Verknüpfungen erst am Schluß bearbeiten
Application.Calculation = xlCalculationManual
Set Kurz = New DataObject
Kurz.GetFromClipboard
Satz = Kurz.GetText(1)
Such = "Benutzte Namen:"
If InStr(Satz, Such) Then ' Benutzte Namen extrahieren
 SatzN = Mid(Satz, InStr(Satz, Such) + Len(Such) + 2)
 Satz = Left(Satz, InStr(Satz, Such) - 1)
 While (InStr(SatzN, vbLf))
 AnzN = AnzN + 1
 ReDim Preserve Namen2(AnzN)
 Namen2(AnzN) = Left(SatzN, InStr(SatzN, vbLf) - 1)
 SatzN = Mid(SatzN, InStr(SatzN, vbLf) + 1)
 Wend
End If
Such = "Benutzte Matrixformeln:"
If InStr(Satz, Such) Then ' Benutzte Matrixformeln extrahieren
 SatzM = Mid(Satz, InStr(Satz, Such) + Len(Such) + 2)
 Satz = Left(Satz, InStr(Satz, Such) - 1)
 While (InStr(SatzM, vbLf))
 AnzM = AnzM + 1
 ReDim Preserve Matrixformeln2(AnzM)
 Matrixformeln2(AnzM) = Left(SatzM, InStr(SatzM, vbLf) - 1)
 SatzM = Mid(SatzM, InStr(SatzM, vbLf) + 1)
 Wend
End If
Such = "Benutzte Formeln:"
If InStr(Satz, Such) Then ' Benutzte Formeln extrahieren
 SatzF = Mid(Satz, InStr(Satz, Such) + Len(Such) + 2)
 Satz = Left(Satz, InStr(Satz, Such) - 1)
 While (InStr(SatzF, vbLf))
 AnzF = AnzF + 1
 ReDim Preserve Formeln2(AnzF)
 Formeln2(AnzF) = Left(SatzF, InStr(SatzF, vbLf) - 1)
 SatzF = Mid(SatzF, InStr(SatzF, vbLf) + 1)
 Wend
End If
While (InStr(Satz, vbLf))
 AnzZ = AnzZ + 1
 ReDim Preserve Zeilensatz(AnzZ)
 Zeilensatz(AnzZ) = Left(Satz, InStr(Satz, vbLf) - 1)
 Satz = Mid(Satz, InStr(Satz, vbLf) + 1)
Wend
For Z = 1 To AnzZ
 If InStr(Zeilensatz(Z), ChrW(9474)) Then Exit For
Next Z
If Z \> AnzZ Then
 Mldg = "kein senkrechter Strich gefunden"
 GoTo Fehler
End If
AnzS = 0
For N = 1 To Len(Zeilensatz(Z)) 'ermittlung der Spaltenbezeichnungen Spalten()
 If Mid(Zeilensatz(Z), N, 1) \>= "A" And Mid(Zeilensatz(Z), N, 1) " " Then
 N = N + 1
 Spalten(AnzS) = Spalten(AnzS) & Mid(Zeilensatz(Z), N, 1)
 End If
 End If
Next N
Z = Z + 2
' Einlesen der Zellwerte
While (AscW(Left(Zeilensatz(Z), 1)) = "0" And Mid(Zeilensatz(Z), N, 1) 0 And InStr(InStr(N, Zeilensatz(Z), ChrW(9474)) + 1, Zeilensatz(Z), ChrW(9474)) \> 0)
 S = S + 1
 von = InStr(N, Zeilensatz(Z), ChrW(9474)) + 1
 lang = InStr(InStr(N, Zeilensatz(Z), ChrW(9474)) + 1, Zeilensatz(Z), ChrW(9474)) - von
 ActiveSheet.Range(Spalten(S) & CInt(Zeilen(AnzZ))) = Trim(Mid(Zeilensatz(Z), von, lang))
 N = InStr(N, Zeilensatz(Z), ChrW(9474)) + 1
 Wend
 Z = Z + 1
Wend
For N = 1 To AnzN ' Einlesen der Namen
 Bezug = Mid(Namen2(N), InStr(Namen2(N), ":") + 3)
 Bezug = Left(Bezug, Len(Bezug) - 1)
 ActiveWorkbook.Names.Add Name:=Trim(Left(Namen2(N), InStr(Namen2(N), ":") - 1)), RefersTo:=Bezug
Next N
For N = 1 To AnzF ' Einlesen der Formeln
 If InStr(Formeln2(N), "=") Then
 Formel = Mid(Formeln2(N), InStr(Formeln2(N), "="))
 Formel = Left(Formel, Len(Formel) - 1)
 Range(Trim(Left(Formeln2(N), InStr(Formeln2(N), ":") - 1))).FormulaLocal = Formel
 End If
Next N
For N = 1 To AnzM ' Einlesen der Formeln
 If InStr(Matrixformeln2(N), "=") Then
 Matrixformel = Mid(Matrixformeln2(N), InStr(Matrixformeln2(N), "="))
 Matrixformel = Left(Matrixformel, Len(Matrixformel) - 2)
 Range(Trim(Left(Matrixformeln2(N), InStr(Matrixformeln2(N), ":") - 1))).FormulaArray = Matrixformel
 End If
Next N
Set Kurz = Nothing
Application.Calculation = xlCalculationAutomatic
Exit Sub
Fehler:
MsgBox Mldg
Application.Calculation = xlCalculationAutomatic
End Sub