名前付き範囲を別のワークブックにコピーする


0

私は自分の名前付きセルをあるワークブックから別のワークブックにコピーするためのこのVBAコードを持っていますが、それは私にくれます Error 9: Subscript out of range。何かアイデアがありますか?

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

どの行がエラーをスローしていますか?
Excellll

Nextの前の最後の行
Masoud

VBAエディタでF8を使ってコードをステップスルーしてみましたか?エラーは最初にその行に到達したときに発生しますか、それともエラーが発生する前に数回ループしますか?
Excellll

それはループしません、私はラインに最初に到達したときにエラーが発生します。私はこのサイトでこのコードを見つけました、私はVBAがあまり得意ではありません。 R1C1は何を参照していますか?それは私の名前付きセルがあるべき範囲ですか?
Masoud

ワークブックに(1)同数のワークシートがあるか。 (2)シートの名前は同じですか?
Excellll

回答:


1

だから、問題はそれです Workbooks(wbs) Workbookオブジェクトとして認識されません。これは、括弧内の引数がファイルパスではなくインデックス、つまり整数であると想定されるためです。

1つの解決策は、ワークブックコレクションをループ処理して、目的のパスを開いているワークブックのパスと比較することです。次に、一致するワークブックと同じWorkbookオブジェクトを設定します。

以下のコードでは、各ワークブックに対してこれを行いました。あなたはおそらくたくさんのワークブックを開いていないので、複数のループは計算上意味がありません。

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

パスを削除して両方のワークブックを開いているだけで最初のコードが機能することに気付きました。しかし、どのセル名を転送するかを選択する方法はありますか。それらすべてではありませんか。
Masoud

あなたの中にあなたの条件を含める必要があります For Each 名前をループします。 IF namが条件X、Y、Zを満たしている場合は、次のようになります。 wbd。そうでなければ、スキップしてください。
Excellll

+1ナイスキャッチ - 逃した。私はちょうど交換したと思います for each ... とともに for each .. in wbs.names しかし、この解決策はより堅牢に見えます。
Raystafarian
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.