[[20150310182705]] 『アクティブセルを参照し、かつその隣のセルも参照』(さだ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『アクティブセルを参照し、かつその隣のセルも参照したい』(さだ)

エクセル初心者です
アクティブセルを参照するマクロを調べ実行できましたが、その隣のセルも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


早々のご回答ありがとうございました。
わかりにくい説明で申し訳ありません
利用目的はラベルの印刷です。
同じシートのA1:B5に簡易的なラベルを罫線で作っています.(入力後、A1:B5までの範囲を印刷します。)
A10:E20にデータが並んでいます。(入力はB列のみ)
B10に入力(選択)したときにA1:B5のラベルに表示させたいのです。
B10に入力(選択)したらA1にB10の値。A2にB10の右隣の値。A3にB10の左隣の値・・・
データ項目が増えたときにもB1にB10の2つ左隣の値を表示させるなど、数字を変更して任意に表示したいです。
入力したら印刷の繰り返し作業なのでこのようなものができたらと思っています。
何とか勉強していきたいので再度ご教示願います。
(さだ) 2015/03/10(火) 20:28

 列に意味があるのであれば、隣といった指定ではなく、何列のデータとしたほうが良い
 と思います。
 それとも、処理のたびに列の使い方が変わるのでしょうか。

 また、今回のケースはイベントマクロではなく、範囲を指定して指定範囲に対するといった
 処理にしたほうが良いと思います。

 繰り返し処理、というのでしたら複数データを対象にしたお話だと思いますが、
 具体的なデータを使用して、説明してみてはどうでしょうか。
(Mook) 2015/03/10(火) 20:34

 すでにMookさんから指摘がありますし、私も利用目的?? とコメントしましたが
 要望の処理そのものにイベント実行は適しているとは思えません。
 とりわけ SelectionChange これは、マウスでどこかのセルを選択すると、いやがおうでも
 実行されてしまいます。

 このシートのどこかを、印刷目的ではなく(うっかりも含めて)マウスで選択したり、
 あるいは、どこかのセルに何か入力してエンターをおすことでセルが移動するなんて
 しょっちゅうありますよね。そのたびに、そのセルを起点として、所定のセルに値が転記されてしまう。

 まず、構成をどうするかという前に、Mookさんが指摘されるように

 ・こんなレイアウトのシートがある ということを具体的に
 ・そのレイアウトのシートに対して、どこを、どのような基準で、どこに、どれだけ転記する。

 それを、まず、(さだ)さんの頭の中で整理して、回答者がわかる言葉で質問するようにしてください。
 これができなければ、要件の仕様がかたまっていないということになります。

 追記です。

 仕様・要件は、現在のレイアウトで説明してください。

 ただ、将来こんなようにかわることがありうるということを【具体的に】かくことは
 おおいに結構ですね。
 そうすれば、回答側は、そのあたりを考慮して、コード案を書きますので。

(β) 2015/03/10(火) 21:24


ご指摘ありがとうございます。
現在はこのようなフォーマットを使用しています。
このフォーマットにA1:B5のラベルを追加したいと考えています。
入力はF7:H10まで小数点の数字のみ横に入力していきます。

G10(●12.34)を入力したときに入力したセルはB5へ表示し、同じ行のC10、D10、E10をB1、B2、B3に表示したい
また、B4には入力したセルと同じ列(G列)の6行目の”2番”を表示したいとおもっています。
時間がかかりましたこのような感じです。
聞きたかったことが自分でもわかってなかったことを認識しました。
あらためてご指南いただきたく思います。
よろしくお願いいたします。
※印刷ボタンについては後日あらためて考えてご質問いたしたく存じます。
     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


Mookさま、βさまありがとうございました
印刷マクロ成功しました。まさに要望どおりです。
さっそく運用開始しています。ありがとうございます。
運用を開始したところ、大変便利ということで、ほかの職場からも依頼が入りました。
他の職場では重さ情報を直接重量計からエクセルに飛ばしています。はかった結果が自動入力され、Enterキーを押すまでを自動で行っています。
フォーマットは同じです
     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

ご返答ありがとうございます。また説明不足で申しわけございません
作業の説明をしていませんでした。
私たちは重量計に対象物(アルミ、鉄など)をのせ表示された重量をPC(エクセル)にキーボードで入力しています。他の部署でも同じ内容の仕事をしていますが、その職場の重量計には通信機能がついており、PCと重量計をケーブルでつなぎ、重量計の出力ボタンをおすことで重量を直接エクセルに入力しています。
●エクセルに飛ばしています。 というのは具体的にどういった動作でしょうか。
・重量計の出力ボタンを押すと表示された重量が指定されたセルに自動入力されます。
●またその中で Enter キーを押すというのは、他のキーに置き換え可能でしょうか。
・ボタン限定で可能です。設定で3つだけ選べます。Enterか矢印ボタンの↓PgUpか→Endの3つです
●データは F7:H10 内のデータ位置はどのように制御されているのでしょうか。
             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さま
お礼のコメントおそくなり大変失礼いたしました。
私がアップしたと思い込んだコメントを確認しておらず、ここまでお世話になりながらこのような形で
おわっていたこと重ねておわびいたします。
現在Mookさまに書いていただいたマクロのおかげで仕事の負荷も革命的に減り、大変感謝しております。
現在、マクロの知識を理解するため、少しずつですがエクセル大辞典サイトで"Hello world"から勉強中です。
mook様のマクロ知識の深さもそうなのですが、人がどんなミスをおこすとか、、私の幼稚な説明でも全体像を
つかむ感じとか先々こんなことが起こるかもとかそういったもののmookさまの知識にあっとうされました。
わたしもそういったことがすこしでもできるようになりたいとおもい自分なりに始めようと思いました。
そういう感情がでるきっかけとなったmookさまに再度感謝いたします。
そんな中、このマクロでまた追加したいことがあり、またやりとりをはじめました(もんぺ)
一からやるといいながらも仕事もあり・・・言い訳ですが・・・
βさまからもご教示いただいております。おきづきになればアドバイスねがいます[20150325231051]
(もんぺ) 2015/03/27(金) 23:48

 あらあら、ご丁寧にお礼をどうも。
 まったく気にしていませんので、恐縮しないでください。
 この質問がきっかけで、マクロに興味を持たれたようであれば何よりです。

 あちらの質問はβさんが、私からは文句のつけようのない回答をされているので、
 継続されるが、よろしいかと思います。眺めながら私も参考にさせてもらっています。
(Mook) 2015/03/28(土) 00:09

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.