『マクロで合計_2_手順→コード作成→変数宣言』(もみじ坂) [[20140814193616]]『マクロで合計 1』 こうですか? >両方の方法がまざって〜  てことなので、IF関数で NO が同じとこ 月が同じとき   同じのを探して。該当のセルに書き出す。  集計のシートのループも追加しました。 集計シートにいらないデーターあったので、削除してコンパクトにしました。 データーシートの範囲を求める  3行目からの最終行ループ(データーシート)    3列目からの最終列ループ(データーシート)      1行目から最終行ループ(集計シート)        ifデーターシートNO = 集計シートNOが一致したとき          ifデーターシート月 = 集計シート月が一致したとき            データーシート値J列+集計該当セル           End if  End if 次のループ        集計シートの該当シール=データーシート値J列+集計該当セル     次のループ   次のループ ★集計シートいらないものを削除してコンパクトにしました。  [a] [b] [c] [d] [e] [f] [g] [2] NO 商品名前 1 月 2 月 3 月 [3] A01 [4] A02 30 90 70 [5] A03 30 [6] A04 60 ★データーシート [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 < 使用 Excel:unknown、使用 OS:unknown > ---- その考え方は、ご自身で実行してみるとどういう事ですか?   (HANA) 2014/08/27(水) 23:07 ---- これはまだイメージです。 欲しいコードはまだ全部見つかっていません。 でもこれを実行すると 問題が。 HANA 様 が教えてくれた データーシートからNOと月を検索するコードを どう表現したらが頭を痛めるところです。 ここまでのイメージで 何か変なところありますか? (もみじ坂) 2014/08/27(水) 23:21 ---- >ここまでのイメージで 何か変なところありますか? 変なので「ご自身で実行してみるとどういう事ですか?」と書いてみました。 もみじ坂さんなら、集計シートに集計するときに どのようにするんですか? ご自身がやることを順番に書き出してみてはどうでしょう?   (HANA) 2014/08/27(水) 23:37 ---- エクセルからも一旦離れて考えてみたらどうですか? データの表と集計の表と紙と鉛筆と消しゴムを渡されて 「これ、集計しておいて」 と言われた時、もみじ坂さんなら 集計できますよね? 最終的には  A02の1月、2月、3月。A03の1月。A04の2月。 以上の5か所に数字を書く事になると思いますが その時、一番最初に数字を書くのはどこですか? また、その数字は何を書きますか?   (HANA) 2014/08/28(木) 08:31 ---- こんにちは。横から失礼します。 > こうですか? というか、マクロに正解ってないですよ? どんな手を使ってでも望みの結果を出せたら それでオッケーで 回答者が正解を知っていて○とか×とか判定してくれるようなものじゃないです。 家を建てるのに似ています。 家族みんなが気持ちよく暮らせる家ができ上がったらそれでオッケー、 正解はありません。 有無以前に、正解という概念自体ありませんよね。 ところでマクロでどんなことがしたいのでしたっけ。 なにも知らないにんげん(わたし)に分かるように、 つまりもみじ坂さんのかわりにわたしが集計できるように説明ってできますか? ( 佳 ) 2014/08/28(木) 21:43 ---- [[20140814193616]] 新しく作るときに、前のリンクはある方がいいですよ。 (デイト) 2014/08/29(金) 09:40 ---- 検討中のマクロ案を捨てて、ピボット利用案なぞ。 まず、分かりやすいように集計元は不要な情報をばっさり切って、以下のようにしてください。 [a]       [b] [c]   [d] [2] 日付     年月 NO   金額 [3] 2014年1月1日 A02 10 [4] 2014年1月2日 A02 20 [5] 2014年1月5日 A03 30 [6] 2014年2月5日 A02 40 [7] 2014年2月5日 A02 50 [8] 2014年2月6日 A04 60 [9] 2014年3月5日 A02 70 B列には、「=DATE(YEAR(A3),MONTH(A3),1)」の式を埋めておきます。 次に、B〜D列を範囲選択。「挿入」−「ピボットテーブル」。 列ラベルに「年月」、行ラベルに「NO」、Σ値に「金額」を指定。 「金額」は値フィールドの設定で、「合計」にします。 これだけで目的の表になると思いますが、いかがでしょうか。 (???) 2014/08/29(金) 14:47 ---- ( 佳 )様(デイト) 様  説明不足ですみません。 ずっと(HANA)様のレッスンでしたので、そのつもりで書いてました。 それでも不足の部分多々ですね今後、気を付けます (´゚д゚`) (???) 様 >検討中のマクロ案を捨てて、ピボット利用案なぞ。 これは誤解です。 いずれPTの利用内容をマクロに切り替えたいのであって、 今やっているマクロをPTに切り替えたいのではありません。 説明足らずですみません (*´ノД`) 皆様ご迷惑をおかけしました。 折角回答いただいたのにホントに申し訳ありません。 今後はなるべく説明を入れるようにします。 (; ・`д・´) (もみじ坂) 2014/08/30(土) 20:48 ---- HANA 様 あれからまたいろいろと考えてみました。 HANA 様の考えの元に  データシートの3行目から最終行まで処理します。  1.Noが集計シートの何行目に有るかMATCH関数で調べます。  2.日付から月部分を取り出して、集計シートの何列目に有るかMATCH関数で調べます。  3.集計シートの、1で調べた行と,2で調べた列のセルに 数量を足し算します。  これを最終行まで実行します。 ちょっと視線を替えて書き出してみた結果 集計シート [a] [b] [f] [g] [e] [f] [g] NO 商品名前 1 月 2 月 3 月 A01 e3+0 A02 e4+j3 F4+j6 G4+j9 e4+j4 F4+j7 A03 e5+J5 A04 f6+J8 私の手順  ◆最終行=データシートの3行目から最終行まで処理します。   1.Noが集計シートの何行目に有るかMATCH関数で調べます。    NO=MATCH(F3〜最終行,Sheet5!$A$1:$A$7,0)   2.日付から月部分を取り出して、集計シートの何列目に有るかMATCH関数で調べます。      月=MATCH(MONTH(B3:),Sheet5!$A$2:$J$2,0)    ◆IF関数を使って条件を付ける     NOが見つかったとき    ◆IF関数を使って条件を付ける     月が見つかったとき   3.集計シートの、1で調べた行と,2で調べた列のセルに 数量を足し算します。 集計シート(見つかったNOセル、見つかった月のセル)= 集計シート(見つかったNOセル、見つかった月のセル))+ データーシート(最終行、10)     ●書き出すときのイメージ      集計シート(E3)=データーがある時の計算なのでA01はカウントされないはず。     集計シート(E4)=集計シート(E4)+データーシート(J3)一週目のループ     集計シート(E4)=集計シート(E4)+データーシート(J4)一種目のループ  これを最終行まで実行します。 手順の考え方はあってますか? 同じ答えをぐるぐるして書いてる気も。 一回書き出して頭を整理の意味合いも。。。。 (もみじ坂) 2014/08/30(土) 21:42 ---- おおよそ良いと思います。 3番の数量を足す所は 集計シート(見つかったNOセル、見つかった月のセル)= 集計シート(見つかったNOセル、見つかった月のセル))+ データーシート(3〜最終行、10) って書いてある方が、1,2の書き方と合うと思いますが どうですか? それから Cells(1, 1).Value = "HANA" と書いたら、A1セルに「HANA」という文字が入りますね? 集計シート(見つかったNOセル、見つかった月のセル)= 集計シート(見つかったNOセル、見つかった月のセル))+ データーシート(最終行、10) これで、集計シートの目的のセルに加算した値が入るので >●書き出すときのイメージ がどういった意味で書いてあるのかよくわからないですが。。。 これは、3の後に何か別の命令文を入れるという事ですか? それとも。。。?   (HANA) 2014/08/30(土) 22:24 ---- (HANA)様 すみません。命令文は3.のみです。           ●書き出すときのイメージ は(ループで加算するとこんな感じかな?のイメージです^^;; とくにコードを追加しません。)      集計シート(E3)=データーがある時の計算なのでA01はカウントされないはず。     集計シート(E4)=集計シート(E4)+データーシート(J3)一週目のループ     集計シート(E4)=集計シート(E4)+データーシート(J4)一種目のループ これでコード作成の作業に入れるのでしょうか? >と書いたら、A1セルに「HANA」という文字が入りますね? はい。 (もみじ坂) 2014/08/30(土) 22:53 ---- >これでコード作成の作業に入れるのでしょうか? さっそく コード作成作業に入りたいと思いますが パーツごとで構いませんので、いくつかわかりますか?   (HANA) 2014/08/30(土) 23:15 ---- こんな感じでしょうか? 2.の最終行はDなので、+4列が必要ですよね 3.これですと、エラー出たんですよ。日付の部分を加工してからしないとダメですよね?  1.最終行=データシートの3行目から最終行まで処理します。 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row ↑これは1列の最終行の意味ですよねそうするとほかの列を最終行にしたい時は別の処理を入れないといけないですね。    2.NO=MATCH(F3〜最終行,Sheet5!$A$1:$A$7,0)     NO= Application.Match(データシート.Cells(i, "D"), 集計シート.Range("A:A"), 0)    3.月=MATCH(MONTH(B3:),Sheet5!$A$2:$J$2,0)       月=Application.Match(Month(データシート.Cells(i, "A"), 集計シート.Range("2:2"), 0)    4.NOが見つかったとき     If IsNumeric(NO) Then    5.月が見つかったとき     If IsNumeric(月) Then    6.集計シートの、1で調べた行と,2で調べた列のセルに 数量を足し算します。    集計シート(NO、月)= 集計シート(NO、月))+ データーシート(i、"J")     7.End If     8.End If  9.これを最終行まで実行します。 Next i (もみじ坂) 2014/08/31(日) 11:37 ---- >2.の最終行はDなので、+4列が必要ですよね どこに +4列 ですか? Cells(Rows.Count, 1).End(xlUp).Row ~ ここが、「1列目」=「A列」という事ですが。 今回、A列もD列も同じだけ情報が入っていると思いますので どちらの最終行までのループでも、同じ回数処理できると思いますがどうでしょう? >3.これですと、エラー出たんですよ。日付の部分を加工してからしないとダメですよね? エラーメッセージは   コンパイルエラー   修正候補:区切り記号または) って出るんだと思います。 ですから「)」をもう一度確認してみて下さい。 Month(セル) で、セルの月が求まります。 セル部分が データシート.Cells(i, "A") でしたら Month(データシート.Cells(i, "A")) と、最後に「)」が二つ並ぶはずですよね? 少しコードの話になりますが、Rangeの前に 「データシート」「集計シート」がありますが これが 変数 って事はわかりますか? よくわからなければ、変数を使うのではなく まずは Sheets("シート名")の様に書いてみて下さい。 すべての Range とか Cells の前に適切な Sheets("○○") を付けて下さい。 初めの方にある For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row は、 Cells の前に「どこのシートの」というのが書いてない様です。   (HANA) 2014/08/31(日) 12:08 ---- こうですか? ★が修正箇所です 1.最終行=データシートの3行目から最終行まで処理します。 ★For i = 2 To データシート.Cells(Rows.Count, 1).End(xlUp).Row    2.NO=MATCH(F3〜最終行,Sheet5!$A$1:$A$7,0)     NO= Application.Match(データシート.Cells(i, "D"), 集計シート.Range("A:A"), 0)    3.月=MATCH(MONTH(B3:),Sheet5!$A$2:$J$2,0)       ★月=Application.Match(Month(データシート.Cells(i, "A")), 集計シート.Range("2:2"), 0)    4.NOが見つかったとき     If IsNumeric(NO) Then    5.月が見つかったとき     If IsNumeric(月) Then    6.集計シートの、1で調べた行と,2で調べた列のセルに 数量を足し算します。    集計シート(NO、月)= 集計シート(NO、月))+ データーシート(i、"J")     7.End If     8.End If  9.これを最終行まで実行します。 Next i >これが 変数 って事はわかりますか? はい分かります。 (もみじ坂) 2014/08/31(日) 13:40 ---- ちなみに >2.NO=MATCH(F3〜最終行,Sheet5!$A$1:$A$7,0) ってかいてあるのに >NO= Application.Match(データシート.Cells(i, "D"), 集計シート.Range("A:A"), 0) だと、D列ですが。。。? では、変数の宣言をしたり・変数にシートをセットしたり >集計シート(NO、月)= 集計シート(NO、月))+ データーシート(i、"J") ここももう少し書き直したりして コードにしてみてもらえますか?   (HANA) 2014/08/31(日) 13:50 ---- >だと、D列ですが。。。? あΣΣ(゚д゚lll)! ありがとうございます。直しました。 >では、変数の宣言をしたり・変数にシートをセットしたり DIM の後にくっつけるものの基準てなんですか(??) Dim 集計シート As Worksheet シートにセットするので  これは分かります。 あとはなんとなく使ってます。 こちらの表見て、一番無難なのを選びました。 (´゚д゚`) http://www.d3.dion.ne.jp/~jkondou/excelvba/dim.htm コードはこうですか? しかしまたエラーで「オブジェが必要」と。 Sub test8() Dim NO As Long Dim 月 As Long Dim i As Long Dim 集計シート As Worksheet Dim データーシート As Worksheet Set 集計シート = Worksheets("Sheet5") Set データーシート = Worksheets("Sheet6") For i = 2 To データシート.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(データシート.Cells(i, "E"), 集計シート.Range("A:A"), 0) 月 = Application.Match(Month(データシート.Cells(i, "A")), 集計シート.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計シート.Cells(NO、月) = 集計シート.Cells(NO、月) + データーシート.Cells(i、10) End If End If Next i End Sub 集計シート [a] [b] [c] [d] [e] [f] [g] [2] NO 商品名前 1 月 2 月 3 月 [3] A01 [4] A02 30 90 70 [5] A03 30 [6] A04 60 データーシート [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/31(日) 19:44 ---- VBEのオプションの[編集]タブのコードの設定の中の2番目に  変数の宣言を強制する(R) がありますが、そこにチェックが入っていますか? また、コードを書いているところの一番上に Option Explicit の一文が入っていますか? それらの設定をやってもらったら なぜエラーになるのかわかるのじゃないかと思います。 ちなみに >しかしまたエラーで「オブジェが必要」と。 どこの行で出たのか合わせて書いておいてもらえると良いと思います。 >DIM の後にくっつけるものの基準てなんですか(??) >こちらの表見て、一番無難なのを選びました。 (´゚д゚`) 最初はそんな感じで良いと思います。 うまくいかない時に、どういった時にいつもと違うのかを確認してもらえると良いと思います。 今回は、「NO」「月」の変数は数値を入れるので まずは Long でやってみて下さい。 「オブジェクトが必要」のエラーが出なくなったら 今度はその部分のエラーになると思いますので、その時また修正してもらったら良いと思います。   (HANA) 2014/08/31(日) 23:14 ---- >Option Explicit >変数の宣言を強制する(R) を設定しました。 それでも「変数が定義されていいません。」  データシートのところに マーク?されてます。 >今回は、「NO」「月」の変数は数値を入れるので まずは Long でやってみて下さい。 現在 Dim 月 As Long 使用してますが、違うということでしょうか? それに 新しいWDに切り替えてから。ヘルプが表示されなくなったんです(??) 2007の使用したとき エラーメッセージ表示されると 「ヘルプ」ボタンクリック後に いろいろヒントが表示されたんですが、 今は真っ白。「あ」の文字も出ないですよ。 設定方法等分かりましたら合わせて教えてください (*´ノД`)   (もみじ坂) 2014/09/01(月) 00:00 ---- >データシートのところに マーク?されてます。 だって宣言したのは >Dim データーシート As Worksheet ですから。 「データシート」は『変数が定義されていいません。』ですよね? エクセルの言う事も、きちんと聞いてあげてください。 >新しいWDに切り替えてから。 「WD」って何ですか? 普通に(F1とかで)ヘルプは見られますか?   (HANA) 2014/09/01(月) 00:04 ---- >「WD」 windows2010です ^^;; >普通に(F1とかで)ヘルプは見られますか?  いいえ、見れません、といいますか何も表示されていない真っ白なページになってます >「データシート」は『変数が定義されていいません。』ですよね? (??) 変数宣言してシートをSETすれば シート名の代わり 変数が使えるという意味では ないのですか? さらにもう一度「データーシート―」 を変数宣言しなければならないのですうか? Dim 集計 As Worksheet Dim データーシート― As Worksheet   Set 集計 = Worksheets("Sheet5") Set データーシート― = Worksheets("Sheet6") NO = Application.Match(データーシート―.Cells(i, "E"), 集計.Range("A:A"), 0) でも データーシート という言葉がいけないのかと思い。 ローマ字に変更したところ 今度は(NO、月)の部分は「変数が定義されていません。」とでています。 変数宣言を一通りを試したんですが、どれもダメでした。 ローマ字に変えても全然ダメでした。 Sub test8() Dim NO As String Dim 月 As String Dim i As Long Dim 集計 As Worksheet Dim Date6 As Worksheet Set 集計 = Worksheets("Sheet5") Set Date6 = Worksheets("Sheet6") For i = 2 To Date6.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(Date6.Cells(i, "E"), 集計.Range("A:A"), 0) 月 = Application.Match(Month(Date6.Cells(i, "A")), 集計.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計.Cells(NO、月) = 集計.Cells(NO、月) + Date6.Cells(i、10) End If End If Next i End Sub (もみじ坂) 2014/09/01(月) 00:25 ---- >変数宣言してシートをSETすれば シート名の代わり 変数が使えるという意味では ないのですか? 使えます。 データーシート ←宣言&Set した言葉 データシート  ←エラーになった所の言葉 >今度は(NO、月)の部分は「変数が定義されていません。」とでています 「NO、月」なんて変数は宣言してませんよね? エラーが出て反転する所をよく確認してください。 「、」と「,」は違います。 >>普通に(F1とかで)ヘルプは見られますか? >いいえ、見れません、といいますか何も表示されていない真っ白なページになってます ヘルプを表示して上の方の右の方に 検索▼ があると思います。 その「▼」をクリックし一番下の「開発者用リファレンス」をクリックしてみて下さい。   (HANA) 2014/09/01(月) 00:51 ---- すみません(*´ノД`) 「,」ていつも自動に修正してくれるはずなのに。 全角で、て入力時は修正してくれないのですね (´゚д゚`) 今度はまた、違う箇所がエラーに ステップインしたところ If IsNumeric(NO) Then でひかかったんです。 一個一個結果を見たところ 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") の 「i」が上手く結果を拾いえていないの感じです。 i=3 だったり i=形が一致しなかったり エラー13になったりします。 >その「▼」をクリックし一番下の「開発者用リファレンス」をクリックしてみて下さい。 もともとチェックされています、エクセルのヘルプもあって クリック ⇒ エラー13検索 → google の検索画面に切り替えたんですよ。 もしかすると エラー箇所は教えてやるけど、内容は勝手に調べろて事なんだろうか(??) そういうPCかもしれません。 Sub test8() Dim NO As String Dim 月 As String Dim i As Long Dim 集計 As Worksheet Dim データー As Worksheet Set 集計 = Worksheets("Sheet5") Set データー = Worksheets("Sheet6") For i = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) 月 = Application.Match(Month(データー.Cells(i, "A")), 集計.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") End If End If Next i End Sub (もみじ坂) 2014/09/01(月) 10:02 ---- 横から失礼します。 エラー13は「i」で出ているエラーではないです。 「型が一致しません」ですよね? それはNO=〜〜か月=〜〜で出ているエラーです。 まずその二つの型はString型ですよね? そこにMatchで検索した値を入れようとしていますが、値が見つからなかった場合「False」が返ります。 そうするとFalseはBoolean型ですので、String型にBoolean型を入れようとして「型が一致しません」 となります。 せっかくIsNumeric関数を使っているのですから、二つの変数をなんでも入るVariant型に変更して、 中身で評価すればよいのではないでしょうか? HANAさんがコードの掲載していない方針のようなので、私も削除しました(11:45) 途中コードにDebug.Printを挟んで変数の値を確認することは、とても大切な処理です。(特に初めて作ったコードなら) F8を推し進めながら、どの段階でエラーが出ているかイミディエイトウィンドウで確認してみてください。 エクセルのバージョン分かりませんが、2013だと標準でインストールされないみたいですね。 http://www.relief.jp/itnote/archives/018464.php (稲葉) 2014/09/01(月) 11:41 ---- 横からすいません 月の計算ですがAではなくB列ではありませんか それとmonthでだすと1などがでますが、集計では1月なので一致しません。 これを解消するには一案ですが MATCH + CONCATENATE + MONTH + B列 + "月" + 2行目 それともしエラーが出たらそのエラー文のままgoogleなどで検索すると答えがあったりします。 最初からVBAでやるよりも今回のMATCHの場合一度マクロの記録などでできるのか、確かめながらやるということもできます。 一度にすべてを考えるのではなく、デバッグ機能やブレークポイント、コメントを書いたり、コメントにしてみたりしてしてください。 (デイト) 2014/09/01(月) 12:03 ---- (デイト) 様 ありがとうございます (´。✪ω✪。`) あれこれを直したら何やらいつの間にか変わってました (*´ノД`) >一度にすべてを考えるのではなく ずっと長い事同じレッスンをしています。 なにをつくりたいか → どの様に結果を得られるか → コード作成の手順 → コード作成 → 現在は変数の設定方法  そして今はようやくエラーになる理由を勉強しているところです (´゚д゚`) 道のりはまだまだナイガイと思います。 (稲葉)様 ありがとうございます ・:*(〃・ェ・〃人)*:・ Variant型 結構いいんですね覚えておきます。 Longがよく見かけるので、こっちの方がいいのかと思いました。 変数の説明はサイトによって全然違いますしね。 ここがすごくわかりやすかったです。 http://www.geocities.jp/cbc_vbnet/kisuhen/hensuu.html > 途中コードにDebug.Printを挟んで変数の値 これはよくわかりませんが、 ネットで、イミディエイトと検索したところ、 test8 → enter 押すと 実行されてるかどうかを確認できると。。。 それでしたら。ボタン作ってマクロを登録して使用してます。 その都度 ポチリポチリ と。 柱|皿 ̄)q >エクセルのバージョン分かりませんが、2013だと標準でインストールされないみたいですね。 エクセル2010ですそれでも、インストールされていないのでしょうね? ないものを望んでも仕方ないので、あるもので活用します。 ネットという膨大な辞典を (゚д゚lll)! (もみじ坂) 2014/09/01(月) 13:59 ---- 皆様のご協力でようやくこのコードで、欲しい結果を得ることができました。 ホント ありがとうございます。 しかし(HANA)様   何度もマクロを実行したところデーターを永遠に合計されてしまうのですね ΣΣ(゚д゚lll)! [a] [b]    [f] [g] [e] NO 商品名前 1 月 2 月 3 月 A01 A02      240 720 560 A03      240 A04     480 ★この結果を維持するには合計する前に 値をクリアしないといけないですね (*´ノД`) ビックリしました。 でも、そういうコードを作ったので、その通りに動いただけですもんね。 これで一段落ついたのでしょうか? [a] [b] [f] [g] [e] [f] [g] NO 商品名前 1 月 2 月 3 月 A01 A02 30 90 70 A03 30 A04 60 Sub test8() Dim NO As Variant Dim 月 As Variant Dim i As Long Dim 集計 As Worksheet Dim データー As Worksheet Set 集計 = Worksheets("Sheet5") Set データー = Worksheets("Sheet6") For i = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) 月 = Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") End If End If Next i End Sub (もみじ坂) 2014/09/01(月) 14:16 ---- 結局エラーの原因は分かったのでしょうか? >合計する前に 値をクリアしないといけないですね (*´ノД`) そうですね。 追加してみて下さい。 E3セルから、(A列の最終行,2行目の最終列)のセル までの範囲ですよね? >その都度 ポチリポチリ と。 これだと、エラーが出た段階でしか止まらないので [F8]で一行ずつ実行しながら 確かめてみてもらうのが良いと思います。   (HANA) 2014/09/01(月) 15:18 ---- >結局エラーの原因は分かったのでしょうか? >その都度 ポチリポチリ と。 >これだと、エラーが出た段階でしか止まらないので はい、最後らへんはのエラーは私のせいだと思います。 ポチリまくったのはエラーが発生しなくなった時です。 エラーの時で、ループで確認したら、i=9 の時ので、END IF になったころでした。 データーシート ループの間に空欄があったせいではと。。。 For=3to9 の時はいいのですが、 最終行になりますと。 15目から色々メモってたので、そのせいかもです。 それらを除いたら Dim NO As Long Dim 月 As Long でも全然問題ありませんでした。 だいたいコツが掴んだので、値クリアは問題ないですが、 TELの追加条件をチャレンジしてみようと思います (´。✪ω✪。`) 少々お待ちください。 その前にフォームページも作らなきゃ〜 (*´ノД`) ここのように教えてくれるところないかしら。 (もみじ坂) 2014/09/01(月) 16:28 ---- フォームはexcelで作成ですか?それとも別の何かですか excelでしたらこのサイトで大丈夫です。 (デイト) 2014/09/01(月) 16:47 ---- >>結局エラーの原因は分かったのでしょうか? >Longがよく見かけるので、こっちの方がいいのかと思いました。 >はい、最後らへんはのエラーは私のせいだと思います。 全然分かってない。 同じVBA組む者として、今までの流れを見ていましたが、能力は人それぞれ仕方ないところは ありますので、コードを組んで気付かないことについては言及しません。 しかし、既知の問題に対する修学態度が最悪です。 エラーの本当の原因を分からないままコーディングして、一番困るのは使わされる側です。 例え自分が使うにしろ、上司或いは同僚に提出する資料として信頼性が低すぎます。 是非そこを改めてください。 本題に戻ります。 これは計算結果を都度入力していくマクロですので、エラーで途中で処理が止まるとどこまで処理 されているのか、ユーザーが分からなくなります。 Long型一本でいくのなら、それなりのコーディングが必要です。 On ErrorルーチンでNOと月の変数を括って、Errオブジェクトで処理を分岐させるか 先ほど説明したVariant型変数にして、IsNumeric変数で分岐させるか これはコードを組む者として最低限のマナーだと(私は)思います。 Debug.Printの使い方も載せてありますので、確認してください。 http://www.excellenceweb.net/vba/debug/debug_print.html 以下Variant型とIsNumeric関数で処理した場合の例です。 Sub test8() Dim NO As Variant, NO検索値 As String Dim 月 As Variant, 月検索値 As String Dim i As Long Dim msg As String Dim 集計 As Worksheet Dim データー As Worksheet Dim WSF As WorksheetFunction '//変数の設定 Set WSF = Application.WorksheetFunction Set 集計 = Worksheets("Sheet5") Set データー = Worksheets("Sheet6") '//データシートA列の3行目からA列の最終行までループ処理 With データー For i = 3 To .Cells(.Rows.Count, "A").End(xlUp).Row Debug.Print "///" & i & "行目の処理///" '//検索する値を取得 NO検索値 = .Cells(i, "E").Value 月検索値 = Month(.Cells(i, "A").Value) Debug.Print NO検索値 Debug.Print 月検索値 '//検索結果を取得 NO = WSF.Match(NO検索値, 集計.Range("A:A"), 0) 月 = WSF.Match(月検索値, 集計.Range("2:2"), 0) Debug.Print NO Debug.Print 月 '//どちらも数値ならば、集計に出力 If IsNumeric(NO) And IsNumeric(月) Then 集計.Cells(NO, 月).Value = 集計.Cells(NO, 月) + .Cells(i, "J") Else msg = msg & i & "行目の「" & NO検索値 & "」「 " & 月検索値 & "」" & vbNewLine End If Next i End With If Len(msg) > 0 Then MsgBox msg & "の処理が出来ませんでした。" End Sub HANAさんごめんなさい。。。 (稲葉) 2014/09/01(月) 16:54 ---- (デイト) 様 スルーしてください ^^;; ホームページの間違いです。 (稲葉) 様 ご指摘と、辛辣のお言葉を善処しました。 Debug.Printの件はありがとうございます。 ゆっくりと勉強させていただきます。 (もみじ坂) 2014/09/01(月) 19:45 ---- 稲葉さん。 >>結局エラーの原因は分かったのでしょうか? これは、もみじ坂さんにあてた言葉でもありますが 稲葉さんにあてた言葉でもあったのですよ。 >同じVBA組む者として、今までの流れを見ていましたが でしたら、もみじ坂さんがどの様な方なのかも お分かりと思いますが。   (HANA) 2014/09/01(月) 23:21 ---- HANAさん >>>結局エラーの原因は分かったのでしょうか? >これは、もみじ坂さんにあてた言葉でもありますが >稲葉さんにあてた言葉でもあったのですよ。 早とちりしていたかもしれませんが、(表をちゃんと見てないので・・・) VBA上では、Match関数の戻り値はString型とLong型では、Falseが戻るので受け取れない仕様。 設計上では、データシートにあり、集計シートにないものがある問題。 ・・・或いは集計シートはまっさらなシートに、データシートに有るものだけ出力させるなどの工夫。 (工夫に関しては、関数で作ろうという方針のようでしたが) 私が原因かなーと思うところはこんなところでした。 横から口出して、場を荒らしたようで申し訳ございませんでした。 >(略)お分かりと思いますが。 はい・・・。 (稲葉) 2014/09/02(火) 08:46 ---- 稲葉さん。 稲葉さんが場を荒したとは思いません。 関係ない話が長くなるといけませんので、短いですがこの辺で。 もみじ坂さん >TELの追加条件をチャレンジしてみようと思います  その前に >15目から色々メモってたので、そのせいかもです。 もう一度同じ状況にして、MATCH関数の戻り値が何になるのか。 また、それが格納できる変数の型は何なのか。 ぜひ確認して頂けると良いと思います。 それから >ループの間に空欄があったせいではと。。。 これの対策も必要ですかね。。。?  なぜ空欄があるのかのご説明によって どの様な対策が出来るのか が  変わってくると思いますが。 あ、先にホームページですか。 そちらも頑張ってください。   (HANA) 2014/09/02(火) 09:52 ---- >ループの間に空欄があったせいではと。。。 >もう一度同じ状況にして、MATCH関数の戻り値が何になるのか。 現在testシート「データーシート」のレイアウトは下記になってます。 上の表は計算用、下の表はここに貼りだし用です。 行列をずらすと関数の参考セルが変わるので、このようにしました。 元のデーターはA列に空欄はありません。 必ずNOは入ります。 [a] [b] [c] [d] [e] [f] [g] [h] [i] [j] [k] [2] NO 日付 TEL 月検索値 NO NO検索値 単価 cs pc 金額 金額 [3] 140101 2014年1月1日 8768 5 A02 4 10 [4] 140101 2014年1月2日 8768 5 A02 4 20 [5] 140101 2014年1月5日 8768 5 A03 5 30 [6] 140101 2014年2月5日 2913 6 A02 4 40 [7] 140102 2014年2月5日 2913 6 A02 4 50 [8] 140102 2014年2月6日 2913 6 A04 6 60 [9] 140102 2014年3月5日 2913 7 A02 4 70 [10]     5 #N/A [11]     5 #N/A [12]     5 #N/A [13]     5 #N/A [14]     5 #N/A [15] NO 日付 #VALUE! #N/A cs pc 金額 [16] 140101 2014年1月1日 #N/A #N/A 10 [17] 140101 2014年1月2日 #N/A #N/A 20 [18] 140101 2014年1月5日 #N/A #N/A 30 [19] 140101 2014年2月5日 #N/A #N/A 40 [20] 140102 2014年2月5日 #N/A #N/A 50 [21] 140102 2014年2月6日 #N/A #N/A 60 [22] 140102 2014年3月5日 #N/A #N/A 70 下記のコードは皆さんが指摘していただいた箇所を全部直しても、 まだ、エラーで「型が一致しない」とコメントがでましたので、 色々試したところ、データーシートの下の表をC列に移動したところエラーがなくなったのであれ?と その後、何度か下の表をA列〜D列に一列ずつずらして、確認しても 下の表がA列から外すとエラーがなくなったので、これのせいではないかと書きました。 今日は関数で確認したところ 数字と文字 が入るので、 long が 数字じゃないよ〜と警告したんですね。 Sub test8() Dim NO As Long Dim 月 As Long Dim i As Long Dim 集計 As Worksheet Dim データー As Worksheet Set 集計 = Worksheets("Sheet5") Set データー = Worksheets("Sheet6") 集計.Range("E3:M6").ClearContents For i = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) 月 = Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") End If End If Next i End Sub >E3セルから、(A列の最終行,2行目の最終列)のセル までの範囲ですよね? はい、でも最終行はできないかな? 今はこれを使ってます。 集計.Range("E3:M6").ClearContents 最終行で、実行すると間に空欄があると正しく修正されないですよね(??) (もみじ坂) 2014/09/03(水) 21:16 ---- >今日は関数で確認したところ 数字と文字 が入るので 数字ってのは、4,5,6,7 とかの事で 文字ってのは、#VALUE! #N/A の事ですか? でしたら、後者は「文字」ではなく「エラー値」です。 エラー値は、数値でも文字でもないので Long で宣言された変数には入れられませんし String で宣言された変数にも入れられません。 Variant は「なんでも入れる」ので  とにかく一旦結果を入れて、後でその結果が妥当か精査する ~~~~~~~~~~↑~~~~~~~~~~~~ ~~~~~~~~~~~↑~~~~~~~~~~~~~~~ | If IsNumeric(NO) Then Variantで宣言して NO = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) が、稲葉さんが書いて下さっている >せっかくIsNumeric関数を使っているのですから、二つの変数をなんでも入るVariant型に変更して、 >中身で評価すればよいのではないでしょうか? をコードにした場合です。 >上の表は計算用、下の表はここに貼りだし用です。 貼り出し用のデータは、別のシートに作ってください。 本来必要でない処理を入れないといけなくなる可能性が出てきます。 #N/Aエラーは、通常でも対処をしておくのが良いエラーだと思いますが #VALUEエラーは、本来出ないはずのエラーですよね?   (HANA) 2014/09/03(水) 23:00 ---- >#VALUEエラーは、本来出ないはずのエラーですよね? になったのは NO 日付 #VALUE! #N/A cs pc 金額 =MATCH(MONTH($C15),Sheet5!$A$2:$J$2,0) 検査値が 日付型なのに、 NO は文字型だからですよね NOのところに 日付を入れたところ 普通に 結果が返りました。 >文字ってのは、#VALUE! #N/A の事ですか? はいそうです。 エラーですね (*´ノД`) >エラー値は、数値でも文字でもないので〜 そうだったんですOK て書いているので、 いつも使っちゃいと思ったんですが、 適応適所 で使わないとダメですね   (もみじ坂) 2014/09/04(木) 00:12 ---- >NOのところに 日付を入れたところ 普通に 結果が返りました。 いや「"日付"と文字が入っている所」に 日付(シリアル値)を入れたんですよね? MONTH関数の引数に日付が入っていなかったので #VALUE! エラーになった。   単純に書き間違えとは思いますが。 本来のデータがどのような構成になっているのかわからないのですが、どうなっていますか? やはり、表の下に また別の表が有ったりするのでしょうか? また、日付列に 日付以外のデータが入る可能性があるのでしょうか? >いつも使っちゃいと思ったんですが、 >適応適所 で使わないとダメですね そうですね。 変数とその型を宣言する利点として 【1】.変数名を間違った時、教えてくれる。 すでに体験済と思いますが 例1) Dim データーシート As Worksheet     ~~~~~~~~~~~~~~で宣言しているのに For i = 2 To データシート.Cells(Rows.Count, 1).End(xlUp).Row ~~~~~~~~~~~~間違えて書いてしまった。 例2) 集計シート.Cells(NO、月) = 集計シート.Cells(NO、月) + データーシート.Cells(i、10) ~~~~~ 「NO, 月」と書く所、「NO、月」になってしまって 変数として扱われてしまった。 等ともう一つ 【2】.想定と違うものを入れようとした時、教えてくれる。 があると思います。 今回、MATCH関数で検索値の出現する行番号,列番号を求めますが 検索範囲の中に、検索値が必ずあれば 結果は必ず値なので Long で宣言した変数の中に入らないといけません。 たとえば  If COUNTIF関数で、検索値が範囲の中に有るか調べる。範囲の中に有る場合 Then NO = Application.Match(・・・・) End If 等としてあれば、NOには数値が入らないといけないです。 変数:NO を Long で宣言しており ↑の作りにしたにも関わらず 「型が違う」とエラーが出る様なら、  ・そもそもコードが間違っている  ・想定外のデータがある のどちらかと思いますので、原因を突き止め 対応する事になります。   その対応のなかで「やっぱりVariantで宣言しないとだめだわ」ってなる事もあると思いますが。 変数:NO を Variant で宣言していた場合「型が違う」なんてエラーは出ませんから 処理が最後まで進んで、結果を見た時に 「あれ?思った結果と違うんだけど どこが違うのかな?」 ってなります。 コードが短かければ、見つけやすいと思いますが 長くなってくると、探すのが大変です。 さて、再度になりますが 御返事によっては今後の方針も変わってきますので データシートの2行目の見出し以降に、その見出しと一致しないデータが入るのか? 教えて下さい。 また >>E3セルから、(A列の最終行,2行目の最終列)のセル までの範囲ですよね? >はい、でも最終行はできないかな? >最終行で、実行すると間に空欄があると正しく修正されないですよね(??) 具体的に、どんな表を想定しているのでしょう? ご呈示の例であれば、  A列 の最終行は6行目  2行目の最終列は7列目 なので、  E3から Cells(6, 7) の範囲にしかデータは入らないですよね? まぁ、A列のデータ量が増えた時に "E3:M6" をその都度変更するのなら それでも良いのかもしれませんが。   (HANA) 2014/09/04(木) 10:53 ---- >単純に書き間違えとは思いますが。 すみません^^;;その通りです。 変数はよく使うなりの理由があるんですね。 よくわかりました。やはり long のままで使用したいと思います。 ただ、本質がよくわからないのですが、 Integer、Long て 同じ数字を入れる変数ですよね。 使用基準は、 使える数字の幅になるのでしょうか? めったに使用しないと思いますが、Single、Double、もそうですが、違いはやはり数字の幅? Stringはよくわかりませんが、数字と文字を両方認識できるよということでしょうか? Variant は 数字も文字もエラーも何でもどんとこい とイメージでよろしいでしょうか? バイト型 Byte 1         0〜255 ブール型 Bool 2         真(True)偽(False) 整数型 Integer 2         -32,768〜32,767 長整数型 Long 4         -2,147,483,648〜2,147.483,647 単精度浮動小数点数型 Single 4         -3.402823E38〜-1.401298E-45(負の数) 1.401298E-45〜3.402823E38(正の数) 倍精度浮動小数点数型 Double 8         -1.7976931348623E308〜-4.94065645841247E-324(負の数)                         4.94065645841247E-324〜1.79769313486232E308(正の数) 通貨型      Currency 8         -922,337,203,685,477.5808〜922,337,203,685,477.5807 日付型         Date  8         西暦100年1月1日〜西暦9999年12月31日 オブジェクト型    Object  4         オブジェクトを参照するデータ型 文字列型     String  10+文字列の長さ 0〜2GB バリアント型     Variant  16         すべてのデータを扱えるデータ型で0〜2GB (もみじ坂) 2014/09/05(金) 00:30 ---- > A列のデータ量が増えた時に "E3:M6" をその都度変更する〜  最終行、自動に取得してくれるとありがたいです。 >E3から Cells(6, 7) の範囲にしかデータは入らないですよね?   testデーターですと Cells(6, 8) です。 >具体的に、どんな表を想定しているのでしょう? 例えば下記の表からしますと。 (E3から最終行、P列).クリアコンテンツ にした場合  F6=60 と P7=30 が消されずに そのまま残るんじゃないかとイメージしてます。 もちろんどこのセルが空欄になるかは合計ガでないと分からないので そうするとコード作成は (A3から最終行、1) でも  消すのは E3からPの最終行だよといったコード作成しなければならないでしょうか? 何言ってんのかよくわからなくなりました^^;; [1] [a] [b] [f] [g] [e] [f] [g] [h] [i] [j] [k] [l] [m] [n] [o] [p] [2] NO 商品名前 1 月 2 月 3 月 4 月 5 月 6 月 7 月 8 月 9 月 10 月 11 月 12 月 [3] A01 [4] A02 30 90 70 [5] A03 30 [6] A04 60 [7] A05 30 (もみじ坂) 2014/09/05(金) 00:43 ---- 変数の型については http://officetanaka.net/excel/vba/variable/03.htm この辺をご覧になると良いかもしれません。 >>E3から Cells(6, 7) の範囲にしかデータは入らないですよね? > testデーターですと Cells(6, 8) です。 すみません、ずれてますね。 セル位置がよくわからないので、教えて下さい。 1.A列の入力がある最後の行は何番ですか?・・・・・E列ではなくA列で確認します 2.2行目の入力がある最後の列は何番ですか?・・・・月の見出しが入力されている行   (HANA) 2014/09/05(金) 09:24 ---- 変数宣言ありがとうございます。勉強します。 >1.A列の入力がある最後の行は何番ですか?・・・・・E列ではなくA列で確認します 集計シートは「7」番目です 元データーは「50」番目 です ただし、 増えます。 >2.2行目の入力がある最後の列は何番ですか?・・・・月の見出しが入力されている行 集計シートは 「8」番目です。 元データーは 「17」番目です。増えません。 (もみじ坂) 2014/09/05(金) 18:03 ---- >>1.A列の入力がある最後の行は何番ですか? >集計シートは「7」番目です >>2.2行目の入力がある最後の列は何番ですか? >集計シートは 「8」番目です。 という事は、  E3セルからCells(7, 8)セルの範囲に結果が入力されている って事ですよね? マクロで集計を始める前に、この範囲をClearContentsするという事だったのですが それでも駄目だと思いますか?   (HANA) 2014/09/05(金) 23:16 ---- >E3セルからCells(7, 8)セルの範囲に結果が入力されている そうしますと。最終行と最終列を取得品といけないですよね。 >>1.A列の入力がある最後 >>2.2行目の入力がある最後 上の条件を一個ずつ入れたところ下のコードができましたが、 またややこしく考えているんでしょうか?私 ΣΣ(゚д゚lll)! Sub test10() Dim NO As Long Dim 月 As Long Dim 集計 As Worksheet Set 集計 = Worksheets("Sheet5") NO = 集計.Range("A3").End(xlUp).Row 月 = 集計.Range("E2").End(xlToRight).Column '範囲 E3〜H6 集計.Range(Cells(NO, 5), Cells(3, 月)).ClearContents '集計.Cells(NO, 月).ClearContents End Sub (もみじ坂) 2014/09/07(日) 23:32 ---- 結果としては同じですが >>E3セルからCells(7, 8)セルの範囲 ~~~~~~ ~~~~~~~~~~~~~~~ の考え方とは少し違うコードになっていると思います。 分かったうえで Cells(NO, 5)セルからCells(3, 月)セルの範囲 ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~ とやっておられるなら「絶対ダメ」って事は無いと思いますが。 NOの結果が「7」、月の結果が「8」だった時に Cells(NO, 5)はどのセルか? Cells(3, 月)はどのセルか? コード内に仮に Cells(NO, 5).Select Cells(3, 月).Select を入れてもらって、集計シートが見える状態にして ステップインで実行しながら、どこのセルが選択されるのか見てもらっても良いと思いますし MsgBox Cells(NO, 5).Address MsgBox Cells(3, 月).Address を入れておくと、セル番地がメッセージボックスで表示されるので確認出来ると思います。 イミディエイトウィンドウを表示させて、 ステップインで実行中  ? Cells(NO, 5).Address と入力して Enter を押すと 結果が表示されますのでそれで確認しても良いと思います。 それから、 >集計.Range(Cells(NO, 5), Cells(3, 月)).ClearContents だと、集計シート以外のシートがアクティブになっていたらエラーになると思います。 複数シートを対象にする場合は、すべてのセルの前に「どのシートの」を入れて下さい。   (HANA) 2014/09/08(月) 08:39 ---- 返信遅くなってすみません。 9月はドタバタして返信が遅れがちかもです (*´ノД`) > Cells(NO, 5)セルからCells(3, 月)セルの範囲 ~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~ Cells(3, 5)セルからCells(3, 8)セルの範囲 は E3 〜 H8 までの範囲の応用のつもりでしたが、 コードの認識としては E1〜最終行 E2〜最終行 E3〜最終行 だけでした。 そうすると、Cells(3, 月)は使えるけど Cells(NO, 5)は作り直さなければならないですね (´゚д゚`) > の考え方とは少し違うコードになっていると思います。 あら?違うのですねそうしますと E3セルからCells(7, 8)セルの範囲ですと こうになりますか? For i = 3 To 集計.Cells(Rows.Count, 1).End(xlUp).Row   For j = 3 To 集計.Cells(2, Columns.Count).End(xlToLeft).Column       集計.Range(i, j).ClearContents (もみじ坂) 2014/09/10(水) 21:43 ---- >NOの結果が「7」、月の結果が「8」だった時に >Cells(NO, 5)はどのセルか? Cells(3, 月)はどのセルか?  確認して下さい。 と書きましたが、確認しましたか? どのセルでしたか?あるいは、どのセル番地が表示されましたか? エクセルに出した指示(書いたコード)が 正しくエクセルに伝わっているか(思っている通りに書けているか) 確認出来る様になる事が、コードを完成させる為の近道です。 今回の件は、実際問題として そのままで支障はないと思います。 ですが、デバッグの練習だと思って 考えるのではなく、やってみてもらえたらと思います。  もちろん、結果を確認した後は 考えて下さいね。 もう一度書きます。 「どのセルでしたか?あるいは、どのセル番地が表示されましたか?」   (HANA) 2014/09/11(木) 11:00 ---- 集計.Cells(NO, 5).Select E1 で 集計.Cells(3, 月).Select  N3 でした。 しかし、なぜでしょうか? 集計.Cells(3, 月).Select 3行目の 最終例 はそのまま実行されたのに、 集計.Cells(NO, 5).Select は E5が最終行なのに なぜ E1 が認識されたんでしょうか? ちなみにコードを 集計.Cells(NO, 月).Select にしますと、 1行目の最終列になります。 NOは 1行目を最終列を認識しているのか。 それとも 1行目から処理していて。 FOR〜 next 関数がないために 次の行に行けていないというイメージでしょうか? (もみじ坂) 2014/09/14(日) 22:06 ---- 変数:NO に値を入れる所がおかしくないですか? ステップインで実行しながら、変数:NO に 期待する値が入っているか確認してみて下さい。 期待する値が入らないなら、コードの修正が必要です。 これまで書いてきたコードの該当部分と見比べてみて下さい。 ローカルウィンドウは表示できていますか?   (HANA) 2014/09/14(日) 22:55 ---- 同じく > NO = 集計.Range("A3").End(xlUp).Row  にする場合は 集計.Cells(NO, 5).Select E1 で 集計.Cells(3, 月).Select  N3 でした。 ですよ なにがいけないのか私では分からないですが。 何度やっても結果は一緒でした。 (??) > NO = 集計.Cells(Rows.Count, 1).End(xlUp).Row にする場合は 集計.Cells(NO, 5).Select E6 で 集計.Cells(3, 月).Select  N3 でした。 でした。 なにが違うのでしょうか? ★別件ですが、 (HANA)様 ネットを開くと警告ページが表示されるやつを 削除方法知りませんか?  何かをインストールされたのではないようなんですよ。  Google Chrome 使うときが一番災厄です。  30秒に一回画面が切り返されて作業できない状況なんです。  主に JAVA の ぐれーどUP しろ。  ですとか。 ウイルスがどうのですとか。  似てる画面で勝手に広告がいっぱい追加されたり大変です。  何とかなる方法知りませんか?  今エクスプローラを使用してるんですよ (*´ノД`) いったい何が起こったのやら。。。 (もみじ坂) 2014/09/16(火) 21:52 ---- > NO = 集計.Range("A3").End(xlUp).Row と書いた時の NO に入る値と > NO = 集計.Cells(Rows.Count, 1).End(xlUp).Row と書いた時の NO に入る値は それぞれいくつになっていますか? >ネットを開くと警告ページが表示されるやつを 削除方法知りませんか? もう少しヒントが欲しいですが。 エクスプローラーだと表示されないんですか? Google Chrome が出しているのか、その他の何かが出しているのかわかりますか? まずは、オンラインのウイルスチェックをしてみてはどうでしょう?   (HANA) 2014/09/16(火) 22:14 ---- > NO = 集計.Range("A3").End(xlUp).Row  メッセージではE1 です セル番地でいいんですよね 値というのは  値は NO=0 です  > NO = 集計.Cells(Rows.Count, 1).End(xlUp).Row   E6です   NO=6 です。 (もみじ坂) 2014/09/16(火) 22:45 ---- 無料ソフトDLしてスキャンしました。でも変わらないです。 adwcleaner_3.310 下記のページに切り替わるんです。勝手に、、、 9月17日追記 問題解決のため不正アクセスリンクを削除しました。 エクセル学校はエクスプローラではコメントを記載できないのですね (*´ノД`) (もみじ坂) 2014/09/16(火) 22:51 ---- 速やかにネット管理者に相談した方が良いと思います。 間違ってもダウンロードしない方が良いでしょう。 それはウィルスサイトのようです(少なくとも検索すると怪しい先として情報が 多数あります)。 ネット見てる方もアクセスしないようにしてください。 取りあえず URL 切っておきます。 (Mook) 2014/09/16(火) 23:36 ---- 何かインストールされてるみたいですね。 私なら、不具合が起こる前まで復元してみますが。  それで直るかどうかわからないですが。。。 >エクセル学校はエクスプローラではコメントを記載できないのですね (*´ノД`) 私は Internet Explorer つかえてます。 さて、 >> NO = 集計.Range("A3").End(xlUp).Row > 値は NO=0 です これはおかしいですね。 集計.Range("A3").End(xlUp)したセルの .Row ・・・・行番号 が入るので「0」になることはないです。 確認するタイミングが違っていませんか? ステップインで実行して、NO = 集計.Range("A3").End(xlUp).Row の行を過ぎた後 ローカルウィンドウで「NO」の値を見るのですよ? >> NO = 集計.Cells(Rows.Count, 1).End(xlUp).Row >  NO=6 です。 Cells(Rows.Count, 1)ってどのセルかわかりますか?   (HANA) 2014/09/16(火) 23:46 ---- 質問の本題とは関係ない、追加コメントですw。 さすがに入れてみるのはやっていないですが、検索した限りは、Java のアップグレードを 偽装した広告表示するプログラムをインストールするサイトといった情報がありました。 HANAさんの言うように、とりあえず復元ポイントがあるのであれば、問題が出る前まで 戻すのが手っ取り早いと思います。 ない場合はまず怪しいソフトのアンインストール。 それからブラウザ(特におかしな挙動をする)の、拡張機能の削除など。 それでダメならブラウザの再インストール。 それでもダメなら最後は OS 再インストールでしょうか。 会社の PC ならまずは管理者に相談してみるのが良いと思います。 なので掲示板を見る方も、安易に上記にアクセスしたり、インストールしたりしないように ご注意を。 それから下記を確認してみてはと思います。 ブラウザのホームページの設定、 HOSTS ファイルに怪しい登録がないか。あれば復元を。 http://support.microsoft.com/kb/972034/ja (Mook) 2014/09/17(水) 07:56 ---- (Mook)様 ありがとうございます。 エクセル学校の返事だけでも一苦労だったんです "o(`*ω*´)カチーン・・・・ ご指摘通りに ネット会社に通報したところ 対処法を見つけました。 リセット方法と消去ソフト https://support.google.com/chrome/?p=help&ctx=menu#topic=3227046 こちらも合わせてリセットしました。 http://support.microsoft.com/kb/972034/ja これで何とか、今のところなに問題を起きていないです。 そして、あれから もう一つのサイトが浮上 media プレイ の Up グレートです。 皆様も気を付けてくださいませ (´。✪ω✪。`) どうもありがとうございました m(_ _)m (もみじ坂) 2014/09/17(水) 09:49 ---- すみません。 ローカルウィンドウとエミディエイトを間違えました^^;; > NO = 集計.Range("A3").End(xlUp).Row    値は NO=1 です  > NO = 集計.Cells(Rows.Count, 1).End(xlUp).Row   値は 月=14  です > NO = 集計.Cells(Rows.Count, 1).End(xlUp).Row   値は NO=6   A列の最終行ですよね (??)    最下端(65536行)から上に向かって空白でないセルを検索する? (もみじ坂) 2014/09/17(水) 16:44 ---- えっと >> NO = 集計.Range("A3").End(xlUp).Row   >  値は NO=1 です これって、思った値ですか? NOに入れようと思っている値は「6」だと思いますが。。。? 思った値が入っていないなら、コードが悪いので変更が必要です。 >> NO = 集計.Cells(Rows.Count, 1).End(xlUp).Row >  最下端(65536行)から上に向かって空白でないセルを検索する? はい。ですから >> NO = 集計.Range("A3").End(xlUp).Row と書いてあると、A3セルから上に向かって空白でないセル(連続しないセル)を 検索する事になりますが、それじゃダメですよね?   (HANA) 2014/09/17(水) 16:54 ---- >これって、思った値ですか? あ!!ΣΣ(゚д゚lll)! 勘違いしてました。 A3から最終行取得してほしかったんですが、 これではなく >> NO = 集計.Range("A3").End(xlUp).Row こっちになりますね NO = 集計.Range("A3").End(xlDown).Row 欲しい結果を明確にして 必要なコードを作る。 あんなに言われたのに、また忘れてますね (*´ノД`) (もみじ坂) 2014/09/17(水) 20:53 ---- >NO = 集計.Range("A3").End(xlDown).Row そうですね。 A3セルを起点にするなら、xlDown で探さないといけないですね。 さて、これで NOに「6」が入る様になりましたね。 では > '範囲 E3〜H6 > 集計.Range(Cells(NO, 5), Cells(3, 月)).ClearContents の、何に私がこだわっているかわかりますか? Cells(NO, 5) のセル番地はどこですか? Cells(3, 月) のセル番地はどこですか?   (HANA) 2014/09/17(水) 21:44 ---- Cells(NO, 5) のセル番地はどこですか?  E6 Cells(3, 月) のセル番地はどこですか?  H3  です。 >の、何に私がこだわっているかわかりますか? う〜ん 間違ったらすみません。 始点 と 終点 を探す? みたいなイメージですか? (もみじ坂) 2014/09/17(水) 23:24 ---- >始点 と 終点 を探す? みたいなイメージですか? 「探す」ってのはどういう事でしょう? A列に6行目までデータがあって、2行目に8列目までデータがあったら E3:H6 の範囲のセルの値をクリアする必要があります。 A列に10行目までデータがあって、2行目に12列目までデータがあったら E3:L10 の範囲のセルの値をクリアする必要があります。 こう考えると、始点は変わらず 終点が変わりますよね? 始点は決まっています。E3です。 終点が、データ量によって変わります。  A列に 6行目まで入っていたら  6行目までの範囲ですし    10行目まで入っていたら 10行目までの範囲です。  2行目に、8列目まで入っていたら 8列目までの範囲ですし      12列目まで入っていたら 12列目までの範囲です。 終点のセルがどこなのか、データ状況を確認して 指定する必要があります。 E6:H3の範囲と、E3:H6の範囲は同じです。 すでに書いていますが、今回それをわかっていて > 集計.Range(Cells(NO, 5), Cells(3, 月)).ClearContents としているのなら(まぁその理由は知りたいところですが)良いと思いますが 「テキトーに当てはめて、なんとなくうまくいったから 結果オーライ」 だとしたら、良いとは思えません。   (HANA) 2014/09/17(水) 23:41 ---- >まぁその理由は知りたいところですが 集計.Range(NO, 月).ClearContents はじめは これを使用したんです。でもエラーですし。 欲しい結果得られなかったので、 月は12か月しかないので、変動はないのですが、 NOはたま〜に変動ありますので、どうしようかな〜と考えたところ Cellsプロパティ を見て 始点と終点探す?認識させる? そして、その範囲を消してもらうイメージで使用しました。 それしか思いつかなかったです ^^;; http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html 後ほどfor〜next を 浮かんで あそっか といった感じです。 (もみじ坂) 2014/09/18(木) 00:40 ---- 考え方は、参考にされたページで良いです。 >集計.Range(NO, 月).ClearContents >はじめは これを使用したんです。でもエラーですし。 >欲しい結果得られなかったので、 変数にきちんと値が入っていれば、エラーにはならないと思いますが 欲しい結果は得られないと思います。 これだと、最後のセルを一つだけしかクリアできないからです。 >Range("A1", "B3").Select で、A1:B3の範囲が選択出来ます。 今回は(6行8列まで見出しがあったら)E3:H6なので Range("E3", "H6").Select で、E3:H6の範囲です。 実際は、後ろ側の「H6」の方は変数で変化させたいので この部分が Cells(○ ,△) の様に変数で変化する様にします。 欲しい結果が得られなかった時に、新しい別のものを探すのではなく 最初の内は難しいと思いますが、どうして欲しい結果が得られなかったのか まず検討してみてもらうのが良いと思います。 すると、自分で間違えやすい所もわかってくると思いますので。   (HANA) 2014/09/18(木) 08:27 ---- 間違えてますね (*´-`*)ゞ ポリポリ 集計.Cells(NO, 月).ClearContents ですと 範囲が E3:H6 ならば H6 のひとマスのみ削除されてました。 なので、できないと判断したんです。 >すると、自分で間違えやすい所もわかってくると思いますので。 はいわたしは細かいところがダメですね「.」とか「,」とか そういう些細のところを気をつけなければ _〆(・v・★) これで値クリアは一区切りでOKですか? Sub test8() Dim NO As Long Dim 月 As Long Dim i As Long Dim 集計 As Worksheet Dim データー As Worksheet Set 集計 = Worksheets("Sheet5") Set データー = Worksheets("Sheet6") Call 月別値削除 '集計.Range("E3:M6").ClearContents For i = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) 月 = Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") End If End If Next i End Sub (もみじ坂) 2014/09/18(木) 19:50 ---- >これで値クリアは一区切りでOKですか? えっと、値クリアするところはどこですか?   (HANA) 2014/09/18(木) 22:09 ---- あすみません。 call を使って ◆のところに入れました。 コード実行しても。ちゃんと欲しい結果になってます ^ー^ 今のところ 。。。 (*´-`*)ゞ ポリポリ Sub test8() Dim NO As Long Dim 月 As Long Dim i As Long Dim 集計 As Worksheet Dim データー As Worksheet Set 集計 = Worksheets("Sheet5") Set データー = Worksheets("Sheet6") Call 月別値クリア ’◆ '集計.Range("E3:M6").ClearContents For i = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) 月 = Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") End If End If Next i End Sub Sub 月別値クリア() Dim NO As Long Dim 月 As Long Dim 集計 As Worksheet Set 集計 = Worksheets("Sheet5") 'NO = 集計.Cells(Rows.Count, 1).End(xlUp).Row NO = 集計.Range("A3").End(xlDown).Row 月 = 集計.Range("E2").End(xlToRight).Column '範囲 E3〜H6 集計.Range(集計.Cells(NO, 5), 集計.Cells(3, 月)).ClearContents '集計.Cells(NO, 月).ClearContents End Sub (もみじ坂) 2014/09/18(木) 23:40 ---- >集計.Range(集計.Cells(NO, 5), 集計.Cells(3, 月)).ClearContents の記述はいかがなものかと言っているのですが。   (HANA) 2014/09/18(木) 23:45 ---- > の記述はいかがなものかと言っているのですが。 使うと不都合が生じるんですか? > > 集計.Range(Cells(NO, 5), Cells(3, 月)).ClearContents > としているのなら(まぁその理由は知りたいところですが)良いと思いますが > 「テキトーに当てはめて、なんとなくうまくいったから 結果オーライ」 > だとしたら、良いとは思えません。 と書いてあったので、いいのかなと。。。 FOR NEXT のほうがいいですか? >この部分が Cells(○ ,△) の様に変数で変化する様にします。 ここらへんをチャレンジした方が勉強になりますか? やり方は多分たくさんあると思います。 (もみじ坂) 2014/09/19(金) 17:14 ---- >ここらへんをチャレンジした方が勉強になりますか? >やり方は多分たくさんあると思います。 いや、別の方法を考えてほしいわけじゃないです。 >Range("E3", "H6").Select の様に書いてほしいです。 ですから  集計.Cells(NO, 5) が「E3」  集計.Cells(3, 月) が「H6」 になるかどうか確認してください。 2014/09/08(月) 08:39から、が関連の部分です。   (HANA) 2014/09/19(金) 18:26 ----  集計.Cells(NO, 5) が「E3」  集計.Cells(3, 月) が「H6」 にならないです。  集計.Cells(NO, 5) が「E6」  集計.Cells(3, 月) が「H3」 になってます。 集計.Range(集計.Cells(NO, 5), 集計.Cells(3, 月)).ClearContents この形を ↓  > >Range("E3", "H6").Select  の様に書いてほしいです。 この形に変えるていうことですか? それともまだ途中だからまだ出番ではないと意味ですか? 理解が悪くてすみません (´ロ`ill)  集計.Cells(NO, 5) が「E3」 集計.Cells(3, 月) が「H6」 この結果になるには  集計.Cells(3, 5) が「E3」 集計.Cells(NO, 月) が「H6 に変えないと。。。。 (もみじ坂) 2014/09/19(金) 20:10 ---- >集計.Cells(3, 5) が「E3」 >集計.Cells(NO, 月) が「H6」 ですから Range("E3", "H6") ~↑~ ~↑~ | 集計.Cells(NO, 月) 集計.Cells(3, 5) つまり Range(集計.Cells(3, 5), 集計.Cells(NO, 月)) ~~~~~~~E3~~~~~~~ ~~~~~~~~H6~~~~~~~~ の様に書いてもらいたかったのですが、わかってもらえますか? あくまでも E3からA列の最後の行で2行目の最後の列 のセル と言う考え方です。 上で「今回それをわかっていて〜〜としているのなら(まぁその理由は知りたいところですが)良い」と書きましたが その理由として  A列の最後の行でH列のセル から 3行で2行目の最後の列 のセル と考えているといわれれば、考えた通りのコードなので良いと思います。 ですが、どちらかというと 「テキトーに当てはめて、なんとなくうまくいったから 結果オーライ」 のレベルだと思いました。 ・E3からA列の最後の行で2行目の最後の列 のセル  ・A列の最後の行でH列のセル から 3行で2行目の最後の列 のセル 違いが分かってもらえますか?   (HANA) 2014/09/19(金) 23:21 ---- >の様に書いてもらいたかったのですが、わかってもらえますか? なるほど、すみません。 私はその書き方自体が ダメだと勘違いえしてました ^^;; >違いが分かってもらえますか? うーんと イメージでいいますと、 >Range(集計.Cells(3, 5), 集計.Cells(NO, 月)) 欲しい結果の範囲だけを実行する  >集計.Range(Cells(NO, 5), Cells(3, 月)).ClearContents 寄り道してから、欲しい結果の範囲だけを実行するけど といった感じでしょうか? 言葉で説明するのは難しいですが。。。。 (もみじ坂) 2014/09/22(月) 19:05 ---- >私はその書き方自体が ダメだと勘違いえしてました ^^;; ダメだった時に、何がダメだったのか 確認してください。 うまくいかないコードを、すぐに破棄してしまって まったく別のコードを作ってみて 「なんとなくうまくいったから、できた」では いつまでたってもできる様にはならないと思います。 >〜〜といった感じでしょうか? もう一度、私が書いた事を読み直してもらえますか?   (HANA) 2014/09/22(月) 23:30 ---- 範囲が書くと 言う 意味でしょうか? >・E3からA列の最後の行で2行目の最後の列 のセル    E6 と H3   > ・A列の最後の行でH列のセル から 3行で2行目の最後の列 のセル   H6 と H3 > 違いが分かってもらえますか? でしょうか? (もみじ坂) 2014/09/23(火) 22:48 ---- ですね。 >A列に6行目までデータがあって、2行目に8列目までデータがあったら >E3:H6 の範囲のセルの値をクリアする必要があります。 > >A列に10行目までデータがあって、2行目に12列目までデータがあったら >E3:L10 の範囲のセルの値をクリアする必要があります。 > >こう考えると、始点は変わらず 終点が変わりますよね? の様に考えませんか? やりたいことがあった時に http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html の様な入門ページを見て、まずは土台を作って下さい。 Range("E3", "H6").Select と書けば、E3:H6 の範囲が選択出来ますよね。 そうするつもりで Range(集計.Cells(3, 5), 集計.Cells(NO, 月)).Select と書いてうまくいかなかった場合、色々な状況は考えられますが >Range("E3", "H6").Select と書けば良い事は明らかなので  Cells(3, 5) → E3の事になって居ない  Cells(NO, 月)→ H6の事になって居ない 事を疑ってください。 ダメだと思って、破棄して 新しい方法を探すのでは いつまでたっても「どこがダメだったのか」わからないままになってしまいます。 今回の様に「その記述はダメだと思っていた」と間違った結論を出してしまったら 今後にとても影響して来てしまうと思います。   (HANA) 2014/09/23(火) 23:36 ---- >事を疑ってください。  なるほどそういうことなんですね (*´ノД`) >「なんとなくうまくいったから、できた」では  私はまだこの区域から抜け出してないようですね  気をつけねば 。。。 (もみじ坂) 2014/09/23(火) 23:46 ---- これで 値クリア は一段落でしょうか? 欲しい結果はばっちりです _〆(・v・★) (もみじ坂) 2014/09/24(水) 20:09 ---- 値クリアも一段落です。 今後の事も考えて、今回は 同じsubの中に入れてもらえると良いと思います。   変数の宣言が重複するから、別のプロシージャ(別のsub○○)にしたのかな?   とか思ってますが。 そしたら、番号が一致するものの合計を出すコードを考えてみますか?   (HANA) 2014/09/24(水) 20:56 ---- >今後の事も考えて、今回は 同じsubの中に入れてもらえると良いと思います。 入れておきます。 別にしたのは 、 確認しやすいと思ったからです。 > そしたら、番号が一致するものの合計を出すコードを考えてみますか? いえ、これと一緒にすると非常に見づらいことが判明しました。 なぜかいいますと 商品NO は 50 個ぐらいで。 一個のTEL番号 で使用してるのは だいたい 10〜15商品ぐらいなんです。 印刷するときも見にくいです(*´ノД`) そこのところを迷ってます。 なにかいい案ありましたら参考に是非教えてください (*´-`*)ゞ ポリポリ 今のところ二通りのやり方を見つけて そのほうが見やすいではなかと思ってます。 1.ダブらない項目をソートして ⇒ 書き出す ⇒ 月別計算する。 2.Adictionaryを使って ダブルらない項目書き出す ⇒ 月別計算する。 (もみじ坂) 2014/09/24(水) 22:29 ---- ん? ちょっとよくわからないです。 集計方法を変える って事ですか? 今の表とは、別のお話?   (HANA) 2014/09/25(木) 09:25 ---- >集計方法を変える って事ですか?今の表とは、別のお話? はいそうです。 今の表ですといらないものが多いです。 別の表を作った方が見やすいかな?と。。。 なので、先に Adictionaryをできればと思います (*゚Å゚;*) (もみじ坂) 2014/09/25(木) 09:40 ---- じゃあ、先に結果図を決めてもらうのが良いのかな? 単純にあるものだけで NO毎・TEL毎・月毎 で集計出来れば良いのか? [A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [1] [2] NO 日付 TEL ・・ NO ・・ 単価 cs pc 金額 [3] 140101 1/1 8768 A02 10 [4] 140101 1/2 8768 A02 20 [5] 140101 1/5 8768 A03 30 [6] 140101 2/5 2913 A02 40 [7] 140102 2/5 2913 A02 50 [8] 140102 2/6 2913 A04 60 [9] 140102 3/5 2913 A02 70 [A] [B] [C] [D] [E] [F] [1] [2] NO ・・ TEL 1月 2月 3月 [3] A02 2913 90 70 [4] A02 8768 30 [5] A03 8768 30 [6] A04 2913 60   (HANA) 2014/09/25(木) 11:17 ---- データーは分かりやすいよう内容をかえました。 ◆元データー [a] [b]     [c] [d] [e] [f] [g] [h] [g] [h] [g] [1] 書類NO 日付     TEL NO 単価 cs pc 金額 [2] 140124 2014年1月5日 8768 A02 10 [3] 140124 2014年1月5日 8768 A02 20 [4] 140124 2014年1月5日 8768 A15 30 [5] 140124 2014年1月5日 8768 A03 40 [6] 140124 2014年3月5日 8768 A03 50 [7] 140124 2014年3月5日 8768 A12 60 [8] 140124 2014年3月5日 8768 A10 70 ◆集計シート [欲しい結果] 必要なNOのみ表示させて 月別に計算する [a] [b]     [c] [d] [e] [f] [g] [h] [1] NO 商品名前 個数 名称 1 月 2 月 3 月 4 月 [2] A02     30 [3] A03     40 50 [4] A10     70 [5] A12     60 [6] A15     30 (もみじ坂) 2014/09/26(金) 16:28 ---- TEL番号の話はどうなったのですか? >集計シート [欲しい結果] 必要なNOのみ表示させて 月別に計算する 今までは、集計シートにNOが事前に入力されていたが それをやめるから、データシートから重複なく抜き出す作業が必要になる って事ですか? どこかの列に、年間の合計を出すことにして オートフィルタで非表示にしても良さそうに思えますが。   (HANA) 2014/09/26(金) 16:52 ---- 重複をなくすリストを作る方法として  ・フィルタの詳細設定で重複を除く  ・一行ずつ処理しながら、まだ出てきていないデータの場合登録していく    たとえば、昇順に並べて 上のデータと違ったら新しいデータなので登録する 等あると思いますが、Dictionalyもやってみられると良いと思います。 以前、「Dictionaryは集計をするものではない」と書きましたが覚えていますか? 今、集計するマクロを作りましたよね? では、「マクロは集計をするものか?」と聞かれると、 「やり方によっては集計もできるけど、集計するものではない」ですよね。 Dictonaryもそんな感じで思ってもらえると良いんじゃないかと思います。 Dictonaryは、一つのKeyに対して一つのItemを登録できるものです。 イメージとして(あくまでもイメージです) Key Item [1] [2] [3] [4] こんな感じの2列の表を想像してみてください。 お約束として、Keyの列に同じ値を入れる事はできません。 また、Keyを問い合わせする事でItemを参照する事ができます。 たとえば、登録処理を済ませて Dictonaryに以下の様なデータが入っているとします。 Key Item [1] リンゴ 赤 [2] レモン 黄 [3] メロン 緑 [4] キウイ 緑 「リンゴ」を問い合わせると「赤」 「メロン」を問い合わせると「緑」 と返ってきます。 VLOOKUP関数で VLOOKUP("リンゴ",範囲,2,FALSE) と書くと「赤」が得られますが 同じ様な使い方です。  Itemの中にはいろんなものが入れられたりするので そういった点は異なりますが。 また、これから登録しようとするKeyがすでに登録されているかどうか 簡単に確認できます。 COUNTIF関数で COUNTIF(範囲,"リンゴ") の結果が0でなければ 登録済みとわかりますが そんな感じです。 ですから、Dictionaryは決して 集計ができる魔法のツール ではありません。  ・登録されているKeyかどうか簡単にわかる  ・一つのKeyに対して、一つのItemが登録できる  ・あるKeyに登録されているItemが何か、簡単にわかる それだけです。 さて、Dictionaryを使うに当たって 何か参考にしているページ等ありましたら 教えてもらえると良いのですが。   (HANA) 2014/09/26(金) 23:38 ---- > TEL番号の話はどうなったのですか? あ!ΣΣ(゚д゚lll)! 抜けてました。 B1 に 入力した TEL の NO のみ月別合計です。 [a] [b] [c] [d] [e] [f] [g] [h] [1] 8768 [2] NO 商品名前 個数 名称 1 月 2 月 3 月 4 月 [3] A02 30 [4] A03 40 50 [5] A10 70 [6] A12 60 [7] A15 30 ◆参考しているページ 重複しない品名と個数の合計を計算します http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.html >どこかの列に、年間の合計を出すことにしてオートフィルタで非表示にしても良さそうに思えますが。 それはどういった感じですか? やり方がわからないので、計算し直ししか思いつかなかったです。 一番いいのは、今までの表を使って計算した後に。 空欄の行を非表示するみたいなのできれば、 もう一度作り直す、苦労はしないですみますが (*゚Å゚;*) Dictionaryは私にとっては難しく感じます。 IF関数を FOR〜NEXT 関数のように 使い慣れないせいかもですが...... (もみじ坂) 2014/09/27(土) 09:43 ---- >>どこかの列に、年間の合計を出すことにしてオートフィルタで非表示にしても良さそうに思えますが。 >それはどういった感じですか? >やり方がわからないので、計算し直ししか思いつかなかったです。 そんな大層な事ではなく。。。 たとえば、I列にでも =SUM(E3:H3) の式を入れておくと データが無い行は「0」が表示されます。 オートフィルタで0以外の行を表示させたら 結果がある行だけ表示されると思います。 せっかくマクロで処理をしているので、 If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") End If この時に、一緒に 合計列にも足し算していく様にしたら良いと思います。 集計.Cells(NO, "I") = 集計.Cells(NO, "I") + データー.Cells(i, "j") みたいなのを追加して。 すると、データが無かった行のI列は空欄になるので 絞り込む際も「空白以外」の設定になります。 >Dictionaryは私にとっては難しく感じます。 どういうものかわからない内は、そうかもしれません。 手を動かしてみるのが良いと思いますので 参考にしておられるページの「•重複しない品名と個数の合計を計算します」のコードの データ範囲・出力範囲などを変更して 合計(月ごとではなく商品毎の全ての月の合計)をだすコードを つくってみられてはどうでしょう。         (HANA) 2014/09/27(土) 15:21 ---- >データが無い行は「0」が表示されます。 あ!ΣΣ(゚д゚lll)! なるほど 全部見る必要全部の列を参照する必要ないですね。。。 やってみます。 > データ範囲・出力範囲などを変更して 合計(月ごとではなく商品毎の全ての月の合計)をだすコードを つくってみられてはどうでしょう。 はいでは上の終わったらチャレンジしてみます。 アイテムとキーで迷子しそうですが。。。 3日ぐらい留守にしますので、戻ったらチャレンジしたいと思います。 少しお時間下さい (´。✪ω✪。`) (もみじ坂) 2014/09/27(土) 21:37 ---- (HANA)様 おひさしびりです。 3日のはずが帰えてくるのに1週間かかってしまいました (*´ノД`) '行を再表示させる '空欄の行を非表示させる I列の合計を HANA 様 の 言葉を参考に、追加してみました。 Hiddenプロパティ は行を表示非表示 を設定できるのは分かりましたが、 Cells.Select Selection.EntireRow.Hidden = False 表示するあとはエクセル全体に範囲を参照されているため、 Cells(1, 1).Select を指定する必要があるのは分かりました。 行非表示する際の Cells(行番号, 1).EntireRow.Hidden = True   ' ★(? ?) も似たような意味でしょうか? こんな感じのコードですが、 一応欲しい結果は得られていますが、おかしな点ありますか? Sub test8() Dim NO As Long Dim 月 As Long Dim i As Long Dim 集計 As Worksheet Dim データー As Worksheet Set 集計 = Worksheets("Sheet5") Set データー = Worksheets("Sheet6") '行を再表示させる Cells.Select Selection.EntireRow.Hidden = False Cells(1, 1).Select '値クリア NO = 集計.Range("A3").End(xlDown).Row 月 = 集計.Range("E2").End(xlToRight).Column 集計.Range(集計.Cells(3, 5), 集計.Cells(NO, 月)).ClearContents '月別合計 For i = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) 月 = Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") 集計.Cells(NO, "I") = 集計.Cells(NO, "I") + データー.Cells(i, "j") End If End If Next i '空欄の行を非表示させる For 行番号 = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row If Cells(行番号, "I").Value = "" Then Cells(行番号, 1).EntireRow.Hidden = True   ' ★(? ?) End If Next 行番号 End Sub (もみじ坂) 2014/10/08(水) 21:28 ---- オートフィルタを使うと楽かと思いましたが Hiddenを使われたのですね。 > Cells.Select > Selection.EntireRow.Hidden = False > 表示するあとはエクセル全体に範囲を参照されているため、 セル全体が選択されているのは最初に「Cells.Select」をしているからです。 Select−Selection の無いコードにしてみて下さい。 Selectしなければ >Cells(1, 1).Select も不要になります。 追加された部分は、どのシートに対しての処理なのかが抜けている部分がありますので 追加しておいてもらうのが良いかもしれません。 >集計.Cells(NO, "I") = 集計.Cells(NO, "I") + データー.Cells(i, "j") 合計を出す列を「I列」と決めるなら 最初にデータをクリアする範囲   集計.Range(集計.Cells(3, 5), 集計.Cells(NO, 月)).ClearContents も、「I列」で良い事になりますよね?   集計.Range(集計.Cells(3, 5), 集計.Cells(NO, "I")).ClearContents こんな感じで。 今回の件とは別ですが(課題として残っていた部分です) 今のコードのままではMatch関数で検索値が無かった時にエラーになって止まります。 変数の型をLongで行くのなら、 データー.Cells(i, "E") の値が 集計.Range("A:A") の範囲に有るかどうか COUNTIF関数等で調べてからMatch関数が行われる様にしておくのが良いと思います。 また、検索値が無かった場合にどうするのかも決めておいてもらえると良いと思います。  無かったものは集計しないのか  処理を中断して、追加してもらって もう一度実行してもらうのか   (HANA) 2014/10/09(木) 09:37 ---- >オートフィルタを使うと楽かと思いましたが オートフィルタと使った方が解除するときもすぐできますね。変更します。 といってもマクロ記録で得たコードですが (*´-`*)ゞ ポリポリ >も、「I列」で良い事になりますよね? はいそうですね。 ただ、実際のデータは「I列」ではないので、あえて変動しても編集しなくてもいいように を使用したんですが、 集計.Range(集計.Cells(3, 5), 集計.Cells(NO, "I")).ClearContents を使用した方がいいのでしょうか? >データー.Cells(i, "E") の値が 集計.Range("A:A") の範囲に有るかどうか そうですね、NOが追加になったとき 集計シートも追加しないとですね、すっかり忘れてました ΣΣ(゚д゚lll)! >検索値が無かった場合にどうするのか こちらはなんとなくできそうですが、 COUNTIF関数 ですか? データシートを集計シートのNOの 個数を調べる感じでしょうか? Sub test8() Dim NO As Long Dim 月 As Long Dim i As Long Dim 行番号 As Long Dim 集計 As Worksheet Dim データー As Worksheet Set 集計 = Worksheets("Sheet5") Set データー = Worksheets("Sheet6") NO = 集計.Range("A3").End(xlDown).Row 月 = 集計.Range("E2").End(xlToRight).Column '行を再表示させる 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=9 '値クリア 集計.Range(集計.Cells(3, 5), 集計.Cells(NO, "I")).ClearContents '月別合計 For i = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) 月 = Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") 集計.Cells(NO, "I") = 集計.Cells(NO, "I") + データー.Cells(i, "j") End If End If Next i '空欄の行を非表示させる For 行番号 = 3 To 集計.Cells(Rows.Count, 1).End(xlUp).Row If 集計.Cells(行番号, "I").Value = "" Then 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=9, Criteria1:="<>" End If Next 行番号 End Sub (もみじ坂) 2014/10/10(金) 23:46 ---- >集計.Range(集計.Cells(3, 5), 集計.Cells(NO, "I")).ClearContents >を使用した方がいいのでしょうか? いいえ。 >実際のデータは「I列」ではないので、あえて変動しても編集しなくてもいいようにを使用した のですから、むしろ 集計.Cells(NO, "I") = 集計.Cells(NO, "I") + データー.Cells(i, "j") の方を直してもらうのが良いと思います。 行を再表示させるところで 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=9 となっていますが、この「9」部分も >実際のデータは「I列」ではないので、あえて変動しても編集しなくてもいいように しておかないといけなくないですか? また、空欄の行を非表示させる所は、ループさせる必要がありますか? 一行ずつ If 集計.Cells(行番号, "I").Value = "" Then を確認しても、やることは 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=9, Criteria1:="<>" ですよね? それからこちらに関しても >実際のデータは「I列」ではないので、あえて変動しても編集しなくてもいいように しておいてもらうのが良いと思います。   (HANA) 2014/10/11(土) 15:21 ---- なるほど _〆(・v・★) まだ、抜けてる部分がありますね。 少し疑問を浮かんだんですが。 コードの中に 月とNOを2か所使用しているんですが、 For 〜 Next の中に設定している 月とNO は For 〜 Next のループ内のみ使用することができるんですよね (*゚Å゚;*) 今更の質問ですみません 指摘箇所を下記に修正してみました。 Sub test8() Dim NO As Long Dim 月 As Long Dim i As Long Dim 行番号 As Long Dim 集計 As Worksheet Dim データー As Worksheet Set 集計 = Worksheets("Sheet5") Set データー = Worksheets("Sheet6") NO = 集計.Range("A3").End(xlDown).Row 月 = 集計.Range("E2").End(xlToRight).Column '行を再表示させる 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=月 '値クリア 集計.Range(集計.Cells(3, 5), 集計.Cells(NO, 月)).ClearContents '月別合計 For i = 3 To データー.Cells(Rows.Count, 1).End(xlUp).Row NO = Application.Match(データー.Cells(i, "E"), 集計.Range("A:A"), 0) 月 = Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) If IsNumeric(NO) Then If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") 集計.Cells(NO, "I") = 集計.Cells(NO, "I") + データー.Cells(i, "j") End If End If Next i '空欄の行を非表示させる 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=月, Criteria1:="<>" End Sub (もみじ坂) 2014/10/11(土) 23:30 ---- >今更の質問ですみません いいえ、良い所に気づいてもらえました。 何度も書いていますが 変数には、使う時に 使いたい値が入っていないといけません。 使いたい値と言うのは、たとえば  集計.Range("E2").End(xlToRight).Column  Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) です。 月 = 集計.Range("E2").End(xlToRight).Column 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=月 を、「変数:月」を使わずに書いてみると 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 集計.Range("E2").End(xlToRight).Column)).AutoFilter Field:=集計.Range("E2").End(xlToRight).Column になります。 これだと、コードを読んでいくときに 最初の「集計.Range("E2").End(xlToRight).Column」を見て 『表の最終列番号だな』と思い、その後の「集計.Range("E2").End(xlToRight).Column」を見て 『ここも、表の最終列番号だな』と思います。 変数を使った書き方だと 変数:月には、表の列番号が入っているので 『集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=月  この2か所には同じ値が指定されているな。 ~~ ~~』 の様に、コードを一文字ずつ読む必要が少なくなります。 今回の疑問を持たれたのは If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") End If って出来ないとおもわれたからじゃないでしょうか? 確かに、これではダメです。 「変数:月」は、最初は 月 = 集計.Range("E2").End(xlToRight).Column で、表の最終列番号が入っていますが その後 月 = Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) で、検索した月がある列番号に書き換わっているからです。 変数を使わずに(すこし端折って)書くと If IsNumeric(月) Then 集計.Cells(NO, ・・・.Match(・・・, 0)) = 集計.Cells(NO, ・・・.Match(・・・, 0)) + データー.Cells(i, "j") 集計.Cells(NO, 集計.・・・・・・.Column) = 集計.Cells(NO, 集計.・・・・・・.Column) + データー.Cells(i, "j") End If ですね。 或いは If IsNumeric(月) Then 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") 月 = 集計.Range("E2").End(xlToRight).Column 集計.Cells(NO, 月) = 集計.Cells(NO, 月) + データー.Cells(i, "j") End If この様にすれば、 上側の行の段階では、使いたい値(検索した月がある列番号)が「変数:月」に入っていて 下側の行の段階では、使いたい値(表の最終列番号)が「変数:月」に入っていますので 同じ結果が得られると思います。 '空欄の行を非表示させる 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=月, Criteria1:="<>" の所も同様ですね。 今のままでは「変数:月」には、最後に検索した月がある列番号 が入っていて 使いたい値(表の最終列番号)は入っていないので うまく行っていないと思います。 この様に書くなら '空欄の行を非表示させる 月 = 集計.Range("E2").End(xlToRight).Column 集計.Range(集計.Cells(2, 1), 集計.Cells(NO, 月)).AutoFilter Field:=月, Criteria1:="<>" です。 でも、「集計.Range("E2").End(xlToRight).Column」って今回は途中で変わらないですよね? 最初の 月 = 集計.Range("E2").End(xlToRight).Column の時の値を「変数:月」が保持してくれていたら ループ内や 非表示にさせる時に そのまま使えます。 なんで保持してくれていないかと言うと、その後で違った値を入れるからです。 変数は、色々使いまわしが出来ますが 基本的には「入っているものの名前がわかる変数名」にしておいて 内容が違うものは、違う変数に入れるのが良いと思います。 集計.Range("E2").End(xlToRight).Column は、たとえば「表最終列番号」 Application.Match(Month(データー.Cells(i, "B")), 集計.Range("2:2"), 0) は、たとえば「検索月列番号」 と言う名前の変数に入れるとすると If IsNumeric(検索月列番号) Then 集計.Cells(NO, 検索月列番号) = 集計.Cells(NO, 検索月列番号) + データー.Cells(i, "j") 集計.Cells(NO, 表最終列番号) = 集計.Cells(NO, 表最終列番号) + データー.Cells(i, "j") End If の様になります。 実際は変数名に6文字も書くのは大変なので、もう少し短い名前を考えてもらうのが良いと思いますが。   (HANA) 2014/10/12(日) 13:51 ---- 業務連絡です。 明日(もう今日ですが)から しばらく 携帯からしか返信ができませんので 新スレを作ってもらえたらと思います。 また、その間長文の投稿は難しくなると思いますので ご了承ください。   (HANA) 2014/10/15(水) 00:07 ---- HANA 様 了解です。ただ、私もしばらくドタバタしてます。 来週に新しトビを立ておきます。 あと、雨が強いときはどうやらうちはネットつながらないみたいです (*´ノД`) もう少しお時間下さい。 (もみじ坂) 2014/10/15(水) 22:47 ---- 業務連絡です すみません。現在家のネットが使えません。 もう少しかかりそうです。 (もみじ坂) 2014/10/21(火) 15:24 ---- [[20141024002243]]『マクロで合計 3』 へ (もみじ坂) 2015/03/08(日) 23:09