• ベストアンサー

EXCELVBA 配列値集計方法

こんにちは、 配列の集計方法に関してお聞きしたいのですが、 配列1がありますて、 配列1(1,1)、配列1(1,2)の値をもとに (配列1(1,1)が重複しており、かつ 配列1(1,2)も重複している場合) 重複しているものがあれば 配列1(1,3)の値を合算したものを求め 配列2に格納するようにしたいのですが、 うまくロジックが組めません。 よい方法なあるでしょうか。 配列1内データ----------------- 配列1(1,1)=abc 配列1(1,2)=test1 配列1(1,3)=15 配列1(2,1)=def 配列1(2,2)=test1 配列1(2,3)=50 配列1(3,1)=abc 配列1(3,2)=test1 配列1(3,3)=111 配列1(4,1)=ghi 配列1(4,2)=test2 配列1(4,3)=80 配列1の値を集計後----------- 配列2(1,1)=abc 配列2(1,2)=test1 配列2(1,3)=116 配列2(2,1)=def 配列2(2,2)=test1 配列2(2,3)=50 配列2(3,1)=ghi 配列2(3,2)=test2 配列2(3,3)=80

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

無理矢理dictionaryを使う例です(最近凝っているもので) 試験用のデータを配列に入れるのが面倒なので、ワークシートから読み込んでいます。もっと素直な回答をお望みでしょうが、ご参考まで。 ...................A...............B...............C ..1...........abc........test1..............15 ..2...........def........test1.............50 ..3...........abc........test1..............111 ..4...........ghi.......test2.............80 Sub test() Dim myDic As Object, myKey As Variant Dim i As Long, j As Long Dim keyString As String Dim splitArray As Variant Dim sourceArray As Variant Dim destArray() As Variant '試験用に配列に取り込む sourceArray = ActiveSheet.Range("A1").CurrentRegion Set myDic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(sourceArray, 1) keyString = sourceArray(i, 1) & "☆" & sourceArray(i, 2) If Not myDic.exists(keyString) Then myDic.Add keyString, sourceArray(i, 3) Else myDic.Item(keyString) = myDic.Item(keyString) + sourceArray(i, 3) End If Next i myKey = myDic.keys ReDim destArray(1 To myDic.Count, 1 To 3) For i = 1 To myDic.Count splitArray = Split(myKey(i - 1), "☆") destArray(i, 1) = splitArray(0) destArray(i, 2) = splitArray(1) destArray(i, 3) = myDic(myKey(i - 1)) Next i Set myDic = Nothing 'ここは中味の確認用です。 For i = 1 To UBound(destArray, 1) For j = 1 To 3 Debug.Print destArray(i, j) Next j Next i End Sub

lensent
質問者

お礼

ありがとうございます。 下記のように、計算対象の列(D,E)が増えた場合 どこら辺を修正すればよいでしょうか? 変更を試みたのですが、コードの把握に至りませんでした。 すいません。 ...................A...............B...............C...............D...............E ..1...........abc........test1..............15..............1..............2 ..2...........def........test1.............50..............11..............25 ..3...........abc........test1..............111..............81..............24 ..4...........ghi.......test2.............80..............8..............2

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • noah7150
  • ベストアンサー率46% (116/251)
回答No.1

'初期化はされているものとして 添字2 = 1 配列2(1,1) = 配列1(1,1) 配列2(1,2) = 配列1(1,2) For 添字1 = 1 To 配列1の最大 '同一有無 For 添字3 = 1 To 添字2 If 配列2(添字3,1) = 配列1(添字1,1) And _ 配列2(添字3,2) = 配列1(添字1,2) Then Exit For End If Next '同一がなければ文字列をセット If 添字2 < 添字3 Then 配列2(添字3,1) = 配列1(添字1,1) 配列2(添字3,2) = 配列1(添字1,2) 添字2 = 添字3 End If '値を加算 配列2(添字3,3) = 配列2(添字3,3) + 配列1(添字1,3) Next エディタで入力しただけなので合ってるか?ですが

lensent
質問者

お礼

ありがとうございます。 参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 二次元配列の分割

    よろしくお願いします。 $hoge = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); というような配列があったとき、 abcが110以下のときと、110より大きい場合で分割した配列を 用意したいと考えてます。 具体的には、 $hoge1 = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), ); と $hoge2 = array( "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); に分割したいと考えています。 どのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP
  • QUERY_STRINGを連想配列に入れたい

    よろしくお願いします。 $_SERVER['QUERY_STRING']の値 q1=abc&q2=def&q3=ghi を連想配列に入れたいと思います。 $array = array("q1"=>"abc","q2"=>"def","q3"=>"ghi"); どのようにしたらQUERY_STRINGの値を連想配列に入れられますか?

    • ベストアンサー
    • PHP
  • excelの重複データの削除方法。

    excel2003で重複する値を自動的に削除する方法を探しています。 現在、以下のような手順で作業をしています。     A   B   C 1 ○○○ 100 ABC 2 ▼▼▼ 200 DEF 3 ◇◇◇ 300 GHI 4 ■■■ 400 JKL 5 △△△ 500 MNO ↑の元データに      A   B   C 1 ○○● 100 ABC 2 ◇◆◇ 300 GHI ↑のデータを追加(貼り付け)して並び替えをすると      A   B   C 1 ○○○ 100 ABC 2 ○○● 100 ABC 3 ▼▼▼ 200 DEF 4 ◇◇◇ 300 GHI 5 ◇◆◇ 300 GHI 6 ■■■ 400 JKL 7 △△△ 500 MNO というデータが出来るとします。 「C列の値を基準」として、重複している箇所を検出・削除し (上の例で言えば、1・2・4・5の行。)      A   B   C 1 ▼▼▼ 200 DEF 2 ■■■ 400 JKL 3 △△△ 500 MNO というデータにしたいと考えております。 重複した値のどちらか一方を残す、という方法ではなく、 重複した値の全てを削除する、という方法が解りません。 手作業で1つ1つ削除していけばいいのですが、本物のデータは何千件とあるので 手作業では時間が掛かりすぎてしまいますので…。なにかよい方法はないでしょうか? 簡単な方法であれば大変助かりますが、マクロなどを使用する方法でもかまいませんのでご教授下さい。 よろしくお願い致します。

  • PHP 配列について

    PHPで簡単なプログラムを作っています。 上手い方法があれば教えてください。 例えば $arr = array(); $arr(0) = "ABC"; $arr(1) = "DEF"; $arr(2) = "GHI"; $arr(3) = "JKL"; $arr(4) = "MNO"; この様な配列があり、これを以下の様に「特定のデータを削除し空いているキーを詰めたい」場合どうしたら良いのでしょうか? この場合は"DEF"を削除。 $arr(0) = "ABC"; $arr(1) = "GHI"; $arr(2) = "JKL"; $arr(3) = "MNO"; アドバイスお願いします。

    • ベストアンサー
    • PHP
  • 2次元配列について

    プログラミング初心者です。先日以下の例文を問い合わせさせていただきました。 答えとして$abc[0] に $def を代入して、$abc[1] に $abcという配列([0] に $def の内容がある)が代入されると教えていただき、実際確認しました。二次元配列入れ子のようになるのは解ったのですが、 どのような場合に使うのでしょうか? ホームページなどの画面に表示するのに使ったりするのでしょうか? それともデータベースからデータを抽出して一時的に、何らかのかたちで格納 したりする場合によく使われるのでしょうか? この例文だけどこかにあったので、実際どのように使うのかイメージできません。 すみません。教えてください。 <?php $def = 'test'; $abc = array(); $abc[] = $def; $abc[] = $abc; print '<pre>'; print_r($abc); print '</pre>';

    • ベストアンサー
    • PHP
  • VBA:配列の中で文字列が何番目にあるか知りたい

    たとえば Hairetu = Array("ABC","DEF","GHI") としておいて配列から"DEF"が何番目にあるのかを検索する方法はないのでしょうか? よろしくお願いします。

  • VBAで配列のデータを検索

    初歩的なことかもしれませんが、自力ではどうしてもできなかったので質問させてください。 例えば dim 配列(5) as String 配列(0)=abc 配列(1)=123 配列(2)=def 配列(3)=456 配列(4)=ghi 配列(5)=789 といった配列がある場合で、配列()から「ghi」を検索したい場合は、 どのような手法を使えばよろしいでしょうか。

  • 文字列を配列にしたい

    お世話になります。 PHP4.3.9を利用しているのですが、以下のような文字列を分割して、求める形の配列に入れたいのですが、何か良い方法はありますでしょうか? ■文字列 abc=123&def=456&ghi=789 ■このような形にしたいと思っています↓ $hoge = array(   "abc"=>"123",   "def"=>"456",   "ghi"=>"789" ) ヒントだけでも結構ですので、ご教示いただけると幸いです。宜しくお願いします。

    • ベストアンサー
    • PHP
  • Access 異なるフィールドの集計方法について

    Access初心者です。 異なるフィールド名の集計方法を教えて下さい。 例えば、コース1、コース2、コース3というフィールド名があって コース1にはABC、コース2にはDEF、コース3にはGHIというのがあって コース1~コース3の集計を下記のようにまとめたい場合はどうしたらいいでしょうか? ABCDEFGHIと1列にまとめて表示させたいです。 よろしくお願いします。

  • 区切り文字を配列に格納する方法を教えて下さい。

    区切り文字を配列に格納する方法を教えて下さい。 $array[] = "abc,1981,1,12"; $array[] = "def,1982,2,18"; $array[] = "ghi,1991,4,12"; list($name[$i],$yy[$i],$mm[$i],$dd[$i]) = split("\,",$array[$i]); でループさせればそれぞれの変数に代入できますが、例えば $name["abc"]["yy"] = "1981"; $name["abc"]["mm"] = "1"; $name["abc"]["dd"] = "12"; のように分解するにはどうすれば良いでしょうか?

    • 締切済み
    • PHP

専門家に質問してみよう