- ベストアンサー
エクセルVBAで別BOOKに「名前の定義」のCopy
- エクセルVBAを使用して、別BOOKに「名前の定義」をコピーする方法について質問しています。
- エクセルファイルの一部が壊れていて、エラーが発生するため、同じ内容の別BOOKを作成する必要があります。
- しかし、「名前の定義」を行ったセル範囲の一部が再作成されない問題が発生しています。解決策を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 コードをみる限りは、「名前の定義」が写されているようには思えないのですが……。 それは、ともかく、別の掲示で、最近、VBA自身の取り扱いとしては「名前の定義」に難色を示したのですが、「名前の定義」の設定は、文字列の数式なのですね。つまり、VBAとしては、数式と同じなのだと思います。ただ、そう、安易に考えないほうがよいかもしれません。理由は、Names の親オブジェクトの問題です。 細かいところは、良く検討されていませんが、こちらで、少し、書き直してみました。 Sub Book_Copy2() Dim fn As String Dim wb1 As Workbook, wb2 As Workbook Dim ans As Integer, i As Integer Dim n As Integer, m As Integer Dim nm As Name fn = Application.GetOpenFilename("エクセル ファイル (*.xls), *.xls") If fn = "False" Then Exit Sub Application.EnableEvents = False Set wb1 = Workbooks.Open(Filename:=fn, UpdateLinks:=1) Set wb2 = ThisWorkbook ans = MsgBox(wb1.Name & "を " & wb2.Name & " へCopyしますか?", vbYesNo + vbQuestion) If ans = vbNo Then Exit Sub For Each nm In wb2.Names nm.Delete Next nm n = wb1.Worksheets.Count m = wb2.Worksheets.Count If n > m Then wb2.Worksheets.Add After:=wb2.Worksheets(m), Count:=n - m End If For i = 1 To m wb1.Worksheets(i).Cells.Copy wb2.Worksheets(i).Range("A1") wb2.Worksheets(i).Name = wb1.Worksheets(i).Name Next i '名前定義の移し変え For Each nm In wb1.Names With nm wb2.Names.Add .Name, .RefersTo, True End With Next nm wb1.Close False Application.EnableEvents = True On Error Resume Next ActiveWorkbook.ChangeLink Name:=fn, NewName:=wb2.Name, Type:=xlExcelLinks On Error GoTo 0 Set wb1 = Nothing Set wb2 = Nothing End Sub
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >.RefersTo, True は nm の範囲をそのままという理解でいいですか? >(通常は RefersToR1C1:="=SheetC!R2C3:R6C5"とか範囲を指定しなければいけな いので) 細かいことは調べていませんが、数式と同じ考え方ではないでしょうか? 本来、Ver.4以前のオブジェクトでない限りは、内部的には、原形のようなものがって、それを、そのまま移すと考えました。プロパティに選択肢を持っているものは、明示的に、R1C1 スタイルにする必要はないと思います。
お礼
ありがとうございます。 助かりました。
お礼
Wendy02さま、大変ありがとうございます。 おかげさまで目的を達することができます。 > コードをみる限りは、「名前の定義」が写されているようには思えないのですが……。 ActiveWorkbook.ChangeLink Name:=fn, NewName:=wb2.Name, Type:=xlExcelLinks で定義も写されますよ。ただし、参照されているのだけでしたが。 > '名前定義の移し変え > For Each nm In wb1.Names > With nm > wb2.Names.Add .Name, .RefersTo, True > End With > Next nm なるほど、全部やるにはこうやるんでね。勉強になります。 最後にもう一ついいですか? .RefersTo, True は nm の範囲をそのままという理解でいいですか? (通常は RefersToR1C1:="=SheetC!R2C3:R6C5"とか範囲を指定しなければいけないので)