[[20170319173223]] 『Sheet1を入力シート、sheet2にデータシートに、s』(シルバーOL) ページの最後に飛ぶ

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

 

『Sheet1を入力シート、sheet2にデータシートに、sheet1(A2)とおなじコード番号をもつ行に転記したい』(シルバーOL)

契約の新規、更新、解約の異動を入力しているリストがあります。契約番号をコード番号にし異動があった場合直接セルに入力していますが、大きな表なので、入力シート(sheet1)に同じ項目を作り、一件のデータのみ異動を入力、sheet2の同じ契約番号を持つ行に入力項目を転記したいと思います。入力項目契約番号を除いて15項目(B〜O)あります。新しい契約番号の時はsheet2の最下行に転記したいと思います。出来れば契約が終了した番号は条件付き書式などで塗りつぶされたら分かりやすいのですが。転記マクロをお教えください。

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


マクロではなくて、フォームを使って入力するのはどうでしょうか。

http://edutainment-fun.com/excel/tool/form.html

(マナ) 2017/03/19(日) 18:15


 まず、サンプル的なものでいいので、Sheet1 と Sheet2 の レイアウトを具体的にアップお願いします。
 それがないと、きわめて抽象的なアドバイスしかできなくなります。

 それと、確認なんですが、Sheet1 は あくまで 1件だけ、Sheet2 にはいわゆるリスト形式で全データがあると思われるんですが

 ・Sheet2 には、あらかじめ、全契約番号が記入されているのでしょうか?
  それとも、新規(契約番号が存在しない)ものは追加ということになるのでしょうか?

 ・項目がいくつあるのかはわかりませんが、SHeet1 には、毎回、当該契約の項目をすべて入力するのですか?
  それも大変ですよね。それとも、変更のあった項目のみ入力させるのでしょうか?

 ・Sheet1 への入力がどうなるのかにもよりますが、契約番号 A で入力したとします。
  なんらかのタイミングで Sheet2 に書きこまれるわけですが、この A が間違っていた。正しくは AA だった。
  こういう場合は、どのような入力を想定していますか?
  (間違いですから Sheet2 の A は 消さなければいけませんよね?)

 ★といった面倒なことを考えていくと、なかなか難易度は高くなりそうですね。
  ここは、マナさんアドバイスのdataフォームの利用を検討してみてはいかがでしょうか。

(β) 2017/03/19(日) 18:18


早速にご指示を頂きありがとうございます。まず
sheet1(入力)は1けんのみにしようと思っております。1件入力してはsheet2へ転記が一番ミスがないかなと今の所は考えています。
sheet2のリストのデータ数は契約番号のA列も含めてA〜Pの16項目が横にならんでいます。また全契約が入っています。
sheet1は2と同じ項目を同じ形でA〜Pにして契約場所、金額など入力規則などで入力支援設定をしたいと思います。転記先は値のみにしたいと思っています。
今までユーザーフォームなどチャレンジしましたがコンボボックスを複数設定するなどで挫折して、データーベースを作ることが思うように出来ないままいます。
関数で何とかならないかと試しましたが、むりでした。
マクロで単純に追加していくだけなら分かったのですが、同じ番号をもつ行に転記するというのがどうも駄目です。
エクセルの入力フォームはPC入力があまり得意では無い人は無理があるようです。
  A    B      C   D      E   F G H I JKLMNOP
 契約?a@契約場所名 場所番号 契約種別 電話
1123456  A      A001   一般  0000
こんな感じなのですがUPの仕方がわからないので打ち込みましたのでよろしくお願い致します。
(シルバーOL) 2017/03/19(日) 19:38

 >エクセルの入力フォームはPC入力があまり得意では無い人は無理があるようです。 

 具体的に、どのあたりが【無理】なのでしょうか?
 たとえば、本件をユーザーフォームであれなんであれ、なにかしらマクロで処理するとします。
 そうした場合でも、データの 新規追加、削除、変更 を考えた場合には、基本的にはデータフォームと
 同じような操作が必要になります。

 マクロコードから、いったん離れ、新規追加、既存データ削除、既存データ変更 それぞれにおける、操作者の操作の流れを
 文章で説明してもらえませんか?
 文章で説明する過程で、必要な機能が明確になっていくと思います。

 で、その操作が 操作者にとって無理のない、簡単なものであれば、データフォームでの処理もできるはずですし
 操作者にとって、やはり (データフォーム同様)難しい ということになるかもしれませんので。

( β) 2017/03/19(日) 19:55


現在は新規・契約終了・既存データ変更など番号入力で隣のセルに当該項目が表示されます。
契約金額などもリストを作り変更条件により読み込み表示されるようにして極力手打ちはないように設定してありますが、何分にも契約件数が多いので入力行のミスなど起こしやすいかと思い何とか短評形式の入力法はないかと思っています。IF関数で契約番号が同じならばと思いましたが”そうでない時”という設定が調べましたが駄目でした。
フォームは項目が入力規則などが設定出来ず定型で使う用語も手打ちしなければならないので、検討致しましたが、外しました。
やはり無理な事でしたら現状維持であきらめようかと思います。お騒がせ致しまして申し訳ありません。

(シルバーOL) 2017/03/19(日) 21:26


 >やはり無理な事でしたら現状維持であきらめようかと思います

 あきらめるのは、もったいないですよ。

 >現在は新規・契約終了・既存データ変更など番号入力で隣のセルに当該項目が表示されます。

 このところを、それぞれ、【どんな手順で操作者が入力(含むデータ指定)】するのか(させたいのか)を
 その手順を【言葉】で説明いただきたかったんですが・・・・
 その過程で、いろんなことが見えてきますので。

 たとえば A 列に契約番号を入れたとしますね。
 これが、新規入力なのか、既存データ修正なのかの判定は、どうさせるのか?
 あるいは、その取り消しは、どういった指示で行うのか。

 なんらかの方法で 契約番号 AA のデータを呼び出したとします。
 その AA を BB に変更したとします。
 この場合、Sheet2 に BB がないケース、すでに存在するケース、それぞれ、
 どういった処理を行うのか。

 また、データ入力時、往々にして、既存データをコピーして、それを元に新規データを作成したい。
 こういうことも、要望にあがるでしょう。

 そういった、ケースの洗い出しと分析も必要でしょうね。

 機能ごとに、操作者による入力と、その入力を受けて、何をどう判定して、その結果どうするのか。
 入力の最初から、Sheet2 への更新までの流れ(シナリオ)を説明いただきたいと思っているんですが?

(β) 2017/03/19(日) 22:55


>今までユーザーフォームなどチャレンジしましたがコンボボックスを複数設定するなどで挫折して、
>データーベースを作ることが思うように出来ないままいます。
>フォームは項目が入力規則などが設定出来ず定型で使う用語も手打ちしなければならないので、
>検討致しましたが、外しました。
シートをユーザーフォームのように使うのは大いに賛成です。
プログラミングする部分を極力減らして、
入力の制御が出来ますので大いに利用すべきです。
しかし、いずれにしてもエクセルを遠隔で制御するような感じになるので、
それなりのプログラムを書く必要があります。
ご自身でデバッグできるようにならないと、
簡易データベース的なものは作れないかなぁと思います。

そもそも、プログラマーはバグ取りが面白いと言えるような変人がする職業です。(言い過ぎかm(_ _)m)
根気がかなり要りますので、覚悟がそれなりに必要かと思います。

ちなみに、いまどのデータを扱っているかは、
データベースシート→表示シートに転記するときに行番号を記録しておくか、
データにユニーク(※唯一無二のこと)なIDを付けて、Match関数で検索して行を取得するか、
の方法で管理することになると思います。

(まっつわん) 2017/03/19(日) 23:34


エクセルにはフォーム機能も元々あります。
が、使い勝手が悪いようで、奥底にしまわれてしまってます。

http://excel.resocia.jp/report/2029/

ただ、されたいことが実現できると思うので、
これから作るアプリの機能や外観の参考に十分なると思います。

そのうえで、「こうしたい」というのが明確になれば、
それを一つ一つ実現していくよう、質問してはいかがでしょうか?

(まっつわん) 2017/03/19(日) 23:55


まっつわん様、ご親切をありがとうございます。お言葉に甘えて現在のファイルの仕様を説明させて頂きます。
まず、契約場所毎に料金が違ってくるので現在はそれ毎にシートを作りました。各シートのA1セルにハイパーリンクを設定し、契約番号を入力で当該行に行けるようにしてあります。
各セルに入力規則、関数設定で契約の変更など入力して別シートにカウントイフ関数などで契約状況など数値で表しています。この方法ですとかなりPCを扱い慣れている事が前提なので、私のイメージはATMのように誰でもができる操作にならないかと、このファイルを作成した時から思って、色々調べてみてマクロに挑戦したのですがさっぱりわからないのです・・・・・
取り敢えず異動のあった時の入力だけでもと思い、入力シート、データシートを作りました。
が、契約番号が同じ行に転記できるのは見出し行のすぐ下にある契約番号の行とデータシートに無い番号時に最下行に転記だけでした。データシートの見出し行を除く2行目以下に既存データの契約番号の行には転記が行われないのです。
現在はその後の展開は横に置いておいてこの件だけでも解決したいと思っています。また今後は現在契約場所別に分けているシートは1枚のシートにしたいと思います。入力シートの各セルには現在使っている入力支援のための各ツールを設定出来ますか?

(シルバーOL) 2017/03/20(月) 08:37


「入力」シート

┌────┬─────┐
│契約番号│ │
├────┼─────┤
│場所番号│ │
├────┼─────┤
│種別 │ │
├────┼─────┤
│電話 │ │
└────┴─────┘┌─────┐

                        │登録ボタン│
                        └─────┘

「データ」シート
┌────┬────┬──┬───┐
│契約番号│場所番号│種別│電話 │
├────┼────┼──┼───┤
│ 100001│A001 │一般│ 05001│
├────┼────┼──┼───┤
│ 100002│A002 │一般│ 05002│
├────┼────┼──┼───┤
│ 100003│A003 │一般│ 05003│
└────┴────┴──┴───┘

「入力」シートモジュール
Option Explicit

Private Sub CommandButton1_Click()

    Dim ixRow As Long
    Dim rngData As Range
    Dim rngID As Range

    Set rngID = Me.Range("B1")
    Set rngData = Sheets("データ").Range("A1").CurrentRegion.Offset(1)
    Application.EnableEvents = False

    On Error GoTo ErrH
    ixRow = WorksheetFunction.Match(rngID, rngData.Columns(1), 0)
    On Error GoTo 0

    rngID.CurrentRegion.Columns(2).Copy
    rngData.Rows(ixRow).PasteSpecial Paste:=xlPasteValues, Transpose:=True
    rngID.CurrentRegion.Columns(2).ClearContents
    Application.EnableEvents = True
    Exit Sub

ErrH:

    ixRow = rngData.Rows.Count
    rngID.Value = WorksheetFunction.Max(rngData.Columns(1)) + 1
    Resume Next

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rngID As Range
    Dim rngData As Range
    Dim ixRow As Long

    Set rngID = Me.Range("B1")
    If Target.Address <> rngID.Address Then Exit Sub
    Set rngData = Sheets("データ").Range("A1").CurrentRegion.Offset(1)
    On Error GoTo ErrH
    ixRow = WorksheetFunction.Match(rngID, rngData.Columns(1), 0)
    On Error GoTo 0

    Application.EnableEvents = False
    rngData.Rows(ixRow).Copy
    rngID.PasteSpecial Paste:=xlPasteValues, Transpose:=True
    Application.EnableEvents = True
    Application.CutCopyMode = False
    Me.Range("B1").Select

    Exit Sub

ErrH:

    ixRow = rngData.Rows.Count
    Resume Next
End Sub

契約番号を空欄で、他を入力し登録ボタンで、
「入力」シート → 「データ」シート最下行の下に契約番号を追加して転記

契約番号に番号を入力で、
「データ」シートから検索して → 入力シートに転記

の例です。
叩き台にどうぞ。
テキトーに書いたから無駄が多いです。
慣れてきたら同じことを2度書かないで済むように書き直してください。

(まっつわん) 2017/03/20(月) 13:18


まっつわん様、早速ご教示頂きありがとうございます。仕事から帰宅して早速新しいファイルを
でコードをコピペしてやってみました。
希望通りデータシートに項目は転記されました。新しい番号もふってくれるのが助かります。今まではMAX関数をいれたセルを作って新しい番号を取得していましたので。
ただわからないのですが既存データの異動編集の際はデータシートに検索BOXを作って編集するのでしょうか?
データシートの既存番号で入力値を変えて登録しても最下行に転記同じ契約番号で転記されます。

理解不足お許しください。
(シルバーOL) 2017/03/20(月) 23:02


まっつわん様、昨夜は理解不足な事を送りすみませんでした。今朝分かりました。第2の実務に沿ったファイルやってみようと思います。ありがとうございます。
(シルバーOL) 2017/03/21(火) 07:28

先日はありがとうございました。実務に即した項目でやってみました。その結果数式を使って値を計算しているセルが転記後のクリアで数式もクリアされます。CrerContentsは書式は残すことがわかりました。出来れば数式もセルに残したいのです。「0」の値が入力前に表示されても差し支えないのですが・・・
ジャンプさせてクリアするコードをどのように扱えば良いでしょうか。
「SpecialCells(xlCellTypeFormulas, 1).Select '数式 rngID.CrerContents」
コマンドボタン1クリックで行いたいのですが。
宜しくご教示下さい。
(シルバーOL) 2017/03/26(日) 10:09

コメント返信:

[ 一覧(最新更新順) ]


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