ここから質問投稿すると、最大4000ポイント当たる!!!! >>

エクセルファイル、book1,book2があります。
book1のA1-A10には日付という名前の定義がしてあります。
book1にあるコマンドボタンを押すと
このA1-A10をコピーして、book2を開き、book2のA1セルに貼り付け
るようにします。このあとbook2のA1-A10をドラッグしたとき
日付という名前の定義がしてあるようにしたいです。
普通に貼り付けたら名前の定義はされてないと思いますが、
形式を選択して貼り付けのXMLスプレッドシートで貼り付けると
名前の定義もコピーして貼り付けられたので、
それを取り入れてコードを入力したのですがうまくいきません。
以下が私が入力したコードです。

Private Sub CommandButton1_Click()
Macro1
End Sub

以下は標準モジュール
Sub Macro1()
Range("A1:A10").Select
Selection.Copy
Workbooks.Open Filename:= (ファイルの保存先)
Range("A1").Select
ActiveSheet.PasteSpecial Format:="XML スプレッドシート",   Link:=False, DisplayAsIcon:=False
Application.CutCopyMode = False
ActiveWorkbook.Save
ActiveWindow.Close
Windows("book1.xls").Activate
End Sub

book2を開くところまではうまくいきますが、その後の貼り付けがうまくできません。
デバックでは
ActiveSheet.PasteSpecial Format:="XML スプレッドシート", Link:=False, DisplayAsIcon:=False
が黄色く表示され、「実行時エラー1004
WorksheetクラスのPasteSpecialメソッドが失敗しました。」
となります。
どこをどう訂正したらよいか、あるいは他のうまくいくコードをご存知でしたら教えてください。よろしくお願いします。

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

A 回答 (2件)

>形式を選択して貼り付けのXMLスプレッドシートで貼り付けると


>名前の定義もコピーして貼り付けられた...
なるほど、これは知りませんでした。ありがとうございます。

例えばCドライブtempフォルダにtemp.xlsというテスト用ファイルを作って以下試してみてください。

Sub test1()
  Const fName = "c:\temp\temp.xls"

  Range("A1:A10").Copy
  With CreateObject("excel.application")
    '.Visible = True
    With .Workbooks.Open(fName)
      With .Sheets(1)
        .Activate
        .Range("A1").Select
        .PasteSpecial Format:="XML スプレッドシート"
      End With
      .Close True
    End With
    .Quit
  End With
  Application.CutCopyMode = False
  Workbooks.Open fName
End Sub

このような感じで、別インスタンスのExcel(Excelをもう1コ起動する)で処理すれば、
ご提示の方法で出来なくはないです。
(もしかしたらクリップボードを弄ればこんな面倒な事しなくて可能なのかも。この辺パス)

他に、シートを一旦コピーした後に切り取り-貼り付けする事でもできます。

Sub test2()
  Const fName = "c:\temp\temp.xls"
  Dim ws As Worksheet
  
  Set ws = ActiveSheet
  With Workbooks.Open(fName)
    ws.Copy before:=.Sheets(1)
    Set ws = .Sheets(2)
    With .Sheets(1)
      .Range("A1:A10").Cut ws.Range("A1")
      Application.DisplayAlerts = False
      .Delete
      Application.DisplayAlerts = True
    End With
  End With
  
  Set ws = Nothing
End Sub

でも、最初から名前定義がある事がわかっていて、コピーと同時に設定したいケースであれば、
どうせマクロで処理するのですから、普通にコピーして、名前の定義も設定すれば良いような気もします。

Sub test3()
  Const fName = "c:\temp\temp.xls"
  Dim r As Range
  
  Set r = Range("A1:A10")
  With Workbooks.Open(fName)
    r.Copy .Sheets(1).Range("A1")
    .Sheets(1).Range(r.Address).Name = "日付"
  End With
  
  Set r = Nothing
End Sub

いずれもActiveSheetのA1:A10に名前定義があるとして、
"c:\temp\temp.xls"の最左SheetのA1:A10にコピー&名前定義するコードです。
    • good
    • 0
この回答へのお礼

返信が遅れてしまい申し訳ないです。
end-uさんのご回答を参考にコードを入力した結果、
私の望みどおりのことができるようになりました!
Excelをもうひとつ起動するコードを知らないかったので、
非常に参考になりました。
ありがとうございました。

お礼日時:2009/10/04 11:29

名前を新たに定義してみては



Range("A1:A10").Copy
Workbooks.Open Filename:=(ファイルの保存先)
Range("A1").Select
ActiveSheet.Paste
ActiveWorkbook.Names.Add Name:="日付", RefersToR1C1:="=" & ActiveSheet.Name & "!R1C1:R10C1"
    • good
    • 0

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

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

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

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

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

Qエクセルの名前の定義を他のファイルにエクスポートする方法?

エクセルの名前の定義で質問です。 一つのファイルで定義した名前を、他のファイルにそっくりそのままエクスポートあるいはコピーできないものでしょうか。

ある分野の機器を、国別・機種別にデータ集計を取って、グラフにしています。
国は6カ国あり、一カ国ごとに1ファイルあります(例、France.xls、USA.xls、Japan.xls等)。
機種は8種類あり、それぞれの機種ごとにシートを設けているので、各国ファイルは各々8シートで構成されています。 (例 france.xlsファイルには、machine1, machine2, machine3・・のようにシートがある。)

各シートの構成要素は全く同じで、データ数値と、データ数がそれぞれ異なるだけです。

これらのシートは既に作成されており、前任者は毎月更新されるデータを表にいちいち貼り付けて、グラフ範囲も手作業で更新してきたようなのですが、更新する量が多いのでできる限り自動化したいと思い、グラフ範囲は、表の行が毎月増減するのに自動対応できるよう、Offset関数を使って表の名前を定義し、グラフもそれに合わせて自動更新できるようにしました(例 =OFFSET($S$5,0,0,COUNTA($S$5:$S$1000),1)のように)。

名前は各シートにつきグラフタイトル用、値1用、値2用と設定したので、1シートにつき3つ×8シート=24定義にもなっていまいました。 そして最初のファイルをとりあえず保存したのですが、残り5カ国のファイルも一つ一つ手入力で名前を定義しなくても、最初のファイルで設定した名前を他のファイルにコピーできないものかと思い、ご質問させていただいてます。 

各ファイルの構成要素は全く一緒なので、定義した名前とその範囲はみな一貫しています。 どなたか、一つのファイルで定義した名前を他のファイルにエクスポートできる方法をご存知でしたら、ご教授お願いいたします。 わかりづらい文面で申し訳ありません。

エクセルの名前の定義で質問です。 一つのファイルで定義した名前を、他のファイルにそっくりそのままエクスポートあるいはコピーできないものでしょうか。

ある分野の機器を、国別・機種別にデータ集計を取って、グラフにしています。
国は6カ国あり、一カ国ごとに1ファイルあります(例、France.xls、USA.xls、Japan.xls等)。
機種は8種類あり、それぞれの機種ごとにシートを設けているので、各国ファイルは各々8シートで構成されています。 (例 france.xlsファイルには、machine1, machine2, machine...続きを読む

Aベストアンサー

VBAで良ければですが。

基にしたいブックに下記コードを貼り付けて、変更の都度実行します。
実行する際は変更したいブックも全て開いておきます。
(半分ずつでもいいです)

Sub 名前の定義変更()
 Dim nam As Excel.Name
 Dim wb As Workbook

 For Each wb In Workbooks
    If wb.Name <> ThisWorkbook.Name Then
      For Each nam In ThisWorkbook.Names
         wb.Names.Add Name:=nam.Name, RefersTo:=nam
      Next
    End If
 Next
End Sub

貼り付ける所は、
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_vbe.html
を参考に”標準モジュール”という場所です。

実行方法は基になるブックを表示してAlt+F8キーを押し、
”名前の定義変更”を選択してOKです。

VBAで良ければですが。

基にしたいブックに下記コードを貼り付けて、変更の都度実行します。
実行する際は変更したいブックも全て開いておきます。
(半分ずつでもいいです)

Sub 名前の定義変更()
 Dim nam As Excel.Name
 Dim wb As Workbook

 For Each wb In Workbooks
    If wb.Name <> ThisWorkbook.Name Then
      For Each nam In ThisWorkbook.Names
         wb.Names.Add Name:=nam.Name, RefersTo:=nam
      Next
    End If
 Next
End Su...続きを読む

QExcel 他のファイルからシートをコピー 名前の定義を引き継がない。

こんにちは、
・EXCELで他で作ったファイルのシートがあります。(シート1)
・シート1には、いろいろと名前が定義されています。

シート1をコピーした際に名前の定義が引き継がれないようにするにはどうすればいいのでしょうか?

何かお分かりの方がいましたら教えてください。よろしくお願いします。

Aベストアンサー

メニューの「編集」から「シートの移動またはコピー」でコピーされたのですね?

こうしてみてください。
1.シート1のA1セルの左上の四角をクリックして全セル選択
2.コピー
3.コピー先のA1セルを選択
4.貼り付け

これで、数式や書式しかコピーペーストされないと思います。

QエクセルVBAで別BOOKに「名前の定義」のCopy

前からあったエクセルのファイルのどこかが壊れたらしく、ときどき作業中に突然エラーとなってエクセル自体が落ちてしまうので、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

前からあったエクセルのファイルのどこかが壊れたらしく、ときどき作業中に突然エラーとなってエクセル自体が落ちてしまうので、BOOKの複製では意味がないと考え、同じ内容のものを別BOOKに再作成するマクロを以下のとおり作ってみました。(新規作成のBOOKにこのマクロを貼ります)
これで、VBAのモジュールを除き、再作成できたのですが、どういうわけか「名前の定義」を行なったセル範囲の一部が反映されません。
調べてみると、他のセルから参照されていない「名前の定義」がすっぽり抜け落ちるようにも思え...続きを読む

Aベストアンサー

こんばんは。

コードをみる限りは、「名前の定義」が写されているようには思えないのですが……。

それは、ともかく、別の掲示で、最近、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

こんばんは。

コードをみる限りは、「名前の定義」が写されているようには思えないのですが……。

それは、ともかく、別の掲示で、最近、VBA自身の取り扱いとしては「名前の定義」に難色を示したのですが、「名前の定義」の設定は、文字列の数式なのですね。つまり、VBAとしては、数式と同じなのだと思います。ただ、そう、安易に考えないほうがよいかもしれません。理由は、Names の親オブジェクトの問題です。


細かいところは、良く検討されていませんが、こちらで、少し、書き直してみました。

Sub...続きを読む

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

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

Aベストアンサー

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

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

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

Qエクセル VBAで範囲に名前を定義する

Sub 範囲import設定()
Sheets("Format").Select
Range("A1").Select
Selection.CurrentRegion.Select
ActiveWorkbook.Names.Add Name:="import", RefersToR1C1:="=Format!R1C1:R26C7"
End Sub

「マクロの記録」でCTRL + * で全データ範囲を選択して"import"という名前を定義したところ
上のようなコードになりました。全データ範囲は毎回違うのですが、ごらんのようにセル番号
で指定されてしまいます。そのつど異なる全データ範囲に名前を定義するにはどうすればいいのでしょうか。
よろしくお願いします。

Aベストアンサー

こんにちは!

単に名前定義だけの場合は

Sub 範囲import設定()
Worksheets("Format").Range("A1").CurrentRegion.Name = "import"
End Sub

でOKだと思います。

>全データ範囲は毎回違うのですが・・・
というコトは一旦「import」という名前定義を削除して新たに名前定義し直す必要があると思います。
そこで↓は「import」という名前定義を削除するコードです。

Sub 削除()
ActiveWorkbook.Names("import").Delete
End Sub

※ 新しい範囲を名前定義する場合は、一旦「削除」のマクロを実行して
「範囲import設定」のマクロを実行してください。m(_ _)m

QEXCELマクロで上書きメッセージ無しで保存する方法

EXCELマクロで上書きメッセージ無しで保存する方法をお願いします
ActiveWorkbook.SaveAs "C:\Documents andSettings\Nakatani\MyDocuments\Book1.xls"
の様にするとすでにファイルがある場合上書きメッセージが出ます
メッセージを出さずに上書きするプログラミングを教えて下さい
宜しくお願いします

Aベストアンサー

Application.DisplayAlerts = False
ActiveWorkbook.SaveAs "C:\Documents andSettings\Nakatani\MyDocuments\Book1.xls"
Application.DisplayAlerts = True

Q別のエクセルファイルで名前の定義をつけた範囲からの検索

書類を作成するのにエクセルを使っています。
現在のところ、検索するデータを同じエクセルファイルの別シートからINDIRECT関数で名前の定義を付けた範囲から検索しています。名前の定義をつけたデータは数種類あります。
これを別のエクセルファイルに移し、そこから検索できますか?
よろしくお願いします。

Aベストアンサー

検索式を提示して相談された方が良いと思います。

例えば、VLOOKUP関数の場合
ブック名、A.xls
シート名、Sheet1
A1に、検索値
A2に、定義名
と仮定した場合
=VLOOKUP(A1,INDIRECT("[A.xls]Sheet1!"&A2),3,FALSE)
でいけると思います。

QVB上で実行中の無限ループの止め方

今まで、CUIベースのBASICでのプログラムの経験はあるのですが
Visual系のBASICは初心者です。
原因はわかっているのでプログラムの修正はできるのですが
VB上でコンパイルして実行したときに無限ループに陥ってしまって
どうにもプログラムをとめられなくなります。
そんなことがないように、実行前に全てのプロジェクトを保存して
いますので、そんなに実害はないのですが、どうすればとめられるのでしょう・・
今現在は、タスクマネージャーから強制終了させています。

Aベストアンサー

無限ループの一番内側に
DoEvents
を入れておくと、ウィンドウ切替え->デバッガ終了操作が出来ますよ

危なそうなとこにも入れておくと、何かと安心です。

QRange("A1")⇔cells(1,1)の変換。

EXCELのマクロについて質問します。
Range("A1")⇒(1,1)
cells(1,1)⇒("A1")
に一発変換する方法を教えて下さい。
時間があるかた宜しくお願いします。

Aベストアンサー

こんなのでよろしいでしょうか?
range("A1") → Range("A1").Row & "," & Range("A1").Column
cells(1,1) → Cells(1, 1).Address(False, False)
()や""は付けていません


人気Q&Aランキング