[[20140918165503]] 『引数を更に共通化する方法?』(syk) ページの最後に飛ぶ

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

 

『引数を更に共通化する方法?』(syk)

たびたびすみません。
今日中にしたいので、別シートで質問させていただきます。

さきほど、修正していただいて、うまくいったんですが、
私のミスで、

  条件マンNo = データシート.Range("C1").Value ではなく
  条件マンNo = 結果シート.Range("C1").Value   でした。

データシートは集計の際にSheet("データ")で使っているもので、
結果シートは出力の際にSheet("集計結果")で使っています。
↑自分でも理解する為にわざと復唱しました。

結果(集計結果)シートのC1を選択しなければいけないのに、
間違えていました。

集計のほうでも、出力の結果シートを参照できるようにしたいんですが、
その共通化?がわかりません。
それ以外にも、方法があれば、教えていただきたいです。
あと、本当に申し訳ないのですが、初心者なので、
こうしたらいい、と言われてもどう書いたらいいかわからず。。
なので、マクロを書き上げていただけたら、助かります。

よろしくお願いします。

こちらが現在のマクロです。

 Option Explicit

 Public dic契約時間 As Object
 Public dic社員時間 As Object
 Public dic協力会社 As Object
 Public dic社員 As Object

 Private Sub btn_集計_Click()
    集計 Worksheets("データ")
    出力 Worksheets("集計結果")
 End Sub

___

 Public Sub 集計(データシート As Worksheet)
    Set dic契約時間 = CreateObject("Scripting.Dictionary")
    Set dic社員時間 = CreateObject("Scripting.Dictionary")
    Set dic協力会社 = CreateObject("Scripting.Dictionary")
    Set dic社員 = CreateObject("Scripting.Dictionary")

    Dim rowCnt As Long
    rowCnt = データシート.Range("A2").End(xlDown).row

    Dim 条件マンNo As String
    条件マンNo = データシート.Range("C1").Value    '★ 問題点

    Dim オーダー番号 As String
    Dim オーダー名 As String
    Dim マンNo As String
    Dim 時間 As Double

    Dim row As Long
    For row = 2 To rowCnt
        オーダー番号 = データシート.Cells(row, "A")
        オーダー名 = データシート.Cells(row, "B")
        マンNo = データシート.Cells(row, "C")
        時間 = CDbl(データシート.Cells(row, "D"))

        If マンNo = 条件マンNo Then
            If Not dic協力会社.Exists(オーダー番号) Then
                dic協力会社.Add item:=オーダー番号 & " " & オーダー名, key:=オーダー番号
                dic契約時間.Add item:=時間, key:=オーダー番号
            Else
                dic契約時間(オーダー番号) = dic契約時間(オーダー番号) + 時間
            End If
        Else
            If Not dic社員.Exists(オーダー番号) Then
                dic社員.Add item:=オーダー番号 & " " & オーダー名, key:=オーダー番号
                dic社員時間.Add item:=時間, key:=オーダー番号
            Else
                dic社員時間(オーダー番号) = dic社員時間(オーダー番号) + 時間
            End If
        End If
    Next
 End Sub

___

 Public Sub 出力(結果シート As Worksheet)
    結果シート.Range("A2").Value = "【社員】"
    結果シート.Range("A14").Value = "【協力会社】"

    Dim 行 As Long
    Dim key
    行 = 3
    For Each key In dic社員.keys
        結果シート.Cells(行, "A").Value = dic社員(key)
        結果シート.Cells(行, "B").Value = dic社員時間(key)
        行 = 行 + 1
    Next

    行 = 15
    For Each key In dic協力会社.keys
        結果シート.Cells(行, "A").Value = dic協力会社(key)
        結果シート.Cells(行, "B").Value = dic契約時間(key)
        行 = 行 + 1
    Next

    結果シート.Range("B3:B19").HorizontalAlignment = xlRight

End Sub

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


集計サブの引数を増やし、結果シートも渡しましょう。勉強との事なので、ご自分で試してみてください。
(???) 2014/09/18(木) 17:43

???さん

引数を増やす・・・。がキーワードですね!
ヒントありがとうございます。
そうですね、ここまでしていただいたので、あとは自分でします。
またつまづいたら、ヒントをもらいに現れます。
ありがとうございます。
(syk) 2014/09/18(木) 17:50


 シートを渡してもいいですが、そのシートの中で使うものが
    Dim 条件マンNo As String
    条件マンNo = データシート.Range("C1").Value    '★ 問題点
 だけであれば、このセルのデータだけを(文字列として)引数に追加するという方法も
 あります。

 引数名を 条件マンNo にすれば、コードの変更も最小限ですみますし。
(Mook) 2014/09/18(木) 18:24

mookさん

文字列として引数に追加する、、。

出力か集計、どちらかの引数名を条件マンに変えるということですか?
それとも、別に新たに条件マンの引数を作るということですか?

すみません、いまいち想像ができなくて、、。
(syk) 2014/09/19(金) 08:57


呼び出し側の変更例。私の案だと、
    集計 Worksheets("データ"), Worksheets("集計結果")

Mookさんの案だと、

    集計 Worksheets("データ"), Worksheets("集計結果").Range("C1").Value

という感じでしょうか。あとは呼ばれる側をどう変更するか、ですね。
(???) 2014/09/19(金) 09:31


???さん

なるほど。
でも、ひとつ疑問なんですが、
mookさんの案を使うとして、出力=Worksheets("集計結果").Range("C1").Value
になるっていうことは、、
出力シートで、結果シートを参照する際に、支障はないんですか?

なので、何が言いたいかというと、、
たとえば
結果シート.Range("A2").Value = "【社員】"
は、訳したら、

Worksheets("集計結果").Range("C1").Valueの、Range("A2").Value = "【社員】"
になるということですよね?
勘違いだったらすみません。

rangeの選択がふたつ重なるのはどうなるんですか?

(syk) 2014/09/19(金) 09:40


 集計だけを変更して、出力は変更しません。
(たいふ) 2014/09/19(金) 10:16

>でも、ひとつ疑問なんですが、
>mookさんの案を使うとして、出力=Worksheets("集計結果").Range("C1").Value
>になるっていうことは、、
>出力シートで、結果シートを参照する際に、支障はないんですか?

大きく勘違いされていますね。出力先は「Worksheets("集計結果")」です。
「Worksheets("集計結果").Range("C1").Value」は、条件マンNo ですよね?
(???) 2014/09/19(金) 10:27


 自分で調べて、理解する(使ってみる)という流れを確立するのが上達の早道ですが、
 まずはこの辺りを読んではどうでしょうか。
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200_100.html
http://www.k1simplify.com/vba/tipsleaf/leaf340.html

 とくに最初のサイトは EXCEL/VBA に関して体系的に説明されているので、折に触れ読んで
 試してみると良いと思います。

 内容を見るのも大事ですが、VBAは手軽に試せるのですから、「こうかな?」と思うことは
 実際にコードで試してみてください。
 そうすればネットで聞かなくても OK か NG はすぐわかりますよね?
 その上で、どうしてそうなるかがわからなければ、質問するのが良いと思います。

 ??? さんの後者の渡し方だと、受け側は
 Public Sub 集計(データシート As Worksheet, 条件マンNo As String)
 になります(プロシージャ中の★は宣言(Dim)もあわせて削除)。

(Mook) 2014/09/19(金) 10:31


???さん、

大きく勘違いしてましたね、、。
すみません。
一度基礎を見て、そのうえで???さんのヒントを参考にさせていただきます。
ありがとうございます。
(syk) 2014/09/19(金) 11:04


mookさん、

urlありがとうございます。
その通りですね。
私のやり方じゃ、丸投げっていうものですね、、。
とても勉強になりました。
前記事でも、mookさんにはお世話になりました。
ぜひ参考にさせていただきます。
ありがとうございます。
(syk) 2014/09/19(金) 11:06


コメント返信:

[ 一覧(最新更新順) ]


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