|
|
| Excel VBA Macro ・ コピー ・ FAQ |
|
当日データをコピーして長期保存用シートの対応する日付の行に貼り付けるには?
|
|
|
|
Question 060k |
|
 |
 |
|
|
345ページ [4-5-1図] ◆ 環境・・ Excel 2000 & WindowsXP

マクロを勉強したくて、「組み方講座」を買って現在勉強中の者です。
本書ではP.345(セル範囲を選択してコピーするマクロを自動記録する)に
該当すると思うのですが、これと連結させたいところがありまして改造にあたると思い
相談させていただきたくメールしました。また、有料とありましたがどのくらいの料金なのでしょうか?
相談したい内容は、以下の内容なのですがあまり高い相談料であれば遠慮させていただきたいのですが、・・・・
連結したいのは、前段としてその日(1日)のデータを別ワークシート(長期保存用)に
コピーしたいのですが、
別ワークシートにコピーする際にあらかじめ記述してある
日にちを読み取り、該当する日にちのところ(行)にコピーしたいというものです。
FAQでは、「値の操作」⇒「14.[判別] A列に特定の数字が入っている行を抽出してコピーするには」が該当しそうだと思い勉強していましたが、機能は(A列にたくさんあるデータから特定の数字を抽出する・・・複数)でした。
今回の相談はコピーデータは、ひとつ(1日分)のものを別ワークシート(長期保存用)の該当する日付の行にコピーしたいというもので、まだ初心者の範囲を出られず、応用する能力もいたらず、相談させていただきたくメールしました。
なお、添付のファイルは自分で作ってみたものですが、「実行エラー’91 オブジェクト変数またはWithブロック変数が設定されていません。」となってうまくいきません。
|
|
Answer |
Copyright (C) 2007.7.6 永井善王 |
|
|
拙著 「Excel VBA マクロ 組み方講座」 をご愛読、ありがとうございます。 大がかりな改造は有料でお願いしていますが、真面目に勉強なさっている方の、この程度のご相談は無料で結構ですよ。
お送りいただいたファイルのマクロを実行してみましたが、違うエラーメッセージが表示されてしまいました。
よって、あなたが作成中のマクロから離れてしまうようで申し訳ありませんが、どのような手順で作成するのが簡単かを纏めておきますので、これに沿って考えてみてください。
ステップ1: コピー貼り付けするマクロを自動記録しておく
[マクロの記録]を開始して、下図のように、RS-W6シートの 2007/7/6 のデータ (C4:J4セル) をコピーして、長期保存用シートの C8セルに値だけ貼り付ける。 そして、マクロを[記録終了]する。

すると、下記のようにマクロが記録されます。(コメント行は消去済み)
Sub Macro1()
Sheets("RS-WS").Select
Range("C4:J4").Select
Selection.Copy
Sheets("長期保存用").Select
Range("C8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
ステップ2: 対応する日付の行を探すコードを考える
RS-W6シートの B4セルに入っている日付を、長期保存用シートの B列のセルから見つけて、その行番号を取得する必要があります。 いろいろな方法が考えられますが、ここでは、Matchワークシート関数 (※1) を使ってみます。
Dim 検査値 As Double '(※2)
Sheets("RS-WS").Select
検査値 = Range("B4").Value '変数「検査値」に B4セルの値を代入する
Sheets("長期保存用").Select
Set 検査範囲 = Range("B1:B64") 'Match関数用に検査するセル範囲を設定する
行番号 = Application.WorksheetFunction.Match(検査値, 検査範囲, 0)
ステップ3: 上記2つのマクロを合体し、一部修正して完成する
Sub Macro1 a()
Dim 検査値 As Double
Sheets("RS-WS").Select
Range("C4:J4").Select
Selection.Copy
検査値 = Range("B4").Value
Sheets("長期保存用").Select
Set 検査範囲 = Range("B1:B64")
行番号 = Application.WorksheetFunction.Match(検査値, 検査範囲, 0)
Range("C" & 行番号).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
Matchワークシート関数は、検査範囲内に検査値が存在しない場合にエラーが発生するので、対策しておいた方が良いかもしれません。 また、検査範囲の変動に備えておく必要があるかもしれません。
では、ご成功を祈ります。上手くいったらご連絡ください。
(※1) Matchワークシート関数については、本のP.387にくわしい解説があります。 また、このHPでは「変更されたデータのみ抽出するには」の中にあります。
(※2) 変数「検査値」のデータ型を Double としている理由は、「Match関数で検索する日付を変数で指定するとエラーになるが」を参考にしてください。
|
|
|
|
|