Lösung
Ich habe festgestellt, dass sich die Sache auch ohne Makro lösen lässt. Vorteil ist eine etwas größere Flexibilität, die aber gar nicht benötigt wird in diesem Falle. Nachteil ist, dass sie nicht ganz so transparent ist und langsamer (auch wennn nicht messbar).
Ich verwende nämlich die INDIREKT()-Funktion und bastel aus dem Tabellennamen in der jeweiligen Spalte und den vorgegebenen Koordinaten einen neuen Bezug zusammen, den ich dieser Funktion übergebe. Beispiel folgt per Mail.
Und hier nun noch die Makrolösung. Dabei entstehen also wieder feste Formeln, die auf die jeweiligen Blätter zeigen. Insofern transparenter und schneller. Nachteil hier ist, dass man die Dollarzeichen benötigt, um das Kopieren von Spalte zu Spalte zu ermöglichen (sonst würden sich die Beüge auch immer im eine Spalte verschieben. Ich habe im per Mail verschickten Beispiel sowohl Spalten als auch Zeilen festgehalten (also zwei $-Zeichen), obwohl nur das für die Spalte nötig wäre hier.
Basis für die Makro-Variante ist eine Dummy-Spalte, die man erstmal in alle gewünschten Spalten kopiert. Die Formeln darin verweisen auf ein Dummy-Blatt (das auch existiert, damit man auch Dummy-Werte sieht und Excel nicht immer nach dem „fehlenden“ Dokument fragt). Dieser Blattname wird dann vom Makro ausgetauscht.
Hier der Code (im Beispiel gesendeten natürlich enthalten):
'Zum Verwenden bitte den Bereich markieren, in dem die zu ändernden Formeln stehen.
'In diesem Falle ist es z.B. B6:smiley:23.
'Dann dieses Makro ausführen.
'Bei der o.g. Auswahl geht das Makro also deren drei Spalten durch.
'Die Variable "Spalte" zeigt also nacheinander auf B6:B23, C6:C23 und D6:smiley:23.
'Die Eigenschaft "Column" gibt jeweils die auf das Blatt bezogenen Spalten-Nummer
'zurück, hier also nacheinander 2, 3, und 4 für B, C und D.
'Mit "Cells(y, x) greift man statt auf den Namen einer Zelle auf dessen
'Koordinaten zurück. Range("B5") wäre also gleichbedeutend mit Cells(2, 5).
Sub ErsetzeTabellenNamen()
Dim Spalte As Range 'eine Spalte des ausgewählten rechteckigen Bereichs
Dim yANr As Integer 'Nummer der Zeile, in denen die Auftragsnummern stehen
Dim TabName As String
Const DummyName As String = "DUMMY" 'muss ein Name ohne Leer- oder Sonderzeichen und ohne Ziffern sein!
yANr = 5 'Die K-Nrn stehen bei Dir in Zeile 5.
For Each Spalte In Selection.Columns 'Gehe alle Spalten in der Auswahl durch
TabName = Cells(yANr, Spalte.Column).Value 'Der Tabellenname wird aus der Zelle in der zuvor festgelegten Zeile und der aktuellen Spalte ausgelesen:
Spalte.Replace DummyName, "'" & TabName & "'" 'Ersetze alle Dummy-Namen durch den gefundenen - das wirkt auch auf Formeln. Der neue Name wird dabei in '' gesetzt. Sollte das nicht nötig sein, fallen sie später automatisch wieder weg.
Next Spalte
End Sub 'ErsetzeTabellenNamen
Kristian