アプリ版:「スタンプのみでお礼する」機能のリリースについて

A列に会社の番号B列に会社名。
C列の該当する会社の行に1を入力します(複数あり)
入力と同時にD列に番号を表示。

例1)
1行名はタイトル行
A2=1 B2 〇〇 C2="" D2=""
A3=5 B3 ××  C3=1 D3=002-5-2
A4=5 B4 ×× C4=1 D4=002-5-2

※D3,D4の番号について→002は固定です。5は会社の番号のA列から。2は行カウントの数字ですが、一番上にある行カウントを以下の1が入力された行に自動表示。

次に、例1)で入力したC3とC4の1は削除して、次にC2、C5、C6に1を入力します。
この時に、例1)で表示されたD列の番号はそのまま表示されてほしいです。

A2=1 B2 〇〇 C2=1 D2=002-1-1
A3=5 B3 ××  C3="" D3=002-5-2
A4=5 B4 ×× C4="" D4=002-5-2
A5=1 B5 〇〇 C5=1 D2=002-1-1
A6=1 B6 〇〇 C6=1 D3=002-1-1
A7=5 B7 ×× C7="" D4=""


複雑なのですが、vbaで上記の内容を実現することは可能でしょうか。
可能でしたら教えてくださいませ。
宜しくお願いいたします。

A 回答 (2件)

補足有難うございます.



内容を読むとマクロは少なくとも2つ用意した方が良さそうですね.
①Dのセルに出力するマクロ
②Cのセルを判定するマクロ

考え方から説明しますと
・①はCのセルに値が入力された際に実行する.
・入力されたセルの行の位置を引数に入れる.
(例えばC3セルに入力したなら引数は3,C5セルに入力したなら引数は5)
・上記引数とCellsを利用してD列に値を出力する.

・②はEのセルにが入力された際に実行する.
・入力されたセルの行の位置を引数に入れる.
・上記引数とCellsを利用してCのセルの値を消す.

次に確認ですが,行カウントについて同じグループというのは例えば質問文で考えるとA2,A5,A6は1で,A3,Aは5で,それぞれ同じグループという意味で良いですか.
上記の内容が正しいならこのシートでは上から順に新規で入力された値に対して順々に数値を振り分けているという事になります.
すなわち
・会社番号が1→行カウントで1
・会社番号が5→行カウントで2
例えばA8に会社番号が6というのが入力された場合には行カウントは3になりますか?

ここでの確認の意図は行カウントが上記内容で決定しているとするなら1つ作業列もしくは作業用シートを用意した方が良いと考えるためです.
この作業というのは先ずA列の値で重複する値を削除したものをコピーし,上から1,2,3と番号振り(行カウントの値を決める)を実行するというものです.

具体的には作業シートをSheet2に置くなら,A列の範囲で重複データを削除したものをシート2のA列にコピーすれば
Sheet2のA1が1,A2が5になります.
Dのセルの行カウントの値を出力する時はSheet1のAのセル値を検索値にSheet2のAのセル値と合致するセルの行番号として出力すれば良いという事になります.
(つまり会社番号と行カウントを整理するマクロが別に必要)

まだマクロを組んでテストをしていないので,実際のマクロの記述は回答できていませんが,ご参考までに

あともう一つ確認ですが,質問者さんの立場でこのシートで入力するのはA~C列とE列ですよね?
もしC列も自動化する場合にはE列に1が入力されているかどうかでC列の1の入力/削除も可能です.
    • good
    • 0
この回答へのお礼

ありがとうございます。
内容を確認しましてお返事させていただいております。
お忙しいところ申し訳ございませんが、ご確認お願いいたします。


■①Dのセルに出力するマクロ
 ②Cのセルを判定するマクロ

>ありがとうございます。②に関しましては以下のマクロを作成して動作確認済みです。ご確認いただけましたら幸いです。

Private Sub Worksheet_Change_2(ByVal Target As Range)
Set t = Intersect(Target, Range("E:E"))

If t Is Nothing Then Exit Sub
For Each c In t
If c.Column = 5 And c.Row > 1 And c.Value = 1 Then
Range("C1").Offset(c.Row - 1).ClearContents
End If
Next c
End Sub


■例えばA8に会社番号が6というのが入力された場合には行カウントは3になりますか?

>申し訳ございません。私も勘違いをしておりました。
この場合は、行カウントは8になります。
グループの一番上段にある、1が入っているのは何行目かで値が決まります。

例えば、A9、A12、A13が「8:丸井」という会社でC列に1を入力していきます。
この時のD列の番号はA9に1を入力したら002-8-9が自動表示されます。
次にA12を入力したら002-8-9が自動表示されます。
別シートに反映されたこの3行分のFAX若しくは印刷が完了したらE列に1を入力してC列の2がクリアとなります。


■あともう一つ確認ですが,質問者さんの立場でこのシートで入力するのはA~C列とE列ですよね?
>はい、A~C列とE列の入力となります。

お礼日時:2017/08/26 03:40

質問文に書かれている事をVBAで実現する事は可能ですが,それは飽くまで例1の内容に限定して処理後の状態にするというだけです.



例えばC3とかC4の値を消すなら
Range("C3").Value = ""
とか
Range("C3").Select
Selection.Clear
みたいない感じで指定したセルの値を消す事はできます.

D3への出力なら
Range("D3").Value = "002-" & Range("A3") & "-" & Range("A2:A3").Rows.Count
(ここでのRows.Countが適切かは疑問がありますが)

マクロが実行されるタイミングが自動である,すなわちセルに何かしらの入力があった際に実行ということであるなら,過去にも同様の質問がありましたので,こちらを参照下さい.
https://oshiete.goo.ne.jp/qa/3163895.html


おそらく上記内容では質問者さんが本当にやりたい事を満足しないと思います.
処理自体はRangeで指定したセルもしくはセルの範囲にしか反映されませんので,例えばA8,A9・・・・と範囲を広げていった時には適用できないからです.

つまりもう少しどういう条件になった時に各々の処理を実行するのかを明確にする必要があります.
・C列の値を入力もしくは消すのはどういう条件なのか?例えばC3に1は入力されているが,処理後は空白になっている.この処理をもう一度行うと1が再度入力されないか?
・複数行を一括処理する時に,処理する行をどのように判定するか?
 (自動で出力されるのであれば,複数行を一括で処理するような事は起こらない様にも思いますが)
・行カウントの定義は?
 (質問文からは良く分からないので,どういう条件で数値が決まるかを書いて頂きたいです)
などなど

具体的な実行後の状態ではなく,処理内容を書かれると良いと思いますよ.
    • good
    • 0
この回答へのお礼

ご丁寧にご指導いただきまして、ありがとうございます。
申し訳ございませんでした。

・C列を消すときは、C列に1を立てると、その行の内容が別シートのFAXフォームにとんで、FAXが終わるとシートに戻ってきてE列に確定の列を設けておりここに1を入力するとC列の1は削除されます。
・複数行を一括処理する時はc列に1を入力した行は同じグループとみなし、D列の番号は同じ番号となります。
・行カウントの定義は、同じグループの一番上の行のカウントを使用します。

ご質問いただいておりました内容は以上の通りです。
何度もすいません。
宜しくお願いいたします。

お礼日時:2017/08/24 05:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!