Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
548to552
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
548to552
548to552
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Verknüpfungen ändern

Verknüpfungen ändern
19.01.2005 14:40:05
{Boris}
Hi Leute,
ich habe eine Datei mit 30 Blättern. Jedes Blatt ist mit der selben Datei verknüft: "'D:\Alle\[Muster.xls]Muster'!A1"
Jetzt möchte ich auf jedem Blatt die Verknüpfung ändern, indem "Muster" durch den jeweiligen Blattnamen ersetzt wird.
Im Ordner "Alle" sind gleichlautende Dateien (so wie die Blattnamen) vorhanden.
Ich habe es wie folgt versucht:
Option Explicit

Sub ersetzen()
Dim Ws As Worksheet
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With
For Each Ws In ThisWorkbook.Worksheets
Ws.Range("A5:Z100").Replace "Muster", Ws.Name
Next Ws
End Sub

Das scheint aber eine Ewigkeit zu dauern - kann den Code nichtmal abbrechen - nur der Taskmanager "löst" das Problem.
Da ich diese Vorhaben wahrscheinlich noch mehrere mal vor der Brust habe:
Wie kann man das am Besten (Schnellsten) bewerkstelligen?
Danke und Grüße
{Boris}

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Verknüpfungen ändern
Uduuh
Hallo Boris,
ich vermute, dass das damit zusammenhängt, das Excel jedesmal prüft, ob die Datei 'BlattName.xls' auch im Ordner 'Alle' existiert. Vielleicht hilft das Abschalten der Aktualisierung von Remote-Bezügen. Kann dir allerdings nicht sagen, wie das in '97 geht. Schau mal unter Extras-Optionen.
Gruß aus'm Pott
Udo
Remote-Bezüge gibt´s bei xl97 nicht...
Boris
Hi Udo,
...dafür aber "Fernbezüge aktualisieren". Habe das jetzt mal ausgeschaltet - aber leider ohne Erfolg. Selbst beim händischen Suchen / Ersetzen auf nur einem Blatt hängt sich die Kiste auf - obwohl ich die Berechnung zusätzlich noch auf manuell geschaltet habe.
Der exakte Suchbereich (vorher markiert) erstreckt sich über A5:HA20 - aber das dürfte doch eigentlich kein größeres Problem sein, oder?
Grüße Boris
Anzeige
Bei 40 Zellen dauert es schon ca. 17 Sekunden!!!
Boris
Hi Udo,
...hab das jetzt nochmal gecheckt.
Bei 30 Blätter x ca. 2500 Zellen = 75.000 Zellen / 40 = 1875 x 17 Sekunden = 31875 Sekunden = 531 Minuten = 8,8 Stunden!!! Hilfe!!!!!!!!!!
Wo liegt denn hier bitte schön die Schnecke auf der Leitung? Das kann es doch nicht sein!
Verwirrte Grüße
Boris
AW: Bei 40 Zellen dauert es schon ca. 17 Sekunden!!!
Uduuh
Hallo Boris,
hab mal ein bischen getestet und festgestell, dass es erheblich schneller geht, wenn du die Workbooks öffnest und dann die Formeln aktualisierst.
also:
for each ws in thisworkbook.worksheets
set wkb=workbooks.open("d:\alle\" &ws.name &".xls")
ws.range("A1:E500").replace "Muster", ws.name
wkb.close, false
next ws
Gruß aus'm Pott
Udo
Anzeige
Danke Udo...
Boris
Hi Udo,
...ich werde das gleich mal mit der Array-Variante vergleich - mal sehen, was schneller ist ;-))
Grüße Boris
Alternative
Uduuh
mach 'nen Nachtjob draus,
setz dich ans Klavier
und trink ein paar Bier.
:-))
AW: Verknüpfungen ändern
19.01.2005 15:14:17
Josef
Hallo Boris!
Der Code ist ungetested, sollte aber funzen!


      
Sub ersetzen()
Dim Ws As Worksheet
Dim n As Long, m As Integer
Dim arr As Variant
Dim fSearch As FileSearch
Dim wkb As Workbook
Dim strPath As String
Dim iCnt As Integer
On Error GoTo ERRORHANDLER
With Application
    .Calculation = xlCalculationManual
    .ScreenUpdating = 
False
    .EnableEvents = 
False
    .DisplayAlerts = 
False
End With
strPat = 
"D:\Alle"
Set fSearch = Application.FileSearch
With fSearch
.NewSearch
.LookIn = strPath
.SearchSubFolders = 
False  '<<<<Unterordner durchsuchen True/False
.FileType = msoFileTypeExcelWorkbooks
.Execute
   
For iCnt = 1 To .FoundFiles.Count
   
   
Set wkb = Workbooks.Open(.FoundFiles(iCnt))
      
      
For Each Ws In wkb.Worksheets
      
         arr = Ws.Range(
"A5:Z100").Formula
         
            
For m = 1 To UBound(arr, 2)
               
For n = 1 To UBound(arr, 1)
                  arr(n, m) = Replace(arr(n, m), 
"Muster", Ws.Name)
               
Next
            
Next
         
         Ws.Range(
"A5:Z100").Formula = arr
      
      
Next
      
   wkb.Close 
True
   
   
Next
End With
ERRORHANDLER:
With Application
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = 
True
    .EnableEvents = 
True
    .DisplayAlerts = 
True
End With
End Sub 


Gruß Sepp
Anzeige
Ich glaub´s nicht...
Boris
Hi Sepp,
...danke erstmal für diesen Code.
Aber ich glaube, wir haben uns da missverstanden (wenn ich den Code richtig lese).
Ich habe eine Datei mit 30 Blättern - und es gibt zu jedem dieser 30 Blätter im Ordner "Alle" eine gleichnamige Datei (gleicher Name wie der jeweilige Blattname).
Und ich möchte diese 30 Blätter jeweils mit der Einzeldatei verknüpfen- bisher lautet aber jede Verknüpfung in jedem Blatt auf die Datei Muster. Und nur das möchte ich für jedes der 30 Blätter ändern.
Und mit deinem Code wird doch in jeder dieser 30 Einzeldateien die Verknüpfung geändert - da ist aber gar nix zu ändern, weil dort keine Verknüpfungen existieren.
Oder hab ich deinen Code fehlinterpretiert?
Danke und Grüße
Boris
Anzeige
AW: Ich glaub´s nicht...
19.01.2005 15:36:28
Josef
Hallo Boris!
Da hab' ich dich falsch verstanden!
Dann so:


      
Sub ersetzen()
Dim Ws As Worksheet
Dim n As Long, m As Integer
Dim arr As Variant
On Error GoTo ERRORHANDLER
With Application
    .Calculation = xlCalculationManual
    .ScreenUpdating = 
False
    .EnableEvents = 
False
    .DisplayAlerts = 
False
End With
     
      
For Each Ws In ThisWorkbook.Worksheets
      
         arr = Ws.Range(
"A5:Z100").Formula
         
            
For m = 1 To UBound(arr, 2)
               
For n = 1 To UBound(arr, 1)
                  arr(n, m) = Replace(arr(n, m), 
"Muster", Ws.Name)
               
Next
            
Next
         
         Ws.Range(
"A5:Z100").Formula = arr
      
      
Next
      
ERRORHANDLER:
With Application
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = 
True
    .EnableEvents = 
True
    .DisplayAlerts = 
True
End With
End Sub 


Gruß Sepp
Anzeige
Das isses...
Boris
Hi Sepp,
...hab auch grad den Code - danke deiner Anregung - zu Ende geschrieben:

Sub verknuepfungen_ersetzen()
Dim arr As Variant, n As Long, m As Long
Dim Ws As Worksheet
On Error GoTo ERRORHANDLER
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
For Each Ws In ThisWorkbook.Worksheets
arr = Ws.Range("A5:Z100").Formula
For m = 1 To UBound(arr, 2)
For n = 1 To UBound(arr, 1)
arr(n, m) = WorksheetFunction.Substitute(arr(n, m), "Muster", Ws.Name)
Next
Next
Ws.Range("A5:Z100").Formula = arr
Next Ws
ERRORHANDLER:
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
End With
End Sub

Der Vorteil liegt hier in der Tat darin, die Umwandlung innerhalb des Arrays vorzunehmen. Jetzt dauert die "nur" noch ca. 20 Sekunden pro Blatt - damit kann ich gut leben.
BTW: Replace allein funktioniert bei xl97 nicht - daher meine Änderung auf Substitute.
Danke und Grüße
Boris
Anzeige
AW: Das isses...
19.01.2005 15:54:24
Josef
Hallo Boris!
Freud mich das es klappt!
Bei Manipulationen in einem größeren Zellbereich, nehm' ich fast immer
den Umweg über ein Array, weil meistens das Schreiben in die Zellen
die Performance frisst. Das Übergeben eines Array's aber sehr schnell geht.
Gruß Sepp
AW: Probier mal...
FP
Hi {Boris},
... diesen Code aus

Sub Boris()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
ActiveWorkbook.Sheets.Select
Cells.Select
Selection.Replace "BORIS", ActiveSheet.Name
ActiveCell.Select
ActiveSheet.Select
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub

Servus aus dem Salzkammergut
Franz
Anzeige
Ich hab deinen Beitrag gelesen...
Boris
Hi Franz,
...danke dafür - hab´s aber noch nicht ausprobiert.
Werde das aber noch nachholen!
Grüße Boris

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige