[[20141213185105]] 『マクロで合計 5』(もみじ坂) >>BOT

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

 

『マクロで合計 5』(もみじ坂)

[[20140814193616]]『マクロで合計 1』
[[20140827212357]]『マクロで合計 2』
[[20141024002243]]『マクロで合計 3』
[[20141124231425]]『マクロで合計 4』

 ◎ HANA様 レッスン用

 ◆今回の課題

   1. 配列を使って合計する etc

 ◆集計シート

 [a]	[b]	[c]	[d]	        [e]	[f]	[g]	[h]	[i]	[j]	[k]	[L]	[M]	[N]	[O]	[P]	[Q]
 NO	商品名前	個数	名称	1 月	2 月	3 月	4 月	5 月	6 月	7 月	8 月	9 月	10 月	11 月	12 月	合計
A01				 												
A02																
A03																
A05																

 ◆データーシート

 [1]	[a]	[b]	        [c]	[d]	[e]	[f]	[g]	[h]	[g]	[h]
[2]	書類NO	日付	        TEL		NO	NO検索値	単価	cs	pc
[3]	140124 	2014年1月5日	1234 		A01	1				10 
[4]	140124 	2014年1月5日	5678 		A01	1				20 
[5]	140124 	2014年1月5日	1234 		A04	0				30 
[6]	140124 	2014年1月5日	5678 		A04	0				40 
[7]	140124 	2014年3月5日	8768 		A02	1				50 
[8]	140124 	2014年3月5日	8768 		A05	1				60 
[9]	140124 	2014年3月5日	1234 		A05	1				70 

 ※このPCはHELP機能を搭載していません。

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


 配列使ってみますか?
 集計シートの E3:Q6 を配列にする予定ですか?

 まぁ、「E3セル」と表現するところが「○○の1行1列」の様に変わるだけで
 処理の流れ自体は変わりませんので、処理の流れを考える所からやってもらえたら良いと思います。

 でも、処理の流れも変更して 配列も使う様に変更 だと二つ変わってしまうので
 集計シートの E3:Q6 を配列にするだけなら、ここまでで完成している処理で
 配列を使うものに変更することを考えてもらう方が良いかもしれません。

 その他の部分も配列にしようと思っておられるのなら
 配列を使わないコードを完成させてから
 配列を使ったものに変更してもらうのが良いように思います。

 Dictonaryではなく「配列」ですよね?
  
(HANA) 2014/12/13(土) 21:54

 >今のコードにとらわれずに、データシートと集計シートを渡されて「集計してね」と言われた時
 >どのように集計していくか、一つずつ手順を確認しながら 文字にしてもらうと良いと思います。

 処理方法はいろいろありそうですね。
 考えかたによってループは一個ですむとは (´。✪ω✪。`)
 1行か1列ずつ勝手に移動してくれないのかしら?
 それか範囲を指定すると勝手に順番に合計してくれるのでしょうか?

 紙上で計算ということなので

 For i〜Nextは条件により3行目から値がある最終行まで繰り返す
 集計シートのB1が空欄の時か(集計シートのB1が空欄じゃない時&データーシートと集計シートB1が同じTELの時)
 1行ずつデーターシーのC列の月 と 集計シート2行目の月 と同じ時

 集計シート

 [a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[L]	[M]	[N]	[O]	[P]	[Q]
 NO	2			1 月	2 月	3 月	4 月	5 月	6 月	7 月	8 月	9 月	10 月	11 月	12 月	合計
A01				H3+H4												
A02						H7										
A03																
A04				H5+H6												
A05						H8+H9										

 E列を最終行まで1行ずつループを繰り返す。
 E列が終わったら 列 +1 で
 次のF列も同様と繰り返す。

 1行ずつデーターシーのC列の月 と 集計シート2行目の月 と等しくないとき
 Q列で NOの値を足し算する。
(もみじ坂) 2014/12/13(土) 22:15

>配列使ってみますか?
 ↓これて配列ですか?

 Set データー = Worksheets("Sheet6")
   Set 集計 = Worksheets("Sheet5")

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

 なんか違う気が^^;;
 配列ていうのは 「E3:Q6」の範囲を入れるカゴ?を作って
 その範囲の中で順番に計算してくれる感じですよね?
 キット 、 しかし、変数ばかり使うので意味が分からないです (´ロ`ill)    

 現在のコードで配列ですね。考えてみます。

(もみじ坂) 2014/12/13(土) 22:32


 >↓これて配列ですか? 
 それは、配列じゃないですね。。。
   goukei = goukei + データー.Cells(i, "J").Value
 は、これまでも使っている
   NO最終行 = 集計.Cells(Rows.Count, 1).End(xlUp).Row
 こういうのと一緒で、変数に値を入れているだけです。

 配列は ↓よねさんのWordとExcelの小部屋|配列の利用 
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_array.html
 の最初に書いてある様に
   •配列を使うと一つの変数に複数の値を格納できます。
 と言うものです。

 集計.Cells(Rows.Count, 1).End(xlUp).Row の値と Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) の値をそれぞれ使いたいから
 最初の方は 変数:NO最終行、後の方は 変数:NO検索 と
 変数を二つ用意したのを覚えていますか?

 A4サイズの箱が一つあると思ってください。
     ┌───────┐
     │       │←A4サイズの箱
     │       │
     │       │
     └───────┘
 もみじ坂さんは、裏に糊のついたA4サイズの用紙をたくさん持っています。
 用紙一枚に「1」と書いて、箱に入れます。
 箱の中を見たら、「1」と書かれている用紙が見えます。
 次に、別の用紙一枚に「2」と書いて、箱に入れます。
 箱の中を見たら、「2」と書かれている用紙が見えます。
 二枚目の用紙は、裏に糊がついていて 一枚目の用紙とくっつくので
 一枚目の用紙に何が書かれていたかはもうわかりません。

 変数:NO最終行、変数:NO検索 はそんな箱です。
 「1」は「1」で後で使いたい。「2」は「2」で後で使いたい。
 だから、箱1に「1」を入れて、箱2に「2」を入れました。
 そしたら、箱1の中をみたら「1」と書かれた用紙が見えて
 箱2の中をみたら「2」と書かれた用紙が見えます。

 配列はと言うと、たとえば
 A4サイズの箱の中に十字の仕切りを付けて、A6サイズの枠を4つ作り
          1列目   2列目
     ┌───┬───┐
  1行目│ A │ C │←A4サイズの箱に仕切りを付けて4分割したもの
     ├───┼───┤
  2行目│ B │ D │
     └───┴───┘
 もみじ坂さんは、裏に糊のついたA6サイズの用紙をたくさん持っているイメージです。

 Aの位置が1行1列の位置。Bの位置が2行1列の位置。

 用紙一枚に「1」と書いて、箱のAの位置に入れます。
 次に「2」と書いて、箱のBの位置に入れると
 Aの位置には「1」、Bの位置には「2」が見える状態ですね。

 もしも「2」と書いた用紙を、箱のAの位置に入れると
 最初に入っていた「1」はなくなって、「2」だけが見えます。

 上から入れると最初に入れていたものが何かわからなくなる のは
 仕切りのない箱と同様ですが、入れる場所
   Aの位置か、Bの位置か、Cの位置か、Dの位置か
 を変える事によって、この箱は4つの値を入れておくことが出来ます。

 •配列を使うと一つの変数に複数の値を格納できます。
 と言う事です。

 今回配列を使うメリットとしては、処理速度の短縮になると思います。
 セルに何かをする(値を見たり、書いたり、書式を変更したり等)のは時間のかかる処理です。
 今回は特に
                    集計.Cells(NO検索, 月検索) = 集計.Cells(NO検索, 月検索) + データー.Cells(i, "j")
                    集計.Cells(NO検索, 月最終列) = 集計.Cells(NO検索, 月最終列) + データー.Cells(i, "j")
 この辺りで、その都度セルの値を書き直していくのではなく
 配列に表を完成させておいて、最後に所定の範囲に書き出すことにすれば
 セルに値を書き込む作業は一回で済みます。

 本当に処理速度を上げることを目的にするなら、他にも配列にしたら良い部分がありますが
 今回は「お勉強」と言う事で、E3:Q6に対応する配列を作る事だけをやってみて下さい。

 >配列ていうのは 「E3:Q6」の範囲を入れるカゴ?を作って
 >その範囲の中で順番に計算してくれる感じですよね?
 最初にカゴ作りは必要ですが
 配列は、計算して【くれる】ものではありません。
 値を保管しておくものです。

 集計.Cells(NO検索, 月検索) = 集計.Cells(NO検索, 月検索) + データー.Cells(i, "j")
 このコードで あるセルに、そこに入っていた値に特定の値を足し算した値を入れました。
 goukei = goukei + データー.Cells(i, "J").Value
 このコードは goukeiと言う変数に、そこに入っていた値に特定の値を足した値を入れる。
 セルの値を読んで結果をセルに書くのか、変数の値を読んで変数に結果を入れるのか の違いで、同じ作りですね。

 配列を使ってもやはり
  Aの位置に、そこに入っていた値に特定の値を足した値を入れる。
 場合、Aの位置は 1行1列の位置なので、イメージとしては
  箱(1, 1) = 箱(1, 1) + データー.Cells(i, "J").Value
 こんな感じです。
  集計.Cells(NO検索, 月検索) = 集計.Cells(NO検索, 月検索) + データー.Cells(i, "j")
 とよく似ているでしょう?
  
(HANA) 2014/12/14(日) 00:43

 う〜ん (*゚Å゚;*)

 とりあえずこんな感じでしょうか?

 >E3:Q6に対応する配列を作る事だけをやってみて下さい。

 簡単に書くとE3:Q6はこんな感じ

 tbl = 集計.Range(集計.Cells(3, 5), 集計.Cells(6, 17)).Value ですよねキット

 それを最終行&最終列いれると

   '範囲をカゴに格納する
    tbl = 集計.Range(集計.Range("A3:A" & Rows.Count), 集計.Range("A2" & Columns.Count)).Value

 しかし、あんまり意味ないような (??)

 それとも、、、、、
 しかし、カゴはもっと単純のものだったような?
 For I = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row
   tbl = 集計.Range(I, 集計.Range("A2" & Columns.Count)).Value

 これでは、仕切りのない箱と同様ですね。。。
 もう少し考えてみます (´゚д゚`)
 最初にカゴ作りは必要なのですね。
(もみじ坂) 2014/12/17(水) 00:05

 >簡単に書くとE3:Q6はこんな感じ
 >tbl = 集計.Range(集計.Cells(3, 5), 集計.Cells(6, 17)).Value ですよねキット
 いや、これは E3:Q6の範囲の値をtblに取り込んでいますね。

 その下に書いてある
 >'範囲をカゴに格納する
 の「格納する」と言う言葉の方がより合っていると思いますが
 今は格納したいわけではなくて、カゴを作りたいのです。

 先のページの、B.動的配列 の上側のコードをステップインで実行してみて下さい。
  データも、説明通りA1:A6に作成して下さい。
 ローカルウィンドウは表示されていますね?
 最初
     式              値           型
  [+] Module1                   Module1/Module1
        I            0            Integer
        lRow         0            Integer
        C                         Integer()
 となっています。この段階で C はまだ仕切りのない箱の状態です。

  ReDim C(lRow)
 の行が実行された後は
     式              値           型
  [+] Module1                   Module1/Module1
        I            0            Integer
        lRow         6            Integer
   [+] C                         Integer(0 to 6)
 になりますね。

 Cの前に [+]がついて、型の所も (0 to 6) になります。
 [+]を開いてもらうと
        C(0)         0            Integer
        C(1)         0            Integer
        C(2)         0            Integer
        C(3)         0            Integer
        C(4)         0            Integer
        C(5)         0            Integer
        C(6)         0            Integer
 になっていて、7つの部屋に区切られています。

 実際は、行数も列数も必要なので
   ReDim 箱(行数 , 列数)
 こんな感じになると思います。

 >それを最終行&最終列いれると
 まで一度に考えるのは難しいと思うので
 まずは 集計結果の範囲は「E3:Q6」データ範囲は「3行目から9行目まで」と固定にして
 動くコードを完成させてもらうのが良いと思います。 
  
(HANA) 2014/12/17(水) 10:05

 「ReDimステートメント」

 この「動的配列」はDimステートメントだけでは利用できません。利用するにはReDimステートメントでの 初期化が必要となります。

 とありますが、配列使うときは必ずこれを使用するんですね。
 でも、何を初期化するんのやら (??)

 >B.動的配列 の上側のコード
 こちらですか? みんな701なんですねコード。。。。。。

 Sub rei701_1()
 Dim I As Integer
 Dim lRow As Integer
 Dim C() As Integer
 lRow = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行番号を求めています
 ReDim C(lRow)
  For I = 1 To lRow
    C(I) = Cells(I, 1).Value * 10
  Next I
  For I = 1 To lRow
    Cells(I, 2).Value = C(I)
  Next I
 End Sub

 これを私のやっていることに置き換えると

 NO最終行 = 集計.Cells(Rows.Count, 1).End(xlUp).Row
 ReDim C(NO最終行)
 For I = 1 To NO最終行
  処理に続く

 のような (??)

 内容を読む感じではこっちポイ?

 Sub rei701_2()
 Dim I As Integer
 Dim lRow As Integer, lRow2 As Integer
 Dim C() As Integer
 lRow = Cells(Rows.Count, 1).End(xlUp).Row
 ReDim C(lRow)
  For I = 1 To lRow
    C(I) = Cells(I, 1).Value * 10
  Next I
 Cells(lRow + 1, 1).Value = 50
 Cells(lRow + 2, 1).Value = 60

 lRow2 = Cells(Rows.Count, 1).End(xlUp).Row
 ReDim Preserve C(lRow2)

  For I = lRow + 1 To lRow2
    C(I) = Cells(I, 1).Value * 10
  Next I
  For I = 1 To lRow2
    Cells(I, 2).Value = C(I)
  Next I
End Sub
(もみじ坂) 2014/12/17(水) 19:16


 えっと、参考にする所は
  変数を準備して
  部屋に区切る
 と言う部分です。

 それ以外の部分は、今回やりたい集計とは関係ない話ですので
 >これを私のやっていることに置き換えると
 置き換えられません。

 現在できているコードを、配列を使ったものに置き換えるのです。
 配列を使ったサンプルコードを、置き換えて目的のコードを作るんじゃないです。

 >こちらですか?
 そうです。
 ローカルウィンドウを表示させて、ステップインで実行しながら
 ReDimの行が実行される前と後でどこが変わるか。
 確認してください。 
  
(HANA) 2014/12/17(水) 22:37

 確認遅くなってすみません。
 人の風邪をもらい唸ってました (´ロ`ill)
 しかも、胃腸とは運がないです。

 コードを確認したところ下記の結果になりました。

    式              値           型
  [+] Module1                   Module1/Module1
        I            6            Integer
        lRow         6            Integer
   [+] C                         Integer(0 to 6)
 になりますね。
 Cの前に [+]がついて、型の所も (0 to 6) になります。
 [+]を開いてもらうと
        C(0)         0            Integer
        C(1)         0            Integer
        C(2)         100            Integer
        C(3)         200            Integer
        C(4)         300            Integer
        C(5)         400            Integer
        C(6)         500            Integer

 のようになって

 For I = 1 To lRow
    Cells(I, 2).Value = C(I)
  Next I

 でセルに値を書き入れる感じでしょうか?

(もみじ坂) 2014/12/20(土) 23:13


 それで、探しているコードがどれかわかりましたか?

 そもそも、ある目的のためにrei701_1のコードを読み進めているのですが
 目的が何かわかってますか?
  
(HANA) 2014/12/21(日) 14:21

 コードはこちらで、実行しました。

 Sub rei701_1()
 Dim I As Integer
 Dim lRow As Integer
 Dim C() As Integer
 lRow = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行番号を求めています
 ReDim C(lRow)
  For I = 1 To lRow
    C(I) = Cells(I, 1).Value * 10
  Next I
  For I = 1 To lRow
    Cells(I, 2).Value = C(I)
  Next I
 End Sub

 >目的が何かわかってますか?

 変数を準備して  部屋に区切る と言う部分 と
 ReDimの行が実行される前と後でどこが変わるか。
 を見るんですよね 違いましたか?

 ReDim C(lRow) の動きですか。。あまり自信ないですが。

 1〜最終行まで順番に値を計算して(1,6)にするにして
 For I = 1 To lRow
    C(I) = Cells(I, 1).Value * 10
  Next I

 6周目で、↓に値をまた(1,6)行に書き出す
 For I = 1 To lRow
    Cells(I, 2).Value = C(I)
  Next I
 とこんな動きしているんではないかと思ってます。
 ただ、私にとっては2回もループしているのになぜ計算時間が早くなにのか。。
 このコードから想像できないのですが ^^;;

 C(I) はカゴとして(1,6)範囲を格納して。計算知ってから。セルに書き出す。
(HANA)様の説明からなんとなく、そんな感じの処理しているのかな?

 とは、思いますが。。。。。
(もみじ坂) 2014/12/21(日) 22:43

 目的は
  「変数を準備して  部屋に区切る にはどう書けば良いか調べる」
 です。

 そして、サンプルでは 変数Cは6個(0 to 6)の部屋に分けられていますが
 実際は E3:Q6 と同じ行数列分の部屋に分けられている変数が必要です。

 ですから、rei701_1のコードを(やって)みて
 1.部屋に分けるコードの書き方を突き止める。
 2.その後、実際に必要な行列数分の部屋に分けるコードの場合
   どの様に書けばよいのかを考える。
 をして下さい。
  
(HANA) 2014/12/22(月) 15:54

 業務連絡

 すみません。この続き年末か年始になりそうです。
 忙しく、くたびれて、頭が働かないです (TwT)
(もみじ坂) 2014/12/25(木) 18:44

 時間が取れる時に、じっくり考えてみて下さい。
  
(HANA) 2014/12/26(金) 17:02

 あけましておめでとうございます。
 引き続き今年もよろしくお願いします m(_ _)m

 一回サボるとなかなか重い腰が上がらないものですね。
 明日やるぞ −x−p と思いながらあっという間に2週間たちました。

 自分に気合とおさらいに明日からまた頑張ります p(^0^)q
                       ^^^^ マタ? -.-。。。。

 1.部屋に分けるコードの書き方を突き止める。
 2.その後、実際に必要な行列数分の部屋に分けるコードの場合
   どの様に書けばよいのかを考える。

 ザックリ実行したところ、サンプルコードで見たときはFor I が
 同じのが2回も書いてると思ったんですが、 違いましたね ^^;; 
 
 自分のコードに置き換えるのはなかなか難しいところですが。トライしてみます。

(もみじ坂) 2015/01/09(金) 23:49


 そうですね。

 ローカルウィンドウを見ながら
 サンプルコードをステップインで一行ずつ実行して
 どの行が済んだ時に、どこがどの様に変わるのか。

 まずは何度も実行して確認してみて下さい。
  
(HANA) 2015/01/11(日) 22:05

  ≧x≦

 Sub rei701_1()
 ReDim C(lRow)

 の役割ですが、
 ここは最終行を入れるのか
 それとも集計シートの範囲を入れるものでしょうか?

 ReDim C(1 To NO最終行, 1 To 月最終列)
 をしたんですが、だからなに?といった感じです。。。

 1.部屋に分けるコードの書き方
 というのは

 For〜 next
 ではないのですね

 ReDim のことでもなさそうですね。。。

 何度ステップインしても
 順番に計算しているだけなので。。。

(もみじ坂) 2015/01/14(水) 20:01


 >For〜 next
 >ではないのですね
 そうですね。そこは違いますね。

 >ReDim のことでもなさそうですね。。。
 なんでそう思いましたか?
 2014/12/17(水) 10:05 の私の投稿を読んでください。

 ちなみに、「部屋を分けた」という表現が
 変数がどのような状態になったときのことを言っているのか
 わかっていますか?
  
(HANA) 2015/01/15(木) 15:40

 >なんでそう思いましたか?
 それは下記を見てそう思ってしまいました。。。。
 (。´・ω・)ん?

 >ReDim のことでもなさそうですね。。。
 これのことですね。。。。

 ********************************
 C(0)         0            Integer
        C(1)         0            Integer
        C(2)         0            Integer
        C(3)         0            Integer
        C(4)         0            Integer
        C(5)         0            Integer
        C(6)         0            Integer
 になっていて、7つの部屋に区切られています。
 実際は、行数も列数も必要なので
   ReDim 箱(行数 , 列数)
 こんな感じになると思います。

 集計結果の範囲は「E3:Q6」データ範囲は「3行目から9行目まで」と固定にして
 ********************************

 と記載していたので、
 ReDim 箱(3 , 9)
 したり
 ReDim 箱(1 To NO最終行, 1 To 月最終列)
 したり 試してました。

 (。´・ω・)ん?
 ReDim 箱(3 , 9)
 は集計シートの範囲を入れるんですね。E3:Q6

(もみじ坂) 2015/01/15(木) 22:09


 >ちなみに、「部屋を分けた」という表現が 変数がどのような状態になったときのことを言っているのか わかっていますか?

 以前説明頂いたこんな感じですか↓ (・ω・`。)?
          1列目   2列目
     ┌───┬───┐
  1行目│ A │ C │
     ├───┼───┤
  2行目│ B │ D │
     └───┴───┘

 ↑のようですと
 変数が4つ区切って分かれさせている状態ですよね キット。。。。

 配列を使うと一つの変数に複数の値を格納できるようなので、

 ↓この図は配列ならば、
 C(0)         0            Integer
        C(1)         0            Integer
        C(2)         0            Integer
        C(3)         0            Integer
        C(4)         0            Integer
        C(5)         0            Integer
        C(6)         0            Integer

 ReDim 箱(3、6) に計算条件をいりこむといった感じでしょうか?
 (集計シートの範囲。E3:Q6)
 For I = 3 To 6
      箱(3, 5) = 箱(3, 5) + データー.Cells(i, "j")
            箱(3, 5) = 箱(3, 5) + データー.Cells(i, "j")
 next
            箱(4, 5) = 箱(4, 5) + データー.Cells(i, "j")
            箱(4, 5) = 箱(4, 5) + データー.Cells(i, "j")

 これは配列 (*゚Å゚;*) ?
 ただ、こうすると  ReDim と For が同じ値になってしまうので、意味あるの?
 また、振出しに戻る。。。。 ΣΣ(゚д゚lll)!
(もみじ坂) 2015/01/15(木) 23:08

 何行  何列の部屋に分ければ良いですか?
 3行9列ですか?

 まずはそこを考えて見て下さい。
  
(HANA) 2015/01/16(金) 20:22

 集計シートの範囲。E3:Q6 でしたら
 ReDim 箱(行数 , 列数)
 行数は 3行目ではなく
 3行目〜6行目 で行数は 4 になるといった感じでしょうか?
 部屋を区切るという意味は。。。

 ReDim 箱(4、17)
(もみじ坂) 2015/01/16(金) 21:53

 >3行目〜6行目 で行数は 4 になるといった感じでしょうか?
 そうです。

 それで、E〜Q だと列数はいくつですか?17ですか?
  
(HANA) 2015/01/16(金) 22:32

E〜Q ですと 13 ですね

ReDim 箱(4、13)

こうなりますね

 コンパクトにしたんですが、こんな感じですか?
 まったく直しがない (*゚Å゚;*)

    Dim NO検索 As Long, NO最終行 As Long
    Dim 月検索 As Long, 月最終列 As Long
    Dim I As Long
    Dim 行番号 As Long
    Dim 集計 As Worksheet
    Dim データー As Worksheet
    Dim カウント As Long
    Dim 箱 As Variant

    Set 集計 = Worksheets("Sheet5")
    Set データー = Worksheets("Sheet6")

    NO最終行 = 集計.Cells(Rows.Count, 1).End(xlUp).Row
    月最終列 = 集計.Cells(2, Columns.Count).End(xlToLeft).Column

    集計.Range(集計.Cells(3, 5), 集計.Cells(NO最終行, 月最終列)).ClearContents

    'ReDim 箱(結果入れる行の数 , 結果入れる列の数)入れるの変数
    ReDim 箱(4, 13)

      For I = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row
         If 集計.Range("B1").Value = "" Or (集計.Range("B1").Value <> "" And データー.Range("C" & I).Value = 集計.Range("B1").Value) Then
             カウント = WorksheetFunction.CountIf(集計.Range("A3:A" & Rows.Count), データー.Cells(I, "E"))

            If カウント <> 0 Then
                NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A:A"), 0)
                月検索 = Application.Match(Month(データー.Cells(I, "B")), 集計.Range("2:2"), 0)
                  箱(NO検索, 月検索) = 箱(NO検索, 月検索) + データー.Cells(I, "j")

            End If
            End If

     Next

 ★あと一つ確認ですが。
  配列は今あるコードで、ちょいと直す感じですよね E3:Q6 のとこ
 
  一から作るのではないですよね、
  以前。集計シートから合計ではなく
  データーシートから合計するとかしないとか (´・ω・`)

(もみじ坂) 2015/01/16(金) 23:47


 >ReDim 箱(4、13) 
 >こうなりますね 
 ローカルウィンドウで確認しましたか?

 >配列は今あるコードで、ちょいと直す感じですよね E3:Q6 のとこ
 です。

 >以前。集計シートから合計ではなく
 >データーシートから合計するとかしないとか (´・ω・`)
 ひとつ前のスレの終わりの段階ではその流れでしたが
 このスレの最初の、もみじ坂さんが削除してしまったところに
  配列を使ってみたい
 と言った書き込みがあったので、コードを全面的に書き直すのではなく
 完成しているコードを変更して、配列を使ったコードを作ってみる話になったと思います。
  
(HANA) 2015/01/17(土) 01:02

>ローカルウィンドウで確認しましたか?

はい。箱の値が なにも計算されないのですよ T0T

箱の使いどころが違うのですね (*゚Å゚;*)キット

一回簡単な 「足し算を」 作ってみます (*´ノД`)

★確認ですが。
 NO最終行 = Cells(Rows.Count, 1).End(xlUp).Row
 これ一つで、集計シートとデーターシート両方使いえさせる方法ないですよね。。。

(もみじ坂) 2015/01/17(土) 19:23


 サンプルコードで、ReDim C(lRow)の行が実行されたとき
 変数がどのように変わるか、確認してください。

 部屋を分けるのと、計算結果を各部屋に入れるのは
 また別の話です。

 >>ローカルウィンドウで確認しましたか?
 は、「それじゃ正解じゃない」ってことです。

 >これ一つで、集計シートとデーターシート両方使いえさせる方法ないですよね。。。 
 どう言った事を聞かれているのか、よく分からないのですが。
  
(HANA) 2015/01/17(土) 20:15

 >部屋を分けるのと、計算結果を各部屋に入れるのは また別の話です。
そうなんですか?

 ReDim C(lRow) は
 この行を過ぎると C の値はすべて 「0」
 表示されます。
 部屋は7個です
        C(0)         0            Integer
        C(1)         0            Integer
        C(2)         0            Integer
        C(3)         0            Integer
        C(4)         0            Integer
        C(5)         0            Integer
        C(6)         0            Integer
        C(7)         0            Integer

 For 〜
 から順に計算されて結果が表示されつに

 対して

 箱は ずっと
 Empty 値

 部屋は5個に区切ってあります。
  + : 箱(0) :  : Variant(0 to 13)
  + : 箱(1) :  : Variant(0 to 13)
  + : 箱(2) :  : Variant(0 to 13)
  + : 箱(3) :  : Variant(0 to 13)
  + : 箱(4) :  : Variant(0 to 13)

 です。

 エラーはでませんが。得る結果もなし(*´ノД`)。

(もみじ坂) 2015/01/17(土) 21:10


 >部屋は7個です
 0は8個書いてあるので、部屋は8個ですよね。

 >部屋は5個に区切ってあります。
 5行14列ですね。

 用意しないといけないサイズは
 5行14列でよかったんでしたっけ?
  
(HANA) 2015/01/17(土) 21:52

 >0は8個書いてあるので、部屋は8個ですよね。
  (。´・ω・)ん? ReDim C(lRow)
  は7行しかないのに なぜ 8個部屋必要なんですか?
  計算するときも、 C(1)からなんですよ

 >5行14列でよかったんでしたっけ?
 ReDim 箱(4, 13) て書いてあるのに、
 なぜ箱は5個になってるんですか?

 システム上余分に 0 の行 が付くんでしょうか?
 その数を + か − を入れながら

 ReDim の数を調整しなければいけないとか。。。。
(もみじ坂) 2015/01/19(月) 22:37

 変数Cは、ローカルウィンドウで
        C(0)         0            Integer
        C(1)         0            Integer
        C(2)         0            Integer
        C(3)         0            Integer
        C(4)         0            Integer
        C(5)         0            Integer
        C(6)         0            Integer
        C(7)         0            Integer
 となっていますよね?

 部屋は、C(0)〜C(7)なので 8部屋あります。
 0から順に7までカウントしてみてください。

 C(1)〜C(7)であれば、7部屋です。

 「8部屋必要」といっているのではなく
 「8部屋ありますよ。7部屋ではなく。」といっています。
  
(HANA) 2015/01/20(火) 00:26

 なるほど。 必要ではなく あるんですね。
 「0」は余分にある。といったイメージですね

 そうしますと、1行足りないので、
 6行14列ですね
 ReDim 箱(5, 13) 個の数に対して

  + : 箱(0) :  : Variant(0 to 13)
  + : 箱(1) :  : Variant(0 to 13)
  + : 箱(2) :  : Variant(0 to 13)
  + : 箱(3) :  : Variant(0 to 13)
  + : 箱(4) :  : Variant(0 to 13)
  + : 箱(5) :  : Variant(0 to 13)

 集計シート
 [a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[L]	[M]	[N]	[O]	[P]	[Q]
 NO	2			1 月	2 月	3 月	4 月	5 月	6 月	7 月	8 月	9 月	10 月	11 月	12 月	合計
A01				H3+H4												
A02						H7										
A03																
A04				H5+H6												
A05						H8+H9		
(もみじ坂) 2015/01/20(火) 23:05

 >「0」は余分にある。といったイメージですね
 余分にあると言うより
 ReDim C(7) とすると、0から始まってしまう
 です。

 今回は1から始まっている方が都合がよいので
 その方法を探してみて下さい。
  
(HANA) 2015/01/20(火) 23:34

 >今回は1から始まっている方が都合がよいので

 それは以前の書いた書き方ではないですか?
 ↓こんな感じの

 ReDim 箱(1 To NO最終行, 1 To 月最終列)

(もみじ坂) 2015/01/20(火) 23:48


 > それは以前の書いた書き方ではないですか?
 はい。それです。
  
(HANA) 2015/01/21(水) 19:30

 そうしますと

 ReDim 箱(1 To NO最終行, 1 To 月最終列)

 このまま使用しても大丈夫そうですね
 ちゃんと箱を区切ってくれているので、

 問題は計算結果をどうやって入れるかですね。。。。。
(もみじ坂) 2015/01/21(水) 23:28

 変数を使うなら、変数の中身も説明して下さい。
 各変数に値を入れる部分をセットにしてもらっても良いですが。

 NO最終行と月最終列はいくつになってますか。
 どうやって求めますか?
  
(HANA) 2015/01/21(水) 23:56

こんな感じでしょうか?

    Set 集計 = Worksheets("Sheet5")
    Set データー = Worksheets("Sheet6")

    NO最終行 = 集計.Cells(Rows.Count, 1).End(xlUp).Row
    月最終列 = 集計.Cells(2, Columns.Count).End(xlToLeft).Column

    集計.Range(集計.Cells(3, 5), 集計.Cells(NO最終行, 月最終列)).ClearContents

    'ReDim 箱(結果入れる行の数 , 結果入れる列の数)入れるの変数
  ’1行目〜最終行、1列目から最終列を箱に格納
   '7行17列です
    ReDim 箱(1 To NO最終行, 1 To 月最終列)

 集計シート
 [a]	[b]	[c]	[d]	[e]	[f]	[g]	[h]	[i]	[j]	[k]	[L]	[M]	[N]	[O]	[P]	[Q]
[2] NO	2			1 月	2 月	3 月	4 月	5 月	6 月	7 月	8 月	9 月	10 月	11 月	12 月	合計
[3]A01				H3+H4												
[4]A02						H7										
[5]A03																
[6]A04				H5+H6												
[7]A05						H8+H9	
(もみじ坂) 2015/01/22(木) 00:18

 それで用意しないといけない大きさと
 同じものができますか?

 何度目かになりますが、まずは
 「用意しなければいけないサイズが  何行何列なのか」
 お答えください。

 また、NO最終行と月最終列はそれぞれいくつなのか
 教えて下さい。
  
(HANA) 2015/01/22(木) 09:30

 えと 7行13列 でしょうか?
 1行目から数えてしまいますね (*´ノД`)

 >NO最終行と月最終列はそれぞれいくつなのか
 ReDim 箱(1 To NO最終行, 5 To 月最終列)
 - : 箱 :  : Variant/Variant(1 to 7, 5 to 17)
(もみじ坂) 2015/01/22(木) 21:43

 E3:Q6の範囲の大きさが
 7行13列ですか?

 きちんと読んでくれていないか
 ちゃんと考えてくれて居ない様に感じます。
  
(HANA) 2015/01/22(木) 22:03

 たんなる迷いだけかもです (*´ノД`)

 ReDim にいれるのは A1〜Q6 いいのか
 なぜ         E3〜Q6 じゃないといけないのか。

 E3:Q6の(合計値の範囲のみ)範囲なら
 4行13列
 ReDim 箱(3 to 6,5 to 13) です。
(もみじ坂) 2015/01/23(金) 01:15

 >今回は1から始まっている方が都合がよいので
 >その方法を探してみて下さい。
 > 
 >(HANA) 2015/01/20(火) 23:34
  
(HANA) 2015/01/23(金) 22:06

>E3:Q6の範囲の大きさが
 >7行13列ですか?
 >(HANA) 2015/01/22(木) 22:03
 なら
 4行13列
 ReDim 箱(3 to 6,5 to 13) です。

 >今回は1から始まっている方が都合がよいので
 >その方法を探してみて下さい。
 > 
 >(HANA) 2015/01/20(火) 23:34
 なら
 A1:Q6の範囲 になりますか?

 6行13列
 ReDim 箱(1 to 6,1 to 13) 

 ですか (。´・ω・)ん??

(もみじ坂) 2015/01/24(土) 15:54


 範囲の【大きさ】です。

 E3:Q6の範囲の大きさは
 4行13列
 ですよね。

 たとえば、A1:M4の大きさも
 4行13列です。

 変数を4行13列の部屋に分けてください。
 その際、左上の位置が(1,1)で表せるようにしてください。
  
(HANA) 2015/01/24(土) 20:44

 4行13列なら
 ReDim 箱(1 to 4,1 to 13)

 左上の位置が(1,1)はならないです。 (。´・ω・)ん?
 いろいろ試したんですが、
 はこは(1)としか出ないのですね。
 書き方がちがうのでしょうか?
  + : 箱(1) :  : Variant(1 to 13)

 余談ですが、
 『マクロで合計 4』 まで習ったコードで実際ためしたんですが、
 とんでもない時間かかるんですね、コメント表示コードは削除したのにかかわらず
 (*゚Å゚;*) 何回か実行しますと、固まってしまって大変でした。
 いろんな条件を1行ずつ計算してるので、
 当たりまえでしょうが、ちょっとショックです (*´ノД`)
(もみじ坂) 2015/01/26(月) 21:57

 >左上の位置が(1,1)はならないです 。
 なりませんか?

 では、ReDim 箱(1 to 4,1 to 13) にしたとき
 左上の位置はどこなんですか?
  
(HANA) 2015/01/26(月) 23:06

 失礼します。
 HANAさんの個人レッスンにしゃしゃりでてごめんなさい。

 もみじ板さんが、

 ReDim 箱(1 to 6,1 to 13)

 の左上が 左上の位置が(1,1)はならないです といわれているのは

 + : 箱(1) :  : Variant(1 to 13)

 ローカルウィンドウの、箱(1) が、そうなっているということではないのですか?
 もし、そうであれば、この + : 箱(1) :  : Variant(1 to 13) は、1行目の全体の13個の要素を表示したもので
 この + をクリックすると、その中の13個の要素が縦に 箱(1,1)、箱(1,2)、・・・と、1つずつすべて表示されます。
 左上の要素は、この中の 箱(1,1) の部分です。

 見当違いのレスならスルーしてください。お邪魔しました。

(β) 2015/01/27(火) 05:57


 >左上の位置はどこなんですか?
 箱の一番先頭の

  + : 箱(1) :  : Variant(1 to 13)
 ではなさそうですね "(-""-)"

 (β)様の説明の通りの場所でしたら
 左上は(1,1)になっています・

  + : 箱(1) :  : Variant(1 to 13)
    : 箱(1,1) :  
    : 箱(1,2) :  
        :
        :

 こんな感じです
(もみじ坂) 2015/01/27(火) 13:48

 ReDim 箱(1 to 4,1 to 13) から
 4行13列の配列が想像できていますか?

 ワークシート上のA1:M4の範囲と同じ大きさの配列ですが。
  
(HANA) 2015/01/27(火) 21:04

着地点が分からないので、回答が余計
分からなくなりました。

研究中 _〆(・v・★)
(もみじ坂) 2015/01/28(水) 01:12


 ReDim について確認ですが、
 下記のシードで大きさがA1:B6あります。
 使用したい範囲はA3:B6です。
 その際のReDimは
 ReDim 箱(3 to 6,1 to 2) 出会ってますよね
 ただ左側が(1,1)の条件を入れると

 ReDim 箱(1 to 6,1 to 2) になりますよね

           A列目   B列目				
     ┌───┬───┐				
  1行目│ A │ G  │				
     ├───┼───┤				
  2行目│ B │ H  │				
     ├───┼───┤				
  3行目│ C  │ I  │				
     ├───┼───┤				
  4行目│ D  │ J  │				
     ├───┼───┤				
  5行目│ E  │ K  │				
     ├───┼───┤				
  6行目│ F  │ L  │				
     └───┴───┘				

 いろいろ試して悩んだ結果
 ReDim 箱に記載している数字は
 エクセルの行順番と列順番が合わないとエラーになるので、
 良いハスですが。。。。

 もし間違った場合はどこが違うかをヒント頂けると助かります (*´-`*)ゞ ポリポリ
(もみじ坂) 2015/01/28(水) 17:20

これでしたら、E3:Q6の範囲までに書き出すことができました。

 Sub TEST7()
    Dim S2 As Worksheet
    Dim I As Long
    Dim II As Long
    Dim A As Variant

    ReDim A(3 To 6, 5 To 17) As String ' 4×13 列
    Set S2 = Worksheets("Sheet4")
    ' 配列に値をセット

    For II = 5 To 16  '列
    For I = 3 To 6  '行

    A(I, II) = Cells(I, 1).Value * 10

    Next I
     Next II

    ' 配列を一気にセル範囲に転記(ここはReDimとの関係はまだ不明)
    S2.Cells(3, 5).Resize(4, 13).Value = A

 End Sub

 ◆左上が(1,1)の条件
 これでも良さそうな気がします

 ReDim A(1 To 6, 1 To 17) As String ' 6×17列
    Set S2 = Worksheets("Sheet4")
    ' 配列に値をセット

    For II = 5 To 16  '列 ここで 4行 x 13列にする
    For I = 3 To 6  '行
(もみじ坂) 2015/01/28(水) 19:14

 >>ReDim 箱(1 to 4,1 to 13) から
 >>4行13列の配列が想像できていますか?

 と言う話をしているのですが、どこから

 >下記のシードで大きさがA1:B6あります。
 >使用したい範囲はA3:B6です。

 と言う話が出てきたのですか?
 「たとえば○○だったら」ってお話でしょうか?

 また元の話に戻りますが、コードを大きなくくりで分けると
  1.配列(仕切りのついた箱)を用意する
  2.計算結果(シートに表示したい状態)を配列に作る
  3.配列の中身をシートに書き出す
 です。

 1があるから、2があって、3があります。
 私は今、1の部分の話をしています。

 >ReDim 箱に記載している数字は
 >エクセルの行順番と列順番が合わないとエラーになるので、
 これは、どんなコードで試して その様に結論づけられたのかわかりませんので
 もしかしたら、1の範疇の話になって居るのかもしれませんが

 >これでしたら、E3:Q6の範囲までに書き出すことができました。 
 これは完全に 3の話ですよね。
  
(HANA) 2015/01/29(木) 00:00

 >と言う話をしているのですが、どこから
 別のシートで練習をしたんです。

 > 1があるから、2があって、3があります。
 では 2と 3 は無視して
 1はどうですか?
 (HANA)様が求めている回答と一致していますか?
 してないでしょうね。。怒ってるし。。。。。 ( 一一)

 > もしかしたら、1の範疇の話になって居るのかもしれませんが
 はい T0T
 そう考えたほうが、数えやすいです。。。( ;∀;)
 エクセルの行列の数え方と同じなので。。。。
 でも、偏った考え方になりそうな予感が。。。

 ◆左上が(1,1)の条件にすると
 ホントにこれしか思いつかないです。
 ほかの書き方があるかもしれませんが。。。。。(..)

 ReDim A(1 To 6, 1 To 17) As String ' 6×17列

    Set S2 = Worksheets("Sheet4")

    For II = 5 To 16  '列 ここで 4行 x 13列にする
    For I = 3 To 6  '行

 ◆3行4列だけの条件なら
 。。。。エクセルの行と列の容量で

 Sub TEST7()
    Dim S2 As Worksheet
    Dim I As Long
    Dim II As Long
    Dim A As Variant

    ' 箱の仕切りを作る
    ReDim A(3 To 6, 5 To 17) As String ' 4×13 列
    Set S2 = Worksheets("Sheet4")

    For II = 5 To 16  '列
    For I = 3 To 6  '行

(もみじ坂) 2015/01/29(木) 10:47


 >>変数を4行13列の部屋に分けてください。
 >>その際、左上の位置が(1,1)で表せるようにしてください。
 と言っているのにどうして
 >ReDim A(1 To 6, 1 To 17) As String ' 6×17列 
 6行17列の部屋にわけるのですか?
  
(HANA) 2015/01/29(木) 21:21

 ▼質問です。
 ReDim 箱(1 To 4, 1 To 13)
 ↑の意味は ↓ の解釈であってますか
    箱(1, 1) = "A1"
    箱(1, 2) = "B1"
    箱(1, 3) = "C1"
    箱(1, 4) = "D1"

    箱(2, 1) = "A2"
    箱(2, 2) = "B2"
    箱(2, 3) = "C2"
    箱(2, 4) = "D2"

    箱(3, 1) = "A3"
    箱(3, 2) = "B3"
    箱(3, 3) = "C3"
    箱(3, 4) = "D3"

(もみじ坂) 2015/01/29(木) 22:06


 A1,B1,・・・等は 何を表していますか?

 「箱(1, 1)に入れた物は、A1セルに書き出される」
 と言う意味でしたら、それは違います。

 「1列目をA列、2列目をB列・・・と定義した時
  箱(1, 1)は、A1と書き表せる」
 でしたら、そうです。

 こういうのを想像してみてもらうのはどうでしょう。
  会議室に、掲示板があります。
  掲示板は、掲示しやすい様 行列方向に線が引いてあります。
       <1> <2> <3> <4> <5> <6> <7>
      ┌─┬─┬─┬─┬─┬─┬─┐
   [1]│ │ │ │ │ │ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [2]│ │ │ │ │ │ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [3]│ │ │ │ │ │ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [4]│ │ │ │ │ │ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [5]│ │ │ │ │ │ │ │
      └─┴─┴─┴─┴─┴─┴─┘
  今からこの掲示板に張る掲示物を作成します。
  内容は、以下の3行3列の情報です。
     ○△◎
     × ◇
     ◎△○
  掲示物は、掲示板の中央のあたり(2行3列の位置〜4行5列の位置)に張ろうと思っています。

  模造紙を用意して、掲示物を作るのですが
  その時
       <1> <2> <3> <4> <5> <6> <7>
      ┌─┬─┬─┬─┬─┬─┬─┐
   [1]│ │ │ │ │ │ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [2]│ │ │○│△│◎│ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [3]│ │ │×│ │◇│ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [4]│ │ │◎│△│○│ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [5]│ │ │ │ │ │ │ │
      └─┴─┴─┴─┴─┴─┴─┘
  と、5行7列の掲示板と同じ大きさの罫線を引いて
  掲示する予定の位置と同じ位置に内容を書き
  不要部分は折りこんで使いますか?

  たぶんそんな事はせずに
       <1> <2> <3> 
      ┌─┬─┬─┐
   [1]│○│△│◎│
      ├─┼─┼─┤
   [2]│×│ │◇│
      ├─┼─┼─┤
   [3]│◎│△│○│ 
      └─┴─┴─┘ 
  3行3列の掲示板と同じ大きさの罫線を引いて、内容を書くと思います。

  そして最後に、掲示板に張り出します。
       <1> <2> <3> <4> <5> <6> <7>
      ┌─┬─┬─┬─┬─┬─┬─┐
   [1]│ │ │ │ │ │ │ │
      ├─┼─╋━┿━┿━╋─┼─┤
   [2]│ │ ┃○│△│◎┃ │ │
      ├─┼─╂─┼─┼─╂─┼─┤
   [3]│ │ ┃×│ │◇┃ │ │
      ├─┼─╂─┼─┼─╂─┼─┤
   [4]│ │ ┃◎│△│○┃ │ │
      ├─┼─╋━┿━┿━╋─┼─┤
   [5]│ │ │ │ │ │ │ │
      └─┴─┴─┴─┴─┴─┴─┘

  張り出してみると、やはり左上から張ってあった方がよさそうなので
  位置を変更する事にします。

  すると、2行3列の位置〜4行5列の位置に張ろうと思っていたのが
  1行1列の位置〜3行3列の位置 に変更になりますので
       <1> <2> <3> <4> <5> <6> <7>
      ┌─┬─┬─┬─┬─┬─┬─┐
   [1]│ │ │ │ │ │ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [2]│ │ │○│△│◎│ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [3]│ │ │×│ │◇│ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [4]│ │ │◎│△│○│ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [5]│ │ │ │ │ │ │ │
      └─┴─┴─┴─┴─┴─┴─┘
  で考えていた場合、もう一回作り直しますか?

 掲示物を作る時、用紙の大きさは掲示板と相談して決める事ですが
 それが決まってしまったら、掲示板のどこに張るか は考えずに作りますよね?

 結果を書くセルの先頭がE3セルで、
 E3セルに「○」を書きたいから
 箱(3 ,5)に「○」を書いておく
 と、セルの先頭が変わった時に考え直す必要が出てきます。

 配列を使う利点の一つとして、データの先頭位置の変更に左右されないというのがあると思います。

 今回の様に、「結果をどのセルを先頭に書き出すか」とか
 まだ少し先の話になると思いますが、「データがどのセルを先頭に有るか」とか

 それを最初と
  1.配列(仕切りのついた箱)を用意する
 最後
  3.配列の中身をシートに書き出す
 にだけ考えて、間の
  2.計算結果(シートに表示したい状態)を配列に作る
 時に「先頭がE3セルだから。。。あ、D5セルに変わったんだった」なんてのを
 考えずに済む様にして下さい。

 わざわざ配列を用意する目的が少しわかってもらえたでしょうか?
  
(HANA) 2015/01/30(金) 10:06

 説明ありがとうございます。
 ReDim 箱() は セルNO と 列NO ではなく
 ただの仕切りで, 区切った◇はどのセルに入れるかは作り手次第、
 仕切りの◇の数と、範囲の大きさと一致しなくても問題ない。 という認識で大丈夫ですか?
 (例えば、仕切りは 3行3列、しかし 範囲の大きさはA1:G5 でもOK)

 もしそうでしたら私の中でもう一つの疑問が生まれます。
 たぶん、言葉上のボタンの掛け違いと思いますが。。。。。」

(もみじ坂) 2015/01/31(土) 19:38


 えっと、「◇」ってのは何ですか?
 各部屋の事でしょうか?
 変数:箱  の事でしょうか?

 >(例えば、仕切りは 3行3列、しかし 範囲の大きさはA1:G5 でもOK)
 イメージがよくわかりません。

 範囲の大きさ と言っているのは、何の範囲の大きさの事ですか?

 先の例で言うと、掲示板と掲示物がありますが
 掲示板の方の大きさの事でしょうか?
 今、掲示板の大きさは5行7列ですので A1:G5と同じサイズですが。
  
(HANA) 2015/01/31(土) 22:10

 > えっと、「◇」ってのは何ですか?
 変数:箱  で, 仕切りしたマス?

 (例えば、仕切りは(内容は、以下の3行3列の情報です) 3行3列、
 しかし 範囲の大きさは(掲示板)A1:G5 です。)

(もみじ坂) 2015/01/31(土) 22:46


 掲示板の大きさが 5行7列なので A1:G5 と同じ大きさですね。
 掲示物を張り出す範囲が、掲示板の中央のあたり(2行3列の位置〜4行5列の位置)であれば
  これは、C2:E4 の位置になります。
 掲示物の大きさは、C2:E4のサイズなので、3行3列の大きさです。

 ・・・考える順番としては
     掲示物の大きさが 3行3列で
     掲示板の2行3列の位置から張り出すので
     掲示物を張り出す範囲が 2行3列の位置〜4行5列の位置
    なんですが・・・

 エクセルに戻って当てはめてみると
 ワークシートの大きさが(2010をお使いなので)A1:XFD1048576・・・1048576行16384列
 結果を書き出す範囲が、E3:Q6・・・4行13列
 なので、変数は4行13列のものを準備する必要がある。

 ・・・ここも
     集計すべきデータが4行あって、1月〜12月+合計の13列あるので
     変数は4行13列のサイズを用意する。
     これを、E3セルから書き出すと E3:Q6 の範囲になる
    ですが。
  
(HANA) 2015/01/31(土) 23:47

 ▼まとめ
   ReDim 箱() は セルNO と 列NO ではなく
   ただの仕切りで, 区切った◇はどのセルに入れるかは作り手次第

 ▼必要な情報?
   集計すべきデータが4行あって、1月〜12月+合計の13列あるので
   変数は4行13列のサイズを用意する。
   これを、E3セルから書き出すと E3:Q6 の範囲になる
   でも、左を(1,1)にする

 ここまでは、理解できました。ありがとうございます。

 ◆疑問
 多分ここら辺のイメージが一致しないからと思います。
 箱()の書き方と 書き出す大きさ3行3列の?
 「掲示物の大きさは、C2:E4のサイズなので、3行3列の大きさです。」
 だと思います。

 なぜならば
 私の中のイメージでは
 この場合掲示板の表全体 5行7列を仕切り作る時
 箱(1 to 5, 1 to 7)
 になります。

     <1> <2> <3> <4> <5> <6> <7>
      ┌─┬─┬─┬─┬─┬─┬─┐
   [1]│ │ │ │ │ │ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [2]│ │ │○│△│◎│ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [3]│ │ │×│ │◇│ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [4]│ │ │◎│△│○│ │ │
      ├─┼─┼─┼─┼─┼─┼─┤
   [5]│ │ │ │ │ │ │ │
      └─┴─┴─┴─┴─┴─┴─┘

 必要な部分のみですと。 
 箱(1 to 3, 1 to 3)
 にするものだと思ったんですが。

      <1> <2> <3> 
      ┌─┬─┬─┐
   [1]│○│△│◎│
      ├─┼─┼─┤
   [2]│×│ │◇│
      ├─┼─┼─┤
   [3]│◎│△│○│ 
      └─┴─┴─┘ 

 違いますか?
 箱()に変数使うと数字が見えないので、数字を使いました。

 *************************************************
 ▼混乱した理由は[1]と[2]のコメントの違いはなんだろう
 ここから迷宮に入っちゃった感じがします。

 ★[1]
 たとえば、A1:M4の大きさも
 4行13列です。
 変数を4行13列の部屋に分けてください。

(HANA) 2015/01/24(土) 20:44

 ↑に対して 下記のコメントでは

 ★ [2]
 ReDim 箱(1 to 4,1 to 13) から
 4行13列の配列が想像できていますか?
 ワークシート上のA1:M4の範囲と同じ大きさの配列ですが。 
  
(HANA) 2015/01/27(火) 21:04

****************************************************

 [2]のコメントで

 >4行13列の配列が想像できていますか?
 てことですが。
 ステップインしてもちゃんと4行と13列のの仕切りは出来ているのに
 E3:Q6ではないのですか (。´・ω・)ん?

 さらに

 >ワークシート上のA1:M4の範囲と同じ大きさの配列ですが。
  4行13列 は
  E3:Q6 でも
  A1:M4 でも

 同じ範囲の大きさじゃなかったんですか (。´・ω・)ん?
(もみじ坂) 2015/02/01(日) 11:36

 >ReDim 箱() は ただの仕切り
 そうです。

 >変数は4行13列のサイズを用意する。
 >これを、E3セルから書き出すと E3:Q6 の範囲になる
 そうです。

 >でも、左を(1,1)にする
 これは、今回(1 ,1)にした方が便利だというだけです。
 理屈がよく分かった上で、(1 ,1)以外が便利が良い時は
 変更してください。
   今は理屈がわかっておられませんので(1 ,1)にこだわって下さい。

 >私の中のイメージでは
 >この場合掲示板の表全体 5行7列を仕切り作る時
 >箱(1 to 5, 1 to 7)
 >になります。
 掲示板の表全体と同じ配列を作るなら、それで良いです。

 でも、
 >必要な部分のみですと。 
 >箱(1 to 3, 1 to 3)
 >にするものだと思ったんですが。
 必要な部分だけでよいので、3行3列に分けます。

 >混乱した理由は[1]と[2]のコメントの違いはなんだろう・・・
 同じことを言ってのますので、違いはありませんよ?

 2015/01/24(土) 20:44 のコメントは
  変数をA1:M14・・・4行13列・・・に分けてください。
 で、その答えが ReDim 箱(1 to 4,1 to 13) ですよね。
 つまりこれは A1:M14 と同じ大きさの配列です。

 2015/01/27(火) 21:04 のコメントでは
  4行13列の配列(A1:M14と同じ大きさ)が想像できていますか?
 ですから、「できている」or「できていない」とお返事いただければよかったのですが。

 箱の一番先頭が(1 ,1)になるのを確認してもらうところでの話だったと思います。

 ReDim 箱(4, 13) これだと
        <0> <1> <2> <3> <4> <5> <6> ・・・・ <13>
      ┌─┬─┬─┬─┬─┬─┬─┬・・・・┬─┐
   [0]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [1]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [2]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [3]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [4]│ │ │ │ │ │ │ │    │ │
      └─┴─┴─┴─┴─┴─┴─┴・・・・┴─┘
 左上が(0 ,0)から始まっていますし、5行14列あります。

 ReDim 箱(3 to 6,5 to 13) これだと
        <5> <6> <7> <8> <9><10><11> ・・・・ <13>
      ┌─┬─┬─┬─┬─┬─┬─┬・・・・┬─┐
   [3]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [4]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [5]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [6]│ │ │ │ │ │ │ │    │ │
      └─┴─┴─┴─┴─┴─┴─┴・・・・┴─┘
 左上が(3 ,5)から始まっていて、4行ですが 列は9列しかないです。
 ・・・まぁ、箱(3 to 6,5 to 17)にすれば、4行13列になりますが
    左上が(1 ,1)から始まっていないのは同じです。

 ReDim 箱(1 to 4,1 to 13) これで
        <1> <2> <3> <4> <5> <6> <7> ・・・・ <13>
      ┌─┬─┬─┬─┬─┬─┬─┬・・・・┬─┐
   [1]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [2]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [3]│ │ │ │ │ │ │ │    │ │
      ├─┼─┼─┼─┼─┼─┼─┼・・・・┼─┤
   [4]│ │ │ │ │ │ │ │    │ │
      └─┴─┴─┴─┴─┴─┴─┴・・・・┴─┘
 左上が(1 ,1)から始まっている 4行13列の配列ができています。

 >4行13列 は E3:Q6 でも A1:M4 でも
 >同じ範囲の大きさじゃなかったんですか

 E3:Q6 も A1:M4 も 4行13列の同じ大きさの配列ですよ?
 何が疑問なのですか?
  
(HANA) 2015/02/01(日) 12:54

 > 何が疑問なのですか?
 4行13列 に対して 回答が
 ReDim 箱(1 to 4,1 to 13) 
 であれば特に疑問がありません。

 2015/01/27(火) 21:04 のコメントでは
  4行13列の配列(A1:M14と同じ大きさ)が想像できていますか?

 を
 ReDim 箱(1 to 4,1 to 13) じゃ
 A1:M14との範囲 で E3:Q6の範囲じゃないよ
 という意味をうけとってしまったので (。´・ω・)ん????
 迷宮が始まったんです。

 これですべての謎が解けました。
 単なる私の勘違いだけの話ですみません。

 お陰で、わかりやすい説明を頂けたので、
 ちょっとラッキです _〆(・v・★)

 これで、次にいけます〜 ♪

(もみじ坂) 2015/02/01(日) 18:37


 >必要な部分のみですと。 
 >箱(1 to 3, 1 to 3)
 なので、今回は
  ReDim 箱(1 to 4,1 to 13)
 で良いのは納得できましたか?

 最終的にこの配列は E3セルから書き出す予定なので
 E3セルに入れる値は、箱(1 ,1)に入れていくことになりますが
 それもイメージが出来ますか?

 最初は、最後の合計の列(13列目)だけ考えてみて下さい。
 すでにできているコードだと
                    '集計シートの何3行目〜最終行まで1行ずつ= 最終列のセルにNOの値を足し算する。
                    集計.Cells(NO検索, 月最終列) = 集計.Cells(NO検索, 月最終列) + データー.Cells(i, "j")
 この部分の事です。

 変数:月最終列 は、単純に「13」ですね。
 変数:NO検索 は、前のコードでは
                NO検索 = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0)
 A列全体から調べましたので、3行目に検索値があった場合「3」が返されますが
 今回は、3行目の位置が 変数:箱 の1行目になりますので、3行目に有った場合「1」になるようにして下さい。
   
(HANA) 2015/02/01(日) 18:59

 >で良いのは納得できましたか?
 はい。問題ないです。

 > E3セルに入れる値は、箱(1 ,1)に入れていくことになりますが
 やり方はまだ分からないですが。
 書き出しの始まりのセルが E3 ということは分かりました。

 変数は試してみます (*´∀`*) 
(もみじ坂) 2015/02/01(日) 21:52

 こんな感じのイメージであってますか?
 差額の行を「-」すると数的にはあってると思いますが (*゚Å゚;*)

 ▼集計シートの範囲
  集計.Cells(1, 1).Resize(6, 17).Value

 ▼書き出し範囲は
  集計.Cells(3, 5).Resize(4, 13).Value

  そうすると 2行 と4列が足りない ( ̄〜)何処か「−」すれば数会うはず (*゚Å゚;*)
 といろいろ悩ん案ですが。実行したところできちゃいました アレ──ッ!!ヽ(`(`(`(`ヽ(;゚;Д;゚;; )ノ 
 こんなんでいいの? ΣΣ(゚д゚lll)

 If カウント <> 0 Then
                NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A:A"), 0)
                月検索 = Application.Match(Month(データー.Cells(I, "B")), 集計.Range("2:2"), 0)

                    箱(NO検索 - 2, 月最終列 - 4) = 集計.Cells(NO検索, 月最終列) + データー.Cells(I, "j")
(もみじ坂) 2015/02/04(水) 17:33

 > 変数:月最終列 は、単純に「13」ですね。
 って書いてますが。
  
(HANA) 2015/02/04(水) 19:58

 > 変数:月最終列 は、単純に「13」ですね。
 単純に13 。。。 こうですか?
 'ReDim 箱(結果入れる行の数 , 結果入れる列の数)入れるの変数[集計シード]
 ReDim 箱(1 To 4, 13 To 13)

      For I = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row
          NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A:A"), 0)                             
                    箱(NO検索 - 2, 13) = 集計.Cells(NO検索, 13) + データー.Cells(I, "j")

(もみじ坂) 2015/02/04(水) 21:06


 もっとちゃんと書いてある事を読んでもらえませんか?
  
(HANA) 2015/02/04(水) 21:55

 >なので、今回は ReDim 箱(1 to 4,1 to 13)
 ここが違うからダメでしたか?ステップイン見やすいようにコンパクトしてました。
 ReDim 箱(1 To 4, 1 To 13)

 もしほかならどこでしょうか (。´・ω・)ん?

 ●変数:月最終列 は、単純に「13」ですね。
 月最終列 は 「17」 の結果 だけど、
 箱()で数えると 「13」番目ですね 
 そうしますと 月最終列 はとりあえず、このままにしておこ _〆(・v・★)

 ●変数:NO検索 は、前のコードでは A列全体から調べましたので、3行目に検索値があった場合「3」が返される
 A列全体から調ると、3行目に検索値があった場合 「3」
 じゃA3から調べると 3行目にあった検査値 「1」 になる方法があると ?
 深読みはやめよう。。。。多分変数:箱 と つながってるでしょう −x−

 ●変数:箱 の1行目になりますので、3行目に有った場合「1」になるようにして下さい。
 私のイメージでは下の図ですが。
  [1]					      |   [Q]
 [2]	NO	商品名前	個数	名称  |	 合計
 [3]	A01				      | 箱(1,13)
 [4]	A02				      | 箱(2,13)
 [5]	A03				      | 箱(3,13)
 [6]	A05				      | 箱(4,13)

 変数:NO検索 の検索結果3行の時 「1」を表示させる方法ではないですよね ^^;;;
 これでしたら、どこから探そう (*゚Å゚;*)   
(もみじ坂) 2015/02/05(木) 00:41

 >ここが違うからダメでしたか?
 はい、そこが違うのでダメでした。

 それから、その前に
 >月検索 = Application.Match(Month(データー.Cells(I, "B")), 集計.Range("2:2"), 0)
 なんてやっておられたので、やっぱりちゃんと読んでもらえていないと思いました。

 >じゃA3から調べると 3行目にあった検査値 「1」 になる
 でしょ?
 MATCH関数ですよ?
  
(HANA) 2015/02/05(木) 01:04

 > なんてやっておられたので、やっぱりちゃんと読んでもらえていないと思いました。
 すみません 。。 コピペ―でくっ付いてきただけです

 >でしょ? MATCH関数ですよ?
 たしかに、「1」ですね (*´-`*)ゞ ポリポリ 忘れてました。
 NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A9"), 0) 

 ただエラーになりますよ (。´・ω・)ん?
「型が一致しませんと。。。」
 箱(NO検索 - 2, 月最終列 - 4) = 集計.Cells(NO検索, 月最終列) + データー.Cells(I, "j")
 ステップインでここを過ぎるとエラーになしますね

 書き方が違うだけなのでしょうか (*゚Å゚;*)
(もみじ坂) 2015/02/05(木) 23:14

  > 変数:月最終列 は、単純に「13」ですね。
 を何度書かないといけませんか?

 それと、変数の中身は確認しながら実行してますか?
  
(HANA) 2015/02/05(木) 23:36

 > 変数:月最終列 は、単純に「13」ですね。
 変数:月最終列 を 「13」 の数に書き換えるということですか?
 箱(NO検索, 13) = 集計.Cells(NO検索, 13) + データー.Cells(I, "j")

 変数の中身は下記です。
  : NO検索 : 1 : Long
  : I : 3 : Long
  : 行番号 : 0 : Long
  : カウント : 1 : Long
 箱()
      : 箱(1,1) : Empty 値 : Variant/Empty

 行番号が「0」て変でしょうか?
 いつも出ているのに (。´・ω・)ん?
(もみじ坂) 2015/02/06(金) 00:16

 今は、セルに直接足していくのではなく
 変数に表を作っていきましょう  って話ですよね?

 > 箱(NO検索, 13) = 集計.Cells(NO検索, 13) + データー.Cells(I, "j")
 集計シートが出てくるのは、おかしくないですか?

 今まで、Q3セルに直接足し算してたのを
 箱(1,13)に足し算していくんですよね。

 なにをしようとしているのか、分かってますか?
  
(HANA) 2015/02/06(金) 00:47

 > 変数:月最終列 は、単純に「13」ですね。
 >を何度書かないといけませんか?
  
(HANA) 2015/02/05(木) 23:36

 そうしますと、これはどういう意味ですか (。´・ω・)ん?

 最初は 変数: 箱(、13)番目?と思っって、
 そのまま使用しました。

 上記のコメントで違うと思い。じゃ何ぞや?
 変数:NO検索 のように 
 変数:月最終列 検査値 が 「13」

 なのか何のか?
 結局、違うと思いながら、アホのような回答になってしまったんです。

 なぞは1ッ個ずつ解明した方が迷宮入りしない気がしますので、

 ▼先に
 >今回は、3行目の位置が 変数:箱 の1行目になりますので、3行目に有った場合「1」になるように!
 に対して
 私の答えが
 NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A9"), 0)

 です。
 OKですか?NGですか?

 エラーになってますが (*゚Å゚;*)
 しかし検索値は 「1」 です。

(もみじ坂) 2015/02/06(金) 17:30


 >最初は 変数: 箱(、13)番目?と思っって、
 >そのまま使用しました。
 最初は
   箱(NO検索 - 2, 月最終列 - 4) = 集計.Cells(NO検索, 月最終列) + データー.Cells(I, "j")
 ですよね。

 これは、「月最終列」って変数を使っています。

 その次が
   ReDim 箱(1 To 4, 13 To 13)
 ってしてありますね。

 これまで散々
 【左上が(1 ,1)から始まっている配列】
 を作る話をしていたんですよね。

 それで、ReDim 箱(1 to 4,1 to 13) で納得していただいたのですから
 変更しないでください。

 1〜13列あって、本来は
  1〜12列に月ごとの合計 13列目に年合計 を同時に
 するのですが、今回は簡単な 13列目に年合計 だけをやってみて下さい。
 と言っています。

 箱が13列必要なことに変わりはありません。
 「ほかにも列があるけど、今は13列目だけを考える」です。

 ですから
 >変数:月最終列 を 「13」 の数に書き換えるということですか
 まぁ、そう言う事です。
 > 箱(NO検索, 13) = 集計.Cells(NO検索, 13) + データー.Cells(I, "j")
 は正しくないですが。

 >NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A9"), 0)
 >OKですか?NGですか?
 集計シートのデータは9行目でしたっけ?
 話が違ってきている様に思えます。

 ちなみに、Match関数が終わった時の NO検索 の値は 期待値が返っていますか?
 期待値になっているなら、エラーが出るなら ここ以外の問題だと思います。
  (そもそも、考え方が違って 期待値自体が違っている可能性もあるかもしれませんが。
   A3セルにある値を検索して、NO検索値が「1」になってOKだと思っておられるなら
   その期待値は正しいです。)
  
(HANA) 2015/02/06(金) 22:08

 そうしますと

 ▼変数:箱() は OKで
 ReDim 箱(1 to 4,1 to 13)

 ▼Match関数が終わった時の NO検索 の値は 期待値「1」なら OK 
 NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A9"), 0)
 範囲は A3:A6 でした^^;;。

 ステップインは下記の順番で、
 1.ReDim 箱(1 to 4,1 to 13)
 2.NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A6"), 0)
 3.箱(NO検索 - 2, 月最終列 - 4) = 集計.Cells(NO検索, 月最終列) + データー.Cells(I, "j")

 3.が黄色くなったて、もう一回F8押したところに「型が一致しない」とエラー
 たぶん 箱()の仕切りの数と 
 エクセルの行列の数?的なことが合わないのかもです。

 2.NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A:A"), 0)
 の場合は問題なかったので保留にします。 _〆(・v・★)

 月最終列 は 再検討 「13」 。。。。。。。。。

(もみじ坂) 2015/02/06(金) 23:22


 >▼変数:箱() は OKで
 >ReDim 箱(1 to 4,1 to 13)
 はい、これを使って下さい。

 >▼Match関数が終わった時の NO検索 の値は 期待値「1」なら OK 
 >範囲は A3:A6 でした^^;;。
 今回は範囲が違う事がエラーにつながっていませんが
 思い違いがエラーにつながる事もあります。
 気を付けて下さい。
  自分がどのような思い違いをしやすいのか分析してもらうと良いかもしれません。
  
(HANA) 2015/02/07(土) 14:16

 >自分がどのような思い違いをしやすいのか分析してもらうと良いかもしれません。
  はい すみません ≧≦
  どうも、集計シートとデーターシートの範囲がごちゃまぜになったみたいです。>へ<

 >変数:月最終列 を 「13」 の数に書き換えるということですか
 もう少しヒント下さい _〆(・v・★)

  '月最終列 に 入力されているデーターの最終列の列数を取得し代入する
     月最終列 = 集計.Cells(2, Columns.Count).End(xlToLeft).Column
 「13」にするには、個々の部分を工夫する必要あるのでしょうか?

(もみじ坂) 2015/02/10(火) 22:53


 >「13」にするには、個々の部分を工夫する必要あるのでしょうか?
 いやいや、最終列を取得する必要はないですよね。

 1列目が1月 2列目が2月・・・・13列目が合計
 と決まっているので。

 決まっていますよね?そこはわかりますか?

 集計結果範囲がシート上のどこにあるかは関係ないんですよ。
 今は、変数:箱 の列数(列番号)について話をしているのですから。
  
(HANA) 2015/02/10(火) 23:28

では、もう決まってる行なら変数使わなくても
良いですかね (。´・ω・)ん?
(もみじ坂) 2015/02/10(火) 23:31

 「13」ね というのは 
 > 決まっていますよね?そこはわかりますか?
 これを認識すればよさげなかんじでしょうか

 答えが「はい決まってます」

 でOK なんでしょうか?

 またはこれ?, 「13」列目に計算式を入れる
 箱(NO検索, 13) = 集計.Cells(NO検索, 月最終列) + データー.Cells(I, "j")

(もみじ坂) 2015/02/10(火) 23:37


 それの元のコードは
 ↓ですよね。
 集計.Cells(NO検索, 月最終列) = 集計.Cells(NO検索, 月最終列) + データー.Cells(i, "j")
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 同じ記述が二回出てきますね。

 何をやっているか(なんで二回出てくるか)わかっていますか?

 元のコードでの話ですよ。

 >「13」列目に計算式を入れる
 この表現は変ですね。
 セルに式を入れているわけではないので。

 元のコードをステップインで実行途中に、セルに何が入っているかみて下さい。
 計算式は入っていませんよね。
  
(HANA) 2015/02/10(火) 23:47

 >何をやっているか(なんで二回出てくるか)わかっていますか?
 最終列のセルにNOの値+ データー.Cells(i, "j")の値を加算していくコードです。
(もみじ坂) 2015/02/11(水) 00:00

 >最終列のセルにNOの値+ データー.Cells(i, "j")の値を加算していくコード
 この表現がちょっとよくわかりません。

 最終列のセルに NOの値 ?
 「+」があるのと「加算」と言うのはダブってますか?
 それとも、何か別々の事を表現しておられるのですか?

 データー.Cells(i, "j")の値 と表現しておられるのですから
 集計.Cells(NO検索, 月最終列)のセル とか 集計.Cells(NO検索, 月最終列)の値 とかで
 表現してもらえれば良いと思いますが。
  
(HANA) 2015/02/11(水) 00:15

 '集計シートの何3行目〜最終行まで1行ずつ= 最終列のセルにNOの値を足し算する。(加算していく?)

 集計シート				
 				goukei
A01				60 = 集計.Q3 たす 10(データー.Cells(i, "j")) たす 50 (データー.Cells(i, "j"))
A02				
A03				
A05				

 データーシート

 [b]	[c]	[d]		[f]			[i]	[j]	    [k]
 伝票NO	日付	TEL		NO			単価	cs	    pc
140101 	2014年1月1日	8768	11	A01	4				10 
140101 	2014年1月2日	8768	11	A02	4				20 
140101 	2014年1月5日	8768	11	A03	5				30 
140101 	2014年2月5日	2913	12	A05	4				40 
140102 	2014年2月5日	2913	12	A01	4				50 
140102 	2014年2月6日	2913	12	A04	6				60 
140102 	2014年3月5日	2913	13	A02	4				70 

(もみじ坂) 2015/02/11(水) 00:34


 集計.Cells(NO検索, 月最終列)のセル とか 集計.Cells(NO検索, 月最終列)の値 とかで
 説明してもらえますか?
  
(HANA) 2015/02/11(水) 01:48

 >集計.Cells(NO検索, 月最終列)のセル とか 集計.Cells(NO検索, 月最終列)の値 とかで

 NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A6"), 0)
 月最終列 = 集計.Cells(2, Columns.Count).End(xlToLeft).Column

 '集計シートの何3行目〜最終行まで1行ずつ= 最終列のセルにNOの値を足し算する。(加算していく?)
  集計.Cells(NO検索, 月最終列) = 集計.Cells(NO検索, 月最終列) + データー.Cells(i, "j")

 集計.Cells(3行目〜最終行まで1行ずつ), (と、最終列のセルが交差するセル) 
 = 集計.Cells(3行目〜最終行まで1行ずつ), (と、最終列のセルが交差するセル)
   + データー.Cells(i, "j")の値を「+」して加算していく
(もみじ坂) 2015/02/11(水) 15:27

 ループ処理で最終的に・・・ではなく
 >集計.Cells(NO検索, 月最終列) = 集計.Cells(NO検索, 月最終列) + データー.Cells(i, "j")
 だけを取り出して説明してください。
  
 もみじ坂さんが、言葉に出来ていない部分が、分かっておられない部分だと思います。
 =や+などの記号を使わずに表現してみて下さい。

 >「+」して加算
 だと表現がダブってますよね。
  
(HANA) 2015/02/11(水) 16:53

集計.Cells(NO検索, 月最終列) = 集計.Cells(NO検索, 月最終列) + データー.Cells(i, "j")

集計.Cells(A3, Q3) が 集計.Cells(A3, Q3) たす データー.Cells(i, "j")で 同じA01の値
(もみじ坂) 2015/02/11(水) 19:08


 その日本語はカタコトなので
 もっと流暢にしてもらえますか?

 言いたいことは合っているように思います。

 最後の「同じA01の値」ってのは、よくわかりませんが。
  
(HANA) 2015/02/11(水) 20:00

データー.Cells(i, "j")でA3と同じNO番号をデーターシートをJ列3行目から下方向順に見つけて
集計.Cells(A3, Q3) に加算する たす 集計.Cells(A3, Q3)の値  が合計値になる ?

(もみじ坂) 2015/02/11(水) 20:52


 >データー.Cells(i, "j")でA3と同じNO番号をデーターシートをJ列3行目から下方向順に見つけて
  「データー.Cells(i, "j")」と言う記述が
  「A3と同じNO番号をデーターシートをJ列3行目から下方向順に見つける」
 という事をしているのですか?
 書いておられる文章からは、その様によめますが。

 また
 >集計.Cells(A3, Q3) に加算する たす
 の最後の「たす」って何ですか?

 コードを作る時に(作る前に)、実際に手を動かしてやってみてもらいましたよね。
 その時、なにをした時の動作を  そのコードにしたのですか?

 忘れてしまったのなら、前スレの該当部分をもう一度見直して下さい。
  
(HANA) 2015/02/11(水) 21:30

 集計シート(見つかったNOセル、見つかった最終列のセル)「の結果 イコール」 集計シート(見つかった NOセル、見つかった月のセル))「プラス」 データーシート(i, "j")見つかった値を足し算する

 言葉はあれですが。 意味がいあいは

 集計シートで見つかったクロスしたセル二ある値 足す データーシートで見つかった値を足したのが

 集計.Cells(NO検索, 月最終列) になるんですよね

 表にした方が分かりやすいですが。コードの意味合いはわかります。
 実際データで試したときに大変でしたので −.−

(もみじ坂) 2015/02/11(水) 23:28


 集計シートで見つかったクロスしたセル が 集計.Cells(NO検索, 月最終列)
 データーシートで見つかった値     が データー.Cells(i, "j") ・・・・「見つかった」じゃないですが
 集計.Cells(NO検索, 月最終列) になる が 集計.Cells(NO検索, 月最終列)
 ですよね?

 集計.Cells(NO検索, 月最終列) になる のは、集計シートで見つかったクロスしたセル ですよね。

 集計シートで見つかったクロスしたセル = 集計.Cells(NO検索, 月最終列) = 集計.Cells(NO検索, 月最終列) になる
 ですから。

 集計.Cells(NO検索, 月最終列) = 集計.Cells(NO検索, 月最終列) + データー.Cells(i, "j")
 ~~~~~~~↑~~~~~~~~~~~~~~~~~~~   ~~~~~~~↑~~~~~~~~~~~~~~~~~~~   ~~~~~~~↑~~~~~~~~~~~~~
        |                             |                        データーシートの値
        |                       集計シートで見つかったクロスしたセル
    集計シートで見つかったクロスしたセル

   前に「同じものは同じ表現をしましょう」って話をしませんでしたっけ?
   違う表現をしてしまうと、違うものに思えてしまいますよ。

 で、これを集計シートのセルに直接入れていくのではなく
 箱に順番に計算結果を入れていきましょう と言うお話です。

 まずは、簡単なセルを使って考えてみます。

 A1セルに「1」と入れたとします。
    Range("A1").Value = 1
 A1セルに入っている値に「2」を足したい場合
    Range("A1").Value = Range("A1").Value + 2
                        ~~~~~「1」~~~~~~~
   ・・・・もともと A1セルには「1」が入っているので 結果A1セルは「3」になります。

 更に「2」を足します
    Range("A1").Value = Range("A1").Value + 2
                        ~~~~~「3」~~~~~~~
   ・・・・この段階で、A1セルには「3」が入っているので、結果A1セルは「5」になります。

 今度は単純な変数を使って考えてみます。

 変数:keisan を用意します。
  Dim keisan As Long
 変数:keisan に「1」を入れたとします。
  keisan = 1
 それに「2」を足します
  keisan = keisan + 2
   ・・・・もともと keisan には「1」が入っていたので keisan の中身は「3」になります。
 さらに「2」を足します
  keisan = keisan + 2
   ・・・・keisan には「3」が入っていたので keisan の中身は「5」になります。
 そして、A1セルに結果を書きだします
  Range("A1").Value = keisan
   ・・・・すると、A1セルの値が「5」になります。

 もみじ坂さんが書いておられるコードだと
 変数:keisan を用意して
  Dim keisan As Long
 A1セルの値に「2」を足して keisan に入れる。
  keisan = Range("A1").Value + 2
 になっています。

 箱(NO検索, 13) = 集計.Cells(NO検索, 月最終列) + データー.Cells(I, "j")
 ~~~~~変数~~~~~   ~~~計算結果を書きだすセル~~~   ~~~~~~~~足す値~~~~~~~~

 問題は、何度 keisan = Range("A1").Value + 2 を行っても
 A1セルの値は「0」なので keisan の中身は「2」のままです。

 分かりますか?

 一回目
  keisan = Range("A1").Value + 2
            ~~~~~~「0」~~~~~~    ・・・・・keisan の中身「2」
 二回目
  keisan = Range("A1").Value + 2
            ~~~~~~「0」~~~~~~    ・・・・・keisan の中身「2」

 本当は、二回目は 「2」+ 2 ・・・・・・・・keisan の中身「4」にしたいんですよね。
 そして、三回目は 「4」+ 2 ・・・・・・・・keisan の中身「6」にしたいですよね。
  
(HANA) 2015/02/12(木) 16:13

 >前に「同じものは同じ表現をしましょう」って話をしませんでしたっけ?
 はい。何度か注意された記憶が、、、、(´ロ`ill)

 >keisan = keisan + 2
 本来なら↑を見習って↓この形にしたかったんですが。
       ↓

 箱(NO検索, 13) = 箱(NO検索, 13) + データー.Cells(I, "j")
  ~~~~~変数~~~~~   ~~~~~変数~~~~~   ~~~~~~~~足す値~~~~~~~~
(HANA)様が順番にと書いてあったので、とりあえず後回しにしました。
 そのうち、できたと錯覚したんでしょうか (*゚Å゚;*)

 これですとエラーになってしまいます。

 エラーをなくすために ↓にしたんですが。欲しい合計値にならないのは理解してます。

 箱(NO検索, 13) = 集計.Cells(NO検索, 月最終列) + データー.Cells(I, "j")
  ~~~~~変数~~~~~   ~~~計算結果を書きだすセル~~~   ~~~~~~~~足す値~~~~~~~~

 > 箱(NO検索, 13) = 箱(NO検索, 13) + データー.Cells(I, "j")
  ~~~~~変数~~~~~   ~~~~~変数~~~~~   ~~~~~~~~足す値~~~~~~~~
 この使い方では問題なのか、
 書き方が違うのか、いろいろパタンを試したんですが。
 どれもエラーばかりで (´ロ`ill)
(もみじ坂) 2015/02/16(月) 23:47

 >順番にと書いてあったので、とりあえず後回しにしました。
 集計.Cells(NO検索, 月最終列) の所を セル番地ではなく 変数を使って〜〜
 と言う話なので、片方だけ変えたんじゃダメですよね。

 「順番に」と言うのは
  1.配列(仕切りのついた箱)を用意する
  2.計算結果(シートに表示したい状態)を配列に作る
  3.配列の中身をシートに書き出す
 の順番の事です。

 「A1セルに、A1セルのその時の値に+2した値を入れる」と言う作業を誰かにやってもらっているとして
 A1セルではなく、A2セルに変更しようとした時、その人に
 「まずは、A2セルに、A1セルのその時の値に+2した値を入れて」と言いますか?
 当然「A2セルに、A2セルのその時の値に+2した値を入れて」と言いますよね?
 この様に言わないと、思った結果は得られません。

 コードだって同じです。

 人に伝える場合なら、もしも間違って
 「今までA1セルだったのが、A2セルになったから A2セルに、A1セルのその時の値に+2した値を入れて」
 と言ってしまったとしても、察しの良い人であれば
 「え〜、A1がA2になったんだから、A2セルのその時の値に+2しないとだめだよね」
 と、勝手に判断してくれるかもしれません。
 しかし、エクセルはしてくれませんので より正確に指示を出さないといけません。

 さて
 > 箱(NO検索, 13) = 箱(NO検索, 13) + データー.Cells(I, "j")
 でエラーが出るなら、この記述自体が問題なのではなく
 その時の変数の値や、セルの値が問題だと思います。

 各変数が、期待した値になっているか。
 データー.Cells(I, "j")が示すセルの値は、想定したセルの値と同じか。
 確認して下さい。
  
(HANA) 2015/02/17(火) 11:17

 (HANA)様の指摘箇所を弄りましたら、理由判明する前に エラーなく計算でくるようななってました。
 あのエラーはなんだったんでしょうか (。´・ω・)ん?
 変なのいじったのかもしれないです。

 Sub test15()

    Dim NO検索 As Long, NO最終行 As Long
    Dim 月検索 As Long, 月最終列 As Long
    Dim I As Long
    Dim 行番号 As Long
    Dim 集計 As Worksheet
    Dim データー As Worksheet
    Dim カウント As Long
    Dim 箱 As Variant

    Set 集計 = Worksheets("Sheet5")
    Set データー = Worksheets("Sheet6")

    NO最終行 = 集計.Cells(Rows.Count, 1).End(xlUp).Row
    月最終列 = 集計.Cells(2, Columns.Count).End(xlToLeft).Column

    集計.Range(集計.Cells(3, 5), 集計.Cells(NO最終行 - 1, 月最終列)).ClearContents

    'ReDim 箱(結果入れる行の数 , 結果入れる列の数)入れるの変数 [集計シード]
    ReDim 箱(1 To 4, 1 To 13)

      For I = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row
         If 集計.Range("B1").Value = "" Or (集計.Range("B1").Value <> "" And データー.Range("C" & I).Value = 集計.Range("B1").Value) Then
            '集計シートにデーターシート(A3のセルから検索)と同じ値があるかを調べる(0=なし、1=1個ある、2以上はダブってる)

             カウント = WorksheetFunction.CountIf(集計.Range("A3:A" & Rows.Count), データー.Cells(I, "E"))

            If カウント <> 0 Then
                NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A" & Rows.Count), 0)
                     '集計シートで見つかったクロスしたセル=集計シートで見つかったクロスしたセル+データーシートで見つかった値
                    箱(NO検索, 13) = 箱(NO検索, 13) + データー.Cells(I, "j")

            End If
            End If

     Next
      集計.Cells(3, 5).Resize(4, 13).Value = 箱

 End Sub

(もみじ坂) 2015/02/18(水) 00:29


 これまでの書き込みから考えると
        ReDim 箱(1 To 4, 1 To 13)
        NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A" & Rows.Count), 0)
        箱(NO検索 - 2, 13) = 箱(NO検索 - 2, 13) + データー.Cells(I, "j")
 こんなコードにしていて
 「インデックスが有効範囲にありません」というエラーが出ていたのではないかと思いますが。

 ちなみに、これだとなんでエラーになるかわかりますか?
  
(HANA) 2015/02/19(木) 10:12

 変数的にエラーが良くわからないです。。。(´・ω・`)

 箱(1 To 4     と
 Range("A3:A" & と
 箱(NO検索 - 2  

 ここらへんで、何かが違うじゃないかと推測したんですが、、、、
(もみじ坂) 2015/02/19(木) 14:48

 >NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A" & Rows.Count), 0)
 が、最初に(1回目のループの時)どんな値になるかわかりますか?
  ・・・・わかっててもらわないと困りますが。
  
(HANA) 2015/02/19(木) 14:58

 >が、最初に(1回目のループの時)どんな値になるかわかりますか?
 NO検索の値ですか? 「1」 です。
(もみじ坂) 2015/02/19(木) 22:34

 >NO検索の値ですか? 「1」 です。
 そうです。

 すると、
      箱(NO検索 - 2, 13) = 箱(NO検索 - 2, 13) + データー.Cells(I, "j")
 ここの所~~~~~~~~~~           ~~~~~~~~~~
 が、-1 になります。

 箱の行は ReDim 箱(1 To 4, 1 To 13) 1から始まっていて「-1」はありません。

 すると、エラーになって当然だと思いませんか?
  
(HANA) 2015/02/20(金) 14:37

 う〜ン (´・ω・`) そうしますと。
 箱(NO検索, 13) = 箱(NO検索, 13) + データー.Cells(I, "j")
 がOKなのは、検索値 「1」
 箱が「1」から始まり なので、エラーはでなくなったということですね。

 そうしますと。これも同じ理由ですか?
 箱(NO検索,月最終列) = 箱(NO検索, 月最終列) + データー.Cells(I, "j")
 月最終列 は 検索値 「17」
 で箱は「13」までなので、エラー発生。 (´・ω・`)

 月最終列使えなくなりますね。。。工夫するなりしないと。。
(もみじ坂) 2015/02/20(金) 16:04

 >検索値 「1」
 >箱が「1」から始まり なので、エラーはでなくなったということですね。
 >月最終列 は 検索値 「17」
 >で箱は「13」までなので、エラー発生。 (´・ω・`)
 「インデックスが〜」のエラーはそう考えて良いと思います。

 「インデックス」と言う言葉は分かりにくいですが
  何かが『有効範囲にない』と言われているのは分かりますよね。

 ReDim 箱(1 To 4, 1 To 13) としていた場合
 範囲は 行方向1〜4 列方向1〜13 なので
 この範囲外を指定した場合「有効範囲外」です。

 その他に、良く使う例としては シートが3枚ある場合
 Sheets( ○ ) の ○は 1〜3 が入れられます。
 たとえば「4」なんかを入れた場合は 4枚目のシートは無いので
 「インデックスが有効範囲にありません」のエラーが出ます。

 エラーが出た時に、そのエラーが何を言っているのか 理解する努力をして下さい。
 まずは、どんなメッセージが出たのか意識してもらうのが良いと思います。

 ちなみに↓のエラーも出ているので、これも考えてみて下さい。
 >2.NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A6"), 0)
 >3.箱(NO検索 - 2, 月最終列 - 4) = 集計.Cells(NO検索, 月最終列) + データー.Cells(I, "j")
 >
 >3.が黄色くなったて、もう一回F8押したところに「型が一致しない」とエラー
 これは「インデックスが〜」のエラーではないですね。
 エラーが出た時に、集計.Cells(NO検索, 月最終列) が、どこのセルになっているか。
 そのセルには何の値が入っているか。それは思っているものと同じか。
 確認してみて下さい。

 >月最終列使えなくなりますね。。。工夫するなりしないと。。
 なんで、変数が使いたいのですか?
  
(HANA) 2015/02/21(土) 09:35

 >なんで、変数が使いたいのですか?
 月別合計で使うからと思ったんですが。
 月別の計算は月最終列使用しないですね

 理由が勘違いから始まったので、
 今は特にこだわってません (´・ω・`)
 どちらでもいいです。

 シート言えば今後の参考のためでしょうか (*´-`*)ゞ ポリポリ
(もみじ坂) 2015/02/24(火) 21:56

次に行ってよさげなかんじでしょうか (。´・ω・)ん?
(もみじ坂) 2015/03/01(日) 13:23

 >ちなみに↓のエラーも出ているので、これも考えてみて下さい
 はどうなりました?

 エラーが出た時に、原因がご自身で突き止められる様になる事が
 コードが書けるようになる近道だと思います。
  
(HANA) 2015/03/01(日) 13:53

 これも同様に

 NO検索値 「1」になるので

 >2.NO検索 = Application.Match(データー.Cells(I, "E"), 集計.Range("A3:A6"), 0)
 >3.箱(NO検索 - 2, 月最終列 - 4) = 集計.Cells(NO検索, 月最終列) + データー.Cells(I, "j")
    ^^^^^^^^^^  ^^^^^^^^^^^^            ^^^^^   ^^^^^^^^
        [-1]       [13]                     [1]       [17]

 検索結果が「−1」と「17」のところがエラーになった
 箱は1から始まって13までなので

 でしょうか?

(もみじ坂) 2015/03/05(木) 00:17


 エラーメッセージが違うので、違うエラーです。

 私が、なにを確認するように書いているか、見てますか?
  
(HANA) 2015/03/05(木) 19:51

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

コメント返信:

[ 一覧(最新更新順) ]


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