[[20160419145241]] 『コピーしたセルの挿入時、挿入行の行番号を把握ax』(かず) ページの最後に飛ぶ

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

 

『コピーしたセルの挿入時、挿入行の行番号を把握ax(かず)』(かず)

βさん

管理番号をどのように持たせるか、これは、かずさんや担当サイドでわかりやすい採番ルール
にすべきであって
私がこうしなさいと申し上げるマターではありません。(もちろんですよね)
コードでやっていることは、かずさんの最初の質問文から、こういうことがやりたいのかなと
いう想像です。
そういうとらえかたも、もちろんあると思います。ですから、単純挿入の場合は、どういった
採番ルールにするのかということを
提示いただければ、そのようなコードにすることができます。

1.挿入行に対する考え方

 (1)空白行の挿入

    a) 1行の挿入
    右クリックで挿入の操作)挿入された行の直前行の管理番号に対し一つし下のレベルの枝番を付与

             挿入直後     イベント処理後

             管理番号

     例1 2行前    16_1
        1行前    16_1_1  
           挿入行     △    ⇒  1列目空白を★、に変更、管理番号列に 16_1_1_1 格納  
           1行後    16_1_2 

   この場合
   DIC(16_1) =1

     DIC(16_1_1) = 1
   DIC(16_1_1_1) = 1  
     DIC(16_1_2) = 1

    b) 複数行の空白行の挿入
   複数の空白行を 挿入 と言う操作はできない?しない?のではと思っています。

   この場合「1行の空白行挿入」と「コピーして挿入」の操作に分解して扱えばよいと思います

 (2) 複数行をコピーして一括して挿入

   a)          挿入直後  イベント処理後

             管理番号

     例1 2行前    16_1
        1行前    16_2
      挿入1行目  16_2      ⇒   16_2_1  1列目空白を★ 
      挿入2行目    16_2        16_2_2  1列目空白を★
           元1行後      17 
   
    {挿入された行の管理番号は、直前の行の管理番号を選らんで、その一つ下のレベルの
     行番号を_1、_2 のように与える
   

2.コピ-&ペーストの場合

  a) 1行内の部分修正
    普通に行の一部に対し列を修正。管理番号はそのままとし、戻り値 Targetの内容はBM列に保存(※)

  b) 挿入済み1行に部分上書き 
    既に挿入した行の一部の列を更新、戻り値TargetをBM列に保存。
    1列目は既に★マークなので何もしない。

  c) 既に挿入した行だけを挿入、残りの行はコピー&ペースト

    最初の行は、列の更新処理を行い、1列目は★マークを付ける
    残りの行は、1行単位での更新。1列目は▼マーク   

 ※ 行の中の更新処理の中で、飛び飛びの列が更新されている場合、Targetにセル範囲が返されるので
   そのまま保存。大元のリストにマージした時、セル範囲の背景を黄色、文字を赤にする。

   もともと担当者者はそのように修正することになっているのですが実態として守られていないので
   取得したTargetを元に元のリストに色づけをするため。

3.更新処理
  
  βさんの指摘で、いろいろな操作の時に、どういアドレスが戻るのか確認できていません。
  申し訳ないです。
 
  何も変更が行われていない行はディクショナリに登録する必要はないと思いますが
  更新があった行は、大元リストへの反映処理においてDICを利用して処理が簡単になればうれしいので
  更新の場合は DIC(10_1※) = Range(B10:K10) などの形で変更箇所の情報を格納できればよい
  と思っています。

  同じ行の複数個所に対して、更新があった場合は Rangeをitemに順次追加していこうと思います
  更新処理の中でで セルを削除することはないと思いますが、そのような操作はブロックしたいと思います
 
  注1 Itemに登録する情報が単に文字ではなく、Rangeのオブジェクトでもいいかもしれませんが
     今今は検討不足です

  注2 ※
  ご意見頂きたいところなのですが、配布して戻ってきたリストを開いて、ディクショナリを再構成すれば
  には変更箇所データベース的なものとして利用できると思いました

  DICに登録されたkey が 16_1 のように枝番付 なら 配布元の16_1 の管理番号の行を大元リストの16行に挿入する
  DICに登録されたkey が 15  のように枝番なしなら、Itemに登録した Range情報をインデックスにつかって、配布元リスト
  の管理番号15の行のRangeを 大元リストに反映し、そのセルの背景色、フォントを変える 

  ただし 挿入した行に対する更新処理の場合は、挿入した行の管理番号は 10_1 のようになっていて、そこに更新処理
  が行われるので、そのままではDICには key 10_1 となっているはずなので key の管理番号の形ではなく 
  item が 空白  なら 挿入
  item が Range なら 変更 で判断すればよいと理解しました。

  
  注3 更新処理では、βさんが以前複行の複数ブロックでもイベントハンドラがちゃんとTargetを返すと言われていた
  ように記憶しますが、そうであれば、DICに登録する管理番号は、変更箇所のセルの先頭部分という意味になると思います
 
 
コード、特に Dictionary関連のものに注釈を付加する件は心がけます。
ただ、コード機能としての注釈はあまり役に立たないかもしれませんよ。
実際には、Dictionaryかどうかにかかわらず、その持ち方含めた構成の中で何をしているのか それが重要ですので。
ここは、なかなかコード内コメントでは説明し切れない というか、説明を入れると、コード1行に対して10行以上の説明文になって
コードとしては見づらくなりますので、不明なところは別途質問を投げかけていただき、それにこたえるという形も併用せざるを得ないでしょうね。

 おっしゃる通りと思います。了解しました。

 以上

< 使用 Excel:Excel2010、使用 OS:Windows2008R2 >


 まず、最初に、もしかしたら Dictionaryというものを誤解しておられるかもしれないので、その点と
 このトピの今後のことに関するβの考えをメモします。

 ●Dictionary

  Dictionary は、普通の変数と同じ、単なる【変数】です。
  ブックを開いてマクロ内で、変数にいろんな値をセットする。
  それがモジュールレベルの変数であっても、ブックを閉じれば消えてしまいますね。
  次に開いたときには、前回閉じる前に 100 という値だった変数があっても、それは初期値になって始まります。
  Dictionaryも同じです。ブックを閉じれば、すべてなくなります。
  なので、Workbook_Open で、シート上のその時点の値を拾い集めてDictionaryに格納。
  以降、ブックが閉じられるまで、そこを参照しながら採番し、採番結果を書きこんでいます。
  このDictionaryは必須かというと、処理効率を考えなければ、行挿入のつど、シートをなめまわして適切な値を取得すれば
  なくてもいける、だけど、処理効率を考えて、Dictionary を使っているだけです。

  ですから、【変更履歴】をDictionaryに持たせて、それを、後で(いつでも)参照できるようにしたいということ自体が無理。
  (変更履歴については後述します)

 ●このトピのこと。

  前スレで、【撤収云々】と表現しました。

  この意味は、もともとのテーマ、
  ・行挿入のイベントをキャッチしたい。
  ・その際、コピー挿入なら、何をコピーしたかがわかるようにしたい。

  こういうことでしたので(何をコピーしたか というのが、途中で変わってきたようで、今は 挿入行の上の行に対する追加という要件のようですが)
  その範囲が終われば(基本的には終わったと認識していたんですが、もうちょっとかかりそうですね)いったんおしまいにしましょうという意図でした。

  もし、まったく別の形のものにしたいとか、今回出てきたような【履歴管理】といったもの、そういうものは、このトピとは切り離し
  全く新しいトピとして立ち上げていただきたい。その際に、(もちろん)お手伝いできそうであればお手伝いします という意味です。

 ●履歴管理

  前述の通り、全く別物ですので、新しいトピを立ち上げられるべきです。
  が・・・・老婆心ながら、

  1)履歴管理を行うにあたり、いったん 立ち止まって 整理されたらよろしいかと思います。
  2)整理の順番は だれが管理するのか-->なんのために管理するのか-->そのためにはどの情報を保持すべきか
    この順番で行うことが肝要です。これを間違えると、グチャグチャになり、かつ使い物にならないものが出来上がる恐れがあります。
  3)たとえば、現場担当が管理する ということであれば、たとえば100番 の行に対して、abc と入っていた C列の値を xyz に変更した、
    opq と入っていた E列の値を rst に変更した、さらに、昨日、xyz と変更した C列の値を 今日、def に変更したという履歴になるのでしょうね。
    (こういうことが担当にとって役に立つのかどうかわかりませんが)
  4)そうではなく、かずさんが管理をする ということであれば、何と何を比較するのでしょうか?
    担当に配布した 100 番というデータが 回収した時にどうなっているか、もし 100_1 や 100_5_20 も 100 の仲間だとしたら
    担当に配布した 100 番というデータが枝番も含めて 100番グループで、どうなったか という比較ですよね。
    担当サイドで、どのような変更の履歴があろうと、それは、かずさんには関係なく、あくまで 配布したデータと回収したデータの差分が
    管理すべきポイントではないですか?
  5)であれば、なにも、操作ごとに、その変更内容をどこかに記録せずとも、配布ブックと回収ブックをつき合わせれば、充分なのでは?
    (もちろん、必要ならVBAで)

  まぁ、このあたりは、だれが何のために という部分がわからないので、あくまで感想です。
  で、もしかしたら、それは、このようなQ/Aサイトで、ちょこちょこっと出来上がるものではなく、有償、無償ふくめて世の中に出回っている
  変更管理専門のソフトを使うべきマターなのかもしれませんし、あるいは、エクセルがもっている標準の履歴管理でまかなえるものかもしれません。

  そういったことを十分に練ってから、必要であれば、新しいトピにしてください。

 ★いったん、ここまでにします。もらったコメントについては今から読んで、またレスします。

(β) 2016/04/19(火) 17:31


 一部順不同になりますが。

 ●行挿入

  当初、コピーした行がどれかがわかるようにしたいという要件だったはずが、10 の下に 50_1 が来るとおかしいという指摘、
  逆に、この指摘がおかしいなぁと感じたんですが、もしかしたら、以下のような認識でしたか?

  ・コピーしたい行、たとえば10行目を選択して Ctrl/c
  ・その下の行を選択してコピー挿入

  こうすると、10行目が 10 なら、確かに挿入された行は 10_1 になる。うん、美しい。
  でも、かりに 10行目をコピーした後、21行目を選んで行挿入すると、10行目のデータが 21行目となって挿入されます。
  で、20行目は 20 、挿入された行は 10_1 になる。20 の次が 10_1 というのはおかしい。
  こういうことでしたか?

  であれば、コピーされた行を紐付ける必要はさらさらなく、あくまで、その場所の上の行が何なのか、それによって
  採番すればいいということになります。この採番は単純なものになりますので Dictionaryが不要になります。

  ★本当にそれでいいのですか?

  >>複数の空白行を 挿入 と言う操作はできない?しない?のではと思っています。

  操作はできます。で、担当は【しない】ということですが、万が一、そういう操作をしたときに、何も手当てしないと
  データの整合性がくずれます。

  行挿入(単純挿入であれコピー挿入であれ)にあたっては 1行のみ許す、複数行ブロックの挿入なら、エラー扱いで
  元に戻すという手当てはできます。(あるいは 単純挿入の場合のみ1行しばり?)

  ★どうしますか?

  ただ、たとえば 飛び飛びに 1行ずつ選んで 挿入、これはイベント処理では 1つ1つ、別々のイベントとして
  発生しますので、OKになってしまいますが。

 ●コピ-&ペーストの場合 

  ほとんどが【履歴管理】を意識したコメントなので、その部分は、今は、忘れます。

  >>a) 1行内の部分修正 普通に行の一部に対し列を修正。

   このときもA列は▼ですね。

  >>c) 既に挿入した行だけを挿入、残りの行はコピー&ペースト 
  >>  最初の行は、列の更新処理を行い、1列目は★マークを付ける 
  >>  残りの行は、1行単位での更新。1列目は▼マーク 

  ★この意味がよくわかりません。

 ●繰り返しになりますが、BM列に変更Rangeをどうこうとか、色をどうこうという部分は変更履歴管理の部分で、本件テーマとは異なりますので
  βとしては、このトピで対応するつもりはありません。

(β) 2016/04/19(火) 19:18


 新しい採番ルール(?)で、質問です。

 ・最初、まっさらな状態で 10 番があった。
 ・この 10番の行をコピーして 11番〜13番を選択してコピー挿入
 ・結果 10番の行の下に 3行追加され、10_1、10_2、10_3 になった。

 ここで、1行足りないことに気付いた。10_3 の下に 10_4 をつくりたい。

 そちらの要件説明に従えば、

 ・10番をコピーして その下の行(10_1) を選択してコピー挿入?
  この場合、直前の行が10番なので 10_1 になります。10_1 が2行できてしまいますね!

 あるいは

 ・10_3 の行をコピーして、その下の行を選択してコピー挿入?
  この場合、10_3_1 になってしまいますね。

 どうしますか?

(β) 2016/04/19(火) 19:50


 βさん

 本日 17:31に頂いたコメントに対する返信から
 
 自分としては、βさんの説明でDictionaryがメモリ上の機構で
 あってブックを閉じたら消えてしまうものであるとは承知です。

 ただ初心者にとっては、その使い道いまいち理解し切れていない
 と思っております。

 具体的には、どうせDicitionaryを使うなら、挿入の際だけでなく、
 更新の場合にも、管理番号を格納、かつ配布先で行われたリスト
 から Dictionaryを復元して利用すれば、挿入も更新も同じよう
 に扱えてやっていることが単純、理解しやすくなるとの理解です

 変更履歴データベースという言葉を使ってしまったので、何
 か 情報が恒常的に残るデータベースとは思っていません。ご安心を。

 ここで、βさんの2番目の投稿に飛びます

こうすると、10行目が 10 なら、確かに挿入された行は 10_1 になる。うん、美しい。 でも、かりに 10行目をコピーした後、21行目を選んで行挿入すると、10行目のデータが 21行目となって挿入されます。 で、20行目は 20 、挿入された行は 10_1 になる。20 の次が 10_1 というのはおかしい。 こういうことでしたか?

であれば、コピーされた行を紐付ける必要はさらさらなく、あくまで、その場所の上の行が何なのか、それによって 採番すればいいということになります。この採番は単純なものになりますので Dictionaryが不要になります。

 はい。私が4/1 08:09 投稿したコード

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim sv As Long
    Dim i As Long
    Dim ins_Base As Long
    Dim ins_Cnt As Long

    Const N_Col As Long = 5

    sv = Range("A1", UsedRange).Rows.Count
    If sv > ThisWorkbook.MAXROW Then
        If Target.Columns.Count = Columns.Count Then
            Application.EnableEvents = False
            Target.Columns(1).Value = "★"

            ins_Cnt = Target.Rows.Count

            ins_Base = Cells(Target(1).Row - 1, N_Col).Value

            For i = 1 To ins_Cnt
                Cells(Target(1).Row + i - 1, N_Col).Value = ins_Base & "_" & i
            Next i
            Application.EnableEvents = True
        End If
    End If
    ThisWorkbook.MAXROW = sv
 End Sub

を作成 (ただし挿入の部分だけ)

は 挿入される行は挿入行の直前の管理番号を見て、自分の管理番号
を決めていました。Dicitionary は必要としていません。

要するに管理番号の持ち方の方が重要で、Dicitonaryでもセルでも
それほどこの業務の運営には大きな差はなにのかもしれません。

改めてDicitionaryを使う場合の一番のメリットは、
・比較的単純だがデータが大量にある場合、セルに書く、読むより高速
・普通の配列は、インデックスが数字しか書けないが、Dicitonaryは文字列
 をキーにしてItemを格納したりできる
逆にデメリットは、Dicitonaryにしてしまうと必ずVBAを介してデータの入
出力を行わないといけなくなり、肉眼で手軽に確認するというわけには
いかなくなるということだと理解しました。

私の業務の場合、期の最初に300行程度だった案件の行が期末には代替2倍
600行程度になります。現状の配布先リストと大元リストをマージするマクロ
では担当者別では一番多いんひとで150件程度で、その場合配布先リストの
更新や挿入を大元リストに取り込むのに長くて70秒程度なので、Dicitionary
をつかうデメリットを対策した方がよいと思いました

ということで、今後はDicitonaryなしで考えようと思います

●このトピのこと。

 、まったく別の形のものにしたいとか、今回出てきたような【履歴管理】といったもの、そういうものは、このトピとは切り離し 全く新しいトピとして立ち上げていただきたい。その際に、(もちろん)お手伝いできそうであればお手伝いします という意味です。

  私としては当初から2つのリストをマージさせるために、変更や挿入のイベントをキャッチしたいと考えており
 いろいろな検討はしてきたにせよ、βさんのおかげでひとつづ課題を順次掘り下げてきていると理解しています。

●履歴管理

 前述の通り、全く別物ですので、新しいトピを立ち上げられるべきです。  が・・・・老婆心ながら、  
  上述しましたように、変更管理データベースのように が誤解を与えたかもしれません。ご容赦ください
  この点については今は考慮不要と考えております。

βさんの2回目の投稿の後半について

複数の空白行を 挿入 と言う操作はできない?しない?のではと思っています。

 操作はできます。で、担当は【しない】ということですが、万が一、そういう操作をしたときに、何も手当てしないと  データの整合性がくずれます。

   そうでしたか。これは 一連の表があって、その途中に空白の複数行がある場合には、その複数の空白行を選択して
  おいて、右クリックから挿入 という操作でしょうか。
  確かにレアケースであったとしても考えておかなければいかないと理解しましたありがとうございます。

 ほとんどが【履歴管理】を意識したコメントなので、その部分は、今は、忘れます。   履歴管理は意図していませんがいったん、Dicitonaryなしで更新や挿入をうまく処理することでお知恵をお借りしたいと
  思います

c) 既に挿入した行だけを挿入、残りの行はコピー&ペースト   最初の行は、列の更新処理を行い、1列目は★マークを付ける   残りの行は、1行単位での更新。1列目は▼マーク 

  ★この意味がよくわかりません。

  コピー&ペーストの操作に応じた処理の場合分けとして
  複数の行を一括コピーして
  どこかの先に挿入した行を先頭行としてペーストする操作 を想定しました。
  
  この場合、ペーストされる複数行のうち、1行目はもともとは挿入行なので
  コピーアンドペースの操作は通常の処理でいいのだが ペーストされる複数行
  先頭行の1列には、1列目が空白だったら★をつける、1列目が★のままだった
  ら何もしない。

  ペーストされた残りの行は、上書き更新されているので処理の最後で1列目には
  ▼マークを付与
  ということを想定しました。

新しい採番ルール(?)で、質問です。

・最初、まっさらな状態で 10 番があった。 ・この 10番の行をコピーして 11番〜13番を選択してコピー挿入 ・結果 10番の行の下に 3行追加され、10_1、10_2、10_3 になった。 ここで、1行足りないことに気付いた。10_3 の下に 10_4 をつくりたい。

そちらの要件説明に従えば、

・10番をコピーして その下の行(10_1) を選択してコピー挿入? この場合、直前の行が10番なので 10_1 になります。10_1 が2行できてしまいますね!

あるいは

・10_3 の行をコピーして、その下の行を選択してコピー挿入?  この場合、10_3_1 になってしまいますね。

どうしますか?

  なるほど。気づきませんでした
 ロジックとしては、10 と 10_1 の間に挿入される挿入行には 10_0_1 を入れます

 ロジックとして、直前の行の管理番号 ひとつだけは決められない。

 直前の行、直後の行の管理番号のレベルの差を測る。それを10倍にする
 それを挿入する行の行数で 割る
  
 その数値が整数か少数かで判断だと思います。詳細は別途です

 枝番としては上のケースでは 10_0_1 、

  2番目の場合は、10_3_1 にすることになると思います

 以上  
(かず) 2016/04/20(水) 05:06


 かずさんの 4/1 08:09 の投稿コード、もちろん見ていましたが、実は、あぁ、かずさんが示した要件にはなっていないなぁ、間違っているなと
 そう思って、実は無視していました。(失礼)
 その時に指摘しておけば、要件が、元データの番号を引き継ぐということではなかったということがわかったわけで、ちょっと時間のロスになりましたね。

 で、仕様を決めるのは、もちろん、私ではなく、かずさんですが、その仕様に基づくコードとして、何を使ってどう処理するかは、任せていただきたいと思います。
 もし、かずさんが どうしても Dictionary を使いたい ということなら残しますが、残す意味が全くありません。かえってロジックを煩雑にし、かつ
 Dictionaryを使わなくても済む情報をDictionaryに書きこむ部分、効率が悪化します。

 今までは、 10 が コピーされた、だから 10_● としなければいけない。さて、10_■ のなかで、■は、何番まで採番されてシートに書きこまれているか。
 それを、シートの BM列を1行目から最終行までチェックして、■の最大値を取得して、■+1 の値を ● として使う。
 これでもよかったわけですが、そうすると、全行チェックという処理が毎回行われ効率が悪い。
 なので、 10_ というものをキーにして、採番済みの■をデータとして登録しておく。次回は、シートを全行なめなくても、10_ をキーにしてDictionary から
 ■を直接入手し、■+1 の値で BL列に書きこむとともに Dictionaryの登録の値も書き換えておく。そうすることで効率アップをはかっていました。

 しかし、これからは、そうする必要がありません。挿入された行の上の行に、元番号とすべき情報があるわけです。
 (10_0_1 といったものが突如登場したので、これはこれで悩ましいのですが。これは後述します)
 繰り返します。今何番まで採番されているかの情報は、全く不要になります。

 で、10_0_1 の件。
 せっかくの思い付きですが賛成できません。というか、この構えにするコードをβが書き上げる自信がありません。(面倒だということもありますが)

 これを行うためには、挿入された1つ上のみならず、挿入された1つ下もチェックが必要ですね。
 そのこと自体は、どうってことはないのですが、1つ上が 10 だった。だから、10_1 だ。だけど、下にすでに 10_●(おそらく 10_1)が存在する。
 だから 10_1 じゃなく 10_0_1 。なんとなく、おぉそうだねと 思ってしまいがちですが、じゃぁ、次にまた同じ挿入がされたらどうしますか?

 挿入行の1つ上が 10、1つ下が 10_0_1 。 この場合、どういう番号として挿入するのですか?
 さらに、10 の下に、またまた挿入された。これは、どういう番号にするのですか?

 そんなことはしない ということではなく、もし、そういう状態ならコードとしてどう処理するか、ここを矛盾なく、かつ処理可能なルールとして
 かずさんが提示できるなら、それをコード化します。もしできないなら、そういう挿入を禁止するコードを加えるべきなんです。

 むしろ、10 と 10_1 の間に行挿入された。
 10_● は、その時点で 10_1、10_2、10_3 が存在している。
 こういった場合、 順番はおかしくなりますが 10_4 として作成したほうが、理屈としてもわかりやすいのでは? 10 を元にして4番目に作成された行ですから。
 並びがいやだということなら、並び替えを行えば済みます。
 (で、こうするなら Dictionary の利用がベター)

 いずれにしても、BL列、BM列、必要ならBL列に、しっかりと理屈が付き、採番可能なルールを確定していただき、それをコードで実現する。
 で、★と▼についても、そのルールを、しっかりと提示いただく。
 たとえば、挿入ではなく、どこかの行に、別の行、それはA列が空白かもしれませんし、★かもしれませんし ▼かもしれません、その行が
 まるまるコピペされて上書きされたときに A列、BL列、BM列はどうあるべきか。そういうことも含めてルールを提示いただき、【早く切り上げたい】ですね。

(β) 2016/04/20(水) 07:05


 かずさんのコメントを読み飛ばしていたところがありました。

 >>ということで、今後はDicitonaryなしで考えようと思います 

 了解です。

 >>これは 一連の表があって、その途中に空白の複数行がある場合には、その複数の空白行を選択して
 >>おいて、右クリックから挿入 という操作でしょうか。

 そうではなく、そういう操作をするかどうかはわかりませんが、
 通常なら、ある行を選択して行の挿入。そうすると、その1行上に空白行が挿入されますね。

 それに加えて以下のような操作が可能ですね。

 ・複数行(たとえば10行)選択して、行挿入

  選択領域の上に10行分の空白行が挿入されますね。

 ・さらに Ctrlキーを押しながら、とびとびの、複数ブロックの行の固まりを選択して挿入。

  それぞれの選択ブロックの上に、それぞれの行数で空白行ブロックが、一度に複数ブロック挿入されますね。

 >>ロジックとして、直前の行の管理番号 ひとつだけは決められない。 
 >>直前の行、直後の行の管理番号のレベルの差を測る。それを10倍にする 
 >>それを挿入する行の行数で 割る 
 >>その数値が整数か少数かで判断だと思います。詳細は別途です 

 詳細別途、お待ちしています。
 繰り返しになりますが、コードとしてどうするか、(割るのかかけるのか)それはこちらにまかせてください。
 提示いただきたいのは計算ロジックではなく、様々なケースの、採番のルール、これを網羅的に『言葉で』説明したものです。

(β) 2016/04/20(水) 08:20


 To かずさん

 明日から、5日間ほど他出しますので、その間、掲示板対応ができません。
 ご容赦のほどを。

(β) 2016/04/21(木) 22:37


βさん

 そうでしたか。昨日から先ほどまで仕事がかかりっきりとなって
 しまい。これから検討するメモをまとめ明日投稿しようとしていました
 お手数かかてすいませんが戻られましたらまたアドバイスを頂ければ
 助かります。よろしくお願いいたします。

 以上

 
(かず) 2016/04/22(金) 01:00


βさん

 採番ルールの件

1.まずご指摘について順に回答
     

・最初、まっさらな状態で 10 番があった。 ・この 10番の行をコピーして 11番〜13番を選択してコピー挿入 ・結果 10番の行の下に 3行追加され、10_1、10_2、10_3 になった。 ここで、>1行足りないことに気付いた。10_3 の下に 10_4 をつくりたい。 そちらの要件説明に従えば、

・10番をコピーして その下の行(10_1) を選択してコピー挿入? この場合、直前の行が10番なので 10_1 になります。10_1 が2行できてしまいますね! あるいは ・10_3 の行をコピーして、その下の行を選択してコピー挿入?  この場合、10_3_1 になってしまいますね。 どうしますか?

  最初に考えていた挿入位置の直前の管理番号を基にして次に挿入すうる行の管理番号を当たる
  というやり方が、それだけでは破たんをきたすということが判明しました。

 私が書いた

直前の行、直後の行の管理番号のレベルの差を測る。それを10倍にする それを挿入する行の行数で 割る  その数値が整数か少数かで判断だと思います。詳細は別途です

 説明が不十分で大変申し訳ありません。
 ここは実数が無限に細分化という、数直線のようなものをイメージして考えており
 ほんとうにそおのようにするかは別として、理屈の上だけからいえば挿入行の管理番号
 に小数点を与えればいいと考えていました。

 つまり管理番号10 と 10_1の間に行が挿入された時、管理番号に何を振るのか
 の問題を、10と10.1 に間に等間隔にどれだけ数値がおけるのか、として考えます
 
 また挿入行が何行あるのかを考慮して、小数点の桁が変わります。
 1行挿入なら 10と10.1 の偏差は 0.1  1行から9行までの挿入なら

  9行挿入まで   10.0 < 10.01, 10.02, ・・・, 10.09 < 10.1

 ?@直前と直後の行の管理番号を 数値と見なせして 「偏差」と考える 
 ?Aそこに挿入する行数が10未満なら偏差を1/10、1桁さげて
  直前の行に加えると 10.01, 10.02, ・・・10.09

    挿入する行が100行未満なら 10.001, 10.002 ・・
  上記の 小数化管理番号だと見づらいので 枝番に対応させて 10_0_1とすると
  考えました。
  
 さらにβさんの指摘は
枝番としては上のケースでは 10_0_1 、

 について 
 

で、10_0_1 の件。 せっかくの思い付きですが賛成できません。というか、この構えにするコードをβが書き上げる自信がありません。(面倒だということもありますが)

これを行うためには、挿入された1つ上のみならず、挿入された1つ下もチェックが必要ですね。 そのこと自体は、どうってことはないのですが、1つ上が 10 だった。だから、10_1 だ。だけど、下にすでに 10_●(おそらく 10_1)が存在する。 だから 10_1 じゃなく 10_0_1 。なんとなく、おぉそうだねと 思ってしまいがちですが、じゃぁ、次にまた同じ挿入がされたらどうしますか?

  ここで同じ行が挿入された場合
  10
  10_0_1

   10_1 
   となっている状態で 10_0_1 が 10_0_1の前に挿入されたら
  10 と 10.01 の偏差は 0.01 で 挿入行数は1行。 10行未満
  なので 偏差を1桁さげて=1/10して 10に足す
  10+ 0.001 = 10_0_0_1です
  結果
  10
   10_0_0_1
   10_0_1
   10_1
   です。破たんはしていません。10の下にいくら挿入されて大丈夫。

 >・10_3 の行をコピーして、その下の行を選択してコピー挿入?  この場合、10_3_1 になってしまいますね。
  ここで挿入時は、上で述べた「直前、直後の行を見て採番」では
  10_3
  10_3_1
  となっていた場合は 10.3 と10.31 の差 は0.01 で 挿入行が1行なら10未満で1桁下げて
  10.301 となり
  10_3

    10_3_0_1
    10_3_1
    となります
  10_3, 10_4 の場合は偏差と挿入行から10.31 管理番号としてを数値化した
  
  ここで 問題は、挿入位置の直前、直後の見ないといけないので、実装が
  面倒?ということになります。
 
  尚、ここでの挿入のされ方は関係ないので、いったん網羅的に挿入の操作がどうであったか
  は横に置いておいて大丈夫なはずと理解しています  

 また βさんおコメントで

ここで、1行足りないことに気付いた。10_3 の下に 10_4 をつくりたい。

  このケースから
 10_3 
  11と続いていれば 10.3 と11.0の偏差は0.7 なら挿入行は6行まで 挿入できるので
 このルールに 偏差が0.1より大きいときは、上のように植木算のようにして 6行ま
 ではそのまま 桁数を下げないので 10_3 から 10_4 を得ることが可能。
 なので上述の(1)(2)に加えて(3)のルールとして追加
 
2.並び替えを踏まえたやり方

こういった場合、 順番はおかしくなりますが 10_4 として作成したほうが、理屈としてもわかりやすいのでは? 10 を元にして4番目に作成された行ですから。 並びがいやだということなら、並び替えを行えば済みます。

  並bi採用すると
 
 10
 10_1
 ・・・
  で 
 10
 10_1
  10_1 
 ・・・
 一時的に上記となっても、最終的に2番目の10_1_1から後ろの行の管理番号を改めて付け替えれば対応可能と理解しています

3. 並びかえから発想したアイデア
 挿入行の管理番号は、戻った時に管理番号がユニークであればよいので
 編集中でイベントを拾っている時には
 10

  10_1
 10_1
  11

  のように枝番は一時的に同じにしておいて、最後に 10_1に枝番を振り直します
 このロジックでは、管理番号につけ方には悩まず挿入があればあるだけ_1を加えます

 挿入の度 同じ枝番を使っておいて、ブックを閉じるとき、枝番を付け替えます

 この方法では、挿入された枝番号は 責余の管理番号を10としたら 10_1, 10_2 となる
 ので単純明快です

 
 とりあえず、今日はここまでです
 
 以上
(かず) 2016/04/22(金) 04:41


 出発前に、とりあえず書きこんでおきます。

 1.採番の考え方、掘り下げて記載いただいたものを、印刷して旅先で時間が取れれば読んで理解を深めておきます。
 2.ただ(否定しているのではなく)、結構難しい(と想像される)ロジックをいれてまで、この挿入採番を行ったとして
   その採番って、本当に有益なのか、逆にいえば、その採番されたものから、かずさんが(あるいは担当が)何を知ることができるのか。
 3.これは、今までにも繰り返しましたが、【目的】が何かということで、βが、そこを理解し切れていないだけなのかもしれません。
 4.当初の(というか、現在のコードの)採番は、それなりに、あぁ、こういうことがしたかったんだろうなと理解していました(間違っていたようですが)
   つまり、

   50 
     51
     52

     配布時に、こういったものがあったとして、かつ、配布時点の最大番号は 100 だったとして、回収時に

   50 
     60_1
     51
     70_2
     80_3_1
     52
     101

   こうなっていたとしたら、60_1 は 元々 60 だったものをコピーして50の下に挿入した。
   70_2 は、同様ですが、70 の行をコピーした。でも、その前に、どこかしらに70の行のコピーがあって、これは、その2回目のコピー。
   80_3_1 は、コピーして出来上がっていた 80_3 をコピーしたもの。101 は、コピーではなく空白行が挿入されてできあがったもの。

   こういった採番は、担当にとってはほとんど意味のないものだけど、これは、かずさんが回収後、なにかしら、この動きで管理したいポイントが
   あるんだろうなと勝手に解釈していました。(テーマが【挿入元の行を把握】でしたから)

 5.で、そういったことではないとして、では、この番号で何を管理したいのか?あるいは、この番号があれば何が(かずさんや担当に)有益なのか?
   それがわからなくなっています。

   50 
     51
     52  

   こうあったとして

   50 
     *1
     *2
     *3
     *4
     51
     52  

   こうなっていたとします。(*n は挿入の順番)この *n に対して振られた枝番から (かずさんや担当が)何を読み取ろうとしているのか?(何がわかりたいのか)

   さらに、上記の挿入4行が、空白行を4行一挙に挿入して作られたものだった場合と、
   1行ずつ4回(この順番で)挿入して作られたものだった場合とで、異なる採番にしなければいけないのか?
   それはなぜなのか?

   あるいは、挿入の順番が

   50 
     *1
     *3
     *4
     *2
     51
     52 

   だったとして、それは、↑の順番で挿入したものとは別の採番をしなければいけないのか?それは何のためか?

   ここがわかりません。要は 50 の下に(51の前に)配布時にはなかったものが、挿入されたとわかればいいのでは?と思ったりします。

   なんとなく、単に、採番列の番号が昇順であってほしい。そうじゃないと気持ちが悪いと、
   そういっているようにも思えます。

(β) 2016/04/22(金) 07:08


βさん

 コメントありがとうございます
 まず目的 ですが 2つのリストをマージするためです
 そして
 変更元の「リスト」の挿入行 と書いていると思いますが
 そこを読み飛ばされてしまって、運悪く 変更元の()挿入行と
 書いてしまったところを 読まれてしまったのかと思います
 

さらに、上記の挿入4行が、空白行を4行一挙に挿入して作られたものだった場合と、 1行ずつ4回(この順番で)挿入して作られたものだった場合とで、異なる採番にし なければいけないのか? それはなぜなのか?

 挿入された結果が昇順であればいいので、つまり挿入の操作はどうであったかは
 意識していないです。逆にどうしてそのように読まれてしまったか不思議です
 (失礼。すいません)

 各担当者から戻ったリストが複数あって、それを順に大元の
 リストにマージしていく際に、昇順というか枝番の形にしておか
 ないと、自分のマージ処理が単純にならないとは思うています

 以上
(かず) 2016/04/22(金) 08:19


 そろそろ出発しますのでとりあえずの最後の書き込みです。

 枝番が必要だとして(βは枝番は不要だと思っているのですが)並び替えて振り直してもいいというくらいなら
 BL列は1つ上の行の番号、BM列は COUNTIF(BL$1:BLその行,BM列の値)-1 という式をしれておけば、それでいいのではとも思います。
 結果が 0 なら 空白という IF制御をいれてもいいですが。

 >>逆にどうしてそのように読まれてしまったか不思議です

 元々が挿入元を何とか把握したいという要件が打ち出されており、また、一生懸命複雑な
 採番ロジックの提示があったからです。

(β) 2016/04/22(金) 09:34


元スレを見ていないし、管理番号とやらがどの列なのかもよく判らない(BL列?)ので、とりあえずA列に数字が入っているものとした採番例なぞ。
(会話ばかりだし、お二人のどちらの言葉なんだか判りにくくて読みにくいし…)

 【標準モジュール】
 Public iFlag As Long

 Public Sub sTimer()
    Dim i As Long
    Dim j As Long
    Dim iR As Long
    Dim iMax As Long
    Dim vw1 As Variant
    Dim vw2 As Variant

    If iFlag = 0 Then
        iFlag = 1
        Application.OnTime Now, "sTimer"
    Else
        With Sheets(1)
            For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
                If .Cells(i, "A").Value = "" Then
                    iMax = .Cells(i - 1, "A").End(xlDown).Row
                    If 9999999 < iMax Then
                        iMax = i
                    End If

                    vw1 = Split(.Cells(i - 1, "A").Value, "_")
                    vw2 = Split(.Cells(iMax, "A").Value, "_")
                    ReDim vw2(UBound(vw2) + 1)
                    For j = 0 To UBound(vw1)
                        vw2(j) = vw1(j)
                    Next j
                    For j = j To UBound(vw2)
                        vw2(j) = 0
                    Next j
                    j = j - 1

                    For iR = i To iMax - 1
                        vw2(j) = vw2(j) + 1
                        .Cells(iR, "A").Value = Join(vw2, "_")
                    Next iR
                End If
            Next i
        End With

        iFlag = 0
    End If
 End Sub

 【シートモジュール】
 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Columns.Count = Columns.Count Then
        Target.Resize(Target.Rows.Count, 1).ClearContents
        Call sTimer
    End If
 End Sub

しかしながら、独自に付ける管理番号なんて、シートを更新する人には無意味な値なんですよね。
行の内容を示すユニークなセルをキーにして、元と更新後の差異を太字等で表現する方が有効と思いますよ。
(???) 2016/04/22(金) 10:48


汎用化のため、管理番号列を定数に浮かせてみたのと、削除時は振り直さないように変更してみました。

 【標準モジュール】
 Public iFlag As Long
 Public iRMax As Long
 Public Const CC = "A"

 Public Sub sTimer()
    Dim i As Long
    Dim j As Long
    Dim iR As Long
    Dim iMax As Long
    Dim vw1 As Variant
    Dim vw2 As Variant

    If iFlag = 0 Then
        iFlag = iFlag + 1
        Application.OnTime Now, "sTimer"
    Else
        With Sheets(1)
            For i = 1 To .Cells(.Rows.Count, CC).End(xlUp).Row
                If .Cells(i, CC).Value = "" Then
                    iMax = .Cells(i - 1, CC).End(xlDown).Row
                    If 9999999 < iMax Then
                        iMax = i
                    End If

                    vw1 = Split(.Cells(i - 1, CC).Value, "_")
                    vw2 = Split(.Cells(iMax, CC).Value, "_")
                    ReDim vw2(UBound(vw2) + 1)
                    If UBound(vw2) < UBound(vw1) Then
                        ReDim vw2(UBound(vw1))
                    End If
                    For j = 0 To UBound(vw1)
                        vw2(j) = vw1(j)
                    Next j
                    For j = j To UBound(vw2)
                        vw2(j) = 0
                    Next j
                    j = j - 1

                    For iR = i To iMax - 1
                        vw2(j) = vw2(j) + 1
                        .Cells(iR, CC).Value = Join(vw2, "_")
                    Next iR
                End If
            Next i
        End With

        iFlag = 0
    End If
 End Sub

 【シートモジュール】
 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Columns.Count = Columns.Count Then
        If iRMax <= Cells(Rows.Count, CC).End(xlUp).Row Then
            Application.EnableEvents = False
            Cells(Target.Row, CC).Resize(Target.Rows.Count, 1).ClearContents
            Application.EnableEvents = True
            Call sTimer
        End If
    End If
    iRMax = Cells(Rows.Count, CC).End(xlUp).Row
 End Sub
(???) 2016/04/22(金) 12:51

???さん登場心強いです

なれないモバイルからレスしています
二つのデータの比較とのこと配布前と配布後のデータですかね

その目的なら何度かコメントしてますが枝番そのものが不要だとおもっていますがね
いずれにしても他の回答者さんのご意見も参考
にしながらすすめていってください

旅からもどったら解決ずみならいいですね。
(β) 2016/04/22(金) 15:12


私も最初に書いたように、比較目的で管理番号を付けるのは不要と思いますね。他にユニークなセルを使えば良いだけ。
ただ、この枝番の方法は、MS-Projectの採番とそっくりなので、工程管理に使えるかなぁ?、と思ってコーディングしてみた次第。

枝番を付けても、もし行削除ありの運用の場合、ごっそり削除後に行追加すると、前と同じ番号を使ってしまう可能性があります。
絶対行削除しない、無効フラグ等で対応、という運用にすればあり得ないのですが、この理由のため、比較用に使うのは反対するわけです。
(???) 2016/04/22(金) 19:00


???さん

 お世話になります。
 縁もゆかりもない私の悪戦苦闘ぶりを見かねて救いの手を差し伸べて
 くださる方が、βさんのほかにもいらっしゃったと思い、率直に驚いて
 います。
  
 そしてお時間をさいてサンプルコードを提供していただいたことに
 感謝しております。

 取り急ぎ、今お伝えしたいできることは以下の通りです
 
 ???さんお時間があるかづかわかりませんが、以前の経緯は[20160327131411]

  にあります。時間がなければ最初の説明の部分だけでも見て頂ければと思います
 
 βさんから指摘を踏まえて、いろいろと検討してきており、単にVBAのコード
 を書くか ということもありますが、作成したリストを配布したり、回収してまと
 めたりする運用のシナリオなども含めて検討しており、そこでいろいろな検討もれ
 などを発見しています
 
(会話ばかりだし、お二人のどちらの言葉なんだか判りにくくて読みにくいし…)

 それはそうでしょう。???さんの登場はまったくの想定外でしたから。
 

 ただ、参戦して頂いた以上わからないものはわからないと言って頂いて
 よいのですが、前の経緯は上で紹介したようにありますので、そちらを
 軽くでもいいので眺めて頂けると助かります。これってマナーですよね。

 それはさておき。
 率直に
「独自に付ける管理番号なんて、シートを更新する人には無意味な値なんですよね。 」
「行の内容を示すユニークなセルをキーにして、元と更新後の差異を太字等で表現する方 が 有効と思いますよ。」
 と大胆?に苦言を呈して頂いたのはありがたいです。
 
 ただ 行の内容を示すユニークなキーをセルにして云々は別途参考にさせて頂きます。

 赤の他人の私のために貴重な時間を使って頂いていることにはとても感謝しています

 尚一点お願いしたいのは、せkっかう提供頂いたコードを試したいのですが
 いきなりコードの羅列になっていてまったく説明がないので、意欲が失せてしまし
 ました。まずはβさんの質問に回答してから試させていただきたいと思います

 以上

(かず) 2016/04/22(金) 23:08


 こんにちは。
 回答ではありません。考え違いをしておられるようなので。

 まずは前スレへのリンクです。(うまくリンクになるかな?)
 [[20160327131411]]
 ならない;  じゃあこれで。無いよりはましだろう。
 http://www.excel.studio-kazu.jp/kw/20160327131411.html

 > ただ、参戦して頂いた以上わからないものはわからないと言って頂いて  
 > よいのですが、前の経緯は上で紹介したようにありますので、そちらを 
 > 軽くでもいいので眺めて頂けると助かります。これってマナーですよね。 

 一般社会のマナーはそうかもしれませんが、掲示板のマナーは違います。
 継続スレッドを立てたときは、立てたひとが(たいていは質問者ですが)
 過去の経緯と現在の状況をざっくり説明して、以前のスレッドへのリンクを張るのが
 QA掲示板の一般的なマナーです。

 質問者は一人、回答者は(潜在的には)100人。
 100人全員がどこにあるか分からないスレッドを探しだして長大なやりとりを読むより
 最初に要約をつけるほうが合理的、という理由が主です。 

 また、質問者が現時点でなにをどう考えているか、どこまで理解しているか
 いったんとめて明らかにしてそこから進めることができる利点があります。

( 佳 ) 2016/04/23(土) 08:52


桂さん
 
 コメントありがとうございます

 おっしゃっていることはわかります。
 ただ話題の内容や投稿者のニーズはさまざまですよねきっと。
 
 そもそも掲示板にマナーを求めてもとは思います
 自分が困っているから助けを求めるはいいとして
 も回答者の方に、私の考えるマナーを求めるは行き過ぎでしたね。 

 以上
 
(かず) 2016/04/23(土) 09:39


βさん

βさん

 ご指摘がいろいろあり少しづつ回答させて頂いていますが
 次の質問においついていない所があると思いますので
 少し振り返りをさせてください

a)まず採番について「矛盾なく実装可能」なルールを示さないと
 コード化の検討は難しいというご指摘がありました。

 またそ次の投稿で

 中略、コードとしてどうするか、それはこちらにまかせてください。  提示いただきたいのは計算ロジックではなく、様々なケースの、採番  のルール、これを網羅的に『言葉で』説明したものです。

 これについて、4/22 の私の回答で、いくつかの例を挙げて、採番の考え方
 を示しました。
 

 b)私の採番ルールは、当たり前ですが実数が分割可能なことに基づいているので
 一意性と順序性を保っていると思います。

c)「挿入」するまでの操作には いろいろなパターンがありうるという話があり
 それはそれで理解が深まったのですが、採番ルールの明確化ということが問題で
 と認識しています

d) a)の話が出る少し前までは 実装の視点で挿入行には、挿入された行の直前の行
  だけみて管理番号を当てればいいと私は気楽にいたのですが、それではだめな
  場合があることが判明しました。10と10_1の間の挿入行が10_0_1ならさらにその前
  に行を挿入する時は同じ番号かといった指摘です

e) ここで、挿入行の直前、直後の管理番号を見て挿入行の管理番号を決めるのはいいけど
  それhそれで面倒だという話になりました。そもそも昇順であることはなぜ必要かという
  ご指摘がありました

f) このあと、挿入された行の管理番号お実装については、実数がどうのということまで考え
  なく挿入されたことがわかりさえすればよく、後で管理番号を付け替えるとことでもいいと
  いう指摘もありました。この点基本的にはそれでもいいと思っています。 
  にもなくとも昇順た

f) なぜ昇順にこだわるかという点については、現状のリストのマージマクロでカバーできずに
  手作業を余儀なくされている際、片方のリストのある特定の行を他方のリストの適切な位置
  に順序性を守って挿入するはとても大変とう経験からで理由として十分な説明ができていま
  せんでした
 

4/22の私の以下の投稿

各担当者から戻ったリストが複数あって、それを順に大元の  リストにマージしていく際に、昇順というか枝番の形にしておか  ないと、自分のマージ処理が単純にならないとは思うています

  昇順の必要性というのは、何らかの理由でマクロ処理した結果を目で見て
 処理する時の管理のしやすさああると思います

 昇順性が保たれていないと
 多数の行のリストを上から見て行って
 
 10_1_4

  ・・・
  ・・・ この間が数十行あったらと想定ください
 ・・・ 
  10_1_1
 10_1_2
  10_1_3
  ここに行を挿入したい
 人間の目と注意力には限界がありますからここに単純に
 (COUNTIFとか使ってどうこうしなくても)
 確実に 10_1_4を入れたいと思ったら
 データを昇順にっしていくことがベターだと思います

 とりあえず今日はここまでです
(かず) 2016/04/23(土) 11:38


βさん、???さん、
 
 (参考)自分のコメントを見直していて誤りに気づいた点
 がいくつかありました。バラバラになりますが順次記します。

1.管理番号の採番ルール(その1)

 04/22(金) 04:41 の私の投稿で 採番ルール
 を考えている部分で 実数がいくらでも細かくできる
 ということをヒントに、管理番号について以下を記しました。

ここは実数が無限に細分化という、数直線のようなものをイメージして考えており ほんとうにそのようにするかは別として、理屈の上だけからいえば挿入行の管理番号 に小数点を与えればいいと考えていました。

つまり管理番号10 と 10_1の間に行が挿入された時、管理番号に何を振るのか の問題を、10と10.1 に間に等間隔にどれだけ数値がおけるのか、として考えます  
また挿入行が何行あるのかを考慮して、小数点の桁が変わります。 1行挿入なら 10と10.1 の偏差は 0.1  1行から9行までの挿入なら

9行挿入まで 10.0 < 10.01, 10.02, ・・・, 10.09 < 10.1

(1)直前と直後の行の管理番号を 数値と見なせして 「偏差」と考える  (2)そこに挿入する行数が10未満なら偏差を1/10、1桁さげて 直前の行に加えると 10.01, 10.02, ・・・10.09 挿入する行が100行未満なら 10.001, 10.002 ・・

 上記の 小数→実数そのままの管理番号だと見づらいので 枝番として  10_0_1とすると考えました。

   枝番形式の管理番号に変える時の場合分けは
 
 (1) 管理番号が10と10_1の間に行を挿入する 

   枝番を比較するために10は10_0と拡張
   直前の行の管理番号 10_0、
   直後の行の管理番号 10_1
   管理番号の(枝番の差)が1。枝番はこれ以上は分割できないと判定。
   挿入行は枝番のレベルを1つ下げて 10_0_1 から始める。
   この場合 挿入行の行数 は以下のように関係ありませんでした。(訂正) 

   直前行 10(→10_0) < 挿入行 10_0_1, 10_0_2, ・・・, 10_0_11・・・ < 直後行 10_1
   ちなみに 管理番号が 1O と 10_0_1 の間であれば
   枝番拡張10(10_0_0) と10_0_1 で比較
   枝番の差は1で分割不可で挿入行はレベルを1つ下げて

     直前行 10(10_0_0) < 挿入行 10_0_0_1, 10_0_0_2, ・・・  < 直後行 10_0_1

   (2)10_3 と10_5 (10_4が生成後 削除された場合)
   10_1と10_6の枝番の桁は同じ
   枝番比較するとその差は 5 挿入行は差ー1で4行までは直前行の最後のレベルの枝番をカウントアップ
   5行以上は レベルを1つさげて
   直前行10_1 (→10_1_0) < 挿入行 10_1_1 , 10_1_2, 10_1_3, ・・・ 

  (3)10_3と11 (10_3 が挿入行の最後)
   枝番お比較 10_3 と11なので比較のために 11→ 11_0

      枝番の差は 7 なので挿入行が6行までは直前行の最後のレベルの枝番をカウントアップ
    挿入行が7行以上あれば、枝番のレベルを10_3 から10_3_0へ1つさげて 
      直前行10_3 (→10_3_0) < 挿入行 10_3_1, 10_3_2, ・・・ < 11

 2.枝番の必要性について

 >で、そういったことではないとして、では、この番号で何を管理したいのか?あるいは、この番号があれば何が(かずさんや担当に)有益なのか?

  >それがわからなくなっています。

 2016/04/23(土) 11:38 に私が投稿した内容で、枝番が昇順になっていることの必要性を、マクロの代わりに人が目で見て処理をするケース
 の管理面であげました。現状では、デバッグの時と、マクロでリスト作成が完了してしまった後に、担当から追加修正が発生した場合などに
 あえてマクロを持ち出さなくとも、手作業で対応可能なので手で大元リストを修正してしまっていたりします。

 βさんの指摘には、そもそも枝番自体いらないのではとの指摘ありましたが私は違うと思っていますので、以下に説明します。
 
 ケース1 
  同じ配布先からの追加修正のリストが提出された場合です。

 1)担当Aのリストの管理番号を大元リストの管理番号に転記 
  ・・・しばらくして
 2)担当Aが先のリストに漏れていた案件を行収入した訂正版を提出
  
  このとき既に担当Aのリストは大元のリストに反映してしまっていると
  します。

  βさんの提案のように枝番ではなく挿入の印*だけだと、以下のような様相を呈しているはずです。

  担当Aの配布リスト 
  50

    *
    *
    *
  51
    52
  
  大元のリスト
  50
    *
    *
    *
  51
    52
 
  この状態で、担当Aからの追加のリストにある挿入行を区別するには 目で順序を見て
  大元リストにない行を発見するしかありません。

  もちろん、配布先リストに入れたイベントハンドラが有効に働いて、挿入行の先頭には★マークが
  付いていますがのでリストの全行を見るわkではないですが、挿入行にはすべて★マークが付いて
  いますから、★マークの付いたところを順に見ていくことになり、この場合のミスや手間を抑止
  するにに枝番、昇順は有用と思います。

    一方 枝番が昇順に振られていたら
  50

    50_1
    50_2
    50_2_1 2回目の挿入
    50_3
    51
    52

  尚、むろん1回目のリストで提出された挿入行をすべていったん捨てて、再度挿入し直す
  方法はあると思います。 しかしこれは追加の挿入行1行を処理するために、他の行まで
  修正することになります。 

 3.複数の担当者がリストの同じ部分に、行を挿入している場合

 例
  担当Aのリスト
  50
  50_1  50行目の後ろに2行追加
  50_2
  51

   担当Bのリスト
  50 
    50_1  50行目の後ろに3行追加
    50_2
    50_3
    51

  これを 担当Aを処理し、担当Bと順位処理する当然
  50

    50_1 ・・・担当B
    50_2  ・・・担当B
    50_1 ・・・担当A
    50_2 ・・・担当A
    50_3 ・・・担当A 
    51

    となってしまいます。この場合はそれぞれの担当者の情報は取り込みましたが、重複がないか
  チェックする必要が出てきます。
  
  つまり
  管理N0  timestamp           売上(K\)  粗利(K\)   担当
  50                 1,000        400 
 a) 50_1   4/24 10:00 10:10      500         200    B  ・・担当B提出リストから取込み
 b) 50_2    4/24 10:00 10:10        1,000         400   【A】 ・・担当B提出リストから取込み 
 c) 50_1   4/24 10:00 08:45        2,000         700    A  ・・担当A提出リストから取込み
 d) 50_2   4/24 10:00 08:45     3,000        1200    A  ・・担当A提出リストから取込み
 e) 50_3   4/24 10:00 08:45      1,000         400    A  ・・担当A提出リストから取込み
    51                            1,000         400

 注 タイムスタンプを押すタイミングは現状深く検討できていませんが、ブックをCloseするタイミング
   で同じタイムスタンプを押す想定。

 説明:
 ・上記 b)は、担当Bから提出された行から取り込んでいるが、実は担当Aの案件でこのままでは
  ダブルカウントされてしまう。
 ・担当Aと担当Bの間の認識の差を、まとめ者=私が常に察知して正しく補正することは無理。
  以下のように手作業でのチェックとマクロのチェック両面でチャックアウトする

 ・担当Bから提出された行に 担当がAとなっているものがないか、配布元リストをAutoFilterの結果で
  でチェック。
 ・配布元リストに行が挿入された時点で、管理番号の一部としてタイムスタンプを入れておく。
  
 ・大元リスト側のマクロ処理で
  50と51の間に枝番が振られている → 挿入操作が行われた、
  timestampに2種類がある     → 複数の人が同じ場所に挿入行を入れている
  

    timestamp毎に、担当をグループに分け、そのグループ内に担当が重複していないかをチェック
  し該当があればアラームメッセージを表示する

???さん

私も最初に書いたように、比較目的で管理番号を付けるのは不要と思いますね。 他にユニークなセルを使えば良いだけ。

 上記に述べたように単にリストを比較するだけでなく、配布先のリストから
 大元のリストを作成する運用を考えています。
 
 ExcelやVBAの範囲で考えており、DB的なデータ行に対して固定的な
 番号を与えることは困難ですよね。 他にユニークなセルを使えばよい
 と簡単に言われますが、現状のリスト自体にはユニークキーがなく管理番号
 をユニークなキーにしようとしています。 「ユニークなセルを使えば良いだけ」
 と言われますが、イメージされている前提や制約が違っているのではないか
 と思います。

枝番を付けても、もし行削除ありの運用の場合、ごっそり削除後に行追加すると、 前と同じ番号を使ってしまう可能性があります。

 私の理解では、同じ行番号を使うことになるのは問題にしていません。
 例えば
 配布先リストでは、挿入行の採番ルールが挿入された行の直前、直後の管理番号から
 生成されるので
 50
 50_1
 50_2
 ・・
 51
 ここで挿入行をごっそり削除して
 50
 51
 52
 という管理番号に戻ります
 ここで50と51の間に挿入される行は50_1, 50_2、・・・です

 おそらく、???さんのご指摘を私が理解できていないのだと思います
 何を気にして頂いているのか、教えてください

 >絶対対行削除しない、無効フラグ等で対応、という運用にすればあり得ないのですが、
 すいません。このコメントも理解が追い付いていません。
 私のケースに当てはまりそうなら解説頂きたいです。直接当てはまらないなら
 後学のために教えてください

 
 長くなりましたが、ここまでが新たに検討した点です。取り急ぎ報告します
(かず) 2016/04/24(日) 13:24


かずさんの目の前にあるデータが、私の目の前には無いのですよ。だから、何が最適なのかは私には判りません。ご自分で判断してください。

行削除の懸念が判らない、というならば、問題ないのでしょう。読み飛ばして良いです。視点を教えただけです。

やりたいことは、比較元のシートと最新のシートを比べて、変わったところが判るようにしたい、なのではないかと読みました。
本文のような長い文字列をユニークな列としても良いのですよ? とにかく、普通は毎回は変えない列って、ありませんか?
売上、ということは、部門名とか商品名とか、項目名があるはずですよね? それはキーにならないのですか?
1列だけではユニークにならない、というならば、たとえば売上月と商品名の2列を使えばユニークになりませんか?
もし変わらない列があれば、番号なんて不要だよね、ということを言っているだけですよ。
(???) 2016/04/24(日) 15:40


???さん

 コメントありがとうございます
 

本文のような長い文字列をユニークな列としても良いのですよ? とにかく、普通は毎回 は変えない列って、ありませんか? 売上、ということは、部門名とか商品名とか、項目名があるはずですよね? それはキー にならないのですか?  そもそも 現状、商品区分、プロジェクト名、担当名を 複合キーとして比較してい
て、それらが表の中で最も変更頻度が少ないのですが、それらでも完全に固定化できない
です。???さんお環境ではそういうことは考えにくいのでしょうね

 案件名も時に応じて変わりますい担当も変わります。また文字列をキーにしている
ので括弧の半角全角などの違いでもキーがアンマッチになり誤りが発生しやすいのです

 ???さんから見たら私の環境は特殊な環境なんでしょうね。こればかりは
 致し方ないですね(苦笑)

 以上 
(かず) 2016/04/24(日) 16:27


 >現状、商品区分、プロジェクト名、担当名を 複合キーとして比較していて

あるじゃないですか、キーに使えそうな項目が。 全然特殊じゃないですよ。 その組合せで、前回分と比較すれば良いのでは?
担当者がプロジェクト名を書き換えて一致しなくなったならば、それは変更ありと判定するだけです。
キーが変わっていなければ、数字等をセル単位で比較して、違いを強調すれば良し。キーが一致しなければ、
1行丸ごと強調してしまえば良し。そういう比較マクロを作るだけで目的は果たせるのではないかと思うわけです。

でもって、やっぱり駄目だ、枝番必須、と言われるのでしたら、私の挙げたマクロを使ってみればよろしい。
使いもしないでぐだぐだと文句ばかり言われるのは心外ですよ。
(???) 2016/04/25(月) 09:16


???さん

せっかくおっしゃっていただいているのに申し訳ないです。
まずご指摘頂いていることについては本当に感謝しています。
本当に。

取り急ぎ、ご指摘に対する検討結果から。

端的には???さんがご指摘の複合キーの組み合わせで2つのリストで一致させる
ような方式は、すでに試し済みなのです。 私の文章力が不足していて誤解させて
いたらすいません。

私が教訓と思っているのは、2つのリストをぶつけるのに文字列を使うのは、キー
になる文字列が本当に動かないものでないと使えないと思っています。

ここのあたりは、お互いの実務の状況が違うとなかなか理解しにくい点だと
思っています。ちなみに行の更新はキーが一致している行がDBのように
その機構で保障されているなら簡単ですよね
でも私の職場ではそんあ機能をExcelに入れ込んでいないので、各担当が
、行を更新するし、行を挿入します。

ちなみに変更元のリストに行が挿入されたら、それを相手のリストの挿入位置
を決めるには、元のリストの挿入行の1行前の行のキーを使っていますが、
直前の行が簡単にいうとタイトル行であったり小計の行であったりすると、コピー
先には、該当する行が複数存在します

私が処理の対象にしているのはそういう、実務にべったり依存したリストといいうか
帳票です。それは私の一存で勝手には変えられません。

なので、おそらく???さんお考えているものが比較的シンプルなリストで、それ
を前提にされているので話が合わないのかなと思ったりしています。

私の職場では、ユーザが入力してくるリストに入力してくるセルの内容は
同じ人の同じ案件の文字列が毎月本当に微妙にずれてくることもざらですね。

毎月送られてくるリストの修正対象行数 が5〜600行、項目数は1行あたり
50項目あります。キーで比較すればいいと言いますが、入力される文字列の
使い方のゆらぐのは仕方のないことですが、毎月5、60件程度に上ります

そうった面倒があるので、文字列での比較を捨てて、ユニークなキーとして
管理番号とかを考えており、そこから挿入行を管理するためのテクニックを
考えているわけです 

キーが変わっていなければ、数字等をセル単位で比較して、違いを強調すれば良し。 キーが一致しなければ、1行丸ごと強調してしまえば良し。そういう比較マクロ を作るだけで目的は果たせるのではないかと思うわけです。

問題にしているリストには、調子よく整備されたユニークなキーがないのです
なので、キーが変わっていないならラッキー。キー項目のデータを変える時は
それに応じたマークとして行の1列目につけることがルールになってしたのですが
徹底できないのです。(悪戦苦闘ぶりが伝わったでしょうか)

また???さんは、2つのリストを比較すると思われていますが
2つのリストをマージして正しいデータにしています。ちなみに
数字等をセル単位で比較 と言われますが、私の職務においては、数字とは
お金でのことです。案件にかかわる売上や、原価などを管理しているので
慎重にあつかわなえればならないです。

率直に言えば、おそらく???さんの想像は、実務ではなく
単にVBAのマクロのテクニック議論しているのでは、と思ってしまいます

尚、???さんに作って頂いたサンプルコードの件、今今連休前で実務が忙しくて
マクロを組んでいる時間がないので、連休中に拝見させて頂きたいと思っております

以上

(かず) 2016/04/26(火) 00:46


こんにちは。佳です。
かずさんにはもうしわけありませんが人偏の佳です。

なにもしなければ、入力担当が好き勝手な入力をするのは当たり前じゃないですか(笑

ちゃんとしたデータを入力してもらっているひとは、
そうなる環境を、言えば、歯を食いしばって構築してきたひとです。
ルールを明示しお願いをしお願いをしお願いをしお願いをしお願いをし
なんなら権威を使い、あればツールを使い、なければ自分で作ってでもツールを使い
頭を使い心を使い、
(前任者ががんばっただけというばあいもありましょうが、まあまあ。。。)

複雑なことをしたがるかたはたいてい「ウチは特別」とおっしゃって
川の下流での対策を求められます。上流は放置です。
まあ、それが普通ですわな。

かずさんは並のひととは違うってところを見せて欲しいものだと思っています。

( 佳 ) 2016/04/26(火) 07:02


 旅から戻りました。

 このトピが、なかなか進行しない1つの理由として、要件-->仕様-->実装 ののうち、
 要件が、かずさんから まとまってかたちで提示されていないということがあるんだろうなと思っています。

 前トピでは、質問タイトルと提示仕様からβが要件を推測して取り組みましたが、結果としては、その要件は間違っていたわけです。
 で、この継続トピでも、正しい要件はこうだという説明は、いまだありません。要件は、かずさんの頭に中にだけあって
 提示されるのは、枝番が必要だから割り振らなきゃいけないという 仕様だけですね。
 しかも、仕様といっても、かなり実装に近いレイヤーの、これを割るとかかけるとか。

 Q/Aサイトでは、要件抜きで仕様からはいるケース少なくないのですが、本件は、要件をクリアにしたほうが
 解決が早いと思います。

 要件が不明なので、そもそも枝番が、どうあるべきかが回答側では、わかりません。
 必要なのか? 必要だとして、採番されたものは、変更してはいけないのか、振り直してもいいのか、昇順じゃないといけないのか
 どちらでもいいのか、あるいは、枝番は不要?

 βは(おそらく、???さんも)枝番は不要ではないのかなと思っています。
 ただし、要件がわからないので、この判断も正しいかどうかわかりません。

 配布前に管理番号 50 というデータがあったとします。

 空白 aaaa 50

 回収時 パターンA

 空白 aaaa 50
 ★  aaaa 50 かずさん提示仕様による枝番付加
 ★  aaaa 50 かずさん提示仕様による枝番付加
 ★  aaaa 50 かずさん提示仕様による枝番付加

 回収時 パターンB

 空白 aaaa 50
 ★  aaaa 50 枝番として 1 をセット
 ★  aaaa 50 枝番として 2 をセット
 ★  aaaa 50 枝番として 3 をセット

 回収時 パターンC

 空白 aaaa 50
 ★  aaaa 50 枝番なし
 ★  aaaa 50 枝番なし
 ★  aaaa 50 枝番なし

 上記の パターンAでなければいけない理由を、パターンBなら、このような要件が満たされない、運用上、こんな支障がある。
 パターンCだと、このような要件が満たされない、運用上、こんな支障がある。

 こういった観点で教えていただけませんか?

(β) 2016/04/27(水) 06:09


 もう1つ。

 前スレ、この継続スレ通して、【行削除】に対する扱いがあいまいになっています。
 かずさんからは、【削除はしない。失注というコメントを記載する】という説明がありました。
 提示済みのコードでも、行削除の場合は何もしないで抜けています。

 ただ、2016/04/24(日) 13:24 で、いきなり、【ごっそり削除された】というコメントが登場。

 ここも、ますます悩んでしまう部分ですね。

 要件の整理提示に加え、担当側での操作手順も含めて、一度、立ち止まって、少し整理されてはいかがでしょうか?

(β) 2016/04/27(水) 06:17


 今朝の一連のβのレス、かずさんが勘違いされるかもしれないので念のため補足です。

 たとえば、回収した際に

 Aさん分

 空白 aaaa 50
 ★  aaaa 50 _1
 ★  aaaa 50 _1_1
 ★  aaaa 50 _2

 Bさん分

 空白 aaaa 50
 ★  aaaa 50 _1
 ★  aaaa 50 _1_1
 ★  aaaa 50 _2

 こんなことはありえないといわれるかもしれませんが、あるかもしれません。

 で、回収後にかずさんが新しい大元リストをどのように作るのか、そのデータの採用ルールが不明ですが
 おそらく、この 50 番については、Aさんが責任者なので、Bさんから送られてきたデータは無視。
 新しい大元リストには Aさん分のみを反映させよう。こうしておられると思っています。

 で、Aさんから、1行漏れていたということで、

 空白 aaaa 50
 ★  aaaa 50 _1
 ★  aaaa 50 _1_1
 ★  aaaa 50 _1_1_1
 ★  aaaa 50 _2

 これが再送された。すなおに、50番全体を削除して、新しくAさんから送られてきた 50番全体を挿入したらいいのではと思っています。
 どうしても、 ★  aaaa 50 _1_1_1 の1行だけを挿入したいんだと、こだわる必要はないと思っていますので。

 逆に、50番に対する追加挿入が、とびとびに複数行あったとした場合、これは、前と同じ、これは新しい枝番、これは前と同じ、これは新しい枝番・・・
 と、目で見ながら1行ずつピックアップして挿入するほうが、手間が大変ですし、間違いも多いと思いますよ。
 総入れ替えが一番確実で、しかも手間がかからず早い処理でしょう。

(β) 2016/04/27(水) 06:41


 (β) 2016/04/27(水) 06:17 で、

 >>要件の整理提示に加え、担当側での操作手順も含めて、一度、立ち止まって、少し整理されてはいかがでしょうか?

 と提言しました。行削除以外に、

 ・別の行(1行あるいは複数行)を コピペで上書きする。
 ・行(1行あるいは複数行)を選んでクリア(Deleteキー)する。

 これらについても、当方からコメントしましたが、その扱いをどうするかが(禁止することも含めて)
 あいまいになっています。ここも整理お願いします。

(β) 2016/04/27(水) 11:43


βさん
 返信遅くなりました。

このトピが、なかなか進行しない1つの理由として、 要件-->仕様-->実装 ののうち、 要件が、かずさんから まとまってかたちで提示されていないと いうことがあるんだろうなと思っています。

 まず要件について。 このトピがなかなか進行しないのは
 申訳ありません。
 
 要件は、今時点で振り返って書いてみます。段階的に検討を
 進めていくことなので、徐々に明らかになってきました。
 

1.要件 ⁻ 概要

  最初の投稿
[20160327131411
http://www.excel.studio-kazu.jp/kw/20160327131411.html 

***************

 1.業務要件
(1)建設プロジェク(=案件と呼ぶ。)の案件名、担当社、売上、利益
 などを1行にまとめて月次でメンテしています

(2)大元のマスタリストがあり、それを月に一回、10人の担当者に配布。
担当者は自分の担当案件の追加や、案件の売上や利益の変化を、配布
された表に記載して返信。

(3)各担当から返信されたリストを大元のマスタに反映させています

2.担当者が案件情報をリストに反映する際の記載ルール

▼(更新):
リストの各行に対し変更ががある場合、行の1列目に▼印をつける。

 削除は行削除ではなく、案件の進捗を示すセルを用意して、
 失注として表す。リストの行の削除は考慮不要。

★(挿入):
リストに対し、案件=行を追加する場合1列目に★印をつけて、行
ごと追加する

 2016/04/01(金) 08:09 の投稿

***************

 やりたいことは
1.挿入と更新があった時、★と▼を1列目につける
 ・現状このマークを拾って別のリストとのマージ処理を行っているが
  記載ミスが多いのでイベントで拾って入力を補正したい

 ・2つのリストの突き合わせとは 大元のマスターのリストを担当者
  に配布し、それを突き合わせるという意味。 

  現状は 突き合わせるキー情報はリスト中の情報を使っており、キー
  が変わる場合に対応するユーザには変更前のキー情報を備考欄に書いて
  もらっておりミス多い

 ・大元のリストの作業列にキー情報を書いて置き、それを配布し
  そのリストで変更された行は、もとのキー情報を保持し、挿入行には
  枝番のようにして挿入された行とわかるようにしたい

2.2つのリストの突き合わせの運用について

 (1)最初に各担当者から、担当案件の関するリストを回収し大元リストを作成

     以降は月次で以下を繰り返す
 (2)大元のリストを各担当に配布する このときシートには何の印もなく
   管理番号も1から順に振られています
 (3)各担当がリストに挿入や変更を加えます、その際挿入★や変更なら▼を
   つけて返す
 という点。

 **** βさんの質問 2016/04/06(水) 09:47

 レス遅れごめんなさい。

 なんとなくわかった部分もありますが、もう少し質問させてください。

 1.まず、各担当に配布する大元リストでは、もう ★も▼もなく、追加された行という識別も不要で
   単純に、そこに100行あるとすれば、それぞれの行は、独立した1件1行で、その識別番号をどう持たせるかは別にして
   毎回、先頭から 1,2,3,4,・・・・,99,100 というイメージですね?

 2.その100行ある大元リスト ですけど、配布前のデータそのものは、どのように作るんですか?
   1)どこかのデータからコピペ?
   2)返送された各ブックを参照しながら かず さんが 手作業で切り貼りして整理したもの?
   3)あらためて、空白の大元リストに かず さんが 100行 手入力?

 3.上記とも関連しますが、その 大元リスト って、このマクロが仕込まれたブック?
   もし、そうであれば、上記作業 1)、2)、3) いずれであれ、そこで イベントが発生して、
   配布先で発生する自動処理が実行されてしまいますが、そこは、どうしているんですか?

 このあたり、具体的にどうされているのか、教えてください。
 
 ***** βさんの質問への回答 2016/04/06(水) 17:51 

 1. そうです。最初は普通に1から順に100まで
ユニークに振るものと思います。

2. 大元のリストは、各担当が提出したものです。

    リストのやり取りは月に1回いかのように
    しています。

先月各担当から集めた複数のリストを
私が現状のマクロで1つのリストにして
おり、そこには元々の各担当がつけた
▼や★マークが残ってます。当月に
それらのマークは全て私が消します。
これで大元のリストができあがります。

3. 考えていたマクロは、リストを
マクロ(-イベントハンドラ)付きExcelで配布
して、入力時のマークの記載漏れを
なくせばよい、と自分が編集する時のことを
考えていました。

ご指摘でその点の考慮不足を気付くことができ
ました。ありがとうございます。結果、
1)配布先には入力内容を
監視し、かつシーケンシャルNoを
保持するマクロをリスト本体と一体化
して配布する。

2)
回収したリストを私が編集して大元の
リストを作る時は、リストに含まれる
マクロは切っておきます。

そして現状マクロでは、1列目の▼や★を
見つけたら特定の列を複合キーとして
各担当のリストと大元のリストを突き合わせ
ていた部分は、シーケンシャルNoを使うよう
にできると思います。
本来は、シーケンシャル実際はシーケン
シャルではないので管理Noとでも呼ぶ
ことにします。
この管理Noがあれば、理屈上は★とか
▼は不要でしょうが、実際にはマークの
方が利用者は簡単に扱えると思います。

** βさん回答 2016/04/06(水) 22:25

 処理のシナリオに関する提案というか、このようにしたらいいかなと思っています。

 1.各担当サイドの作業を考えると、やはり、大元リストのあるブックに今回のマクロを仕込みます。
 2.げん さんサイドの作業としては
  1)回収した担当者ブック(マクロ付)を1つのフォルダにいれておいて(したがってブック名は何らかの工夫をしてユニークにしておく必要がありますが)
  2)これらを統合して、1つのマクロなしブックを作成。(これは、別途の新規マクロで実行)
  3)このブックはマクロなしですから げんさんが、好きなように、次回用大元リストとして変更可能です。
  4)で、げん さんの手元にある マクロ付大元リストブックで、3)で、できあがったシートを マクロ付大元リストブックのシートに上書き。
    これも新規マクロで、仕掛けてあるイベントが発生しないような処理をします。
  5)このときに、新たな連番を振ります。
  6)これを配布します。
  7)次の作業としては 各担当再度での作業の結果を回収し 1)からの作業の繰り返し。

3.各担当者へ配布するリストは担当者別に絞り込むまず、大元のリストをそのままリスト全体で配布。
 
 **** βさん  2016/04/07(木) 09:21

・想像ですけど、たとえばAさん用には 1〜40、Bさん用には 41〜60、Cさん用には 61〜100 といったような  データなんだろうと思います。 (かならずしも、個人別に連続しているわけではないとは思いますが) ・で、このリストを、それぞれの担当者分のみにして、送付するのか、そのまま 他の人のデータも一緒に 送付するのかわかりませんが  おそらく後者? ・だとすると、回収したブックに、同じデータが、それぞれあるわけですね。 で、そのなかで、取り入れ なければいけないデータは、Aさん用のデータなら Aさんから送られてきたブックのデータですね。

 ****  私の回答 2016/04/12(火) 03:05 抜粋

  はい、そのまま送っています。本当は個人別に送ってあげたほうが良いのですが
 面倒なのでしていません。
 理由の一つは、このリストはプロジェクトいわゆる案件 売り上や粗利とそれを
 構成する商品や担当者、その案件の進捗度などを記録しています。
 
 リストを返信するのはプロジェクトの全体に責任を持つ担当者なのでリストは
 プロジェクト単位で見たほうが理解しやすいので、同じプロジェクトを構成する
 商品やシステム構築の進捗度が不ぞろいになっているのは本来おかしいなどと
 としてみています。 

 そんなわけで一般的、全体としてはこのリストにはある担当者があちこちに出て
 きていて1〜30行は Aさんのかかわる案件、31〜60 はBさんがかかわる案件
 とはなっていないです

 βさんがいみじくも指摘していただいていますが、Aさんから帰ってくるデータ
 はAさんの関わる案件のデータのことが多いが、Bさんの関わるデータも含まれて
 います。
  
 詳細省略しますが  βさんの 2016/04/12(火) 09:48 質問 私の回答 2016/04/13(水) 06:31
 を通じて、実際の運用としては、個々の各担当者にリストを配布する、回答としては 例えば
 あるチームのリーダがメンバである各担当者の分の回答分も合わせて回答してくることがある
 
 (補足)
 現状では 私が配布先から戻ったリストを大元リストにマージするマクロを実行した結果を目で
 見て、問題ないか検証しています。

4.マクロを使えない、使いたくない人に対する考慮  2016/04/06(水) 04:54

 利用者によっては自分の好きな入力方法を選びたい、入力ミスは目でチェック

  すればよいというひ人や、私のマクロが不具合でエラーとなった場合には
  マクロは停止して、マクロの影響をうけない方法で入力する方法も残して
  おく。
 
 ****  βさん回答 2016/04/16(土) 15:43 

  こういった要件がありましたね。

  標準モジュールに

  Sub 手作業だけ()

    Application.EnableEvents = False
  End Sub

  こんなコードを用意しておいて、希望する人は、ブックを開いた後、これを実行。

  このあと、エクセルを終了させるまでは、一切のイベントが発生せず、自動処理は行われません。
  
5.行の削除について
 
 βさん 2016/04/27(水) 06:17

 前スレ、この継続スレ通して、【行削除】に対する扱いがあいまいになっています。
 かずさんからは、【削除はしない。失注というコメントを記載する】という説明がありました。
 提示済みのコードでも、行削除の場合は何もしないで抜けています。

 行削除とは案件の失注であり、案件が失注したなら失注したことを、案件の状況の変化として
 報告してもらうことが必要なのです。業務要件です。

 失注になった報告は、見込んでいた売り上げ望めないということなわけで担当者は報告必須と
 認識していて案件の変更 ▼印を1列目に記載し、失注と報告されます。

 現状のリスト突き合わせマクロでも新しく作成つつあるマクロでも▼印を標識にしてその行を
 処理します。

 また、これは行削除の時はまずないのですが、仮に担当者がある行を修正したのに▼マーク
 をつけ忘れたとすると、現状のマクロは修正された行として▼や★の目印を拾って処理をしている
 ために、そのままでは▼や★のマークのつけ忘れは検知できません。

 そのため、現状ではマクロが担当Aの変更元リストを大元リストに反映した場合、担当者Aを条件
 として つまり▼や★があるもの、ないものを合わせて、担当者Aとしての全案件の行として
 変更元のリストとマージ後のリルトで、売上等を比較しています。

 ここで▼や★マークが付いていない行が、変更元リストで変更されてしまっていると、その行は
 本来変更がないのですから大元リストの内容と合致しているはずなのに、修正だけされてマーク
 がないので、その分が差異となって現れるので修正ミスを検知できます

 もし行削除されてしまっていたら、当然マクロはその行を処理しませんが、マクロ処理後に
 担当者Aで 変更元リストと大元リストを比較すれば 行削除を検知するのでそこで検知できます

 これを今後のマクロでもマージ処理後の検証処理として入れておこうと思っています。

 もうひとつ。べーたさんからの質問 2016/04/27(水) 06:17 

ただ、2016/04/24(日) 13:24 で、いきなり、【ごっそり削除された】というコメントが登場。

ここも、ますます悩んでしまう部分ですね。

 説明わかりにくくてすいません。ここは行の削除が行われた後の行挿入された場合に、管理番号は
 同じ番号を使うのか という文脈です。
 
 変更元リストに対して行われた操作の最終的な結果が、回収されて大元リストに反映される時に
 どこに挿入されるのか分かるようにしておくという話です

 変更元で 
 
 いったん行が挿入された。その際に管理番号が付与された。
 こんどは行が削除された。そのために管理番号も消えてしまった。

 もしここに再度、行を挿入するなら管理番号を付与しないといけないので
 その時、挿入する行の管理番号は、直前の行と直前の行とで決めるなら
 先に作成した管理番号をもう一度付与する。 と考えています。     

6.別の行(1行あるいは複数行)を コピペで上書きする。

 **** βさんからの質問  2016/04/27(水) 11:43 

  ・別の行(1行あるいは複数行)を コピペで上書きする。

  この場合、1行であれ、複数行であれ、大元リストに存在していた行に対する変更であれば
 1列目に▼をつける。管理番号はそのまま。

 ただし、挿入した行に対して、コピペして上書きされた場合は、大元リストに対しては挿入と
 して扱う必要があるので、そこは挿入時につけた★印は変えない。

 コピペで、担当者にとっては編集上必要では禁止できないと考えます。

 **** 私からの回答 2016/04/19(火) 08:03
 
 ★挿入行に対し更新が発生した場合は、▼にせず★のままにしたいです。

 行の削除はタブーと認識されているので、操作禁止は不要と考えています。
 本当は、操作禁止を強制したいですが、行削除されてしまっていたら大元
 リストとの突き合わせ検知できるので。

7.担当Aと担当Bの挿入の重複

 **** βさんの質問 2016/04/27(水) 06:41

で、回収後にかずさんが新しい大元リストをどのように作るのか、そのデータの採用ルールが不明ですが おそらく、この 50 番については、Aさんが責任者なので、Bさんから送られてきたデータは無視。 新しい大元リストには Aさん分のみを反映させよう。こうしておられると思っています。

  この場合は、担当Aからのリストも担当Bからのリストも大元リストに反映させています。
 担当Aと担当Bがともに 同じ行の後ろに行をす入しようとした場合

 Aさん分

 空白 aaaa 50
 ★  aaaa 50 _1
 ★  aaaa 50 _1_1
 ★  aaaa 50 _2

 Bさん分

 空白 aaaa 50
 ★  aaaa 50 _1
 ★  aaaa 50 _1_1
 ★  aaaa 50 _2

 の時、担当Aさんの挿入行に対しては、直前の行 =管理番号 50の行の
 後ろに 3行追加したい ということなので、担当Aの処理を行った後、
 担当Bが 上のようなストを送ってきたら、それは担当Bの行は
 担当Aの行の前に追加されます。

  Aさん分

 1列目   管理番号 説明

  空白 aaaa 50
  ★  aaaa 50 _1    ・・・担当B
  ★  aaaa 50 _1_1 ・・・担当B
  ★  aaaa 50 _2  ・・・担当B 

  ★  aaaa 50 _1  ・・・担当A
  ★  aaaa 50 _1_1 ・・・担当A
  ★  aaaa 50 _2  ・・・担当A

 となります。担当Aの分も担当Bの分も直前の行の後ろに正しく
 挿入されています。

 要件としては、担当Aの案件の挿入=案件の追加、担当Bの行の
 挿入=案件の追加であり、どちらも取込むです
 
 変更元リストの大元リストへ反映について、どこまでの仕様及び実装としては
 
 仕様としては、この状態は管理番号が一意になっていませんが、
 次の月に配布する前は、大元リストを1から順に採番し直して
 一意になるようにすればよいと思っています。

 8.枝番の必要性

 βさんの質問 2016/04/27(水) 06:09

上記の パターンAでなければいけない理由を、パターンBなら、このような要件が満たされない、運用上、こんな支障がある。  パターンCだと、このような要件が満たされない、運用上、こんな支障がある

**  私の 回答 2016/04/23(土) 11:38

 
  昇順の必要性というのは、【何らかの理由でマクロ処理した結果を目で見て
 処理する時の管理のしやすさああると思います】

 昇順性が保たれていないと多数の行のリストを上から見て行って
 
 10_1_4 

  ・・・
  ・・・ この間が数十行あったらと想定ください
 ・・・ 
  10_1_1
 10_1_2
  10_1_3

 ここに行を挿入したい
 人間の目と注意力には限界がありますからここに単純に
 (COUNTIFとか使ってどうこうしなくても)
 確実に 10_1_4を入れたいと思ったら
 データを昇順にっしていくことがベターだと思います

 で説明しているつもりでしたが、説明不足だったかもしれません。

 私としては、このマクロを私でない人がエンハンスするとしたら
 エンハンスの結果が正しいことをテストしてみる結果があるでしょう
  
 また、何らかの原因で不具合が発見されて原因究明中で、原因究明は後回し
 でいいから大元リストに手作業で対応できる程度の修正を加えたいような
 状況が多いので、その場合に目で見て確実に修正を加えたい。

 という状況を想定しています

 要するに 変更元リストを単純に大元リストにマクロで反映するだけなら
 ★印の直前の行の後ろに順に行を追加するだけで枝番も不要でしょう。

 異なる点は、パターンCは 変更や挿入を大元リストにマクロで反映した
 その後の人間の作業が手間が少なくするという点からの必要性を認識しているか
 です。

 例題のように該当担当者が1人で挿入行がたった3行しかない場合は問題ないで
 すが、実際には、挿入行が多い人では50件以上の案件を追加があり、案件名など
 で目で見て判断していますが、案件名などは文字で行を識別して行の挿入位置など
 決めるのは誤りや手戻りの元と考えています。
 例
 【XX案件】システム基盤(1Q)
 【XX案件】システム基盤(2Q)
 【XX案件】システム基盤(1Q)(追加)

 
  次に パターンBについて 担当者Aから提出されたリストを処理した後、担当者B
  の提出したリストBを処理すると 以下のようになります
 
  50_1 ・・・担当B

    50_2  ・・・担当B
    50_1 ・・・担当A
    50_2 ・・・担当A
    50_3 ・・・担当A 
    51

    ここで、担当者Aは担当者Aの案件の行についてだけ申告する、担当者Bは担当者B
  の分だけとならないために、以下のようなケースが発生する可能性があります。

  現在は、この点はマクロで処理することは諦めて、私が目で担当Aと担当Bから提出さ
  れた案件の重複をチェックしていますが 担当Aや担当Bに重複がありそうか否かは
  経験値と前月までの結果を参考にしており曖昧さが残ってしまいます。

  それが パターンBは現状の問題点をそのままなために改善したいと考えています
    
  
  管理N0  timestamp   売上(K\)  粗利(K\)   担当
  50               1,000  400 

 a) 50_1   4/24 10:00 10:10      500         200    B  ・・担当B提出リストから取込み
 b) 50_2    4/24 10:00 10:10        1,000         400   【A】 ・・担当B提出リストから取込み 
 c) 50_1   4/24 10:00 08:45        2,000         700    A  ・・担当A提出リストから取込み
 d) 50_2   4/24 10:00 08:45     3,000        1200    A  ・・担当A提出リストから取込み
 e) 50_3   4/24 10:00 08:45      1,000         400    A  ・・担当A提出リストから取込み
    51                            1,000         400

 注 タイムスタンプを押すタイミングは現状深く検討できていませんが、ブックをCloseするタイミング
   で同じタイムスタンプを押す想定。

 説明:
 ・上記 b)は、担当Bから提出された行から取り込んでいるが、実は担当Aの案件でこのままでは
  ダブルカウントされてしまう。
 ・・・

 そのため B) のような行を検知するための情報が必要だと考えています。timestampが必須か、最適か
 はもう少し検討が必要とは考えます。

9.挿入行に対する追加修正時

  βさん指摘 2016/04/27(水) 06:41

  逆に、50番に対する追加挿入が、とびとびに複数行あったとした場合、これは、前と同じ、これは新しい枝番
  、これは前と同じ、これは新しい枝番・・・ と、目で見ながら1行ずつピックアップして挿入するほうが、
  手間が大変ですし、間違いも多いと思いますよ。
  総入れ替えが一番確実で、しかも手間がかからず早い処理でしょう。

  私の回答  2016/04/24(日) 13:24

  尚、むろん1回目のリストで提出された挿入行をすべていったん捨てて、再度挿入し直す
  方法はあると思います。 しかしこれは追加の挿入行1行を処理するために、他の行まで
  修正することになります。 

  (補足)  

  この点は、ご指摘の処理が、もし人間が目で見て行うのでしたら、大元リストに反映済みの挿入行をいったん削除
  して、再度追加行も含めてマクロで挿入することになると考えます。この時、担当者Aから大元リストに挿入された
  リストはいつも一か所で、行数も少ないとは言えないですよね、その時に確実にそれらを人間が目で見て処理をする
  時、枝番があって昇順になっていないと、変更元のこここからここまでの行を、大元リストのここからここまで削除
  してというように、処理するときにやはり枝番などの有用性を裏付けになっていると考えます

  
  取り急ぎ 以上です
 

 
(かず) 2016/04/30(土) 03:40


 言葉の遊びをしているわけではありませんが、今回のかずさんのレスも【仕様】中心の説明ですね。
 何かの要件があって、それを実現するためには、こうこうしたいという、【仕様】です。

 仕様にもいろんなカテゴリーがあって、【運用仕様】なんてのもあります。
 締め日があって、そこで回収したら、もうおしまいとか、1回だけは再送可能とか、いやいや、元がこういう要件だから
 いつなんどきでも変更があればいつでも再送可能とか。
 再送可能でも、再送時には変更のあった部分のみを送るとか、全部、再送するとか。
 【レイアウト仕様】というカテゴリーもありますね。こういった仕様を維持するためには、このセルは保護とか、
 シート保護で条件で行削除は不可能にしておくとか、何でもできるようにしておくとか。

 かずさんの提示【仕様】が、なんとなく、これでいいのかなぁ、だめかもしれない なんて思うので、あれこれ
 コメントしてきたわけですが、この調子だと 【100年】繰り返しても、前に進みそうにありません。

 元々あったデータが変更されて▼がついている。(この部分、コード実装は未着手ですが)
 あるいは ★がついた挿入行がある。
 これらを回収して、かずさんの処理が終わったあと、再送されてきた。
 新たに挿入されている行にのみ着目しておられますが、▼や★でもともとあった行の項目も、どこか変更されているかもしれない。
 これらも、本来は取り込みが必要ですよね。

 取り込みをマクロで考えておられるようで、それなのに、変更のあった場所だけを入れ替えるのが効率的だと
 考えておられる、そこが理解できません。それを判定するための仕掛けで複雑なコードを準備するより、さくと削除してさくっと入れ替える。
 なぜ、それがいやなのか、さっぱりわかりません。

 しかし、考えてみれば、要件実現のために考えた仕様が不適切で困るのは、βではなく、かずさんです。
 ですので、β、本件から撤収します。らちがあきませんし、納得しないものをコード実装する気もありませんので。
 挿入イベントをキャッチしてその部分を処理する構造は、すでに提示したコードで実現できているわけで、
 あとは、その枝番をどうするかだけ(それだけだとは思えませんが、かずさんの思いとしては枝番の持ち方だけ?)ですので
 その部分を、ご自分で、なんとでもコード実装してください。
 上下を比較して、こういう計算で と、細かな設計(?)をしておられるわけですから、自分でいかようにも実現できますね。

 がんばってください。

(β) 2016/04/30(土) 09:13


βさん

 ご主旨は理解しました。βさんのご指摘

前回 要件を明確にとの指摘がありましたので、改めて最初から
逐条的に記載したのですが。ご期待に沿えませんでしたね

要件を段階的に具体的にしていく過程で仕様と解釈されたところが
あったということですね。

掲示板でのやりとりでは、逆説的ですが正確にと書いても、立脚点
や立場の違いから解釈相違が生まれることも多々あるので気を付けねければ
いかないと反省しております

とはいえ、ご丁寧に教えて頂きありがとうございました

以上
 
(かず) 2016/04/30(土) 12:25


こんにちは。

ご説明を拝見して、各行データの責任者を明確にすればそれだけで済むのではないかと思いました。
たとえば番号の横に1列確保して、その行に対する責任者の名前を入れ、ファイルを配布する。
受け取った担当者は、自分の名前の入った行のデータを適宜加工する。
加工の方法は自由。修正でも挿入削除でもお好きにどうぞ。
加工した結果に対してだけ責任を負う。

あ、ただし、完成した表の内容についてかずさんに責任がある場合
言い換えると、入力をしてくださるかたがたは、かずさんの仕事の手助けをしているに過ぎないばあい
この方法は使えません。物理的には可能ですが、効果は薄いでしょう。

ファイルが返ってきたら、集計シートにコピペしますが、このとき
Aさんのファイルからは、Aさんと入った行だけをコピペ、
Bさんのファイルからは、Bさんと入った行だけをコピペ、
以下同様に。全員分コピペ終了したら番号順に並べ替えます。

この集計方法は全員によくよく説明しておきます。
特に、本人の名前の入っていない行はコピペされないこと。
番号の入っていない行は正しい位置に並べられないので
コピペ対象から外してしまうこと(にしましょうか)
この二点を徹底しておきます。

上手に運用すれば、数ヶ月でまともなデータが集まるようになります。

( 佳 ) 2016/04/30(土) 17:50


要件と仕様について、

自分ではなんとなく理解しているつもりですし
感覚的にはβさんの仰っていることとあっていると思うのですが
自分の言葉でちゃんと説明するのはむつかしい。
それで、少しネットで検索してみました。

うーん、自分の思っているのに合う端的な説明は見つからないですね。
(わたしの理解が間違っているのかも。自分勝手な思い込みなのかも。
ちょっと自信がなくなってきました。
これではかずさんが仕様の説明に(わたしの言葉でいう仕様ですが)
仕様の説明に終始されたのも、一方的に責められないと思いました。

端的ではありませんが、要するにこういうことです。
ご参考に

■システム開発は仕様ではなく、要件を中心に進めよう
http://multiport.cocolog-nifty.com/blog/2008/11/post-91d7.html

■情報システムと「行動」
http://multiport.cocolog-nifty.com/blog/2008/10/post-e422.html

( 佳 ) 2016/04/30(土) 17:52


こんにちは。

>現状は 突き合わせるキー情報はリスト中の情報を使っており、キー
>が変わる場合に対応するユーザには変更前のキー情報を備考欄に書いて
>もらっておりミス多い

これも言葉の問題か。
いや、データベースでは、変わらないのがキーです。
たとえ地球最後の日が来ても、絶対に変えないのがキーです。
変わる可能性のあるものをキーにしてはいけません。

( 佳 ) 2016/04/30(土) 18:04


佳さん

 掲示板はあくまで好意でそれぞれの立場で参考意見をコメントして頂いている
 ものだとは認識しています。

 投稿して頂いた3件について不十分かもしれませんがコメントさせて頂きます
 ・1番目に投稿いただいた集計方法のアイデアについてありがとうございます。
  率直な感想としては、私の携わっている業績の集計という局面に限っては、
  従来の方法や仕組みに担当者にとって利益のない方法を押し付けても無駄で
  あり、他の人に対して説明を尽くすなりしてルールの徹底に協力してもらう
  ことと、入力のし易さや誤りがあることを前提に対応を工夫すること等
  2つの局面で対応を考えることができると考えています
  
 ・2番目にコ投稿の件は、理解できますが、当然ですが一般論というかモデル
  としての議論のように思いました。

  今回の検討に関していえば、要件の議論が不十分で、仕様の話がほとんどという
  ことも一般論としてはそうでしょう。つまり関係者間の十分な要件についての
  共通理解があってこそ仕様の議論に意味があるという話は正論すぎるということ
  ですね。
  
  本件では、

    1)大づかみには2つのリストのマージについて既存の列をキーとして使用する代わりに
   もっと手間の少ない方式でこれを実現するということが要件ですね。
  
  2)そのために管理番号を作って挿入や更新の操作を管理する仕組みという部分が
  仕様でしょう。
  
  教訓としては(苦笑)、 要件に限らず、人の行動や実務、仕様についていずれの局面
  でも一般論になりすぎす、実務面を慎重に考慮して検討していきたい考えています。
 
  3番目の投稿については、率直には仰りたいことの意味がわかりませんでした。
  1番目の投稿、2番目の投稿に対する例示という位置づけとも読めませんでした
  単に教科書的な教訓フレーズ としか理解できていません
  (失礼な言い方でしたら申訳ありません)
  
  とはいえ、私の本意としましては、検討がやや中途半端な形になっていますので
  適切なまとめをして頂いたことについては大変ありがたいと考えております。
  
  今後ともよろしくお願いいたします
(かず) 2016/05/01(日) 02:45

 撤収宣言をした分際で、のこのこでてくるのは本意ではありませんが、ちょこっとだけ。

 要件だの仕様だの、議論していくと(私がいいだしたことなので心苦しいんですが)議論のための議論になるリスクがありますね。
 ある要件があって、それを実現するために、おおざっぱな仕様を考えたとします。この仕様が要件に照らし合わせて正しいと仮定すると
 こんどは、このおおざっぱな仕様が、要件になって、それを実現するための、もう少し細かな仕様を考えますね。
 で、こんどは、この、もう少しこまかな仕様が(それが正しいとしたら)あたらしい要件になりますね。

 なので、どこからスタートするか、ここは、あまり議論しても始まらないのですが、たとえば

 1.1件1行の大元リストがある。
 2.回収したデータから、かずさんが、なんらかのリストを作成する。

 2.がどんなものなのか、もとの1行が、再びほかのデータも反映した1行になってしまうのか、あらたな行として増えていくのか
 そのあたりは、わかりませんけど、とにかく、2.の状態がある。

 と考えると、この1.の状態のデータを2.にする(これが正しいとして)、そのためには、どんなデータの持ち方がいいだろうか
 配布さきでは、どんなメンテナンス仕様がいいだろうか、回収した後は、どんなマージ仕様がいいだろうか。

 一度、こういったことを検討したいなと思ったんです。
 その検討のためには、1.と2.が、どんなものなのかを、正しく理解しないと、正しい判断ができないですね。

 今は、それがなく、途中の、枝番をつき合わせれば何とかなると、それのみが、かずさんから提示されている。
 こちらとしては、本当にそうなのか、それで、1.が、ちゃんと2.になるんだろうか。あるいは、そんなことをしなくても
 1.が2.になる方式はないのだろうかと、そう思っているんです。

 この1.って、どんなもの? 2.ってどんなもの というのが、βが申し上げていた要件です。

(β) 2016/05/04(水) 06:40


こんにちは。

3については、1・2とは関係ありません。
たしかどなたかがキーを使って管理することを提案されて
それに対してかずさんが「キーが修正されたときは備考に書いてもらう決まりがうまく行かない
と返されていたので

修正が発生するならその項目はキーではない。
........ということは、キーは存在しないし キーを使った管理はできていない、ということです。
キーを使って管理すれば?というアドバイスに対する返しとして成立していません。
ということで3は、キーをちゃんと理解していませんね、です。

>単に教科書的な教訓フレーズ
データの管理に関する先人たちの、
涙と汗と睡眠不足とw 試行錯誤と知恵と工夫の蓄積された
そのエッセンスを、いまわたしたちは使わせていただいて
おかげで先人のはまった穴に落ちずにすむし
ずいぶん楽をさせていただいている
という感覚がわたしにはあります。
なんだか恰好のいいことを言っているみたいで自分でも気持ち悪いですが
でも本当にそういう感覚なので。

教科書的と流してしまってはもったいないです。

( 佳 ) 2016/05/04(水) 11:28


 佳さん、βさん

 だいぶ時間が過ぎてしまい返信が遅れてしまい申し訳ありません。

 以下に、概要的な回答になりますが。

 
2.佳さんからのコメントに対して

(1)率直には、ご指摘のアドバイス頂いている点が、私の求めているものとの
 方向や具体性の点で異なっていると思っています

 この理由の一つは、掲示板での意見交換では相手の経験値などのプロフィール
 の理解なしに進めることが多いのでしょうからある意味で宿命的なことかなと
 と思っております。

(2)リストの突き合わせに関して頂いたコメントを「教科書的」と申し上げた趣旨は
 私から見ると

 ご指摘のデータベースに関する、情報処理のモデルにおける立脚しているものであり
 情報処理に携わる方の多くは百も承知の事柄かと思います。

 リストの突き合わせということで例を挙げますと、各担当に配布し担当が追加挿入
 してきた行を、大元のリストに挿入するのですが、その行は何を基に元のリストの
 どの位置に挿入すればよいか という点が、私が今使っているマクロデータベースのことで言うと 

 敢えてコメントさせて頂きたいのは、私の業務はどこにでもある業務だと思います。
 特別なことはやっていませんので、組織としては特別なコストや時間をかけるわけには
 いかず、従来のやり方を一新してまったく新しい仕組みを取り入れるということはできません

 既存のしがらみや制約を受け入れて、改善できる所を少しづつ改善することを行っている
 状況だということです。

(3)アドバイス頂いた要件や仕様の定義については、確か関係者間で要件について共通
 理解がないのに仕様の話ばかりしていてはという話はまったくその通りとは思います。

 こういった面では、

 日本情報システムユーザー協会(JUAS)が『非機能要件要求仕様定義ガイドライン』
 として、従来の顧客と開発ベンダ間での要件=従来から認識されてきた機能要件以外の要件
 =非機能要件 に対しても焦点を当てて顧客と開発ベンダ間の認識の食い違いを回避する
 ことなどが行われてきていると思います。

 https://ja.wikipedia.org/wiki/%E9%9D%9E%E6%A9%9F%E8%83%BD%E8%A6%81%E4%BB%B6

 同様の試みは独立行政法人 情報処理推進機構(IPA)が「非機能要件グレード」ととして
 まとめられており、それらの成果を国内の開発ベンダに取込まれてきていると思います

 これは、逆説的ですが、要件を整理し共通の理解を得るということが非常に困難だという
 ことを示していると思います。

3.βさんからのコメントに対して
 
  再度コメントご意見頂きありがとうございます。

  βさんのご指摘は、配布 → 回収・マージの正確な様子を示さないと、何をどうすること
  が本当に正しいのかわからないと、というご指摘だと理解しています。

  私としてはβさんのご指摘に対しては、具合的にお答えしていたつもりでしたが、結果的には
  不十分であったということだと思います。 申し訳ありません

  βさんのご指摘に津中するのには、2つの面で限界があったと考えています

  1つめは、そもそも掲示板でのやりといではなく、チャット等なんらかの形で工夫をした上で
  実際に処理しているデータの一部をセキュリティ上に配慮してやり取りするなど工夫をして
  正確に伝えて誤解やロスを防ぐべきであったと考えています。

  2つ目は、挿入時の行挿入の扱い等については、PDCAと言いますか、要件や仕様の検討をある
  程度進めたら、いったん実装して実データとぶつけるべきであったとお持っております
 
  ここはβさんのお考えとは違うかもしれませんが、要件や仕様の位置づけを「正しく」理解する
  ことの一部は、「実際にどんなデータが書かれているか」を見て、おかしな点があればそこを踏まえて
  再度出発する という形で進めるべきだったと思っています

  一定の期間検討を終えたら不明な部分は保留してしまって、まずは実装を進めるという形ですべきだっ
  たと考えています

  現在 ようやく時間ができたので、再度モチベーションを高めてコード化を進めたいと思っております。
 
  本件踏まえて、今後また意見頂ける場合は、場合に応じて掲示板を補足するコミュニケーションのツール
  を併用することも必要だと考えております。

  以上

 

(かず) 2016/05/16(月) 01:04


コメント返信:

[ 一覧(最新更新順) ]


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