前からあったエクセルのファイルのどこかが壊れたらしく、ときどき作業中に突然エラーとなってエクセル自体が落ちてしまうので、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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
自分のセンスや笑いの好みに影響を受けた作品を教えて
子どもの頃に読んだ漫画などが その後の笑いの好みや自分自身のユーモアのセンスに影響することがあると思いますが、 「この作品に影響受けてるな~!」というものがあれば教えてください。
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
エクセルの名前の定義を他のファイルにエクスポートする方法?
Excel(エクセル)
-
Excel 他のファイルからシートをコピー 名前の定義を引き継がない。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで極大値を拾うには
-
エクセルで各セルそれぞれ四捨...
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
Excelで隣のセルと同じ内容に列...
-
PowerPointで表の1つの列だけ...
-
エクセルで、2種類のデータを...
-
エクセルでオートフィルタのボ...
-
エクセルで最初のスペースまで...
-
エクセルのオートフィルタで最...
-
エクセルで時刻(8:00~20:00)...
-
エクセル(勝手に太字になる)
-
エクセルの項目軸を左寄せにしたい
-
エクセル 文字数 多い順 並...
-
エクセルで文字が混じった数字...
-
エクセルで特定の文字が入って...
-
【エクセル】区切り位置で分割...
-
Excelのオートフィルタで非表示...
-
Excel、市から登録している住所...
-
Excelで半角の文字を含むセルを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで極大値を拾うには
-
Excelで数行間隔で離れているデ...
-
エクセルVBAで別BOOKに「名前の...
-
【Excel】4行ごとの和を集計し...
-
(EXCEL関数)特定範囲内の最大値
-
ネットワーク上のエクセルとリ...
-
EXCEL: 数式を含んだΣは可能で...
-
Excel、sumifはありますが、min...
-
エクセルで各セルそれぞれ四捨...
-
エクセル初心者です
-
SUMIF関数の合計範囲を広くする...
-
条件付のsum,max,min関数の書き方
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
Excelで隣のセルと同じ内容に列...
-
PowerPointで表の1つの列だけ...
-
エクセル(勝手に太字になる)
-
エクセルでオートフィルタのボ...
-
エクセルで時刻(8:00~20:00)...
-
エクセルのオートフィルタで最...
おすすめ情報