• ベストアンサー

VB6.0 一つの分類に対して複数の項目を紐付ける方法

VB6.0 アルゴリズムで悩んでいます。 分類A,A_2 分類B,B_1 分類A,A_1 ~ 上記のようなCSVを読み込みます。 その後、以下のように画面に展開したいのです。 分類A → A_2,A_1 分類B → B_1 ~ 分類は同じ値が存在した場合一つにまとめます。 項目は同じものが存在することはありません。 CreateObject("Scripting.Dictionary")を使用して何とかできないものかと思ったのですが、正直完全にお手上げ状態です。 少々説明が分かりにくいかもしれませんが、ご回答よろしくお願いいたします。

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

  • ベストアンサー
回答No.2

コレクションを要素に持つケースだと柔軟に対応できるかも。   Dim dic As Object   Dim col As Collection   Dim i As Long   Dim csvLine(2) As String   Dim word As Variant   Dim key As Variant      Set dic = CreateObject("Scripting.Dictionary")   csvLine(0) = "分類A,A_2"   csvLine(1) = "分類B,B_1"   csvLine(2) = "分類A,A_1"      For i = LBound(csvLine) To UBound(csvLine)     word = Split(csvLine(i), ",")     If Not dic.Exists(word(0)) Then       Set col = New Collection       col.Add word(1)       dic.Add word(0), col     Else       dic(word(0)).Add word(1)     End If   Next      For Each key In dic.keys     Set col = dic(key)     Debug.Print "●" & key     For i = 1 To col.Count       Debug.Print "(" & i & ")"; col.Item(i)     Next   Next   dic.RemoveAll   Set dic = Nothing

ShimantoGa
質問者

お礼

回答ありがとうございます。 これです、これがやりたかったんです。 本当にありがとうございます。 しかし一点気になった点があります。 If Not dic.Exists(word(0)) Then Set col = New Collection ~ と動的にコレクションを増やしているのですが、これらはDictionaryと違って明示的に破棄する必要はないのでしょうか。

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

その他の回答 (2)

回答No.3

>Dictionaryと違って Dictionaryでも別に明示的に破棄しなくてもよかったはず。 まぁ、Dictionaryのほうに、Nothingを入れている以上どっちもやっておいたほうがBestそうですね。 (もしかしたら、DictionaryのRemoveAll(もしくはNothingを代入時)に、要素の参照カウンタもデクリメントされるかも。) For Each key In dic.keys Set dic(key) = Nothing Next dic.RemoveAll Set dic = Nothing

ShimantoGa
質問者

お礼

ありがとうございます。 どう実現すればよいか皆目見当もつかなかったためかなり苦労していました。 ですので本当に助かりました。 Collectionを破棄する構文と合わせて利用させていただきます。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

画面に展開というのがわかりませんでしたが、  Dim myDic As Object  Dim myKey As Variant  Dim i As Integer  Dim v(3) As Variant  Dim w As Variant  Set myDic = CreateObject("Scripting.Dictionary")  v(0) = "分類A,A_2"  v(1) = "分類B,B_1"  v(2) = "分類A,A_1"  v(3) = "分類B,B_2"  For i = 0 To 3      w = Split(v(i), ",")      If Not myDic.Exists(w(0)) Then         myDic(w(0)) = w(1)      Else         myDic(w(0)) = myDic(w(0)) & "," & w(1)      End If  Next  For Each myKey In myDic.Keys      Debug.Print myKey, myDic(myKey)  Next  Set myDic = Nothing こんな感じの事でしょうか?

ShimantoGa
質問者

お礼

回答ありがとうございます。 ご教授していただいた処理で解決しました。 本当にありがとうございます。 しかしこの処理のことでもう一点質問させていただきたいのですが。 >myDic(w(0)) = myDic(w(0)) & "," & w(1) と記述して分類ごとの項目を紐付けることは可能なのですが、 >myDic(w(0)) & "," & w(1) この部分を配列やCollectionなどにすることはできないでしょうか。 Array(0) = w(1) Array(1) = w(1) objCollection.Add(count,w(1)) 分類の数が不定ですので可能かどうか分かりませんが、よろしければご回答よろしく願いします。

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

関連するQ&A

  • エクセルの関数について(項目を分類したい)

    人に頼まれて表を作ることになりましたがIF関数では対応できないないため、他に適切な関数がお分かりになる方教えてください。 IF関数では「○○が□ならAと△ならBを表示」という風に2つしか分類できませんが、「○○が□か◇ならAと△か▽ならBと◎以上ならCと★以下ならD」というように2つ以上分類ができる関数なのですが・・・存在しますでしょうか? わかる方よろしくお願いします。

  • VB.NETでオブジェクトの内容を見る方法ありませんか?

    デバッグでプログラムを見ているのですが、Object型のデータの場合クイックウォッチでみても「System_ComObejct」となっていて値がどうなっているのか、ちゃんと動いているのかわかりません。 今困っているのは下記二つのとこで (1)すべて戻り地が「System_ComObejct」でちゃんと動作しているのかがわからない。CSV_Filesには何が入っているのか? (FSO,DF,CSV_Filesすべてobject型です) FSO = CreateObject("Scripting.FileSystemObject") DF = FSO.GetFolder(strDir) CSV_Files = DF.Files (2)(Filename,CSV_Files,myFileすべてObject型) For Each Filename In CSV_Files MyFile = FSO.OpenTextFile(Filename, ForReading) Filenameにどんな値が入っているのか知りたいです。 よろしくお願いしますー><

  • VB6のWScript.Shellについて

    VB6のWScript.Shellで、他のVB6プログラムを起動する時の戻り値について教えてください。 AというVBプログラムからBというVBプログラムを起動するシステムがあります。 Bというプログラムで取得した値をAに返す方法はありますでしょうか? Aのソースは以下の通りです。 --------------------------------------------- sub test() dim objWshShell set objWshShell = Wscript.CreateObject("WScript.Shell") objWshShell.Run "C:\B.exe" & " " & hikisu1 & " " & hikisu2 , 1, wait End Function ---------------------------------------------- objWshShell.Runの戻り値はtrueまたはfalseのみのようです。 B.exeからtrue、false以外の値を取得する方法はありますか? また、やり方はobjWshShell.Runでなくてもよいです。 よろしくお願いします。

  • 差込印刷でOutlookの分類項目を利用したい

    お世話になります。 個人事業主です。 Outlookでお客様の住所等を管理しています。 Outlookに「分類項目」があるので、種類分けをしています。 DMを送ろうとOutlookとワードで宛名シールを印刷しようと考えました。 差込印刷の開始→Outlook 連絡先から選択→アドレス帳の編集 とここまでは、順調に来たのですが。 ワードのラベル印刷でOutlookのデータを使用を選ぶと、連絡先内全てのデータが読み込まれます。 上記の通り、「分類分け」をしておりますので、分類Aの方には発送するけれども、分類Bの方には発送しない。 といった場合分けを行うために、Outlookの「分類項目」で分類をしていたのです。 差込印刷のウィザードのフィルタの中に「分類項目」という箇所がありません。 一つ一つ、チェックを付けたり外したりするのは、大変すぎます。 どのようにしたら、「分類項目」を利用することが出来るでしょうか? もし、利用できないとなった場合、「分類項目を利用してなるべく手順を踏まず、分類した相手先のラベルを作る」にはどうしたらいいでしょうか?

  • Excel 複数シートで、違う行にある値をキー項目を元に集計したい。

    Excelを使用した集計作業で、効率の悪さに頭を悩ませています。 自己解決出来ず、お知恵を拝借出来ればと質問させていただきます。 シートA・Bに同じ構造(列の項目数が一致)のデータを持っています。 A・B両方に入力されているキー項目のデータもあれば、 どちらかのみに登録されているキー項目のデータもあります。 2つのシートで一致するキー項目の値を集計し、 シートCに出力する事を考えています。 A・B両方に入力されている場合は各値を合計し、 片方にしか登録されていない場合はそのまま値を表示したいのですが、 効率の良い手順がわかりません。是非お助け下さい! 具体的には、下記のような事を考えています。 【シートA】 キー項目 値1 値2 値3 値4 A001  10  10  10  10 A002  20  20  20  20 A003  30  30  30  30 A004  40  40  40  40 A005  50  50  50  50 A006  60  60  60  60 【シートB】 キー項目 値1 値2 値3 値4 A001  10  10  10  10 A002  20  20  20  20 A005  50  50  50  50 A007  70  70  70  70 A008  80  80  80  80 ↓ 【シートC】 キー項目 値1 値2 値3 値4 A001  20  20  20  20 A002  40  40  40  40 A003  30  30  30  30 A004  40  40  40  40 A005  100  100  100  100 A006  60  60  60  60 A007  70  70  70  70 A008  80  80  80  80 p.s. 現在は下記のような手順で作業しています。 (1)MATCH関数でシートBのキー項目がシートAの何行目にあるかを出力。 (2)手作業で出力された行にデータを移動し、キー項目の行数を合わせる。 (3)シートCにキー項目をコピーし、  値部分は『='シートA'!B1+'シートB'!B1』のような形で計算。 (4)シートBにのみ存在するデータを結合→キー項目でソート ・・・(2)の手順で、非常に時間を要しています(x_x)

  • VBで引数にDictionaryオブジェクトを使用する方法

    VBのプロシージャ間で、Dicitionaryオブジェクトを引数にして渡したいのですが、可能でしょうか。 以下のテストプログラムを起動すると、引数エラーになってしまうのですが、 可能なのでしょうか。 実際は、MsgSet()とMsgGetは別々のプロジェクトの為MsgDicオブジェクトを グローバル変数としてはもつことが出来ません。 '*****値設定用プロシージャ***** Sub MsgSet() Dim MsgDic 'メッセージ格納領域 Set MsgDic = Server.CreateObject("Scripting.Dictionary") MsgDic.RemoveAll '値の設定 MsgDic.Add "MSG1", "メッセージ1" MsgDic.Add "MSG2", "メッセージ2" MsgDic.Add "MSG3", "メッセージ3" Call MsgGet(MsgDic) End Sub '*****値取得用プロシージャ***** Sub MsgGet(MsgDic) Dim getKey,i getKey = MsgDic.keys For i = 0 To MsgDic.Count -1 Print getKey(i) Next End Sub

  • VB.net 既存項目の追加

    VB6.0では、共通フォルダを作成して、共通モジュールを作成して使いまわしができたのですが、VB.net 2005では、既存項目の追加を行うと、プロジェクトフォルダに複写され使いまわしができないようです。 何か設定もしくは方法があるのでしょうか。 例) [VB6.0] ・プロジェクトA...新規作成 プロジェクトフォルダ   C:\Pro-A\... 共通関数.bas C:\Pro-A\共通関数.bas ・プロジェクトB...Aのあとで、Bを新規作成 プロジェクトフォルダ   C:\Pro-B\... 共通関数.bas C:\Pro-A\共通関数.bas プロジェクトBを作成して、プロジェクトAの共通関数.basファイルを追加しても、参照先は、C:\Pro-A内のファイル [VB.NET 2005] ・プロジェクトA プロジェクト  C:\Pro-A\...        C:\Pro-A\共通関数.bas ・プロジェクトB プロジェクト  C:\Pro-B\... 共通関数.bas C:\Pro-B\共通関数.bas ~~~~~~ プロジェクトBのフォルダに複写される。 ※ 追加手順は、ファイルメニュー⇒[プロジェクト]⇒[既存項目の追加]で追加したときに、勝手に複写されているようです。 ⇒ソリューションエクスプローラで、完全パスを確認。 宜しくお願い致します。

  • VB2005でBASP21が使えません

    BASP21のFORMメソッドを使用し、次のような構文でHTMLのタグを読もうとしています。 dim a, b, obj as Object set obj = Createobject("basp21") a = Request.TotalBytes b = Request.BinaryRead(a) str = obj.Form(b,"name") 同じようなコーディングでVB6.0ではタグ<name>の文字列が取得出来て、VB2005では出来ません。 VB2005のコーディングが違うのでしょうか。

  • CSV編集について(VB6)

    VB6初心者です。 例として下記のCSVファイルがあります。 a,1,2,3,4,5,b,1,2,3,4,5,6,c,1,2,3,c,1,2,3,c,1,2,3,c1,2,3 a,1,2,3,4,5,b,1,2,3,4,5,6,b,1,2,3,4,5,6,c,1,2,3,c,1,2,3,c,1,2,3,c,1,2,3,c,1,2,3c,1,2,3 上記を下記のように編集して別のCSVへ保存をしたのですがご教授ください。 a,1,2,3,4,5 b,1,2,3,4,5,6 c,1,2,3 c,1,2,3 c,1,2,3 c,1,2,3 a,1,2,3,4,5 b,1,2,3,4,5,6 b,1,2,3,4,5,6 c,1,2,3 c,1,2,3 c,1,2,3 c,1,2,3 c,1,2,3 c,1,2,3 上記の各a,b,c内の項目数は固定です。 a以降のb,c内の配列はランダムに複数となります。

  • 二次元のDictionary

    ASPは全くの初心者です。 今回、二次元のDictionaryを使って値を表示させたいのですが 行き詰ってしまいました。 以下のコードをどのように変換すれば良いですか? <%@ LANGUAGE = VBSCRIPT %> <% call dictionary_create() Sub dictionary_create() Dim objParent Dim objChild dim x Set objParent = CreateObject("Scripting.Dictionary") For x=0 to 9 Set objChild = CreateObject("Scripting.Dictionary") objChild.Add "kaigi", "会議名"&i objChild.Add "Id", "0"&i objParent.Add x, objChild Set objChild = Nothing Response.Write objParent.Item("ConfName") Next end sub %>