
前からあったエクセルのファイルのどこかが壊れたらしく、ときどき作業中に突然エラーとなってエクセル自体が落ちてしまうので、BOOKの複製では意味がないと考え、同じ内容のものを別BOOKに再作成するマクロを以下のとおり作ってみました。(新規作成のBOOKにこのマクロを貼ります)
これで、VBAのモジュールを除き、再作成できたのですが、どういうわけか「名前の定義」を行なったセル範囲の一部が反映されません。
調べてみると、他のセルから参照されていない「名前の定義」がすっぽり抜け落ちるようにも思えるのですが、この理解であっているでしょうか?
他のセルから参照していなくとも、マクロで参照しているので抜け落ちるのは困ります。
どうすれば、すべての「名前の定義」が再作成されるでしょうか?
Sub Book_Copy()
Dim fn As String
Dim wb1 As Workbook, wb2 As Workbook
Dim ans As Integer, i As Integer
Dim nm As Name
Dim sh As Worksheet
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
For Each sh In wb1.Worksheets
sh.Cells.Copy
i = i + 1
If wb2.Worksheets.Count = i Then
wb2.Worksheets.Add After:=Worksheets(i)
Application.DisplayAlerts = False
wb2.Activate
wb2.Worksheets(i).Activate
wb2.Worksheets(i).Cells.Select
ActiveSheet.Paste
wb2.Worksheets(i).Name = sh.Name
Application.DisplayAlerts = True
Application.CutCopyMode = False
End If
Next sh
wb1.Close (False)
Application.EnableEvents = True
ActiveWorkbook.ChangeLink Name:=fn, NewName:=wb2.Name, Type:=xlExcelLinks
Set wb1 = Nothing
Set wb2 = Nothing
End Sub
No.1ベストアンサー
- 回答日時:
こんばんは。
コードをみる限りは、「名前の定義」が写されているようには思えないのですが……。
それは、ともかく、別の掲示で、最近、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
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"とか範囲を指定しなければいけないので)
No.2
- 回答日時:
こんにちは。
>.RefersTo, True は nm の範囲をそのままという理解でいいですか?
>(通常は RefersToR1C1:="=SheetC!R2C3:R6C5"とか範囲を指定しなければいけな
いので)
細かいことは調べていませんが、数式と同じ考え方ではないでしょうか?
本来、Ver.4以前のオブジェクトでない限りは、内部的には、原形のようなものがって、それを、そのまま移すと考えました。プロパティに選択肢を持っているものは、明示的に、R1C1 スタイルにする必要はないと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ネットワーク上のエクセルとリ...
-
(EXCEL関数)特定範囲内の最大値
-
EXCEL IF関数 AND、OR条件
-
エクセルで極大値を拾うには
-
エクセルVBAで別BOOKに「名前の...
-
【Excel】4行ごとの和を集計し...
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
Excelで隣のセルと同じ内容に列...
-
PowerPointで表の1つの列だけ...
-
エクセルでオートフィルタのボ...
-
Excelで半角の文字を含むセルを...
-
EXCELで 一桁の数値を二桁に
-
エクセルで時刻(8:00~20:00)...
-
エクセルで最初のスペースまで...
-
エクセル 文字数 多い順 並...
-
エクセルで文字が混じった数字...
-
エクセルで、2種類のデータを...
-
「B列が日曜の場合」C列に/...
-
エクセル(勝手に太字になる)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで極大値を拾うには
-
【Excel】4行ごとの和を集計し...
-
エクセルVBAで別BOOKに「名前の...
-
ネットワーク上のエクセルとリ...
-
Excelで数行間隔で離れているデ...
-
1.5以上2.5未満の個数を求める...
-
エクセルで各セルそれぞれ四捨...
-
Excel、sumifはありますが、min...
-
0のセルをカウント〔範囲は飛ん...
-
エクセル で一つおきに合計を...
-
EXCEL: 数式を含んだΣは可能で...
-
(EXCEL関数)特定範囲内の最大値
-
SUMIF関数の合計範囲を広くする...
-
EXCEL IF関数 AND、OR条件
-
Kingsoft(Excel)の計算...
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
Excelで隣のセルと同じ内容に列...
-
PowerPointで表の1つの列だけ...
-
エクセルでオートフィルタのボ...
おすすめ情報