Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3825 / 13645 ツリー ←次へ | 前へ→

【59989】表の集計 ミュウ 09/1/22(木) 20:11 質問[未読]
【59990】Re:表の集計 マクロマン 09/1/22(木) 20:24 発言[未読]
【59991】Re:表の集計 ミュウ 09/1/22(木) 20:35 回答[未読]
【59992】Re:表の集計 マクロマン 09/1/22(木) 20:44 発言[未読]
【59993】Re:表の集計 ミュウ 09/1/22(木) 20:50 お礼[未読]
【59997】Re:表の集計 ミュウ 09/1/22(木) 23:47 お礼[未読]
【60000】Re:表の集計 マクロマン 09/1/23(金) 8:14 発言[未読]
【60005】Re:表の集計 ミュウ 09/1/23(金) 12:08 質問[未読]
【60008】Re:表の集計 マクロマン 09/1/23(金) 12:48 発言[未読]
【60009】Re:表の集計 ミュウ 09/1/23(金) 13:27 お礼[未読]
【60010】Re:表の集計 マクロマン 09/1/23(金) 13:53 発言[未読]
【60012】Re:表の集計 ミュウ 09/1/23(金) 14:08 お礼[未読]
【60013】Re:表の集計 マクロマン 09/1/23(金) 14:46 発言[未読]

【59989】表の集計
質問  ミュウ  - 09/1/22(木) 20:11 -

引用なし
パスワード
   エクセルデータで、

   A列   B列
1行  1   山田太郎
2   3   岡本花子
3   2   加藤一郎
4   2   岡本花子
5   4   山田太郎
6   3   岡本花子 
7   2   加藤一郎
8   1   山田太郎
9   3   加藤一郎
10   2   山田太郎   というデータを

   A列   B列
1行  7    山田太郎
2行  8    岡本花子
3行  7    加藤一郎


などのように氏名でまとめて合計するにはどのようなVBAプログラムになりますか?
いろいろ調べていたのですがはじめて取り組むものでよく理解できず
(集計などになると思うのですが)大変申し訳ありませんがご教授頂けないでしょうか。よろしくお願いします・・・

【59990】Re:表の集計
発言  マクロマン  - 09/1/22(木) 20:24 -

引用なし
パスワード
   一般機能でも出来ると思いますが、VBAで行うなら
Dictionary
で重複無しリストを作成し、
WorksheetFunction.Sumif
で集計、というのはいかがでしょう?

【59991】Re:表の集計
回答  ミュウ  - 09/1/22(木) 20:35 -

引用なし
パスワード
   ▼マクロマン さん:
>一般機能でも出来ると思いますが、VBAで行うなら
>Dictionary
>で重複無しリストを作成し、
>WorksheetFunction.Sumif
>で集計、というのはいかがでしょう?

ありがとうございます。
早速、今調べてみてるのですが
Dictionary メソッド?
これを使用しただけでは数値は合計されないのでしょうか?
何もわからずすみません・・・

実はこのようなデータを最終的にグラフにするために、
(グラフ化までを自動化したいのですが)
データをまずはグラフにできるようにまとめたいと考えたのですが・・・
もし何か有効な方法あったらご教授頂けないでしょうか?
右も左もわからない状況で正直スランプです・・・
よろしくお願いします。

【59992】Re:表の集計
発言  マクロマン  - 09/1/22(木) 20:44 -

引用なし
パスワード
   こちらの説明はよさげだな〜。

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.html

なお、ここはurlを貼り付けることが出来ないので、最初の2文字を全角にしてあります。
半角に修正してからWEBブラウザのアドレスに貼り付けてください。

なお、リンク先を見ていただいたら分かるように
Dictionary
は重複無しにリストを取得するだけです。
集計は別作業になります。
WorksheetFunction.Sumif
で合計を取得できます。
使い方はワークシート関数の
SUMIF
と同じです。

【59993】Re:表の集計
お礼  ミュウ  - 09/1/22(木) 20:50 -

引用なし
パスワード
   ▼マクロマン さん:

ありがとうございます。
ちょっと自分でやってみます。
また質問に来ると思いますが、
もしご覧でしたらお願いいたします。

【59997】Re:表の集計
お礼  ミュウ  - 09/1/22(木) 23:47 -

引用なし
パスワード
   ▼マクロマン さん:
ありがとうございました。

質問なのですが、
>Dictionary
>は重複無しにリストを取得するだけです。
>集計は別作業になります。
>WorksheetFunction.Sumif
>で合計を取得できます。
ということでしたが、書いてあったのをとりあえずそのまま
適用してみたら合計もそのまま出てしまったのですが・・・

WorksheetFunction.Sumif で合計を出すとはどのような意味でしょうか?
何でも聞いてすみません、よろしくお願いします。

【60000】Re:表の集計
発言  マクロマン  - 09/1/23(金) 8:14 -

引用なし
パスワード
   ワークシート関数で
SUMIF
を使ったことがないのでしたら、
挿入

関数

関数の分類:数学/三角

SUMIF
がありますので、「この関数のヘルプ」で
使い方がわかります。

【60005】Re:表の集計
質問  ミュウ  - 09/1/23(金) 12:08 -

引用なし
パスワード
   ▼マクロマン さん:

本当にありがとうございます。
申し訳ありませんがもうひとつ教えてください・・・

現在、回答いただいたものを参考にして作成しているのですが、
以下に命令文を書きますので教えていただけないでしょうか?

Sub datashuyaku()
 Dim myDic As Object, mykey
 Dim c, myVal
 Dim i As Long
 
 Set myDic = CreateObject("Scripting.Dictionary")
 
 myVal = Range("A2", Range("A" & Rows.Count).End(xlUp)).Value
 
  For Each c In myVal
   If Not c = Empty Then
     If Not myDic.Exists(c) Then
       myDic.Add c, ""
     End If
   End If
  Next
 
  mykey = myDic.Keys
  For i = 0 To myDic.Count - 1
   Cells(i + 2, 4) = mykey(i)
  Next i
 
Set myDic = Nothing
 
Dim longend As Long
 
   longend = Application.ActiveWorkbook.Worksheets(1).Range("A65536").End(xlUp).Row
 
For i = 2 To longend
 
Range("D2"), Range("B1:B65536"))

 Cells(i, 5) = Application.WorksheetFunction.SumIf(Range("A2:B65536"), Cells(i, 4), Range("B1:B65536"))

Next
 
 
End Sub

一応最初の部分で重複無しの項目を取得し、
そのあと数値を計算させていますが、
計算の数字がおかしいです。参照するセルがずれるみたいで
おかしいです。
あと項目がないところに0が出るのですが、
ご教授いただけないでしょうか・・・
よく分かりにくい説明で申し訳ありません。

【60008】Re:表の集計
発言  マクロマン  - 09/1/23(金) 12:48 -

引用なし
パスワード
   > Cells(i, 5) = Application.WorksheetFunction.SumIf(Range("A2:B65536"), Cells(i, 4), Range("B1:B65536"))

シートが明示されてないですけどそこは大丈夫ですか?
明示してないとアクティブシートが対象になります。

あと、
>Range("A2:B65536")
>Range("B1:B65536")
セル範囲が重複します。

【60009】Re:表の集計
お礼  ミュウ  - 09/1/23(金) 13:27 -

引用なし
パスワード
   ▼マクロマン さん:

ありがとうございます。
シートの設定は付け足してみます。
また、
>>Range("A2:A65536")
>>Range("B2:B65536")
以上のようにしたらできたのですが、よいのかどうか・・・

あともう一つお伺いしたいのですが・・・
現状では、集計する元データの行数分だけ
集計が終わっても0が表示されてしまいます。
(例えば集計の元データが400行あって、
集計項目が終わってしまってもE列に0が表示されるということ)
セルの参照に問題があるのでしょうか?
申し訳ありません、ご教授お願い致します。

【60010】Re:表の集計
発言  マクロマン  - 09/1/23(金) 13:53 -

引用なし
パスワード
   >longend = Application.ActiveWorkbook.Worksheets(1).Range("A65536").End(xlUp).Row
↓では?
longend = Application.ActiveWorkbook.Worksheets(1).Range("D65536").End(xlUp).Row

>Range("B1:B65536"))
↓のような記述でもいけます。
Range("B:B"))
B列全体、というような意味になります。

【60012】Re:表の集計
お礼  ミュウ  - 09/1/23(金) 14:08 -

引用なし
パスワード
   ▼マクロマン さん:

本当にありがとうございます!
>longend = Application.ActiveWorkbook.Worksheets(1).Range("D65536").End(xlUp).Row
でできました。
参照する行の設定をその列に合わせればいいんですね・・・


>>Range("B1:B65536"))
>↓のような記述でもいけます。
>Range("B:B"))
>B列全体、というような意味になります。

これもできました。
何とか先に進んでみます。
本当にありがとうございました!!

【60013】Re:表の集計
発言  マクロマン  - 09/1/23(金) 14:46 -

引用なし
パスワード
   関数のヘルプの引数の説明は分かりにくいことがあります。
そんなときはネット検索も活用しましょう。

「範囲」と「合計範囲」の違いをよく認識しましょう。
http://www.becoolusers.com/excel/sumif.html

3825 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free