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

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

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

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

1回答

555閲覧

VBScriptで多次元配列を動的に追加したい

ramensann3345

総合スコア2

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2022/08/30 01:04

前提

VBBScriptでCSVファイルから
レコードを読み取り、読み取った内容を多次元配列で保持しつつ
同一キーのレコードの場合、保持している配列に加算し、
新規のキーの場合は、そのまま新規に追加するという
機能をコーディングしています。

「CSVの中身」※左から、"キー"、"金額"、"日時"、"場所"、"品名"
001,2500,20220526,横浜,食料品
005,1200,20220701,大船,雑貨
001,3000,20220526,横浜,食料品

[保持したい形式]
001 5500 20220526 横浜 食料品 ※同一キーのため、金額をマージ
005 1200 20220701 大船 雑貨  ※新規キーのため、そのまま新規追加

ここに質問の内容を詳しく書いてください。
CSVのレコードを読み取り、現状の配列の中身を検索し、同一キーだったら、マージ、存在しなかったら、そのまま新規に追加を行いたいのですが
VBScriptでの実現方法がわかりません。

試したこと

一次元配列にCSVの内容をそのまま保持(カンマ区切り)するようにし、
CSVレコードを読み取り、配列の中身を検索する際、一回、配列の中身を取り出し、spritで各要素に分解し、
同一キーであれば、金額を加算し、再格納し、配列に存在しない新規キーであった場合、Redimで配列要素を追加し、
CSVのレコードのまま、格納といったことを考えましたが、冗長なコーディングに見えて、ほかの方法がないか
質問させていただいております。

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

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

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

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

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

guest

回答1

0

ベストアンサー

クラスと Scripting.Dictionary を使うと良いのでは?

vb

1Option Explicit 2 3Class Detail 4 Public Key 5 Public Amount 6 Public DateTime 7 Public Location 8 Public Name 9End Class 10 11Function LineToDetail(strLine) 12 Dim d, v 13 Set d = new Detail 14 v = Split(strLine, ",") 15 Redim Preserve v(4) 16 d.Key = v(0) 17 d.Amount = CCur(v(1)) 18 d.DateTime = v(2) 19 d.Location = v(3) 20 d.Name = v(4) 21 Set LineToDetail = d 22End Function 23 24Dim dic, v, d 25Set dic = CreateObject("Scripting.Dictionary") 26 27For Each v in Array("001,2500,20220526,横浜,食料品", _ 28 "005,1200,20220701,大船,雑貨", _ 29 "001,3000,20220526,横浜,食料品") 30 Set d = LineToDetail(v) 31 If dic.Exists(d.Key) Then 32 dic(d.Key).Amount = dic(d.Key).Amount + d.Amount 33 Else 34 dic.Add d.Key, d 35 End If 36Next 37 38For Each d in dic.Items 39 MsgBox d.Key & "," & d.Amount & "," & d.DateTime & "," & d.Location & "," & d.Name 40Next

追記

クラスにメソッドやプロパティを追加して、マージの機能など持たせるといいかも

vb

1Option Explicit 2 3Class Detail 4 Public Key 5 Public Amount 6 Public DateTime 7 Public Location 8 Public Name 9 10 Public Sub Save(strLine) 11 v = Split(strLine, ",") 12 Redim Preserve v(4) 13 Key = v(0) 14 Amount = CCur(v(1)) 15 DateTime = v(2) 16 Location = v(3) 17 Name = v(4) 18 End Sub 19 20 Public Sub Merge(d) 21 Amount = Amount + d.Amount 22 End Sub 23 24 Public Default Property Get Item 25 Item = Key & "," & Amount & "," & DateTime & "," & Location & "," & Name 26 End Property 27End Class 28 29Dim dic, v, d 30Set dic = CreateObject("Scripting.Dictionary") 31 32For Each v in Array("001,2500,20220526,横浜,食料品", _ 33 "005,1200,20220701,大船,雑貨", _ 34 "001,3000,20220526,横浜,食料品") 35 Set d = new Detail 36 d.Save(v) 37 If dic.Exists(d.Key) Then 38 dic(d.Key).Merge(d) 39 Else 40 dic.Add d.Key, d 41 End If 42Next 43 44For Each d in dic.Items 45 MsgBox d 46Next

投稿2022/08/30 03:22

編集2022/08/30 08:13
KOZ6.0

総合スコア2622

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

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

ramensann3345

2022/08/30 05:35

お早いご回答ありがとうございます。 VBScriptでもクラス生成できることを初めて知りました。 ただ、既存のプログラムでクラスを生成して処理しているものがなく クラス生成を行う際に、問題がないか検討させていただきます。 ※OSや.Netのバージョンに依存しないか 仮にクラス生成を行わない方法としたら、自分が記載したようなRedimを繰り返していく方法になるでしょうか? もし、お分かりになりましたら、ご回答頂けると助かります。
KOZ6.0

2022/08/30 06:09

>仮にクラス生成を行わない方法としたら、自分が記載したようなRedimを繰り返していく方法になるでしょうか? Dictionary に配列を格納したほうが楽だと思います。
ramensann3345

2022/08/30 07:51

ご提示いただき、ありがとうございます。 互換性は特に問題なし、とのことで、記載いただいた内容をテキストに貼り付けて、vbsファイルで保存し 実行したところ、正常終了するPCとエラーが発生するPCがおりました。どちらもWindows10で、エラーが発生するのは、Enterprise エディションで、Homeエディションでは、正常終了しました。 ※44行目付近のFor Each d in dic.Items の dが全角であったため、どちらも修正済みです。 エラーが発生する箇所は下記で For Each v in Array("001,2500,20220526,横浜,食料品", _ 行:32 文字:52  終了していない文字列型の定数です。 800A0409 のコンパイルエラーとなりました。 なにかお分かりになりますでしょうか? 度重なる質問で、恐縮ですが よろしくお願いいたします。
KOZ6.0

2022/08/30 08:01 編集

メモ帳で保存してませんか? https://teratail.com/questions/hm896k6qnjbcm7 「名前を付けて保存」で文字コードを ANSI もしくは UTF-16LE にして保存してください。 全角の件は申し訳ありません。
ramensann3345

2022/08/30 08:47

ご提示された方法で 無事実行できました! 長々とご対応頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問