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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

3193閲覧

【VBA】動的配列内での項目別最大値の抽出方法について

8787

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/11/26 15:02

編集2019/11/27 16:07

##質問

VBAにてCSVデータから特定の条件で抽出作業を施し、
それらのデータでn行×4列のリストを作成しました。
![イメージ説明

上記のリストにおいて,
各項目別の最大値(ex.項目名Aでの高さの最大値)となるリスト番号を取得するには
どのようにコーディングすべきでしょうか?

if文で条件分岐を行うなど色々トライしてみたのですが、
うまく動かず苦戦しております。コードは以下の通りです。

方針は
0. myArray()にてn行×4列の配列を作成
0. まずは項目名がAの場合のみのn行×4列の配列を作成
0. 2.にて生成した配列の中から「長さ」・「深さ」のデータだけのn行×1列の配列作成
0. 3.の中で最大となる行番号とデータを取得する
を考えておりました。

  • myArray(n)の中身は以下の通りです

myArray(n)
L myArray(n,1)
L myArray(n,2)
L myArray(n,3)
L myArray(n,4)

ex)
myArray(1)
L myArray(1,1)=A
L myArray(1,2)=n1
L myArray(1,3)=66
L myArray(1,4)=91
といった具合です。

  • コードは以下の通りです。

VBA

1'Rangeの定義 2Dim myRange As Range 3Set myRange = Range("A1:An","D1:Dn") 4 5'配列myArrayを生成 6Dim myArray As Variant 7myArray = myRange 8 9'配列を定義 10Dim Array_A_len_pre() As Variant 11Dim Array_A_len() As Variant 12 13'ループ変数 14Dim i As Long 15 16'if文で格納する 17For i = 1 To n 18  If myArray(i, 1) = "A" Then 19    '長さののみの配列を生成 20   ReDim Preserve Array_A_len_pre(i) 21   Array_A_len_pre(i) = myArray(i, 4) 22 23    'ループ変数 24   Dim j As Long 25 26   'Array_A_len_pre()のempty値を除去し配列を再生成 27   For j = 0 To n 28    If Array_A_len_pre(j) <> "" Then 29    ReDim Preserve Array_A_len(j) 30    Array_A_len(j) = Array_A_len_pre(i) 31    End If 32   Next 33    ========================以下質問内容です=================== 34 35 36  End If 37Next

ご教示いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

Orlofsky

2019/11/26 15:33

教授 → 教示
tatsu99

2019/11/27 00:09

>それらのデータでn行×4列のリストを作成しました。 どうやって、そのリストを作成したのでしょうか。そのソースを提示してください。 (Array(1)~Array(n)を作成した個所のソースです)
guest

回答3

0

もし質問内容が件名と違っていて、質問本文に記載されている「各項目名の最大値となるリスト番号」を取得したいのであればtatsu99さんのソースにもう一工夫必要となります。
たとえば、
1)キーを項目名、値をリスト番号にしたディクショナリを別に用意するとか
2)dicHの値を"リスト番号_高さ最大値"にして、最大値判定の際に_の右側の高さ最大値を使うとか
3)高さ最大値を抽出した後もう一度ループして項目と最大値が一致する行を検索するとか
など。

1)が良いですかね。

VBA

1 Dim dicHNo As Object 'キー:項目名 値:最大高さのリスト番号 を追加 2 Set dicHNo = CreateObject("Scripting.Dictionary")

VBA

1  If dicH.exists(wkey) = False Then 2 dicH.add wkey, myArray(i, 3) '修正 3 dicHNo.add wkey, i '追加

VBA

1 If dicH(wkey) < myArray(i, 3) Then 2 dicH(wkey) = myArray(i, 3) 3 dicHNo(wkey) = i '追加

VBA

1 Debug.Print wkey, dicH(wkey), dicHNo(wkey)

出力結果
A 98 2
B 61 3
D 42 4

投稿2019/11/28 10:57

編集2019/11/28 11:07
MrIgat

総合スコア54

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

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

tatsu99

2019/11/28 11:24

取得するのはリスト番号でしたね。ご指摘ありがとうございました。
MrIgat

2019/11/28 11:33

最初のキー出現時の登録、ご注意ください。 dicObject.add key,value
tatsu99

2019/11/28 13:52 編集

>最初のキー出現時の登録、ご注意ください。 ご指摘ありがとうございます。 正式なドキュメントで確認できなかったのですが、 最初のキー出現時の登録時、 dicObject.add key,value と dicObject[key] = value は同じ結果になるはずです。 http://www.koikikukan.com/archives/2014/02/27-015555.php にそれに似たサンプルがあります。 どちらを使うかは趣味の問題ですが。 すみません。完全に同じではないですね。 valueが.NET FrameworkのSystem.Collections.ArrayList のような場合は、dicObject.add key,value の方法でないとエラーになりますね。
8787

2019/12/02 12:45

アドバイスいただきまして誠にありがとうございます。 また、質問の内容が曖昧で申し訳ありませんでした。 出力したかった情報をそれぞれ取得できる方法をご指導いただき大変助かりました。 ありがとうございます。
guest

0

ベストアンサー

dictionary(連想配列)を使った例です。
n=5として、作成してみました。

VBA

1Public Sub test() 2 'Rangeの定義 3 Dim n As Long 4 n = 5 5 Dim myRange As Range 6 Set myRange = Range("A1:A" & n, "D1:D" & n) 7 8 '配列myArrayを生成 9 Dim myArray As Variant 10 myArray = myRange 11 12 '連想配列の定義 13 Dim dicH As Object 'キー:項目名 値:高さ 14 Set dicH = CreateObject("Scripting.Dictionary") 15 'ループ変数 16 Dim i As Long 17 'キー変数 18 Dim wkey As Variant 19 'if文で格納する 20 For i = 1 To n 21 wkey = myArray(i, 1) 22 If dicH.exists(wkey) = False Then 23 '最初のキー出現時、その高さを登録 24 dicH(wkey) = myArray(i, 3) 25 Else 26 '以降のキー出現時、大きいほうで高さを更新 27 If dicH(wkey) < myArray(i, 3) Then 28 dicH(wkey) = myArray(i, 3) 29 End If 30 End If 31 Next 32 '全てのキーと値を出力する 33 For Each wkey In dicH 34 Debug.Print wkey, dicH(wkey) 35 Next 36End Sub 37

以下、実行結果です。(シート内容はあなたの提示された画像と同じです)
A 98
B 61
D 42

投稿2019/11/28 00:52

tatsu99

総合スコア5438

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

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

8787

2019/12/02 12:42

返信遅くなりまして申し訳ありません。 辞書を活用する発想は全くございませんでしたので勉強になりました。 アドバイスいただきましてありがとうございました。
guest

0

コーディング方法の一つの案として私なら、
0. 高さ最大値、高さ最大値のリスト番号、長さの最大値、長さの最大値のリスト番号の4つのメンバーを持つクラスAを作成する。
0. キーを項目名、値をクラスAとしたディクショナリー使い、Arrayをループして項目ごとの高さ最大値のリスト番号と長さの最大値のリスト番号を抽出する。

同じ最大値をもつリスト番号が複数ある場合、取得するリスト番号を、どれか一つにするか全てにするかによって抽出の仕方やクラスAの作り方に工夫が必要となります。

投稿2019/11/27 15:05

MrIgat

総合スコア54

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問