質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

4360閲覧

vbaで、エクセル上の入力データを集計し、配列にしたいです。

yamadatooru

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2015/11/23 12:26

現在エクセルのVBAを勉強をしています。
エクセル上に入力された情報を集計し、配列に入れたいです。
A列が担当者コード、B列が4月のある数値データーで、tanという担当者配列と、aprilという4月配列に入れたいです。
集計後はこのようなイメージです。

1 200
2 250
3 300
5 200

イメージ説明

しかしアルゴリズムが思いつきません。それぞれの配列を初期化後、配列にすでに担当コードが存在するかチェックが必要だと思うのですが、ここからどうしていったらいいか困っています。
アドバイス頂けませんでしょうか?

よろしくお願いいたします。

Public tan(100) As String Public april(100) As Integer '********************************************** '初期化処理 '********************************************** Sub inislize() For i = 1 To 100 tan(i) = 0 '担当コード april(i) = 0 '4月 Next End Sub Sub main() Call inislize '入力データー取得 For j = 1 To 100 If tan(1) = 0 Then tan(j) = Cells(j, 1).Value april(j) = Cells(j, 2).Value Else '配列に存在するかチェック For k = 1 To 100 If Cells(j, 1).Value = tan(k) Then End If Next End If Next End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Excelの統合機能を使用すれば、マクロを使用しないでも集計できますよ。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/tougou.html

VBAで処理する必要があればこちらが参考になりそうです。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_consolidate.html

投稿2015/11/23 23:56

tomo.ina

総合スコア357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamadatooru

2015/11/24 05:15

ご返答ありがとうございます。 今回どうしてもVBAでする方法を知りたく。 担当コードの入力データーと担当コードの配列をループしたものを比較して、一致した場合、不一致だった場合のフラグにし、ループ終了後、処理をするということは可能でしょうか?
tomo.ina

2015/11/24 06:45

処理を考えればできないことはないと思います。 ただ、VBAで統合でのデータ集計を行ってから、Variant型の変数にセルを範囲指定して、 代入すれば、配列として扱えるので、それではだめですか?
yamadatooru

2015/11/24 08:21

出来れば今はアルゴリズムを力を磨くために学習をしていまして、たしかにセルの範囲指定をしてすれば配列にできますが、なるべくループを使ってやりたく。
guest

0

Excelではあまりメジャーじゃないですが一般的に連想配列というものに入れて処理するということが多いです(言語体系によってdictionaryとかhashとかmapとか)
連想配列にはKeyとValueという組み合わせで値を格納でき、同じKeyは複数存在できません
今回の場合、担当をKeyにして値を保存することで重複を排除できそうです
Excelでは「Scripting RuntimeのDictionary」を使うことが多いです(Office2000以降でインストールされたかな?)
No.17 VBAで連想配列 ~ Scripting.Dictionaryあたりが詳しいです

まあExcelだとそんなことしなくてもCOUNTIF関数とかで重複を簡単にチェックできますし、重複しない値を抽出する、または重複する値を削除する機能を使って作業用のワークシートに値一覧を作成して、それを使って配列を初期化することもできますね

投稿2015/11/23 19:09

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamadatooru

2015/11/24 05:13

ご返答ありがとうございます。 今回連想配列は使わずにするやり方をしてみたく。1次元配列でしたいです。
guest

0

まず、以下の部分の考え方がよくわかりません。
'入力データー取得
For j = 1 To 100
If tan(1) = 0 Then ★
tan(j) = Cells(j, 1).Value
april(j) = Cells(j, 2).Value
Else

★ は tan(1) = 0 ではなく、tan(j) = 0 ではないでしょうか。
でも、そうすると、1~100すべて真となり、答えが合わなくなります。

もし、担当者コードが1~100なのであれば、tan の添え字を担当者コードとし、
その値を数値データを集計したものにすればいいと思います。
そうすれば以下のような形で集計できます。
tan(Cells(j, 1).Value) = tan(Cells(j, 1).Value) + Cells(j, 2).Value
ただし、担当者コードに抜けがあるのであれば、その考慮が必要です。

投稿2015/11/23 14:13

yoshi777

総合スコア674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamadatooru

2015/11/24 05:11

返答が遅くなり申し訳ございません。ありがとうございます。 えと。。。tanの添え字を担当コードですか?うーん。 例えば、入力データーと配列の担当が一致した場合、不一致だった場合をフラグにして、ループ抜けたあと処理をするということは可能でしょうか?
guest

0

自己解決

一応こちらを作ってみたところ動くようになりました。ありがとうございます。
次はこれを2次元配列にしなくてはいけませんでして。

Public tan(100) As String Public april(100) As Integer Public may(100) As Integer Public maxix As Integer Public equalix As Integer Sub initialize() For i = 0 To 99 tan(i) = 0 april(i) = 0 Next maxix = 0 '最大インデックス flg = 0 '一致不一致フラグ equalix = 0 '一致したインデックス番号 End Sub Sub main() Call initialize For j = 1 To 100 For k = 0 To 99 If Cells(j, 1).Value = tan(k) Then flg = 1 equalix = k Exit For Else flg = 0 End If Next If flg = 0 Then tan(maxix) = Cells(j, 1).Value april(maxix) = Cells(j, 2).Value may(maxix) = Cells(j, 3).Value maxix = maxix + 1 ElseIf flg = 1 Then april(equalix) = Cells(j, 2).Value + april(equalix) may(equalix) = Cells(j, 3).Value + may(equalix) End If Next For m = 0 To 99 MsgBox (tan(m) & " " & april(m) & " " & may(m)) Next End Sub

投稿2015/11/24 07:14

編集2015/11/24 07:15
yamadatooru

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問