book1にbook2のセルをコピーして貼り付け、book2を閉じようとしたところ、シートにリンクが張られているのか以下のようなメッセージボックスが出てきます
----ここから-----------------
移動またはコピーしようとしている数式またはシートには、移動またはコピー先のワークシートに既にある名前’xxx’が含まれています。この名前を使用しますか?
コピーまたは移動先のシートに定義されている名前を使用する場合は「はい」をクリックします。
数式またはワークシートで参照する範囲の名前を変更する場合は、「いいえ」をクリックし、「名前の重複」ダイアログボックスに新しい名前を入力します。
---------ここまで------------------
取り敢えず「はい」をクリックして閉じているのですが、複数回このメッセージが繰り返し出てきて面倒なので、VBAでこのメッセージを出さないようにしたいのですが、どのようにすればよいのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

こんにちは。



[名前定義]は、本来は、マクロとは相性がよくありません。Application.DisplayAlerts = False でエラーをなくすのは良いのかもしれませんが、[名前の定義]が二重構造になってしまいますので、あまり関心しません。ただ、結果論で、コーディングする人のマクロの技術の問題ですから、当面の問題が起こらなければそれでよいのではないか、と言われるのがオチですから、それ以上は、本質的なコーディングの段階から技術を求められなければ何も言えません。

ただ、本来、シートコピーの段階で、例えば、
以下で新規のブックを用意して、標準モジュールに書いていただければ分かります。

Sub DoubleNamesTest1()
  Dim NewBook As Workbook
  Dim AcBook As Workbook
  Set AcBook = ActiveWorkbook
    With AcBook.Worksheets(1)
      '名前定義
      .Range("A1:C3").Name = "myTest"
      .Copy After:=AcBook.Sheets(AcBook.Sheets.Count)
      .Copy
    End With
    Set NewBook = ActiveWorkbook
    With NewBook
    '以下がエラーが発生する
    
     AcBook.Sheets(AcBook.Sheets.Count).Copy After:=NewBook.Sheets(1) '*
    
    ''ここの二行が、エラー対策
     '.Sheets.Add After:=.Sheets(.Sheets.Count) '**
     'AcBook.Sheets(AcBook.Sheets.Count).Cells.Copy .ActiveSheet.Range("A1") '**
    End With
    Set NewBook = Nothing
    Set AcBook = Nothing
End Sub


AcBook.Sheets(AcBook.Sheets.Count).Copy After:=NewBook.Sheets(1)
  ↓
 上記一行を以下の二行に置き換える
 .Sheets.Add After:=.Sheets(.Sheets.Count)
 AcBook.Sheets(AcBook.Sheets.Count).Cells.Copy .ActiveSheet.Range("A1")
 

というように、Cells.Copy すればよいです。
ですが、[名前の定義]をどうするか、と言われれば、それは、その都度、問題を解決しなければなりません。
    • good
    • 0

一応VBAにはApplication.DisplayAlerts = False


がある。
質問の場合もこれを入れることで、出なくなるか、やってみてください。
ツールーマクローVBE-挿入ー標準モジュールで出た画面に
Sub auto_open()
MsgBox "aaa"
Application.DisplayAlerts = False
End Sub
Sub auto_close()
MsgBox "bbb"
Application.DisplayAlerts = True
End Sub
確認できたらMsgboxの行は毎回出ると、しつこいから削除のこと。
(ほかにもコードのやり方があります)
ーーー
しかし本件は有名なもののようで、Googleでエラーメッセージの「移動またはコピーしようとしている・・」の前から20文字ぐらい(長い目に。途中で切っても可)をコピーし、検索語として貼り付けして、照会すると、そのものズバリに関した記事がたくさんでる。
http://q.hatena.ne.jp/1211612862
など、明確ではないかな。
この対策を取れないか検討するのが筋です。
    • good
    • 1

「はい」で、コピー先シートの名前を使用するので構わないのなら、とりあえずPasteメソッドの前に


Application.DisplayAlerts = False
でメッセージの回避のみ、できます。

それで本当に不都合がないのか、各bookの名前定義を確認しておいたほうが良いとは思いますが。
例えば数式コピーの場合、名前が一緒で、その名前範囲のデータがbook1とbook2で違う時、
貼り付け直後に数式結果が変わってくる事もあるのでは。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル2007 セルの名前の重複ポップアップについて

どうしてもわからないので質問させてください。

エクセル2007を使用していますが、
シートをコピーした際に、「名前の重複があるので、別の名前を指定してください」旨のポップアップが出てしまいます。
ただそのままOKを押せば、もちろんいいのですが、かなり多数名前の定義が残っている(これまで、ミスで定義した名前が累積している?)ようで、とても時間がかかります。
モチロン、名前の管理タブで名前をすべて削除してみました。それでも、名前の定義は残っているようで不思議です。

特定のシートをあるブック(違うブック)にシートコピーをする時はそういった現象は起こりませんが、その後そのブックに元からあったシートをコピー(同じブックへ)すると、同じ現象が起こります。
この場合も、元から「名前の管理」タブで定義の削除を行っているので、画面上では名前の定義は空のままです。

「名前の管理」タブでも削除できない定義があるのでしょうか?
また解決策はあるのでしょうか?

Aベストアンサー

こんにちは。

Excel 2000、Excel 2002 で同じ名前を定義してあるシートをコピーするとエラーが発生する
http://support.microsoft.com/kb/409329/ja

Version は違いますが、ここに書いてある内容のことだと思います。

>そのままOKを押せば、もちろんいいのですが、

私は、あまり賛成できないのです。名前定義が構造的な配列になってしまうのではないかと思うのです。

>「名前の管理」タブでも削除できない定義があるのでしょうか?

それはあるのですね。名前定義の構造は、とても複雑なようです。調べてみると、アプリケーション・レベル、ワークブック・レベル、シート・レベルと三つの格納先があるようです。VBAでも削除できないものもあるようです。

最近、同様の質問はいくつかあるようですが、

VBAでエラーメッセージが出ないようにしたい
http://oshiete1.goo.ne.jp/kotaeru.php3?qid=4970298

これは、VBAですが、ここに解決のヒントがあるのですが、

#というように、Cells.Copy すればよいです。

と書かれてあるように、シートを挿入してから、Ctrl + A -> Ctrl + C で、コピー元のセル全体をコピーして、コピー先に、Ctrl + V で張り付ければよいはずです。

既存のものに関しては、マクロで削除するしかありませんね。ただし、削除できないものもあります。

フォームボタンなどに、マクロを設定してあげるとよいです。
ただ、以下のマクロは、一度では、名前は消えません。場合によって、シートの数だけ繰り返さないといけないかもしれません。

---------------------------------------------------------
'標準モジュール(Alt + F11 -->挿入 -->標準モジュール) 不要になったら、モジュールごと削除してください。

Sub TestMacro1()
  Dim i As Long
  Dim j As Long
  If ActiveWorkbook.Name <> ThisWorkbook.Name Then
    MsgBox "アクティブブックを、このブックにしてください。", vbInformation
    Exit Sub
  End If
  j = Application.Names.Count
  For i = 1 To j
   On Error Resume Next
    Application.Names(i).Delete
   On Error GoTo 0
  Next i
  If Application.Names.Count > 0 Then
   i = j - Application.Names.Count
   MsgBox i & " 個、残っています。", vbInformation
  Else
   MsgBox "このシートから、名前はすべて削除しました。", vbInformation
  End If
End Sub

こんにちは。

Excel 2000、Excel 2002 で同じ名前を定義してあるシートをコピーするとエラーが発生する
http://support.microsoft.com/kb/409329/ja

Version は違いますが、ここに書いてある内容のことだと思います。

>そのままOKを押せば、もちろんいいのですが、

私は、あまり賛成できないのです。名前定義が構造的な配列になってしまうのではないかと思うのです。

>「名前の管理」タブでも削除できない定義があるのでしょうか?

それはあるのですね。名前定義の構造は、とても複雑なようで...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QExcel VBAで複数シートをコピーする

Excel VBAで複数のシートを新たらしいブックにコピーする方法が分かりません。

一応、Selectで全てのシートを選択し
コピーする方法は分かるのですが
出来ればSelectなどの画面遷移をプログラム内に含ませたくありません

シートは n件存在します。
ご存知の方がおられましたら
ぜひ、教えて頂けないでしょうか?

Aベストアンサー

すいません、勉強不足でした。
ただ単純に「全てのシートを選択」し「新規ファイルにコピー」という動作であれば、
sheets.Select
sheets.Copy
だけでできました。

Qエクセルのシート名変更で重複した時のvbaの処理

こんにちは。vba初心者です。

セルのA1を参照してシート名を変更するとき
名前が重複したら、A1に入力されている文字列の後に(2)とつけたいのですが、
その重複したときの処理ができません。

シート名を変更するところまではできました。
以下のvbaです。

Sub test()
Dim aSheet As Worksheet
For Each aSheet In Worksheets
aSheet.Select
aSheet.Name = Range("A1")
On Error Resume Next
Next aSheet
End Sub

これに付け加えるか全然違ってもかまいません。
何かよい方法を教えてください。
説明が不十分かもしれませんが、よろしくお願いします。

Aベストアンサー

capybaruさん

シート名が重複したら、(2),(3)…と番号を増やすようにしました。
また、capybaruさんのプログラムをベースにしています。
  
Sub test()
 Dim aSheet As Worksheet
 Dim NO   As Integer
 For Each aSheet In Worksheets
  aSheet.Select
  NO = 1
  On Error Resume Next
  Do
   Err.Clear
   aSheet.Name = Range("A1") & IIf(NO = 1, "", Format(NO, "(#)"))
   If Err.Number = 0 Then Exit Do
   NO = NO + 1
  Loop
  On Error GoTo 0
 Next aSheet
End Sub

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Q複数の同じフォーマットのファイルを新しいブックで一つのシートにまとめる方法

仕事で、各部署から送られてきた、同じフォーマットのファイル(シート1にのみデータ有)が50個近くあります。
それを新しいブックで一つのシートにまとめなくてはいけません。
地道にコピペするのは時間がかかるのでマクロで処理を行いたいと思います。
マクロでの処理方法ご存知の方、処理方法の載っているサイトをご存知の方、もしくはマクロより簡単な方法がありましたら教えてください。

あと、逆に一つのシートをいくつかのファイルに振り分けていく方法もご存知でしたら教えて下さい。
よろしくお願いします。

Aベストアンサー

すみません。質問を勘違いしていました。
>新しいブックで一つのシートにまとめなくてはいけません
でしたね。
Sub Sample1()
Dim buf As String, i As Long
Dim j
buf = Dir(Sheets("Sheet1").Range("A1").Value & "\*.xls")
Do While buf <> ""
Workbooks.Open Worksheets("Sheet1").Range("A1").Value & "\" & buf
Sheets("Sheet1").Range("A1:J1000").Copy
ThisWorkbook.Activate
Range("A65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Workbooks(buf).Activate
Application.CutCopyMode = False
Workbooks(buf).Close SaveChanges:=False
buf = Dir()
Loop
End Sub
で試してみてください。使い方などは
http://oshiete1.goo.ne.jp/qa4225063.html
を参照してみてください。同じ質問があったので気がつきました。

すみません。質問を勘違いしていました。
>新しいブックで一つのシートにまとめなくてはいけません
でしたね。
Sub Sample1()
Dim buf As String, i As Long
Dim j
buf = Dir(Sheets("Sheet1").Range("A1").Value & "\*.xls")
Do While buf <> ""
Workbooks.Open Worksheets("Sheet1").Range("A1").Value & "\" & buf
Sheets("Sheet1").Range("A1:J1000").Copy
ThisWorkbook.Activate
Range("A65536").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Workbooks(buf).Activate
Application.CutCop...続きを読む

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

Qエクセル マクロで指定フォルダを開く

エクセルにて
指定フォルダを開く、マクロがあれば教えて頂けないでしょうか。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

こういうものですか?
開くフォルダを変えたいときは targ に与えるパスを変更します。

Sub OpenFolders()
Dim targ As String
targ = "C:\"
Shell "C:\Windows\Explorer.exe " & targ, vbNormalFocus
End Sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報