ここから本文です

エクセル マクロ 別ファイルに値のみコピーについての質問です。また、コピー先の...

can********さん

2012/10/2511:58:54

エクセル マクロ 別ファイルに値のみコピーについての質問です。また、コピー先の別フォルダにあるエクセルファイルを開かずにコピーする方法はあるのでしょうか?

指定したセルをコピーして別フォルダに値のみ表示する方法について

同じ書式のエクセルが2つあります。
一つはシート名が1-1、1-2・・・・1-9まであり関数が入っているエクセルファイルです。
もう一つは書式のみですが別フォルダに1-1、1-2・・・・1-9と一つずつのエクセルファイルとして保存されています。

コピーするセルをまとめてコピーしようとすると『複数の選択範囲に対して実行できません』と表示が出る為、セル一つ一つをコピーしながらマクロの記録で値のみ貼り付けをしたところ、やっとの思いで一つのシートをコピーしたのですがうまくいきませんでした。

また、上記のやり方だとマクロの実行の前にコピーするファイルとコピー先のファイルを表示させなければ実行できないのでコピー先のファイルを開かずにコピーできる方法をご教示いただけないでしょうか?

マクロ初心者なもので内容に不備等あるかもしれませんがアドバイスがいただけたらと思い質問いたしました。
宜しくお願いします。

Sub Macro1()
'
Range("F13:G13").Select
Selection.Copy
ChDir "コピーするファイル名"
Workbooks.Open Filename:= _
"コピー先のファイル名.xls"
Range("F13:G13").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Windows("コピー元.xls").Activate
Range("F14:G14").Select
Application.CutCopyMode = False
Selection.Copy
Windows("コピー先.xls").Activate
Range("F14:G14").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub

補足説明不足申し訳ありません。
>『同じ書式のエクセルが2つあります』とした上で、他方『別フォルダに1-1、1-2・・・・1-9と一つずつのエクセルファイルとして保存されています。』となっていて、これだとブックが9つあるようにもうけとれます。
→1-1が2つあるという意味でブックは9つあります。
Range("F13:G14").Value = Range("F13:F14").Valueというのはコピーする値のセルが50近くあれば50のコードが必要というこでしょうか?

閲覧数:
14,706
回答数:
2

違反報告

ベストアンサーに選ばれた回答

c_y********さん

編集あり2012/10/2710:05:23

まず、値のみコピーしたいのなら、「セルのコピー→値のみ貼り付け」という作業は必要ありません。こういうときは『Value プロパティ』を使いましょう。あるセル範囲に値を設定したり、セル範囲の値を取得する役割を持っています。基本形は、
'---------------------
Range("A1").Value = Range("A2").Value
'---------------------
左辺のセル範囲に右辺のセル範囲の値を設定(代入、転記するイメージ)します。

コピー元と転記先は(行と列の数が)同じサイズでなければなりません。エラーにはなりませんが、はみ出た部分が切り捨てられたり、値が何もないとN/A値が返ったりします。

もうひとつ、ブックを開かずに・・・云々について。

マクロ処理は処理対象のブックは開いていることが前提です。ご質問でいうと、『コピー元のファイル』と『コピー先のファイル』は通常は両方とも開いておきます。

マクロの記録だと、コピーや張り付けするたびに対象のブックをアクティブ(作業の対象)にしますが、マクロのコードにブック名やシート名を明示してやれば、ブックやシートなどをいちいち切り替える必要はまったくありません。二つのブックが開いていても、作業のたびにブックやシートがあっちいったりこっちいったりというわずらわしさはぜんぜん感じません。逆に開いているから、ブックがどこにあるかを考えることなく処理ができるのですね。(もちろんブックを開く処理のときは、そのブックがどのパスにあるかは絶対条件ですが・・・) ムリしてブックを開かない理由がない、というところでしょうか...

そのかわり、ブック名やシート名などのいわゆるオブジェクトは必ず(暗黙的にでも)明示するのが基本です。でないと、エラーや予期せぬ結果の元になったりします。たとえば、先の「Range("A1")」はA1セルをオブジェクトとして返しますが、これだけではどのブックのどのシートのA1か、わかりませんよね。

ご質問ではその点の記述が微妙で、コピー元のブックは、「1-1」から「1-9」の9つのシートを持つブック、というのは間違いなさそうですが、『同じ書式のエクセルが2つあります』とした上で、他方『別フォルダに1-1、1-2・・・・1-9と一つずつのエクセルファイルとして保存されています。』となっていて、これだとブックが9つあるようにもうけとれます。

いずれにしろ、
'--------------------------------
WorkBooks("ブック名").WorkSheets("シート名").Range("??")
'--------------------------------
を応用して、がんばってコードにしてみてください。なお、関数が... という記述もありますが、セルに設定された関数をそのままの記述でコピーするには、Value プロパティではなく、「Formula プロパティ」を使います。念のため。

<補足見ました>
字数の関係で、かいつまんで。

まず、保存されたフォルダが別でも同じ名前のブックは同時には開けません。「1-1」から「1-1」にコピーしたいときは、片方を別名保存しておく必要がありますね。

コピー(転記したい)セル範囲の取得の仕方については、VBAのヘルプで『A1 形式の参照を使ってセルまたはセル範囲を参照する』とか『Range オブジェクトを使ってセルまたはセル範囲を参照する』とか『Union メソッド』とか『Range オブジェクト』そのものとか、まず参考にしてみましょう。複数のセルの値を配列にして一気に書き込む、なんてこともできます。ネットで検索すればいろいろありますよ。

1対1が基本で、それをいかに簡単に短い手数で処理するか、を考えるのがキモです。ここが頭の使いどころ、がんばってください。

質問した人からのコメント

2012/10/30 13:34:00

降参 ありがとうございました。
ruta ai0104さんのも参考にしながら色々試して何とか形にできました!!

当初、マクロの記録だけでやっていたのですがVBAを覚えることで一気に書き込んだりも出来るのだと感動しました。

まだ初心者なのでこれから勉強していきたいと思います。

これからも質問したいと思いますのでアドバイス等頂けたらと思います。

ベストアンサー以外の回答

1〜1件/1件中

rut********さん

編集あり2012/10/2616:21:58

補足を見て
「Range("F13:G14").Value = Range("F13:F14").Valueというのはコピーする値のセルが50近くあれば50のコードが必要というこでしょうか?」

良く理解できません。
質問者のコードでは、Range("F13:G13")とRange("F14:G14")と2回に分けてコピーを実施しているところを、
「Range("F13:G14").Value = Range("F13:G14").Value」として、1行で同じことを実現しています。
矩形範囲であれば、「.Range("F13:G1413").Value = .Range("F13:G1413").Value」として2800データを1度に設定できます。

どうしても、離れた位置で個々に移動する必要がある場合には、その回数分のコードが必要になってきます。
マクロは極端な話、手でやる作業を自動化するものですから、手作業で50回の工程になるなら、コードもそれだけ必要です。
逆に、手作業で1回で済む方法があるのであれば、それをコード化すれば良いだけです。

いずれにしても、コピー範囲が分からない限り、正確な回答は出来ないと思います。

補足終了


開かずに値を取得する方法はマクロ4.0を使用する方法がありますが、開かずに値を変更する方法は知りません。
http://officetanaka.net/excel/vba/tips/tips28.htm
質問者や私程度のレベルでは不可能と認識した方が良いです。

さて、代替え案として見えないエクセルを作成し、そこで値を書き込むサンプルを紹介しておきます。
コピー元のファイルとコピー先のファイルは同じディレクトリにある必要があります。
「ChDir "コピーするファイル名"」としているので、同じディレクトリであるとは思うのですが。
この方法は、完全ではないのでThisWorkbook.Pathで、絶対パスを取得した方が良いと思います。
以下、コードです。

Sub sample()
Dim xlApp As Object '見えないエクセル用
Dim wb As Workbook '見えないブック用
Dim ws(1) As Worksheet '両方のシート用
Dim wbName As String 'コピー先ブックのパス&ファイル名称

On Error GoTo errorHandler 'エラー処理へ飛ぶ
wbName = ThisWorkbook.Path & "\" & "コピー先のファイル名.xls"
Set ws(0) = ActiveSheet 'コピー元のシート
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False '見えないエクセルにする(必要ないかも)
xlApp.DisplayAlerts = False 'アプリケーションメッセージを無効にする
Set wb = xlApp.Workbooks.Open(wbName) 'コピー先ブックを開く
Set ws(1) = wb.Worksheets(1) 'コピー先のシート
ws(1).Range("F13:G14").Value = ws(0).Range("F13:G14").Value '値のコピー
wb.Save 'コピー先ブックを保存
wb.Close 'コピー先ブックを閉じる
xlApp.DisplayAlerts = True 'アプリケーションメッセージを無効にする(念のため)

errorHandler:
On Error Resume Next 'エラー無効
xlApp.Quit '見えないエクセル終了
Set xlApp = Nothing '変数解放
If Err.Number = 0 Then
MsgBox "正常に終了しました"
Else
MsgBox "エラーで終了しました" & vbLf & _
Err.Number & vbLf & _
Err.Description
End If
End Sub

注意点として、万一、マクロ実行中にコピー元のエクセルが異常終了した場合等に、見えないエクセルが起動したままになる可能性があります。
その場合は、タスクマネジャーを起動し、残ったEXCEL.EXEのプロセスを終了する必要があります。
分からなければ、PCの再起動でも良いです。

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる