[[20140814193616]] 『マクロで合計_1_自動合計作成考え方』(もみじ坂) ページの最後に飛ぶ

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

 

『マクロで合計_1_自動合計作成考え方』(もみじ坂)

度々すみません。
前回教えていただいた関数をマクロに置き換えてチャレンジしたいと思っています。

シート6 の 日付は 日付型です。
シート5 月は 数字型です。「月」は書式設定で付けました。
シート6

 	[a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]
[2]	NO	日付	TEL	月検索値	NO	NO検索値		単価	cs	pc	金額
[3]	140101 	2014年1月1日	8768 	11 	A02	4				10 	
[4]	140101 	2014年1月2日	8768 	11 	A02	4				20 	
[5]	140101 	2014年1月5日	8768 	11 	A03	5				30 	
[6]	140101 	2014年2月5日	2913 	12 	A02	4				40 	
[7]	140102 	2014年2月5日	2913 	12 	A02	4				50 	
[8]	140102 	2014年2月6日	2913 	12 	A04	6				60 	
[9]	140102 	2014年3月5日	2913 	13 	A02	4				70 	

★?@ヤリタイこと
シート5 B1 が空欄の時 月別&商品別の合計を

 	[a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[l]	[m]	[n]
 [1]														
 [2]	NO	商品名前									1 月	2 月	3 月	4 月
 [3]	A01					30 								
 [4]	A02					30 				   	          30 	90 	70 	
 [5]	A03					30 					          30 			
 	A04					30 						        60 		

★?Aシート5 B1 に 2913(TELNO) を入力されたとき
TEL別&商品別&月別 の合計

 	[a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[l]	[m]	[n]
[2]	NO	商品名前									1 月	2 月	3 月	4 月
[3]	A01					30 								
[4]	A02					30 					30 	90 	70 	
[5]	A03					30 					30 			
[6]	A04					30 						60 		

関数
★?@=SUMPRODUCT((MONTH(Sheet6!$B$2:$B$8)=K$2)*(Sheet6!$E$2:$E$8=$A3),Sheet6!$J$2:$J$8)

マクロでありたいこと

シート5 B2が空欄の時 = 月別&商品別の PC を 合計する
シート5 B2がシート6 c列のTElを入力されたとこ = TEL番別&月別&商品別の PC を 合計する

マクロ
これできそうと思ったんですが全然でした (*´ノД`)

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1360962883

もう一回組み立て方法を (´。 ω 。`)

Sub test2()

    Set リスト = Worksheets("list")   '★
    Set 月 = リスト.Rows(1).Offset(, 2)    '★B列
    Set 商品コード = リスト.Rows(1).Offset(, 5)     '★ E列
    Set TEL = リスト.Rows(1).Offset(, 3)     '★ C列

    With Worksheets("Sheet5")
        For r = 3 To 6
            cntR = .Range("A1").End(xlDown).Row
             商品NO = Application.Match(.Cells(r, "A"), 商品コード, 0)
             月列 = Application.Match(MONTH(.Cells(2, "A"), 月, 0)

           If Range("B1") = "" Then
                ’=SUMPRODUCT((MONTH(Sheet6!$B$2:$B$8)=K$2)*(Sheet6!$E$2:$E$8=$A3),Sheet6!$J$2:$J$8)
              リスト.Cells(商品行, 会社列).Value = Evaluate("SUMPRODUCT((リスト.Range(A2:A)" & cntR & "="".Range("A3")"")*(B2:B" & cntR & "=""更新""))")

                      'Else
                         ' =SUMPRODUCT((MONTH(Sheet6!$B$2:$B$8)=K$2)*(Sheet6!$E$2:$E$8=$A3)*(Sheet6!$C$2:$C$8=$B$2),Sheet6!$J$2:$J$8)

           End If
        Nex
End Sub

途中ですみませんが、こんな感じですか?
かなり的外れ?
だんだんとパーツだけが増えて肝心な部分を組み立てられないでいます。

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


 あっちの話と、こっちの話が混ざってるみたいですね。

 EVALUATEとSUMPRODUCTを使うのなら
 MATCH関数で計算結果を入力するセルを特定する必要はありません。
 むしろ、最初から順に 該当のセルで計算させたい数式を作り
 結果を入れていくことになると思います。

 K2セルに
 =SUMPRODUCT((MONTH(Sheet6!$B$2:$B$8)=K$2)*(Sheet6!$E$2:$E$8=$A3)*(Sheet6!$C$2:$C$8=$B$2),Sheet6!$J$2:$J$8)
 の式が入っているなら、
 EVALUATE("SUMPRODUCT((MONTH(Sheet6!$B$2:$B$8)=K$2)*(Sheet6!$E$2:$E$8=$A3)*(Sheet6!$C$2:$C$8=$B$2),Sheet6!$J$2:$J$8)")
 ってしないといけません。

 ちなみに "SUMPRODUCT((リスト.Range(A2:A)" & cntR & "="".Range("A3")"")*(B2:B" & cntR & "=""更新""))" だと
 cntRが「8」だったとしたら・・・色々大目に見るとして・・・
 "SUMPRODUCT((リスト.Range(A2:A)8=.Range("A3"))*(B2:B8="更新"))"
 です。

 EVALUATEの中には、セルに入れる式から「=」を取り除いて 前後に「"」を付けて文字列にしたものです。

 一つずつ式を作っていかないといけないので、計算自体が重いのでないのなら
 数式を直接埋め込む様にした方が良いと思います。

 とはいってもたとえば。。。。
 cntRが「8」だった場合 "SUMPRODUCT((MONTH(Sheet6!$B$2:$B$8)=K$2)*(Sheet6!$E$2:$E$8=$A3)*(Sheet6!$C$2:$C$8=$B$2),Sheet6!$J$2:$J$8)" を作りたいなら
 "SUMPRODUCT((MONTH(Sheet6!$B$2:$B$" & cntR & ")=K$2)*(Sheet6!$E$2:$E$" & cntR & "=$A3)*(Sheet6!$C$2:$C$8=$B$2),Sheet6!$J$2:$J$" & cntR & ")"
 ですね。
 後は、計算結果を入れるセルが変わると相対参照にしている「K」とか「3」とかが変わってきます。
   cntRは、変わらないですよ?
  
(HANA) 2014/08/14(木) 23:06

 コードは、VBEにコピーしてみましたが
 明らかな構文エラーや、NextがNexになっていたり
 End With がなかったりしています。

 このあたりはつぶしたものを載せてもらうと良いと思います。
  持っておられるイメージは伝わるので、無いよりはある方が良いとは思いますが。

 それから、変数の型を宣言する癖をつけておくと良いと思います。
 その際、ツールのオプションで「変数の宣言を強制する」にチェックをいれて
 モジュールの先頭に
  Option Explicit
 を入れておいてください。

 前回の MATCH関数を使って〜〜 のイメージは
 Sheet6の1行目から処理をしていきます。
 MATCH関数で Sheet5のA列から「A02」を探すと、『4』です。
 なので
 Cells( 4 , 1 + 10).Value = Cells( 4 , 1 + 10).Value + 10
 で、K4セルに「10」が入ります。

 次の行も「A02」なので、MATCH関数の結果は『4』です。
 Cells( 4 , 1 + 10).Value = Cells( 4 , 1 + 10).Value + 20
 で、K4セルは「30」になります。

 次の行は「A03」なので、『5』
 Cells( 5 , 1 + 10).Value = Cells( 5 , 1 + 10).Value + 30
 で、K5セルに「30」が入ります。

 こんな感じで、値を一つずつ所定のセルに加算させていくようなコードにしてみて下さい。 
  
(HANA) 2014/08/14(木) 23:39

(HANA)様

返信遅くなりすみません。
あれから考えても考えてもよくわかりませんでした(*´ノД`)

用は私が今やっているコードでは結果を得られないのがわかりました。

 ★ コードはそれが全部です。月別の合計なので、それ以外はありません。
   コピペ―して使用しているので、置いてきぼりのものもあります。
   なにせエラーばかりなので、先に進みまないために失敗箇所を拾いきれないでいます。

 ★ あと(HANA)様がいっていた MATCH関数とEVALUATE関数は別々だったんですね (´゚д゚`)
 ★ 変数ですか。変数、、、、、変数.........はい
 ★ いろいろと埋め込みたいので、ない頭を使ってマクロにしましそ。

 ★ ホントは下記のコードで簡単にできると思ったんですが、そうもいかないですね、
   なかなか難しいです。

 If Range("B1") = "" Then
                         Sheet6.Cells(商品行, 会社列).Value =  Evaluate("SUMPRODUCT((MONTH(Sheet6!$B$2:$B$8)=K$2)*(Sheet6!$E$2:$E$8=$A3),(Sheet6!$J$2:$J$8)/$F3")
                      Else
                           Sheet6.Cells(商品行, 会社列).Value =  Evaluate("SUMPRODUCT((MONTH(Sheet6!$B$2:$B$8)=K$2)*(Sheet6!$E$2:$E$8=$A3)*(Sheet6!$C$2:$C$8=$B$1),(Sheet6!$J$2:$J$8)/$F3")

          End If

MATCH関数チャレンジしてみます。
もう少しお時間下さい  柱|- ̄)q
(もみじ坂) 2014/08/17(日) 16:53


イメージとしてこんな感じでしょうか。

 Set データシート = Sheets("Sheet6")
 Set 集計シート = Sheets("Sheet5")

 For i = 2 To 最終行
    行 = Application.Match(データシート.Cells(i, "E"), 集計シートのA列, 0)
    列 = Month(データシート.Cells(i, "B").Value) + 10

    集計シート.Cells(行, 列)にデータシート.Cells(i, "J")を足し算
 Next

(マナ) 2014/08/17(日) 23:46


 こんにちは。

 こういうときは、検証用に MsgBoxを使うといいです。

 cntR =100 '適宜
 MsgBox "SUMPRODUCT((リスト.Range(A2:A)" & cntR & "="".Range("A3")"")*(B2:B" & cntR & "=""更新""))"

 こうやってみて期待する数式になっているかどうか。
 もしなっていなければ、前から順番に見て行って最初に違っているところをまず直します。
 直ったら、期待する数式になったかどうか確認し、、、、数式が期待通りになるまで繰り返します。
 エラーが出ないのがこの方法のよいところです ^^

 .Rangeの前の「リスト」の文字が1つしかないのが気になりますね。
 1つにつけたら2つ目以降も自動的に有効になったりはしませんので。
 .Rangeの頭の「.」があったりなかったりするのも気になります。

(  佳) 2014/08/18(月) 06:41


 >  エラーが出ないのがこの方法のよいところです ^^
 と思いましたが、コンパイルエラーが出ますね。

 こんな感じですこしずつ長くして、コンパイルエラーの箇所を特定・修正してください。

    cntR = 100
    MsgBox "SUMPRODUCT((リスト.Range(A2:A)"
    MsgBox "SUMPRODUCT((リスト.Range(A2:A)" & cntR
    MsgBox "SUMPRODUCT((リスト.Range(A2:A)"  & cntR & "="".Range("A3")"")"
    MsgBox "SUMPRODUCT((リスト.Range(A2:A)"  & cntR & "="".Range("A3")"")*(B2:B" & cntR & "=""更新""))"

( 佳 ) 2014/08/18(月) 07:15


(  佳)様

分かりやすい説明をありがとうございます・:*(〃・ェ・〃人)*:・
のちほどゆっくりと分解しながら勉強させていただきます〜 _〆(・v・★)

(マナ)様
度々ありがとうございます ヾ(嬉 ω 嬉)ノ
折角なので、そのコードを元にやってみました。

Sub test()

'Dimデータシート
'Dim 集計シート
Dim i As Long

 Set データシート = Sheets("Sheet6")
 Set 集計シート = Sheets("Sheet5")

    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row

        行 = Application.Match(データシート.Cells(i, "E"), 集計シート.Range("A:A"), 0)
        列 = Month(データシート.Cells(i, "B").Value) + 10
        TEL = Application.Match(データシート.Cells(i, "B"), 集計シート.Range("B2"), 0)

       If 集計シート.Range("B1") = "" Then
           i = i + 1
               集計シート.Cells(行, 列).Value = データシート.Cells(i, "J").Value

       'Else ’B列が空欄じゃないとき、上の条件+同じTELの合計する

        End If

    Next

End Sub

 ★欲しい結果はこちらなのですが、
 シート5 B1 が空欄の時 月別&商品別の合計を 
 	[a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[l]	[m]	[n]
 [1]														
 [2]	NO	商品名前									1 月	2 月	3 月	4 月
 [3]	A01					30 								
 [4]	A02					30 				   	          30 	90 	70 	
 [5]	A03					30 					          30 			
 	A04					30 						        60 	

 ★現在のコードではこちらが結果になります。
  違うところを加算されているようです。

 	[a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[l]	[m]	[n]
 [1]														
 [2]	NO	商品名前									1 月	2 月	3 月	4 月
 [3]	A01					30 								
 [4]	A02					30 				   	         20 	60 		
 [5]	A03					30 					         40 			
 	A04					30 								

★原因はやはりi = i + 1の部分でしょうか?
 調べたところ 加算するにも 色々と方法があるようですが、
 テーブルを作って一個ずつデーターを入れたり
 Value=Value+1? をたしたり、
 変数を作ってたしたり
 どれがホント(??)なんですか?
(もみじ坂) 2014/08/18(月) 18:08


TEL指定の集計は、全集計をできるようになってから
そして、ある程度、コードの理解もできてからにしませんか
(修正は、そんなに難しくはないです)

このスレの最初に提示されたコードをみると
以前、別スレで私が回答したコードを理解不十分なままに、
適当に修正してみたと思われる箇所が多いです。
なので、今回は、できるだけ理解することも考えてみてください。

 現行コードについてですが:
 1)複数シートを扱うマクロの場合は、どのシートが対象か明示してください。
  そうしないと、どのシートを表示してマクロを実行するかで結果はかわります。
  シート指定されていない部分が残っています。

 2)結果が期待と違うのは、現行コードでは加算されずに、上書きになっているからです。
  実は、私はHANAさんの書いたことを具体的なコードで示しただけです。
  HANAさんの説明をよく読んで考えてみて下さい。 
  こんな感じになっていませんか?
   転記先セルの値=転記先セルの値+転記元セル値

  今は、
   転記先セルの値=転記元セル値
  となっているので、単なる上書きになっているのだと思います。

 3)原因はやはりi = i + 1の部分でしょうか? 
  i = i + 1は不要です。これがあると違う行の値が転記されてしまいます。

(マナ) 2014/08/18(月) 21:51


 それっぽいコードを作るより前に
 処理の流れをしっかり考えてみてはどうですか?

 VBAはいろいろな書き方ができますから
 あれこれ見ながら雰囲気だけで切り貼りしたのでは
 うまくいかないと思います。

 マナさんからすでにコメントがありますが 書いていたので載せておきます。

 >>Sheet6の1行目から処理をしていきます。
 >>MATCH関数で Sheet5のA列から「A02」を探すと、『4』です。
 >>なので
 >>Cells( 4 , 1 + 10).Value = Cells( 4 , 1 + 10).Value + 10
 >>で、K4セルに「10」が入ります。 

 ご呈示のコードでは i=2から始まりますね。
 >行 = Application.Match(データシート.Cells(i, "E"), 集計シート.Range("A:A"), 0)
 i=2の時↑のコードは E2セルの値を、集計シートのA列の中から探します。
 4行目にありますので 変数:行=4 です。

 >列 = Month(データシート.Cells(i, "B").Value) + 10
 B2セルの月に +10 するので 変数:列=11 です。

 >集計シート.Cells(行, 列).Value = データシート.Cells(i, "J").Value
 4行11列のセル・・・K4セル・・・に入れるのは データシートのどの行のセルですか?
 2行目のデータに関して 変数:行,変数:列 を求めたのですから
 ここも、2行目のセルですよね?・・・J2セル・・・
  集計シート.Cells( 4, 11).Value = データシート.Cells(2, "J").Value

 しかし
 >i = i + 1
 すると、i=2の時 i=3 になって
  集計シート.Cells( 4, 11).Value = データシート.Cells(3, "J").Value
 これだと J3セル です。

 それに、足し算されずに置き換わってしまいますね。
  
(HANA) 2014/08/18(月) 22:00

 2014/08/14(木) 23:39の投稿とかなりかぶる部分があると思いますが
 今度は「ご自身が処理をする」と思って 一つずつ納得しながら読み進んでみて下さい。

 データを一行ずつ処理して行く ってのは前提条件です。
 ですから、まずは最初の行を処理します。

 >140101 	2014年1月1日	8768 		A02					10 
 のデータです。

 この行の「10」がシート5のどこのセルに入るべきなのか調べますよね?
 A列を順番見て行って「A02」が出てくる行を探すと思います。
 それから、今度は2行目を順番に見て行って「1月」の列を探すと思います。
 見つかった行・列の交差するセルに、まずは「10」を入力すると思います。

 ・・・・そのようにしませんか?
 しない場合は、以下読み進む前に
  自分だったらどうやって表を埋めるか
 考えてみてください。(数式を埋め込む 以外の方法で です。)

 ・・・・話は一旦戻します。

 最初の行の処理(K4セルに「10」を入れる)がすんだら
 次の行の処理に移ります。

 >140101 	2014年1月2日	8768 		A02					20 
 やはり、この行の「20」がシート5のどこのセルに入るべきなのか調べます。
 A列で探して行を特定し、2行目で探して列を特定し
 交差するセルを見るとすでに「10」が入っているので
 「20」を足して セルの値は「30」にすると思います。

 さらに次の行〜〜と、最後の行まで繰り返すと
 希望するシート5が完成すると思います。

 繰り返しばかりで馬鹿らしいと思うかもしれませんが
 一度実際に手を動かしてみてもらうと
 処理の流れがつかみやすくなるのではないかと思います。
  
(HANA) 2014/08/18(月) 23:35

 (HANA)様 (マナ)様

 すみません (*´ノД`)理解度がとろいです。

 問題をかみ砕いてもいいですか?
 まずは条件を一個から計算マクロをやってみたいと思います

 その前に
 あれから調べて大まかな事はこんな感じでしょうか?

 ★1.合計の条件を設定
 ★2.合計値を入れる変数を設ける
 ★3.合計値を書き出す

 てぐあいであってますか?

 そして。現在のコードは1しかないので、
 欲しい結果を得ることができない

 2と3を追加しないといけない状況ですね?

 基本からですみません。(´゚д゚`)

 そして何がいけないのかを1行ずつ確かめる

 ですね
(もみじ坂) 2014/08/19(火) 18:41

 >★1.合計の条件を設定
 と言うのは、何のことですか?

 シート5のA列と2行目の事でしょうか?

 >〜〜てぐあいであってますか?
 あっているのかよくわからないので
 上で私が書いている様に 実際に値を使って処理の経過を書いてみてもらえますか?

 >>・・・・そのようにしませんか?
 >>しない場合は、以下読み進む前に
 >> 自分だったらどうやって表を埋めるか
 >>考えてみてください。

 と書きましたし

 >>繰り返しばかりで馬鹿らしいと思うかもしれませんが
 >>一度実際に手を動かしてみてもらうと〜〜

 とも書きましたが、やってもらえましたか?

 コードを書くということは、誰かに指示を出す って事です。
 どのような指示を出すのか決まらなければ、指示をだせませんよね?

 お考えの1〜3の流れがよくわからないので
 具体的にデータを使ったイメージで説明してもらえると
 それに沿ったコードの提案ができるかもしれません。
  
(HANA) 2014/08/19(火) 20:12

(HANA)様

>お考えの1〜3の流れがよくわからないので
私のやりたいことが(HANA)様に伝わっていない手事ですね。 (´゚д゚`)
どう説明すればいいのでしょうか?データーは私しか見れないですしね

条件が二つだと分からないので条件を1個に変更して、成功したら条件を追加してもいいですか?
その方が確認しやすいです。

★シートは

 Sheet5(合計シート) A列1行目から題名です。

 [a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]
 NO	商品名前								合計
 A01					30 				
 A02					30 				
 A03					30 				
 A04					30 				

Sheet6(データーシート)

A列2行目位から題名

 NO	            日付	TEL	名前	NO	品名	数量	単価	cs	pc	金額
 140101 	2014年1月1日	8768 		A02					10 	
 140101 	2014年1月2日	8768 		A02					20 	
 140101 	2014年1月5日	8768 		A03					30 	
 140101 	2014年2月5日	2913 		A02					40 	
 560404 	2014年2月5日	2913 		A02					50 	
 140102 	2014年2月6日	2913 		A04					60 	
 140102 	2014年3月5日	2913 		A02					70 	

★ステップインで確認したところループはちゃんと順番に行っているのに
 何も結果は表示されないです。A2でなら「190」の結果が欲しいのですが
 このコードの結果は「」空欄のままです。エラーもありませんでした。

 Sub test11()
    Dim goukei As Double
    Dim i As Long
    Dim データーシート As Worksheet
    Dim 合計シート As Worksheet

   Set データーシート = Worksheets("Sheet6")
   Set 合計シート = Worksheets("Sheet5")

        For i = 3 To 9
         '1.合計の条件 合計シートと合計シートの同じNOが同じとき
            If データーシート.Cells(i, 5).Value = 合計シート.Cells(i, 1).Value Then
                'PCの値を合計する、データーシートの3行目から9行目探して合計する
                goukei = goukei + データーシート.Cells(i, 10).Value
            End If
        Next i
        '合計結果を合計シートに書き出す
        合計シート.Cells(i, 10).Value = goukei

End Sub

そこで以前から(HANA)様が

>>Sheet6の1行目から処理をしていきます。

 >>MATCH関数で Sheet5のA列から「A02」を探すと、『4』です。
 >>なので
 >>Cells( 4 , 1 + 10).Value = Cells( 4 , 1 + 10).Value + 10
 >>で、K4セルに「10」が入ります。

確認するようにと書かれているコードをどの部分に入れて確認したらよろしいのでしょうか?

前に提示している★の部分に入れて確認すればよろしのですか? (。´・ω・)ん?

 If 集計シート.Range("B1") = "" Then

               ★集計シート.Cells(行, 列).Value = データシート.Cells(i, "J").Value

       'Else ’B列が空欄じゃないとき、上の条件+同じTELの合計する
              ' MsgBox "LISTにこの番号は登録していません。"
        End If

すみません。。。。。。。。。。。。(*´ノД`)
(もみじ坂) 2014/08/19(火) 22:21


 いろんなコードをみて、やみくもにそれっぽいコードを作ったのではだめです。

 今はまだ、コードを作る前の段階です。

 だから、私がの載せた何かのコードを動かして確認する様には
 書いてないと思いますが。。。
   そもそも、コードの投稿はしてないですし。

 2014/08/18(月) 18:08  でのせておられるコードがありますね?
 testって名前がつけてあるコードです。

 それを、条件を1個に変更して
 マナさんの2014/08/18(月) 21:51 のコメントもよく読んで
 修正してみて下さい。
  
 (HANA)

エラーから解決しないと先が進まなさそうです (*´ノД`)

マクロを実行すると エラー400
ステップインにすると 「実行エラー13:型がいっちしません。」

どこが原因でしょうか?

分からないところを一個一個調べている途中ですが、
これはさすがに分からなかったです。ちょっとお手上げです。
分かりましたら教えてくださいよろしくお願いします。

Sub test()

    Dim 合計 As Double
    Dim i As Long
    Dim NO As Long
    Dim データーシート As Worksheet
    Dim 集計シート As Worksheet

 Set データシート = Sheets("Sheet6")
 Set 集計シート = Sheets("Sheet5")

 合計 = 1
    '2行目からラスト
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
      '集計データーのNO=データーシートと同じものを探す
      'Match(検索値, 検索範囲、0)
         NO = Application.Match(集計シート.Cells(i, "A"), データシート.Range("E:E"), 0)

       '集計データーのNO=データーシートが同じ値の時
       If 集計シート.Cells(i, "A") = データシート.Cells(i, "E") Then
              '転記先セルの値=転記先セルの値+転記元セル値
              合計 = 合計 + データシート.Cells(i, "J").Value
       End If

     '繰り返す
    Next
          集計シート.Cells(i, "A").Value = 合計

End Sub

(もみじ坂) 2014/08/21(木) 21:06


 エラーが出るのは、おそらく
  Application.Match(集計シート.Cells(i, "A"), データシート.Range("E:E"), 0)
 の部分で、MATCH関数がエラーになっていると思います。

 そもそも、集計シートのNOが データシートのE列のどこにあるか を調べるのではないですよね?

 何度も書いていますが、コードを作る前に
 ・どのようなコードにしないといけないのか
 ・その考え方で本当にうまくいくか
 検討が必要です。

 2014/08/19(火) 22:21に載せてもらっている データーシートの方には
 行列番号がついてないですね。

 サンプルですから、仮でも良いので行列番号を付けてください。

 それで、空いた列を二列使って
  MATCH関数で データシートの何行目に同じNOがあるか
  MONTH関数で データシートの何行目が該当列か
 求めてみて下さい。

 そして、作った数式と
 サンプルデータも含めた結果(行列番号つきのもの)を
 載せてもらえたらと思います。

 話がややこしくなるので、まずはここまでやって(コードの制作に取り掛からずに)
 コメントしていただけたらと思います。
  
(HANA) 2014/08/21(木) 22:42

(HANA)様

 すみません。こんな感じでしょうか?

>MATCH関数で データシートの何行目に同じNOがあるか
 Hの列 
 =MATCH($B4,Sheet6!$F$3:$F$9,0)
>MONTH関数で データシートの何行目が該当列か
 2行目
 =MATCH(L$2,MONTH(Sheet6!$C$3:$C$9),0) 

※行と列の名前?を入れているため数式の行がずれています。

です。

集計シート

	[a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[l]	[m]	[n]
[1]	NO	商品名前					MATCHでNO検索		1 月	2 月	3 月	4 月
[2]	A01					30 		#N/A			#N/A	#N/A	#N/A	#N/A
[3]	A02					30 		1 						
[4]	A03					30 		3 						
[5]	A04					30 		6 						

データーシート

	[a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]
[1]	NO	日付	TEL	名前	NO	品名	数量	単価	cs	pc	金額
[2]	140101 	2014年1月1日	8768 		A02					10 	
[3]	140101 	2014年1月2日	8768 		A02					20 	
[4]	140101 	2014年1月5日	8768 		A03					30 	
[5]	140101 	2014年2月5日	2913 		A02					40 	
[6]	140102 	2014年2月5日	2913 		A02					50 	
[7]	140102 	2014年2月6日	2913 		A04					60 	
[8]	140102 	2014年3月5日	2913 		A02					70 	

(もみじ坂) 2014/08/21(木) 23:07


 あ、すみません 書き間違えてました。
 データシートのL,M列に
  MATCH関数で 集計シートの何行目に同じNOがあるか
  MONTH関数で 集計シートの何行目が該当列か
 を求めてください。
  
(HANA) 2014/08/21(木) 23:34

こうですか?

集計シート

	[a]	[b]   	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[l]	[m]	[n]
[1]	NO	商品名前									1 月	2 月	3 月	4 月
[2]	A01					30 								
[3]	A02					30 								
[4]	A03					30 								
[5]	A04					30 								

データーシート

★ながくなるので、D と F に それぞれの結果をいれました

F列=MATCH($F3,Sheet5!$B$3:$B$6,0)
D列=MATCH(MONTH(C3),Sheet5!$L$2:$O$2,0)

	[a]	[b]	[c]	   [d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]
[1]	NO	日付	   TEL 月検索値	NO	NO検索値	数量	単価	cs	pc	金額
[2]	140101 	2014年1月1日	8768 	1 	A02	2				10 	
[3]	140101 	2014年1月2日	8768 	1 	A02	2				20 	
[4]	140101 	2014年1月5日	8768 	1 	A03	3				30 	
[5]	140101 	2014年2月5日	2913 	2 	A02	2				40 	
[6]	140102 	2014年2月5日	2913 	2 	A02	2				50 	
[7]	140102 	2014年2月6日	2913 	2 	A04	4				60 	
[8]	140102 	2014年3月5日	2913 	3 	A02	2				70 	

(もみじ坂) 2014/08/22(金) 00:13


 必要なのは 何行目にあるか?、何列目にあるか? です。

 データシートの 2行目の No「A02」は、F列に「2」となってますが
  集計シートの2行目にはないですよね?

 月の方も、D列に「1」となっていますが
  集計シートの1列目にはないですよね?
  
(HANA) 2014/08/22(金) 00:18

F列=MATCH($F3,Sheet5!$B$3:$B$6,0)
D列=MATCH(MONTH(C3),Sheet5!$L$2:$O$2,0)

★すみません。列と行の名前を入れたので、1行と列がずれました。

★本物物のデータの行列はこちらです。結果はあってると思うのですが。
=MATCH(MONTH(C3),Sheet5!$K$1:$N$1,0)
検索範囲が K1 〜なので、 K1 が 1列目ですよね (??)

=MATCH($F3,Sheet5!$A$2:$A$5,0)
商品NO同様 A2 からなので A01 が一列目で A02 がれ 2列目

私の数え方間違っていますか?
(もみじ坂) 2014/08/22(金) 08:18


 =MATCH(MONTH(C3),Sheet5!$A$1:$N$1,0)
 検索範囲を A1:N1 設定の場合は 1月は 11 行目にあります。

 =MATCH($F3,Sheet5!$A$1:$A$5,0)
 検索範囲を A1:A5 A02 は 3行目にあります

	[a]	[b]	   [c]	[d]	[e]	[f]
[1]	NO	日付	   TEL 月検索値	NO NO検索値
[2]	140101 	2014年1月1日	8768 	11 	A02	3
[3]	140101 	2014年1月2日	8768 	11 	A02	3
[4]	140101 	2014年1月5日	8768 	11 	A03	4
[5]	140101 	2014年2月5日	2913 	12 	A02	3
[6]	140102 	2014年2月5日	2913 	12 	A02	3
[7]	140102 	2014年2月6日	2913 	12 	A04	5
[8]	140102 	2014年3月5日	2913 	13 	A02	3

 他の数え方は知らないです(*´ノД`)

(もみじ坂) 2014/08/22(金) 08:28


 >他の数え方は知らないです(*´ノД`)
 正しい結果が得られるのなら、それで大丈夫です。

 次に、2行目のデータから順に一行ずつ集計シートの各セルに値を加算して行って下さい。
 その際、いろいろ思いを巡らせず 単純に
  F列の行,D列の列 のセル番地が表す、集計シートのセル
 に加算して行ってください。

 2行目は、3行,11列なので 集計シートの 3行11列のセルに
  その時入っている値+J列の値 の結果を書き込みます。
 最初は 0+10 = 10 になりますね。

 3行目も、3行,11列なので 集計シートの 3行11列のセルに
  その時入っている値+J列の値 の結果を書き込みます。
 この時は、既に10が入っているので 10+20 = 30 になると思います。

 7回も単純作業を繰り返すのは面倒だとは思いますが
 コードを作成するためと思って作業を行い
 結果を載せて下さい。
  
(HANA) 2014/08/22(金) 10:16

関数でですか?

(もみじ坂) 2014/08/22(金) 18:15


関数は思いつかないです。

マクロでスト こんな感じですか?
実行エラーで結果は分かりませんが (*´ノД`)

Sub test6()

   Dim NO As Integer
   Dim 月 As Integer
   Dim データシート As Workbook
   Dim 集計シート As Workbook

   Set データシート = Sheet("Sheet6")
   Set 集計シート = Sheet("Sheet5")

        NO = Application.Match(データシート.Cells(i, "E"), 集計シート.Range("A:A"), 0)
        月 = Application.Match(Month(データシート.Cells(i, "B").Value), 集計シート.Range("2:2"), 0)
        ’月 = Month(データシート.Cells(i, "B").Value) + 10

        'A01〜A04
        集計シート.Cells(NO, 月) = 集計シート.Cells(NO, 月) + データシート.Cells(3, 10)
        集計シート.Cells(NO, 月) = 集計シート.Cells(NO, 月) + データシート.Cells(4, 10)
        集計シート.Cells(NO, 月) = 集計シート.Cells(NO, 月) + データシート.Cells(5, 10)
        集計シート.Cells(NO, 月) = 集計シート.Cells(NO, 月) + データシート.Cells(6, 10)
        集計シート.Cells(NO, 月) = 集計シート.Cells(NO, 月) + データシート.Cells(7, 10)
        集計シート.Cells(NO, 月) = 集計シート.Cells(NO, 月) + データシート.Cells(8, 10)
        集計シート.Cells(NO, 月) = 集計シート.Cells(NO, 月) + データシート.Cells(9, 10)

End Su
(もみじ坂) 2014/08/22(金) 21:28


 >コードを作成するためと思って作業を行い
 です。
 もみじ坂さんにやってください と言っています。

 >2行目は、3行,11列なので 集計シートの 3行11列のセルに
 > その時入っている値+J列の値 の結果を書き込みます。
 >最初は 0+10 = 10 になりますね。
 書いてあることはわかりますか?
  
(HANA) 2014/08/22(金) 22:39

 >2行目は、3行,11列なので 集計シートの 3行11列のセルに

 > その時入っている値+J列の値 の結果を書き込みます。
 >最初は 0+10 = 10 になりますね。

イメージはこんな感じですか?
意味取り違いえましたか? (´゚д゚`)

集計シート.Cells(3, 11) + データシート.Cells(2, "J") = 集計シート.Cells(3, 11)
(もみじ坂) 2014/08/22(金) 23:25


 コードや数式は一旦考えないでください。

 「集計シートの 3行11列のセル」
 がどこかわかりますか?
  
(HANA) 2014/08/22(金) 23:34

集計シートの K3 ?

1月 の A02 のところですか?
(もみじ坂) 2014/08/22(金) 23:41


 >集計シートの K3 ? 
 そうです。

 >1月 の A02 のところですか?
 そうです。

 だって、↓の
	[a]	[b]	   [c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]
[1]	NO	日付	   TEL 月検索値	NO NO検索値	数量	単価	cs	pc	金額
[2]	140101 	2014年1月1日	8768 	11 	A02	3				10

 「A02」が集計シートのどの行にあるか探して、F列に入れました。
 そして、b列の月が集計シートのどの列にあるのか探して、D列に入れました。
 だから、F列の値の行,D列の値の列のセルを集計シートで探すと
 「A02」と「1月」が交差するセルになりますよね?

 最初、集計シートのK3セルには何も入力がないと思います。
 そこに、J列の値を足し算した結果を入力してください。

 今は、2行目の処理をしているので J列の値というのは「10」です。
 集計シートのK3セルはどうなりますか?
  
(HANA) 2014/08/23(土) 00:06

 K3=10
次は 
 K3=10+20

こんな感じで書けばよかったんですか (´゚д゚`)

(もみじ坂) 2014/08/23(土) 00:17


 考えるときに A02と1月の交差するセル・・・・→K3セルだな
 ではなく、今は あくまでも F列の行とD列の列が交差するセル と考えて下さい。

 次は 3行と11列が交差するセルに+20 なので、
 K3セルに 10+20の結果「30」と入力できましたか?

 >こんな感じで書けばよかったんですか
 どこに書くと思っておられるのかよくわかりませんが 
 今は 結果をセルに入力してください。

 出来ましたら、その次の行も F列とD列の値を確認して
 該当セルに加算してください。

 集計シートはどうなりますか?
  
(HANA) 2014/08/23(土) 00:28

こうですか?

	[a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[l]	[m]
[1]	NO	商品名前								1 月	2 月	3 月
[2]	A01					30 							
[3]	A02					30 					30 	90 	70 
[4]	A03					30 					30 		
[5]	A04					30 						60 	
(もみじ坂) 2014/08/23(土) 07:41

 表示が少しずれている様ですが
 最初に載せておられる希望結果と同じ結果になりましたね?

 つまり、今回の処理が
  まずはデータシートの2行目に関して
   1.MATCH関数でNOが月シートの何行目に出てくるか求める
   2.MATCH関数で月が月シートの何列目に出てくるか求める
   3.月シートの該当のセル((1で求めた行,2で求めた列)のセル)に数量を足し算する
  次に、データシートの3行目に関して
   1.MATCH関数でNOが月シートの何行目に出てくるか求める
   2.MATCH関数で月が月シートの何列目に出てくるか求める
   3.月シートの該当のセル((1で求めた行,2で求めた列)のセル)に数量を足し算する
  更に・・・・

 の繰り返し処理で良い事がわかりますか?
  
(HANA) 2014/08/23(土) 15:00

>の繰り返し処理で良い事がわかりますか?

はい、理屈は分かりました。

月シート は集計のシートでいいんですよね。
(もみじ坂) 2014/08/23(土) 19:36


 >月シート は集計のシートでいいんですよね。
 ですよね。
 なんで「月シート」なんて書いたんですかね。

 >はい、理屈は分かりました。
 でしたら、少しコードの方を考えてみたいと思います。

 まずは2行目のセルを処理することだけを考えてみて下さい。

 F2セルに入れた数式 =MATCH($F2,Sheet5!$A$1:$A$5,0) と
 D2セルに入れた数式 =MATCH(MONTH(C2),Sheet5!$A$1:$N$1,0) を
 マクロで求めないといけませんがわかりますか?

 それから、そのセルに J2セルの値を足さないといけませんが
 どんな記述になるかわかりますか?

 ループ処理は後で考えるとして、まずは2行目だけを考えてみて下さい。
  
(HANA) 2014/08/23(土) 19:59

 > F2セルに入れた数式 =MATCH($F2,Sheet5!$A$1:$A$5,0) と
 > D2セルに入れた数式 =MATCH(MONTH(C2),Sheet5!$A$1:$N$1,0) 

 イメージ的にこうですか?

 データシートF3 = Application.Match(データシート.Cells(3, 5), 集計シート.Range("A:A"), 0)
 データシートd3 = Application.Match(Month(データシート.Cells(3, 2)), 集計シート.Range("2:2"), 0)

 ここはぜっとわかりません。
 前回マナ様がこう書いてたので、そうなのかな?と思ったんですが。
 そうすると(HANA)様の説明した処理の流れと違ってくるので、チョイ戸惑ってます。
 間にクッション入れるのでしょうか?
          
 集計シート.Cells(4, "k").Value = 集計シート.Cells(4, "k").Value+データシート.Cells(3, "j").Value 

(もみじ坂) 2014/08/23(土) 21:25


 >前回マナ様がこう書いてたので、そうなのかな?と思ったんですが。
 そうですね。。。

 じゃあ、セルに入れた
  =MATCH($F2,Sheet5!$A$1:$A$5,0)
 の式を
  =MATCH($F2,Sheet5!A:A,0)
 にしても、同じ結果が得られることはわかりますか?
  
(HANA) 2014/08/23(土) 21:47

えと

$A$1:$A$5 は

1行から5行までしか参照できないけど

A:A は A 列 を 参照できるの 意味ですよね

よって結果は同じ
(もみじ坂) 2014/08/23(土) 22:01


 そうです。

 では Cells(3, 5) と書いてある時
 どのセルの事かわかりますか?
  
(HANA) 2014/08/23(土) 22:04

 > F2セルに入れた数式 =MATCH($F2,Sheet5!$A$1:$A$5,0) と
 > D2セルに入れた数式 =MATCH(MONTH(C2),Sheet5!$A$1:$N$1,0) 

ではなく 下記が正しいです。
行番号と列番号を入れるとずれてしまうのです。すみません。(*´ノД`)

>D3=MATCH(MONTH(B3),Sheet5!$A$2:$N$2,0)
 データシートd3 = Application.Match(Month(データシート.Cells(3, 2)), 集計シート.Range("2:2"), 0)

>F3=MATCH($E3,Sheet5!$A$1:$A$6,0)

 データシートF3 = Application.Match(データシート.Cells(3, 5), 集計シート.Range("A:A"), 0)

 (3, 5) は E列で NO が入っています。
 (3, 2) は B列で 日付が入っています。

シート5(集計シート)

	[a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[l]	[m]	[n]
[2]	NO	商品名前								1 月	2 月	3 月	4 月
[3]	A01					30 						
[4]	A02					30 					30 	90 	70 	
[5]	A03					30 					30 			
[6]	A04					30 						60 		

シート6(データーシート)

	[a]	[b]	   [c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]
[2]	NO	日付  	TEL 月検索値	NO	NO検索値		単価	cs	pc	金額
[3]	140101 	2014年1月1日	8768 	11 	A02	4				10 	
[4]	140101 	2014年1月2日	8768 	11 	A02	4				20 	
[5]	140101 	2014年1月5日	8768 	11 	A03	5				30 	
[6]	140101 	2014年2月5日	2913 	12 	A02	4				40 	
[7]	140102 	2014年2月5日	2913 	12 	A02	4				50 	
[8]	140102 	2014年2月6日	2913 	12 	A04	6				60 	
[9]	140102 	2014年3月5日	2913 	13 	A02	4				70 	

(もみじ坂) 2014/08/23(土) 22:39


 >行番号と列番号を入れるとずれてしまうのです。
 何がずれているのですか?
  データシートは
   日付が     B列
   月検索値が D列
   NOが       E列
   NO検索値が F列
  で、行方向は
   見出しが  2行目
     データが   3行目以降
 って事ですか?

 でしたら、以下そのつもりでコメントしますね。
 (時々間違えるかもしれませんが、その時は「間違えてるな」と思ってください。)

 さて
 >(3, 2) は B列で 日付が入っています。 
 どこのセルか? をお伺いしました。
 列名だけを答えていただいたのでは不完全だと思います。
  
(HANA) 2014/08/23(土) 23:06

 >って事ですか?
 はいそうです。

 >(3, 2) は B列で 日付が入っています。

   B3

 >(3, 5) は E列で NO が入っています。

   E3

 です。
(もみじ坂) 2014/08/23(土) 23:13

 (3, 5)が E3 なので
 >Match(データシート.Cells(3, 5), 集計シート.Range("A:A"), 0)
 は、MATCH関数の 検査値に「E3」 検査範囲に「A:A」が指定されている
 というのは納得できますか?

 すると、数式 MATCH($E3,Sheet5!$A:$A,0) の
 検査値に「E3」 検査範囲に「A:A」を指定したのと同じですよね?

 マクロのMatch関数方に出てくる
  データシート. とか  集計シート.
 とかの方がわからないのかな。。。?
  
(HANA) 2014/08/23(土) 23:23

 いえ 
 Application.Match 関数は 調べましたので、理解できてます。

 分からないのは いちいち エラー がでる 下記のコードと

 = Application.Match(Month(データシート.Cells(3, 2)), 集計シート.Range("2:2"), 0)

 これから進むであろう 作業です。

 次へ進めて大丈夫です (´゚д゚‘)
(もみじ坂) 2014/08/23(土) 23:34

 こちらは触れていないのですが、このイメージでは見当違いでしょうか?

 集計シート.Cells(4, "k").Value = 集計シート.Cells(4, "k").Value+データシート.Cells(3, "j").Value
(もみじ坂) 2014/08/23(土) 23:35

 もういっこ疑問がありました。
 Match関数使用する際はなぜ データーシートに関数をいれるのですか?

(HANA)様のイメージ = Application.Match(Month(データシート.Cells(3, 2), 集計シート.Range("2:2"), 0)

 私わ集計シートに入れるものを思ってました。
 集計シート A02 をデーターシートから拾い集めるイメージが (´゚д゚‘)真逆にびっくりです。

 私のイメージ = Application.Match(Month(集計シート.Range("K4"), データーシート.Range("B:B"), 0)

 ※本日の返信はここまでです。お休みなさい (mー_ー)m.。o○ zZZZ

(もみじ坂) 2014/08/23(土) 23:43


 >こちらは触れていないのですが、このイメージでは見当違いでしょうか?
 これまでの流れから、一つずつ片づけて行った方が良いと思いましたので。

 イメージとしてはあっていると思いますが
 書き方は問題があると思います。

 2014/08/23(土) 00:28の投稿で、私は
 >あくまでも F列の行とD列の列が交差するセル と考えて下さい。
 と書きましたが、その様に考えられていない様です。

 >Match関数使用する際はなぜ データーシートに関数をいれるのですか?
 別にどこに入れてもらっても構いませんが
 別シートにあると、見にくくないですか?

 >Match関数使用する際はなぜ データーシートに関数をいれるのですか?
 「データシートのセルを検索値にするのですか?」って質問かな?
  
(HANA) 2014/08/24(日) 00:00

 >書き方は問題があると思います。
 了解です。一個ずつ片づけていきます。急がないので (; ・`д・´)

 >「データシートのセルを検索値にするのですか?」って質問かな?
 はいそうです。

 いままで見つけたコードを眺めたところ
 検索値は 集計シートでした。

 まあ。どちらを検索値にしても結果は同じですが、
 ちょっと不思議に思っただけです。
 そんなに深刻な問題ではありません。

 >あくまでも F列の行とD列の列が交差するセル と考えて下さい。
 でわかりやすい方を考えていただいたのですね (´。✪ω✪。`)
 わかりました。
(もみじ坂) 2014/08/24(日) 07:32

 >いままで見つけたコードを眺めたところ
 >検索値は 集計シートでした。
 それも、MATCH関数が使ってありましたか?

 今回の例と同じようなデータであればMATCH関数は使われていないと思います。
 MATCH関数が使われているなら、今回の例とはデータが違うと思いますが。。。

 せっかくなので、考えてみて下さい。

 >私のイメージ = Application.Match(Month(集計シート.Range("K4"), データーシート.Range("B:B"), 0)
 これだと、MATCH関数が成り立たないですよね?
 ワークシートに入力する形に変更すると
 =MATCH(MONTH(Sheet5!K4,B:B),0)
 ですから。

 マクロって、「なんとなく書いたら意図をくみ取って動いてくれる」ってものじゃないです。
   関数もそうですが。
 ルールに則って書かないと動いてくれません。
   関数もそうですが。。。

 2014/08/23(土) 07:41 までで
 データシートのセルを検索値にする方法で、
 数式をセルに入力し、その結果が示すセルにご自身で値を加算していき
 希望する結果が得られましたよね?

 同じように「データシートのセルを検索値にする方法」で考えてみて下さい。
 それで希望する結果が得られる手順が確立するところまで考えられれば
 マクロにするのもできると思います。

 関数&手作業 ですから、じっくり考えてみて下さい。

 集計シートの J2セルには「1」と入っています。
 データシートの日付列には「○○年×月△日」と入っています。
 ここから、一月のデータをどのように探しますか?

 NOの方も考えてみましょう。
 集計シートの「A01」を探します。
 MATCH関数で、D列を探すと 見つかりません。

 次に、「A02」を探します。
 MATCH関数で、D列を探すと 3行目にありますので
  3行目のデータを加算します。

 「A02」は4行目にもありますね?
 これは、MATCH関数でどのように求めますか?

 もちろん、「MATCH関数を使う」という前提を覆してもらっても良いです。
 とにかく、最終結果が得られる様な手順を考えてみて下さい。
 「コード」を考えるのではないですよ。
 「手順」を考えて下さい。
  
(HANA) 2014/08/24(日) 12:05

 >それも、MATCH関数が使ってありましたか?
 IF関数と変数がおおいです。

 やり方はいろいろあるて事は分かりました。

 

 >これは、MATCH関数でどのように求めますか?
 私がいままで提供している不完成のコードが、集計シートを検索値にしたやりかたです。

 ★手順

 こういうことですか?イメージ的に (HANA)様の言葉を借りて

 1.MATCH関数でNOが月シートの何行目に出てくるか求める ⇒ 変数 月1 に格納
 2.MATCH関数で月が月シートの何列目に出てくるか求める ⇒ 変数 NO2 に格納
 3. 行のループ = 3行目 〜 最終行
 4. 集計シートに検索結果を書き出す ↓ イメージです。

  集計シート(K列3行目から最終行、K列から最終列) = データーシートの検索結果((NO2の検索結果、月1の検索結果)、(行のループ、"j列"))
 
  (どっかで見かけた気が(??)恋いう使い方があるようです。イメージはあいまいですが。ちょっとつめすぎですか?)

突っ込み所満載と思いますが、こんな感じですか?

(もみじ坂) 2014/08/24(日) 23:36


 何度も書いていますが、コードを作る前に
 ・どのようなコードにしないといけないのか
 ・その考え方で本当にうまくいくか
 検討が必要です。

 「・どのようなコードにしないといけないのか」
 とは少し違いますが
  ・どのようなコードにしようと思うか
 が、1〜4とその下の一行 ですね?

 では
 「・その考え方で本当にうまくいくか」
 やってみて下さい。

 > 1.MATCH関数でNOが月シートの何行目に出てくるか求める ⇒ 変数 月1 に格納
 データはA3セルから始まっているので =MATCH(A3,Sheet6!E:E,0) ですね?
 たとえば、A1セルにこの数式を入れると #N/A となります。
 これは「A01」のデータがない事を表しますのでこの行の処理はないですが

 > 2.MATCH関数で月が月シートの何列目に出てくるか求める ⇒ 変数 NO2 に格納 
 となっていますので、気にせず 求めるのですね?
 さて、B1セルにこの数式を入れるとして、どのような数式にすれば良いですか?

 一つ忘れてもらってはいけないことがあります。
 コードを作るのはもみじ坂さんですよ。
 ですからまずは「手順」を考えて下さい。
  
(HANA) 2014/08/25(月) 00:01

ふむ また壁にぶつかりました。
ここを理解しないとすすめられないですね。。

手順とは

段取り、処理のながれ?、やることの順番。
ここではどういったことになりますか?

>・どのようなコードにしないといけないのか
>・その考え方で本当にうまくいくか
手順とはこれを両方検証したのちに 書き出す の意味合いでしょうか?

(もみじ坂) 2014/08/25(月) 00:12


 私が考えている処理です。
  データシートの3行目から最終行まで処理します。
  1.Noが集計シートの何行目に有るかMATCH関数で調べます。
  2.日付から月部分を取り出して、集計シートの何列目に有るかMATCH関数で調べます。
  3.集計シートの、1で調べた行と,2で調べた列のセルに 数量を足し算します。
  これを最終行まで実行します。

 以上が「・どのようなコードにしようと思うか」の部分です。

 「・その考え方で本当にうまくいくか」部分はすでにもみじ坂さんにやってもらった
  データシートのD列と,F列に数式を入れておいて
  3行目から順に
   F列の行,D列の列 のセル番地が表す、集計シートのセル
  に加算して行く
 です。

 2014/08/23(土) 07:41の段階で、希望する結果が得られることが確認できましたよね。

 それと同じことを、もみじ坂さんが考えてみた 1〜4+1行 の考え方で
 やってみて下さい。

 ご説明から、最初は
 >データはA3セルから始まっているので =MATCH(A3,Sheet6!E:E,0) ですね?
 と思いましたが、どの様にするつもりでしたか?
 「MATCH関数で」求めるおつもりなら、求められるMATCH関数が作れないといけませんよね?

 途中で「MATHC関数では無理だ」となったら 考えた「・どのようなコードにしようと思うか」が
 「その方法ではダメだ」と結論が出ますので、考え直しが必要になります。
  
(HANA) 2014/08/25(月) 00:39

 >「その方法ではダメだ」と結論が出ますので、考え直しが必要になります。

 うんと

 こうですか?

 何かを(例)マクロのMATHC関数)絶対に使ったコードを作らなければいけない

 ではなく

  1.まずは自分のやりたいころ(手順)を作って
 2.1.で作った言葉に必要な結果を検証してみる (検証は関数でもOK)
 3.2.で検証してほしい結果を得られなければ必要なものを追加していく

 順番にやって最終的に必要なコードが出来上がる

 こんな考えですか?

 もう一度手順を考えてみます。今度は大まかなものと、細かい部分の両方で
 少しお時間をください

(もみじ坂) 2014/08/25(月) 07:26


 そんな感じです。
 私としては

 >2.・・・・・(検証は関数でもOK)
 関数を使っていたら、関数を使う。

 >3.・・・・・必要なものを追加していく
 足りないものがあれば追加
 但し、考え方が悪いとわかったら1から考え直し

 だと思います。

 >順番にやって最終的に必要なコードが出来上がる
 3が済んだら、ようやくコードの製作に取り掛かれる。
 3が済んだ段階ではまだコードになっていませんから。

 電車の乗り方がわからない人に、電車の乗り方を教えるとします。
 料金の支払い方法は、最近いくつかありますよね?
 券売機で切符を買う方法とICカード等で事前に払っている中から引く方法と。

 「どうやって乗ってもらおうか」と思った時
 まず、その人にとってどちらの方法で乗ってもらうのが良いか決めると思います。
 切符を買う方が良いと思ったら
  駅に行ったら券売機を探して下さい。
  目的の駅までは○○円なので、券売機に現金を投入し切符を購入して下さい。
  切符を購入したら、改札を探してください。
  券を通すところがあるので、券を差し込み 改札を通り抜け 出てきた券を取ってください。
 こんな感じになると思います。・・・・・・・・・・・Aの手順

 ICカードをすでに持っているなら、ICカードを使った方が良いですよね?
 その場合は
  改札を探してください。
  カードをタッチする所があるので、タッチさせ 改札を通り抜けて下さい。
 になると思います。・・・・・・・・・・・・・・・・Bの手順

 両方の方法がまざって
  駅に行ったら券売機を探して下さい。
  目的の駅までは○○円なので、券売機に現金を投入し切符を購入して下さい。
  切符を購入したら、改札を探してください。
  カードをタッチする所があるので、タッチさせ 改札を通り抜けて下さい。
 と説明してしまったのでは、電車に乗れません。・・・Cの手順
 でも、頭の中で考えただけでは間違いに気づきにくいです。
 実際に駅に行って
  切符購入→改札を探す→カードをタッチする所にタッチさせる
 とやってみると、これでは改札が通れない事がわかります。

 そこで、作った手順のどこが間違ったのか 再度考え直します。
 切符の購入→改札を探す まではうまくいっているので
 最後の「カードをタッチする所にタッチさせる」が問題ですね。

 電車に乗る方法は、もみじ坂さんはしっかりわかっていると思いますから
 いつもやっている様に行動すると
 「あ、カードをタッチじゃなくて 券を入れるんだった!!」
 とわかりますので、「カードをタッチする所にタッチさせる」を書き直して
 手順が完成します。

 相手が日本人なら、そのまま日本語で伝えれば良いですが
 日本語のわからない人だったら、その人がわかる言語に翻訳しないといけません。
 ここが『コードを書く』に当ると思います。
 その人がわかる言語に翻訳するためには、その言語をわかっていないといけません。

 現在もみじ坂さんは
  Cの手順を考えて
  言語がわからないまま翻訳作業
 をしている様なものに思います。

 だから、エラーばかりで先に進めません。

 >もう一度手順を考えてみます。今度は大まかなものと、細かい部分の両方で
 >少しお時間をください
 構いませんが、私が考えている処理が納得出来れば
    (どこまでおつきあいいただけるかわかりませんが)
 1.データシートから処理する方法でコードを完成させ
 2.電話番号が入った場合にも処理出来る様にコードを変更
 その後は(↓どちらを先にやるのが良いのか微妙な所ですが)
 3.集計シートから処理する方法
 4.Dictionaryを使った方法
 と進めて行けたらと思いますが。
  
(HANA) 2014/08/25(月) 11:06

 >構いませんが、私が考えている処理が納得出来れば(どこまでおつきあいいただけるかわかりませんが)

 こんな贅沢な環境のがす意味は見つかりません。
 無料で 1対1 ここ個まで教えてくれるところは知りません。
 とことんと勉強させてください。

 ところどころ理解がとろくてイライラさせると思いますが (*´ノД`)

 時間は大丈夫です忙しい時期は少し時間頂く事になりますが、その都度にコメント残しますね。

 データーはすでに合計できています。sumproduct関数 で
 TEL 条件追加は ピポットテーブルで間に合わせに使用しています。

 手順ができましたら、新しいトビを立てますね

 今後ともよろしくお願いします。

(もみじ坂) 2014/08/25(月) 11:46


 >データーはすでに合計できています。sumproduct関数 で
 >TEL 条件追加は ピポットテーブルで間に合わせに使用しています。
 すでにブックが重いでしょうか?

 TEL条件追加の方も、SUMPRODUCT関数で作っておかれたらどうですか?
 =IF($B$1="",現在の式,現在の式にTEL条件を追加した式)
 みたいな感じにして。
  うまく修正出来ない場合は
  これはまた別のお話としてもらうのが良いと思いますが。
  
(HANA) 2014/08/25(月) 12:08

 >TEL条件追加の方も、SUMPRODUCT関数で作っておかれたらどうですか?
  関数の修正は大丈夫です。

 ピポットにしたのは、他に参考するデーターがあるので、便利です。
 ただ、使えるのは私だけなので (´゚д゚`)
 マクロ作ってボタン押すと結果でるなら、他の人も使えるかなと。。。

(もみじ坂) 2014/08/27(水) 21:40


 [[20140827212357]]『マクロで合計 2』 へ
(もみじ坂) 2015/03/08(日) 23:08

コメント返信:

[ 一覧(最新更新順) ]


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