[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『引数を更に共通化する方法?』(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 >
引数を増やす・・・。がキーワードですね!
ヒントありがとうございます。
そうですね、ここまでしていただいたので、あとは自分でします。
またつまづいたら、ヒントをもらいに現れます。
ありがとうございます。
(syk) 2014/09/18(木) 17:50
シートを渡してもいいですが、そのシートの中で使うものが Dim 条件マンNo As String 条件マンNo = データシート.Range("C1").Value '★ 問題点 だけであれば、このセルのデータだけを(文字列として)引数に追加するという方法も あります。
引数名を 条件マンNo にすれば、コードの変更も最小限ですみますし。 (Mook) 2014/09/18(木) 18:24
文字列として引数に追加する、、。
出力か集計、どちらかの引数名を条件マンに変えるということですか?
それとも、別に新たに条件マンの引数を作るということですか?
すみません、いまいち想像ができなくて、、。
(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
大きく勘違いされていますね。出力先は「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
urlありがとうございます。
その通りですね。
私のやり方じゃ、丸投げっていうものですね、、。
とても勉強になりました。
前記事でも、mookさんにはお世話になりました。
ぜひ参考にさせていただきます。
ありがとうございます。
(syk) 2014/09/19(金) 11:06
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.