Kopieren Sie benannte Bereiche in eine andere Arbeitsmappe

2874
Masoud

Ich habe diesen VBA-Code, um meine benannten Zellen von einer Arbeitsmappe in eine andere zu kopieren, aber es gibt mir einen Error 9: Subscript out of range. Irgendwelche Ideen bitte?

Sub namexfr() wbs = "C:\Users\MousaviM\Desktop\Book1.xlsm" wbd = "C:\Users\MousaviM\Desktop\Book2.xlsm" For Each nam In Workbooks(wbs).Names Workbooks(wbd).Names.Add Name:=nam.Name, RefersToR1C1:=nam.RefersToR1C1 Next End Sub 
0
Welche Zeile wirft den Fehler? Excellll vor 9 Jahren 0
Die allerletzte Zeile vor Next Masoud vor 9 Jahren 0
Haben Sie versucht, den Code mit F8 im VBA-Editor durchzugehen? Tritt der Fehler auf, wenn er diese Zeile zum ersten Mal erreicht, oder durchläuft er ihn einige Male, bevor der Fehler auftritt? Excellll vor 9 Jahren 0
Es läuft nicht durch, ich bekomme den Fehler, wenn ich die Leitung zum ersten Mal erreiche. Ich habe diesen Code auf dieser Site gefunden, ich bin nicht sehr gut in VBA. Was ist R1C1? Ist das der Bereich, in dem sich meine benannten Zellen befinden sollten? Masoud vor 9 Jahren 0
Haben die Arbeitsmappen (1) die gleiche Anzahl von Arbeitsblättern? und (2) haben die Blätter die gleichen Namen? Excellll vor 9 Jahren 0
Ja, ich öffne gerade zwei neue Arbeitsmappen, um diesen Test durchzuführen. Ich nannte sie Book1 und Book2 und beide hatten Sheet1, Sheet2, Sheet3. Masoud vor 9 Jahren 0
Sorry, ich habe dies gerade in ein Modul eingefügt und konnte den Fehler in der Zeile "Für jeden Namen in Arbeitsmappen (WBS) .Names" sehen. Masoud vor 9 Jahren 0
Gibt es benannte Bereiche in der Arbeitsmappe? Raystafarian vor 9 Jahren 0
Ja, ich habe 3 benannte Zellen in book1 hinzugefügt, um zu sehen, ob ich sie in book2 übertragen kann. Ich möchte diesen Test nur durchführen, bevor ich den Code in einer Live-Arbeitsmappe verwenden kann. Masoud vor 9 Jahren 0

1 Antwort auf die Frage

1
Excellll

Das Problem ist also, dass Workbooks(wbs)es nicht als Arbeitsbuchobjekt erkannt wird. Dies liegt daran, dass erwartet wird, dass das Argument in Klammern ein Index ist, dh eine Ganzzahl, kein Dateipfad.

Eine Lösung besteht darin, die Workbooks-Auflistung zu durchlaufen und den gewünschten Pfad mit den Pfaden geöffneter Arbeitsmappen zu vergleichen. Legen Sie dann ein Arbeitsmappenobjekt der entsprechenden Arbeitsmappe gleich.

Im folgenden Code habe ich dies für jede Arbeitsmappe gemacht. Da Sie wahrscheinlich nicht viele Arbeitsmappen geöffnet haben, sind die mehreren Schleifen rechnerisch unbedeutend.

Sub namexfr() Dim wbs As Workbook, wbd As Workbook, wb As Workbook wbspath = "C:\Users\MousaviM\Desktop\Book1.xlsm" wbdpath = "C:\Users\MousaviM\Desktop\Book2.xlsm" For Each wb In Workbooks If wb.FullName = wbspath Then Set wbs = wb Exit For End If Next wb For Each wb In Workbooks If wb.FullName = wbdpath Then Set wbd = wb Exit For End If Next wb For Each nam In wbs.Names wbd.Names.Add Name:=nam.Name, RefersToR1C1:=nam.RefersToR1C1 Next End Sub 
Mir wurde klar, dass der erste Code funktionieren würde, wenn ich den Pfad lösche und nur beide Arbeitsmappen geöffnet habe. Aber gibt es eine Möglichkeit, den zu übertragenden Zellnamen zu wählen und nicht alle? Masoud vor 9 Jahren 0
Sie müssen Ihre Bedingungen in die "For Each" -Schleife durch die Namen einfügen. Es wäre etwa so, wenn nam nam die Bedingungen X, Y, Z erfüllt, und fügt dann den doppelten Namen zu `wbd 'hinzu. Ansonsten überspringen Sie es. Excellll vor 9 Jahren 0
+1 Schöner Fang - ich habe es vermisst. Ich hätte nur 'for each ...' durch 'for each .. in wbs.names` ersetzt, aber diese Lösung scheint robuster zu sein. Raystafarian vor 9 Jahren 0