- ベストアンサー
マクロでの相対参照ペースト
(マクロ・VBA初心者です・・・・・・) 職場で使用している掲示板で、読んだ人がチェックする為に、 書き込みの後に名前のリストをコピー→貼り付けしています。 これをマクロを使って、任意のセルを選んでマクロを実行すれば リストが貼り付けられるようにしたいのですが、貼り付けがうまく行きません。 マクロの記録で行っているのは、 (1)名前のリストをコピー(絶対参照) (2)コピーしたリストを貼り付け(相対参照) なのですが、貼り付けが相対参照で行われず、絶対参照で行われてしまいます。 記録終了バーが相対参照になっているのは確認しているのですが・・・・・・。 自分なりにマクロの本を読んだりネットで探してみたりしましたが、 基本的なこと過ぎるのか解決策が見つからず、途方に暮れて質問させて頂きました。 もしかしたら何か基本的なところを見落としているかもしれませんが、 何卒宜しくお願い致します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>「ActiveCell.Offset(19, -3).Range("A1").Select」の行を >削除して試してみたのですが、マクロが動きませんでした・・・・・・。 記録したマクロを修正するには一箇所では不十分でした。失礼しました。 Offsetとかあるので、ご自分で「相対参照」対策を講じられていたのでしょうか。 しかし、コピー元を基準にすると、任意な貼り付け先の指定をするのは大変です。 むしろ、貼り付け先を選択してActiveCellとしておけば、コピー元が固定ないので考えやすいでしょう。 5行のマクロを以下のように2行にできます。 '選択セルに名前リストをコピーして選択セルにペースト Range("D1:I1").Copy Destination:=ActiveCell '次のセルを選択 ActiveCell.Offset(1, 0).Select 以上で、選択したセルとその右側に名前が貼り付けられます。
その他の回答 (6)
- cistronezk
- ベストアンサー率38% (120/309)
マクロの記録では、記録した操作を繰り返すのですから、同じところにペーストすることになります。汎用的なものにするには、手直しがどうしても必要になります。 おそらくペースト前に「Range("A6:C6").Select(A6:C6を選択)」などの操作があるためと考えられます。それを削除すればいいと思いますが、実際のコードを見ないことには先にすすめません。 記録したコードの提示をお願いします。
お礼
遅くなりまして申し訳ございませんでした。 以下コードです。 ' Range("D1:I1").Select Selection.Copy ActiveCell.Offset(19, -3).Range("A1").Select ActiveSheet.Paste ActiveCell.Offset(1, 0).Range("A1").Select End Sub 「ActiveCell.Offset(19, -3).Range("A1").Select」の行を 削除して試してみたのですが、マクロが動きませんでした・・・・・・。
- cistronezk
- ベストアンサー率38% (120/309)
回答4です。 >各書き込みの後に、任意のセルを選んでリストを表示させるために >相対参照での貼り付けが必要かと思ったのですが、もしかしてこの考え方に >誤解の原因がありますでしょうか??? 上記の説明でもその操作で絶対参照/相対参照の話がなぜ出てくるかよくわかりません。おっしゃることがピンとこないので、おそらく誤解されているのではと思います。 (1)名前のリストをコピー (2)任意のセルを選んで、「編集」-「形式を選択して貼り付け」ー「値」でペースト をマクロ記録して、希望の結果と違うかを確認してください。
お礼
ありがとうございます、早速試してみました! が、駄目でした・・・・・・。 おっしゃって頂いた方法ですと、下図のように 毎回同じ場所にリストがペーストされてしまいます。 A B C 1 山田太郎 田中一郎 鈴木花子 2 3 4 5 9月30日 今日は、あいうえお かきくけこ、でした。(山田) 6 山田太郎 田中一郎 鈴木花子(←マクロ実行時ここのリストが出現) 7 10月1日 8 今日は、さしすせそ たちつてと、でした。(山田) 9 山田太郎 田中一郎 鈴木花子(←10月1日の書き込みの後、ここにリストを 出したいのですがまた6行目に出現してしまう) リストをペーストしたいところが、その都度選んだセルに毎回変わるので 相対参照でペーストするのかと考えておりました。 私やはり何か根本的に間違えて理解しているところがありそうですね・・・・・・。
- cistronezk
- ベストアンサー率38% (120/309)
回答3です。残念ながら私には未だに以下の点がわかりません。 (1)「書き込み」は具体的にどのセルにしているのか? (2)「各書き込みの後にA1~F1に入力されている名前リストをコピー&ペースト」とあるが、 「各書き込みの後」とは書き込みセルの右側のセルのこと? (3)おそらく名前が取得できればいいとの思うのだが、どうして「値」貼り付けせず参照なのか? 以上があいまいなので、最終的な形が見えてきませんが以下のようなことでしょうか? 「山田太郎」と「鈴木花子」の二人が「書き込み」を読んだ場合。 A B C 1 山田太郎 田中一郎 鈴木花子 2 3 4 5 9月30日 今日は、あいうえお かきくけこ、でした。 山田太郎 鈴木花子 もしこの例が違っているのでしたら、「山田太郎」と「鈴木花子」の二人が読んだ場合の例を示してください。 ちなみに誰が読んだかのチェックだけなら、名前はB1~G1に書き、A2以下に「書き込み」をし、読んだ人は自分の列の書き込み行に「1」を入力させます。必要に応じて条件付き書式で1以外のセルを目立つ色に設定、という方が簡単かと思います。
お礼
回答ありがとうございます。cistronezkさんの挙げて下さった例の通りです。 もう少しだけ補足説明させて頂きます。 山田さんが書き込みをした場合; A B C 1 山田太郎 田中一郎 鈴木花子(←名前のセルは黄色になっています) 2 3 4 5 9月30日 今日は、あいうえお かきくけこ、でした。(山田) 6 山田太郎 田中一郎 鈴木花子(←黄色いままリストを貼り付け。読んだ人は黄色を消す) 7 10月1日 8 今日は、さしすせそ たちつてと、でした。(山田) 9 山田太郎 田中一郎 鈴木花子(←黄色いままリストを貼り付け。読んだ人は黄色を消す) このように、各書き込みをした場合にその次の行(でしたね、失礼致しました)に 名前リストを表示させたいです。 (3)おそらく名前が取得できればいいとの思うのだが、どうして「値」貼り付けせず参照なのか? とのことですが、値のみでしたら貼り付けは任意のセルに可能でしょうか? 各書き込みの後に、任意のセルを選んでリストを表示させるために 相対参照での貼り付けが必要かと思ったのですが、もしかしてこの考え方に 誤解の原因がありますでしょうか??? そして、回答者様に全く何の得もないのに、説明すらうまく出来ていない 私の質問に答えてくださって本当にありがとうございます。 勉強させていただきます。
- cistronezk
- ベストアンサー率38% (120/309)
>書き込みの後に名前のリストをコピー→貼り付けしています。 >(1)名前のリストをコピー(絶対参照) >(2)コピーしたリストを貼り付け(相対参照) 質問者さん独特の表現では、Excelとしての具体的な操作内容が見えてきません。 マクロの記録云々以前に、操作内容を例を挙げて具体的に示してください。
お礼
コメントを下さった皆様、ありがとうございます。 また、わかりにくい書き方になってしまって申し訳ございません。 わかりやすい記述が出来ていない時点で自分でも要素を理解出来ていないのを 露呈してますね・・・・・・。 具体的に操作を書かせて頂きます。 使用するエクセルのシートは1枚です。 A1~F1までにチームメンバーの名前が入力されています。 このシートに、上の行から順に書き込みをしていきます。 (9月30日の書き込みを5行目にしたら次の書き込みを6行目に、その次は7行目に、など) この書き込みを読んだかチェックするために、各書き込みの後に A1~F1に入力されている名前リストをコピー&ペーストしています。 このコピー&ペーストの作業をマクロで作ってみようと思ったのですが、 任意のセルにペーストする作業がうまくいかないのです・・・・・・。 WENDY02さんがおっしゃっているように相対参照は初心者には難しいものなのかもしれないと思いました。 この説明でおわかりいただけるでしょうか??
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 あまり、絶対参照・相対参照という考え方を、VBAプログラミングには持ち込まないほうがよいです。実際に、記録マクロの「相対参照」という考え方は、ものすごくややこしいので、よほどの実力者でないと、混乱してしまいます。 位置関係がはっきりしません。 >(1)名前のリストをコピー(絶対参照) これは何でしょうか?通常のワークシートのリストの場合は、たとえば、ダブルクリックすると良いと思います。 以下は、シートのA列にあるものを、ダブルクリックすると、Sheet2のA列にコピーされるようにできています。しかし、確実性を期すために、MsgBox で出しています。 '------------------------------------------- 'シートモジュール '------------------------------------------- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim i As Variant Cancel = True If Target.Column <> 1 Then Exit Sub 'A列 If Target.Value = "" Then Exit Sub 'セルが空の場合は除外 With Worksheets("Sheet2") i = Application.Match(Target.Value, .Columns(1), 0) '既存のものがあるかチェック If IsError(i) Then .Cells(Rows.Count, 1).End(xlUp).Offset(1).Value = Target.Value MsgBox "コピーされました。", vbInformation Else MsgBox "すでにコピーされています。", vbExclamation End If End With End Sub
- rivoisu
- ベストアンサー率36% (97/264)
意味が今ひとつつかめないのでどんなプログラムかコードを提示してください。
お礼
お教え頂いたようにプログラムしてみました。 Destinationがうまく動かなかったのですが、あれこれといじっていたら 何とか解決しました。教えて頂いたプログラムよりイケてないものになりましたが・・・・・・。 以下のプログラムになりました。 Range("D1:I1").Copy Activecell.select Activesheet.paste あんなに悩んでいたものがこんな数行で解決するとは・・・・・・。 しかし、今回の質問を通じてマクロやVBAについてかなり勉強させて頂きました。 まだまだわからないことだらけながら少しずつマクロ等を考えるための基礎が 身についてきたような気がします。職場がかなりアナログで周りにパソコンを使える人が 皆無な中、皆様に色々とご教授頂けなければもっと時間と労力がかかっていたと思います。 特に何度も詳しく教えて下さったcistronezkさん、ありがとうございました。