[[20120503203731]] 『シートからシートへの反映?』(きんぎょ) ページの最後に飛ぶ

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

 

『シートからシートへの反映?』(きんぎょ)
 初めまして、どうぞ宜しくお願いいたします。
 早速ですが、パソコンの事に詳しくなく本などを購入しましたが自分のやりたいことが、どれにあてはまるかさえ良く解らず困っています。

 シートAには複数の現場名(例えば1〜10)と働く人の名前AさんBさんCさんがあり、Aさんは1の現場に2時間、5の現場に1時間、10の現場に2時間。
 Bさんは1の現場に1時間9の現場に3時間、Cさんは3の現場に1時間2の現場に1時間5の現場に2時間とランダムにデータが毎月変わります。
 シートBには、働いてる人別に空白の欄を作っている請求書が、そこへシートAからデータの入った現場名、時間のみシートBの請求書に反映されるように作りたいのですが
 不可能なのでしょうか?現場名は本当は30個くらいあります。
 どうゆうふうにすれば良いのか教えてください。
 お願いします。

 シートAとシートBの具体的なレイアウトを説明すれば、関数での対応案がすぐにアップされると思うよ。

 (ぶらっと)

 ぶらっとさん、アドバイスありがとうございます。
 文面で説明するのは、解りにくいと思いますが頑張ります。

 シートA
 A欄2〜11には、現場名(例えば1〜10)B欄1にはAさん2〜11までは空欄、C欄、D欄もBさん、Cさんで同じように。
 次に空欄になっている、それぞれの人の現場にでた時間を入力。

 シートB
 シートBは、Aさんの請求書として作成。
 A欄には現場名が反映されるように空欄で枠を作成。
 B欄には現場に行った時間を反映されるように空欄C欄には単価、D欄にはB×Cの合計金額が入る。

 シートCはシートBと同様の雛型でBさんの請求書。

 シートDは同じ雛型でCさんの請求書。

 結果としては、シートAがメインページになり、シートB、シートC、シートDのそれぞれの請求書に反映されるようにしたいのです。

 こんな説明で、理解してもらえるでしょうか?
 宜しくお願いしますm(_ _)m

 シートのイメージはほぼ把握できた。
・単価は、どこかにテーブルがあるのかな?
・請求書のシートのA列は現場名だけど、そこは空欄だよね。(あらかじめ入っているのではなく)
・Aさん、Bさん、Cさんが、どのシートになるのか、そのルールは?
 メインシートの順番にする?
 どこかに名前が入っている?

 いずれにしても、上記質問に答えてもらってからになるけど、当方、関数はからっきしなので
 お手伝いするとしてもマクロ。
 でも、関数エキスパートさんなら、関数で対応できると思うな。

 (ぶらっと)

ぶらっとさんへ

 ● 単価はテーブルなど難しくて作りきれず作ってません、各自、請求書に人によって単価が違うためあらかじめ入れておきます。
 ●請求書シートの現場名の欄は空欄で、メインシートの現場に行った時間が入力された場合のみ、その現場名と時間が反映されるようにしたくて時間の入っていない現場名の所は反映されないように。
 ●Aさん、Bさん、Cさんのシートにはルールは無くメインシートの順番でOKです。
 初心者なので説明も不十分でイライラされるかもしれませんが、宜しくお願いいたします。

 >各自、請求書に人によって単価が違うためあらかじめ入れておきます。 

 具体的にどこに、どのように入れておくつもり?
 たとえばAさんの場合、いくつの作業が登場するかわからないけど、C列に何行かあらかじめいれておく?
 何行いれておく?(2行目だけとか?)

 だけど、これは、いい方法じゃないね。
 "単価"というシートを作って、A列に担当者名、B列に単価。こうしたらどうかな?

 追記)

 あるいは、各シートのどこかを単価欄として、その人の単価をいれておくとか。
 それと、その人が10以上の現場に入っていたらどうする?
 あと、個人別のシートは、シート名を個人名にしておいたほうが、なにかと運用しやすいよ。

 (ぶらっと)


ぶらっとさんへ

そうですね!
ありがとうございます。請求書のシートに入れるより単価シートを作っておいた方がいいですね!

現場が10以上あったら、どうする?ってことですが、実際は常に40くらい現場がありメインページの現場名は、あらかじめ増えても減ってもいいように50くらいの設定で行きたいと思ってます!

シートの名前は、そうですね!個人名で行きましょう。
5人くらいしか居ないので。


 上でも言ったように関数は、まったくお手あげなのでVBAで。

 ・"単価" シート。A列が名前。B列が単価。
 ・請求書シート。 シート名は必ず名前と一致していること。
   レイアウト提示がなかったので勝手に1行目がタイトル。タイトルは、あらかじめ設定しておいて。
   データは2行目から転記。

 Sub Sample()
    Dim c As Range
    Dim r As Range
    Dim myName As String
    Dim shP As Worksheet
    Dim shA As Worksheet
    Dim z As Variant
    Dim myPrice As Double
    Dim mySite As String
    Dim mRow As Long
    Dim i As Long
    Dim x As Long
    Dim buf As Variant

    Application.ScreenUpdating = False

    Set shP = Sheets("単価")
    Set shA = Sheets("シートA")

    mRow = shA.Range("A" & shA.Rows.Count).End(xlUp).Row                            'リストの最終行番号
    For Each c In shA.Range("B1", shA.Cells(1, shA.Columns.Count).End(xlToLeft))    'B2から横に1行目の名前を取り出す
        myName = c.Value
        If Not IsObject(Evaluate("'" & myName & "'!A1")) Then
            MsgBox myName & "さんの請求書シートがありませんので処理をスキップします"
        Else
            z = Application.Match(myName, shP.Columns(1), 0)
            If Not IsNumeric(z) Then
                MsgBox myName & "さんの単価情報がありませんので処理をスキップします"
            Else

                With Sheets(myName)                                     '請求書シート
                    buf = .Range("A1:D1").Value                         'タイトル保存
                    .Columns("A:D").ClearContents                       '転記欄クリア
                    .Range("A1:D1").Value = buf                         'タイトル復元
                    x = 2                                               '転記開始行
                    myPrice = shP.Cells(z, "B").Value                   '単価

                    For Each r In c.Offset(1).Resize(mRow - 1)          '作業時間をこの列から取り出す
                        If Len(r.Value) > 0 Then                        '空白ではなかったら
                            mySite = shA.Cells(r.Row, "A").Value        '現場名
                            .Cells(x, "A").Value = mySite
                            .Cells(x, "B").Value = Val(r.Value)     '時間。念のために数値に置き換え
                            .Cells(x, "C").Value = myPrice
                            .Cells(x, "D").FormulaR1C1 = "=RC[-2]*RC[-1]"
                            x = x + 1
                        End If
                    Next

                End With

            End If

        End If
    Next

    Application.ScreenUpdating = True
    MsgBox "処理が終了しました"

 End Sub

 (ぶらっと)

ぶらっとさんへ

すみません

これを、どうしたらいいのでしょうか?


 ブックが開かれている状態で Alt/F11
 でてきた画面のメニューで、挿入->標準モジュール。
 ここででてきた画面に、このコード(Sub から End SUb まで)をコピペ。
 この画面の右上のXボタンをおして画面を閉じ、ブックの画面に戻る。
 で、ツール->マクロ->マクロ と選んで、でてきたダイアログボックスで Sample を選んで実行。

 まず、こうしてみてくれる?

 (ぶらっと)


ぶらっとさんへ

早速やってみましたが・・・

実行エラー’9’:
インデックスが有効範囲にありません

とエラーが出てしまいました。


 エラーが出た時の小窓で、「デバッグ」ボタンを押すと、エラーになったコードが黄色く光るんだけど
たぶん、Set shA = Sheets("シートA") かな?

シートA の実際のシート名がわからなかったので、コードとしては、そのまま "シートA" にしてある。
このコードを、実際のシート名になおすか、あるいはシートのほうを "シートA" という名前にして、もう一度、試してみてくれないかな?

 (ぶらっと)

ぶらっとさん

やってみました!

今度は、”単価”のほうがエラーになってしまいました・・・

私には難しすぎたのでしょうか?

せっかく、こんな難しいことをしていただいたのに・・・

申し訳ないです。

でも、頑張ります!!


 >パソコンの事に詳しくなく本などを購入しましたが自分のやりたいことが、どれにあてはまるかさえ良く解らず

 ということなので、気にはしている。
 エキスパートさんだったら、これを関数だけで処理することは朝飯前だと思うけど、私はできないので・・
 ちょっと面倒だけど関数と操作(フィルターぷぉション)を組み合わせたものなら、最悪?アドバイスはできるかも。

 でも、もう少しがんばってみる?

 >今度は、”単価”のほうがエラーになってしまいました・・・ 

 ということだから、"単価"シートができていないのかな?

 (ぶらっと)


ぶらっとさんへ

何度も挑戦してみましたが、先へ進む事が出来ませんでした・・・。

もう少し、勉強しないと、せっかく力を貸していただいたのに申し訳なくて・・・。

時間をさいていただいて、本当に ありがとうございました。

嬉しかったです!

(きんぎょ)


 取り敢えず、現場名を参照する所から。。。
 Sheet1	[A]	[B]	[C]	[D]
[1]	現場名	Aさん	Bさん	Cさん
[2]	現場1	5		
[3]	現場2		4	6
[4]	現場3	8		
[5]	現場4		10	
[6]	現場5	3		7
[7]				

 Sheet2	[A]	[B]	[C]	[D]
[1]	Aさん			
[2]	現場名	時間	単価	金額
[3]	現場1			
[4]	現場3			
[5]	現場5			
[6]				
[7]				

 Sheet2のA3シートに
=IF(COUNT(Sheet1!$B$2:$B$6)<ROW(A1),"",INDEX(Sheet1!$A$2:$A$6,SMALL(INDEX((Sheet1!$B$2:$B$6="")*9^9+ROW(Sheet1!$B$2:$B$6)-1,),ROW(A1))))
 の式を入れて下にフィルドラッグしてみて下さい。

 誰のデータを表示するのか、まずは決め打ちしてます。
 人数が多い様なら、一つのシートで使い回す事を考えて行った方が良いかもしれませんが。。。

 (HANA)

HANAさん

初めまして、説明通りにやってみました。


 やってもらう事は必須だと思っていますが。。。
 それでどうでしたか?

 現場名が参照出来れば時間は参照出来ますね?
 VLOOKUP関数とか、SUMIF関数を使ってみて下さい。

 単価は。。。人によって単価が違うと言う事ですが
 現場には依存しないのでしょうか?

 条件にもよりますが、こちらもVLOOKUP関数やSUMIF関数で
 参照出来るのではないかと思います。

 (HANA)

やってはみましたが、参照されませんでした。
何も起こらず・・・。

申し訳ないのですが、関数とかが全く分かっておらず今から少しづつ勉強しようと思ってます。

単価は人に対しての単価なので現場には依存しません。

すみません、せっかく教えていただきましたが勉強不足です。

(きんぎょ)


 >やってはみましたが、参照されませんでした。 
 これはきちんと書くようにして下さい。
 こちらからはどの様に成っているのか、見る事は出来ませんので。

 さて、一つお願いが有ります。
 新しいブックに、私が載せたのと同じ表を 同じ配置で作成し
 数式をこちらからコピーして貼り付けて 確認してみて下さい。

 そうすると、Sheet2のA3以降に期待する結果が表示されると思いますので
 今度は、「データの配置は実際はどうなっているか」を教えて下さい。

 現場名の表示が一番の難関だと思いますので
 まずはそれを先に解決したいと思います。

 (HANA)

一応、作っていただいた通りにシート1とシート2を作成し数式をコピーしやってみた結果、

参照されなっかたのですが。

明日、会社へ行き、またチャレンジして報告したいと思います。

(きんぎょ)


おはようございます。

早速やってみました。

シート2のA3=現場1
    A4=現場3
    A5=現場5

と参照されました!


試行錯誤、本を見たりしながら、Aさんシートを応用してBさん、Cさんも出来ました!

参照出来ました!

ありがとうございます。


 上手く行きましたか。良かったです。
 時間の方は、VLOOKUP関数で出来ると思います。

 まずはこちらをご参考に、やってみて下さい。
https://www.excel.studio-kazu.jp/func/vlookup.html#a_sheet
 VLOOKUP 別シート版

 上手く行かない場合は、作ってみた数式と
 どの様に成って上手く行かないのか。
 希望する結果は何なのか。
 あわせて書いてみてもらえると良いと思います。

 (HANA)

HANAさん

最初に作っていただいた関数で、すべて出来ました!

本当に、ありがとうございました。

この関数を応用し、別の作業にも役立てさせていただいてます。

仕事が、これで ものすごく短縮出来ます本当に、ありがとうございました。

(きんぎょ)


 そうですね。
 時間も上詰めにすれば良いだけなので 最初の式で出来ると思いますが
 その数式は、実は結構重い(印象の強い)数式です。

 必要な所(現場名を抜き出す所)のみに使用し、他の部分は
 他の数式を使っておくのが良いと思います。

 。。。今回は人数も参照範囲もそう多くないので 実害は無いのかもしれませんが。

 (HANA)

そうなのですか・・・

分からず、全部 同じ式を使ってしまいました。

現場数は50位あり、残業や、深夜残業などあり相当な数になっています。

教えて頂いたテーブルを勉強し、改良して行った方が良いのですね!

頑張ってみます!

ありがとうございました。


 現場数がたくさん有るのは当初から
 >実際は常に40くらい現場がありメインページの現場名は、
 >あらかじめ増えても減ってもいいように50くらいの設定
 で、人数も
 >5人くらいしか居ないので。
 って事だったので、充分許容範囲内かと思っていましたが

 >残業や、深夜残業などあり相当な数になっています。 
 この辺りはどうなっているのでしょう?

 B:F列がAさん、G:K列がBさん と言った感じでしょうか?

 また、上詰めにしたいのはどう言った理由だったのでしょう?
 単純に参照して印刷するだけなら
 全て参照しておいて、オートフィルタなどで その時点で不要な行を非表示にしておくのでも
 良いのかと思ってみたり。。。

 数式での使用感にもよると思いますが。

 (HANA)

元々、PCに他の方が雛形を作っており、手書きで計算した後にPC入力して次の工程へつなげて行ってたらしく
今回、私が その業務を引き継ぎ、メイン処理から枝分かれしたいくつもの工程が、この表のおかげで時間が短縮でき本当に助かりました!

まだまだ、解らないことばかりで勉強不足なので頑張って勉強していきたいと思います。

ありがとうございました。

(きんぎょ)


コメント返信:

[ 一覧(最新更新順) ]


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