[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『アクティブセルを参照し、かつその隣のセルも参照したい』(さだ)
エクセル初心者です
アクティブセルを参照するマクロを調べ実行できましたが、その隣のセルもB1に・・・と一度に表示させたいのですがどのようにすればよろしいのでしょうか?
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("A1").Value = ActiveCell.Value
End Sub
アクティブセルの右隣をB1に参照
ActiveCell.Offset(0, -1)
アクティブセルの右2つ隣をC1に参照
ActiveCell.Offset(0, -2)
と増やしていきたかったのですがどのように書いていけばよろしいのでしょうか?
どなたかご教示願います。
< 使用 Excel:Excel2013、使用 OS:Windows7 >
Offset の引数は、右側はマイナスではなくプラスになります。 (Mook) 2015/03/10(火) 19:23
このようなコードの利用目的が??だけど。 以下の Resizeの中の数字がコピーする列数。
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Range("A1").Resize(, 4).Value = ActiveCell.Resize(, 4).Value End Sub
(β) 2015/03/10(火) 19:25
列に意味があるのであれば、隣といった指定ではなく、何列のデータとしたほうが良い と思います。 それとも、処理のたびに列の使い方が変わるのでしょうか。
また、今回のケースはイベントマクロではなく、範囲を指定して指定範囲に対するといった 処理にしたほうが良いと思います。
繰り返し処理、というのでしたら複数データを対象にしたお話だと思いますが、 具体的なデータを使用して、説明してみてはどうでしょうか。 (Mook) 2015/03/10(火) 20:34
すでにMookさんから指摘がありますし、私も利用目的?? とコメントしましたが 要望の処理そのものにイベント実行は適しているとは思えません。 とりわけ SelectionChange これは、マウスでどこかのセルを選択すると、いやがおうでも 実行されてしまいます。
このシートのどこかを、印刷目的ではなく(うっかりも含めて)マウスで選択したり、 あるいは、どこかのセルに何か入力してエンターをおすことでセルが移動するなんて しょっちゅうありますよね。そのたびに、そのセルを起点として、所定のセルに値が転記されてしまう。
まず、構成をどうするかという前に、Mookさんが指摘されるように
・こんなレイアウトのシートがある ということを具体的に ・そのレイアウトのシートに対して、どこを、どのような基準で、どこに、どれだけ転記する。
それを、まず、(さだ)さんの頭の中で整理して、回答者がわかる言葉で質問するようにしてください。 これができなければ、要件の仕様がかたまっていないということになります。
追記です。
仕様・要件は、現在のレイアウトで説明してください。
ただ、将来こんなようにかわることがありうるということを【具体的に】かくことは おおいに結構ですね。 そうすれば、回答側は、そのあたりを考慮して、コード案を書きますので。
(β) 2015/03/10(火) 21:24
A B C D E F G H i 1 : 品目 / アルミ --------------------- 2 : lotNo / R−4 --------------------- 3 : 機種 / A103 ------------- --------------------- 印刷ボタン 4 : 番号 / 2番 ------------- --------------------- 5 : 重さ / 12.34 ---------------------
C D E F G H 6 : 品目 LotNo 機種 1番 2番 3番 7 : 鉄 R-1 A100 10.32 12.82 12.62 8 : ゴム R-3 A102 11.52 12.86 10: アルミ R-4 A103 12.56 ●12.34
(さだ) 2015/03/10(火) 22:55
βさんからも提示があると思いますが、つなぎの一例で。
下記のマクロを標準モジュールに置き、
開発⇒挿入⇒フォームコントロール でボタン を挿入し、マクロの登録で「選択印刷」を指定した例です。
処理したいデータ範囲を選択し、実行してみてください。
Sub 選択印刷() Dim 選択範囲 As Range Set 選択範囲 = Selection Const データ範囲 = "F7:H100" If Intersect(選択範囲, Range(データ範囲)) Is Nothing Then MsgBox "データを選択してから実行してください。" Exit Sub End If
Dim 対象セル As Range For Each 対象セル In Intersect(選択範囲, Range(データ範囲))
Range("B1").Value = Cells(対象セル.Row, "C").Value Range("B2").Value = Cells(対象セル.Row, "D").Value Range("B3").Value = Cells(対象セル.Row, "E").Value Range("B4").Value = Cells(6, 対象セル.Column).Value Range("B5").Value = 対象セル.Value
Select Case MsgBox("印刷を実行しますか?(「キャンセル」で終了)", vbYesNoCancel) Case vbYes ActiveSheet.PrintOut Case vbCancel Exit Sub End Select Next 選択範囲.Select End Sub
(Mook) 2015/03/10(火) 23:32
初心者ですがなんとか必ず実行したいと思います
少し時間をかけて試したいと思います
成功したらお知らせいたします
(さだ) 2015/03/11(水) 00:35
A B C D E F G H i 1 : 品目 / アルミ --------------------- 2 : lotNo / R−4 --------------------- 3 : 機種 / A103 --------------------- 4 : 番号 / 2番 --------------------- 5 : 重さ / 12.34 --------------------- C D E F G H 6 : 品目 LotNo 機種 1番 2番 3番 7 : 鉄 R-1 A100 10.32 12.82 12.62 8 : ゴム R-3 A102 11.52 12.86 10: アルミ R-4 A103 12.56 ●12.34
質問1
印刷ボタンを使用しないで印刷したい
F7:H10内に、入力しEnter押したらMsgBox("印刷を実行しますか?(「キャンセル」で終了)"が表示され「yes」で印刷できないでしょうか?(自分たちは印刷ボタンを使用しています)
※印刷が完了したら指定したセルは隣に移動してる。
質問2
印刷開始時、B1:B5に空欄があったら"未入力箇所があります"の警告を出せないでしょうか?
このようなことも可能でしょうか?すべて丸投げになってしまいましたがよろしくお願いいたします。
(さだ) 2015/03/11(水) 23:34
>エクセルに飛ばしています。 というのは具体的にどういった動作でしょうか。 ・またその中で Enter キーを押すというのは、他のキーに置き換え可能でしょうか。 ・データは F7:H10 内のデータ位置はどのように制御されているのでしょうか。 ・処理したい一回のデータはいくつでしょうか。
Enter キーでマクロを実行するというと、イベントになってしまうので、 マクロにショートカットを割り当て、それを呼び出すというようなほうが通常の操作を 阻害しないのですむと思います。
開発⇒マクロ で対象のマクロを選び、オプションで例えば E を設定しておけば Ctl+E で実行できます。
>印刷開始時、B1:B5に空欄があったら"未入力箇所があります"の警告を出せないでしょうか?
空白が有ったら処理をしないのであれば、警告を出さずとも処理をしなければよいと 思うのですが、空白が有るケースもあるのでしょうか。 スキップで良ければ、こんな形です。
If Application.CountBlank(Range("B1:B5")) = 0 Then Select ... : End Select End If (Mook) 2015/03/12(木) 08:36
C D E F G H 6 : 品目 LotNo 機種 1番 2番 3番 7 : 鉄 R-1 A100 10.32 12.82 12.62 8 : ゴム ---- ---- 11.52 12.86 10: アルミ R-4 A103 12.56 ●12.34
・エクセルは単純にマスに項目がかいてあるだけのものです。自動入力でも手の入力と同じように、F7をマウスで指定して(入力してEnter)=出力ボタンのような感じです。順次G7、H7、F7へと入力
※質問の答えになっていなければすいません。
●処理したい一回のデータはいくつでしょうか
・私たちが入力作業とおなじで一つずつ重さを自動入力しています。
●空白が有るケースもあるのでしょうか。
・F列、G列、H列の入力は前工程のちがう人が入力しています。ですので、その時点で警告をすればよかったことに今更気づきました。エクセルの入力規則の機能で対応します。申し訳ありませんでした。
例えばF7:H10の範囲で数字を入力し→Endをおすと"印刷を実行しますか?(「キャンセル」で終了)"のメッセージでるようなことはできますでしょうか?
※ctrl+Eで実行の方法も試行錯誤してみます。
よろしくお願いします。
(さだ) 2015/03/13(金) 01:55
> ・私たちが入力作業とおなじで一つずつ重さを自動入力しています。 はデータを1回入力したら、その都度印刷をしたいということでしょうか。
先に提示したマクロは、複数セルを選択し、順番に印刷するということを 想定していましたが、都度1ずつの印刷であれば キャンセル は不要だと思います。
F7:H10 の範囲であれば、どこかにデータが入ったときに、都度印刷という動作で よいのですか? (Mook) 2015/03/13(金) 07:44
上記の想定で、 シートモジュールに置くイベント例です。
Private Sub Worksheet_Change(ByVal Target As Range) Const データ範囲 = "F7:H10"
If Intersect(Target, Range(データ範囲)) Is Nothing Then Exit Sub
Dim 対象セル As Range For Each 対象セル In Intersect(Target, Range(データ範囲)) If 対象セル.Value <> "" Then '// データがない時は(削除したときも)印刷しない Application.EnableEvents = False Range("B1").Value = Cells(対象セル.Row, "C").Value Range("B2").Value = Cells(対象セル.Row, "D").Value Range("B3").Value = Cells(対象セル.Row, "E").Value Range("B4").Value = Cells(6, 対象セル.Column).Value Range("B5").Value = 対象セル.Value Application.EnableEvents = True
If Application.CountBlank(Range("B1:B5")) = 0 Then If MsgBox("印刷を実行しますか?", vbYesNo) = vbYes Then ActiveSheet.PrintOut Else If MsgBox("空欄があります。印刷を実行しますか?", vbYesNo) Then ActiveSheet.PrintOut End If End If Next End Sub
(Mook) 2015/03/13(金) 07:59
でも印刷を自動ではなく、確認付きで行おうとすると 計測装置で複数回データを送ろうとしたときに、印刷確認待ちになっていてデータが 入らなかった、なんてことが起きそうです。
マクロを考えるときは、やりたいことを考えるだけでなく、運用時に起こりそうなことを いろいろと考えておかないと結局使えないものになってしまいます。
ですので、使い捨ての個人使用であればともかく、業務で使うものであれば、慎重に仕様を 決める必要があることは認識しておいた方が良いでしょう。
そして、すでにその状況のようですが、一度使い始めると、こうしたい、ああしたい、 という要望が出てきます。
そうしたことに対応するには、管理者(運用者)がきちんとマクロの知識を修得する (すくなくとも理解する)必要があると思います。 (Mook) 2015/03/13(金) 08:07
あらあら、ご丁寧にお礼をどうも。 まったく気にしていませんので、恐縮しないでください。 この質問がきっかけで、マクロに興味を持たれたようであれば何よりです。
あちらの質問はβさんが、私からは文句のつけようのない回答をされているので、 継続されるが、よろしいかと思います。眺めながら私も参考にさせてもらっています。 (Mook) 2015/03/28(土) 00:09
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.