• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBで引数にDictionaryオブジェクトを使用する方法)

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

このQ&Aのポイント
  • VBのプロシージャ間で、Dicitionaryオブジェクトを引数にして渡す方法を教えてください。
  • テストプログラムを起動すると引数エラーになりますが、可能なのでしょうか。
  • MsgSet()とMsgGetが別々のプロジェクトのため、MsgDicオブジェクトをグローバル変数として持つことができません。

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

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

言語は何でしょうか?ASPですか?VB6ですか? Server.CreateObjectが入っているのでASPと見えますが、別プロジェクトと言うことで、VB6のようにも見えます。 そんでもって、どんなエラーメッセージが返されるのですか?どの行ですか? このままVBSで実行させてみましたが、 Print getKey(i) のところで TypeMissMatch で落ちます。 これをMsgBox にしたら普通に通りました。 一般的に、関数の引数でDictionary Object を渡すのは普通に出来ますよ。

i_yuari
質問者

お礼

最初は、ASP内で作成したDictionaryオブジェクトを 使用したくって。 VBにテスト用のDictionaryオブジェクトを作成した時に、Server.CreateObject("Scripting.Dictionary")と記述してしまって落ちていたようです。 VBでは、CreateObject("Scripting.Dictionary")と記述したら上手く行きました。 また本来の目的として、ASPでDictionaryオブジェクト を作成して、COMへ渡すこともできました。 ありがとう御座います。

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

関連するQ&A

  • エクセルVBAでDictionaryオブジェクトについて

    エクセル2000です。 教えてください。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.html というサイトで  「myDic.Add Cells(i, 1).Value, Cells(i, 2).Value は   myDic(Cells(i, 1).Value) = Cells(i, 2).Value と書くこともできます。 」 という記述を見つけました。 試してみたところ Sub test01() Dim myDic As Object Dim myAr() Set myDic = CreateObject("Scripting.Dictionary") For i = 2 To 7 If Not myDic.exists(Cells(i, 1).Value) Then myDic.Add Cells(i, 1).Value, Cells(i, 2).Value End If Next i myAr() = myDic.Keys MsgBox Join(myAr()) End Sub Sub test02() Dim myDic As Object Dim myAr() Set myDic = CreateObject("Scripting.Dictionary") For i = 2 To 7 myDic(Cells(i, 1).Value) = Cells(i, 2).Value Next i myAr() = myDic.Keys MsgBox Join(myAr()) End Sub 上記2つのマクロは、Keyに関してはまったく同じ働きをするようです。 ところがItemに関しては、Keyが重複した場合、あとから出てきた方に上書きされるようです。 これはtest01では、Keyの重複を排除しているためItemは最初に出たものが残る、test02は重複の場合、無条件でKeyが上書きされ(ても値は変化しないけど)、したがってItemも上書きされるという理解でよろしいのでしょうか? ならば、Itemを気にしない場合、わざわざ If Not myDic.exists(Cells(i, 1).Value) Then myDic.Add Cells(i, 1).Value, Cells(i, 2).Value End If と、3行も費やして重複のチェックをしなくとも myDic(Cells(i, 1).Value) = Cells(i, 2).Value のわずか一行で済むということですよね?

  • エクセルでDictionaryオブジェクト

    メリークリスマス! とはいうものの仕事が終わりません。 これまでエクセルでDictionaryオブジェクトを利用し、AN列にある人名データをKeyにしてT列にある金額の集計を行っていました。 条件 AN列のデータには重複するものが多いが同姓同名は存在しない。 T列には必ず数値が入力されている。 AN列にある人名ごとにT列にある金額の集計を行う。 省略してますが以下のようなコードです。 Sub test01()   Dim myDic As Object   Dim x As Long   Dim myC As Range   Dim ws As Worksheet   Set myDic = CreateObject("Scripting.Dictionary")   x = Cells(Rows.Count, "AN").End(xlUp).Row   For Each myC In Range("AN1:AN" & x) '受取人名列     If Not myDic.Exists(myC.Value) Then       myDic.Add myC.Value, Cells(myC.Row, "T").Value 'T列の金額     Else       myDic(myC.Value) = myDic(myC.Value) + Cells(myC.Row, "T").Value '金額を加算     End If   Next   Set ws = Worksheets.Add(After:=ActiveSheet)   With ws '新規ワークシート     .Range("A1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.keys) 'A列にデータ     .Range("B1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Items) 'B列に結びつけ金額データ   End With   Set myDic = Nothing End Sub これでうまくできていたのですが、今回新しい条件が加わり、頭を悩ませております。 新たな条件とは、同じ表のN列にあるコード(数字8桁)のうち、例えば77777777のものがあれば、追加したワークシートのC列にフラグをたてるというものです。 どのようにすればできるでしょうか? よろしくお願いいたします。

  • VB.NETのグラフィック描画について

    グラフィック描画ですが、引数を持たないサブルーチンプロシージャ(固定的な 目盛り等)は、PictureBox_paint(***イベントプロシージャ内に記述すればグラフィック描画ができます(e.Graphicsでグラフィックスオブジェクトを取得できる為)が、 X、Y座標を引数としたサブルーチンプロシージャを作り、その中でLineDraw(*****で描画させたい場合サブルーチンプロシージャ内に dim g As Graphics=pictureBox1.CreateGraphics() でグラフィックオブジェクトを生成しても 描画できないのですがどのようにすれば解決できるでしょうか(イメージがわかり難いかもしれませんのでサンプルを書きました) よろしくお願いします (1)private sub pictureBox1_paint(Byval sender as Object, Byval e as system****** e.Graphics.DrawLine(****** (これは描画できる) End Sub (2)private sub zahyou() ' 座標を生成するサブルーチンプロシージャ dim i as integer for i=0 to 10 hyouji( i , i*5 ) End Sub private sub hyouji( x as integer, y as integer) ’直線を引くサブルーチンプロシージャ dim g As Graphics=pictureBox1.CreateGraphics() g.DrawLine(***,x,y**** (これは描画できない)

  • オブジェクト??

    またまた困っております inputboxで入力した日付を検索して複数選択しようとしたのですが unionの使い方がよくわかりません(・・;) どこが間違っているのかもしくは何が足りないのか教えてください<m(__)m> どうかよろしくお願いします! Option Explicit Sub グラフ() Const SH_NAME As String = "VBA" Dim art As String Dim i Dim ws As Worksheet Dim endrow As Long Dim msg As String Dim writerow As Integer Dim grahu As Chart Dim target As Range Set ws = ThisWorkbook.Worksheets(SH_NAME) writerow = 2 art = InputBox("日付を入力してください") With ws endrow = .Cells(Rows.Count, 2).End(xlUp).Row For i = 2 To endrow If art = .Range("A" & i) Then Set target = Union(target, "D" & i) Else If InStr(msg, .Range("A" & i)) = 0 Then msg = msg & .Range("A" & i) & vbCrLf End If End If Next i target.Select End With If msg <> "" Then MsgBox msg End If MsgBox "グラフベースを作成しました" End Sub Set target = Union(target, "D" & i) ↑ここでエラーが起きて 「オブジェクトが必要です」と言われました どうすればよいのでしょうか?

  • ExcelVBA Dictionaryオブジェクト

    こんにちは。 Dictionaryオブジェクトについて、ご教示いただきたく質問させていただきます。 あるCSVデータにおいて、A列に入力されている番号で重複をなくし、重複する番号については、B列(売上額)C列(利益額)それぞれの値を合計してSheet2に表示させるコード(test1)を書きました。データの行数が3万5千行ほどあるため、処理が終わるのに3分程かかります。 今後もデータは増えていくので、処理終了までの時間をもう少し短縮したく、自分なりに調べてみたところ、Dictionaryオブジェクトというものを知り、使用例を参考にしながら見よう見まねでコード(test2)を書いて試してみたところ、処理終了まで数秒となり、かなり短縮されました。 エラーも出ることなく処理できるものの、Dictionaryオブジェクトに対する理解がイマイチでして、コードの書き方等、問題ないかを知りたく質問させていただいた次第です。 よろしくお願いいたします。 ------------------------------------------------------------------------------ Sub test1() Dim i As Long Dim lastRow As Long Dim ws As Worksheet Application.ScreenUpdating = False '不要データ削除 Rows("1:3").Select Selection.Delete Shift:=xlUp Range("B:Q,S:W,Y:AF").Select Selection.Delete Shift:=xlToLeft Range("A1").Select 'シート名変更・挿入 ActiveSheet.Name = "CSV" Sheets.Add After:=ActiveSheet ActiveSheet.Name = "売利集計" Set ws = Worksheets("売利集計") wS.Cells.ClearContents ws.Range("B1").Value = Worksheets("CSV").Range("B1") ws.Range("C1").Value = Worksheets("CSV").Range("C1") With Worksheets("CSV") .Range("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ws.Range("A1"), unique:=True lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row With Range(ws.Cells(2, "B"), ws.Cells(lastRow, "B")) .Formula = "=SUMIF(CSV!A:A,A2,CSV!B:B)" .Value = .Value End With With Range(ws.Cells(2, "C"), ws.Cells(lastRow, "C")) .Formula = "=SUMIF(CSV!A:A,A2,CSV!C:C)" .Value = .Value End With End With Application.ScreenUpdating = True Set ws = Nothing MsgBox "売利集計完了しました。" End Sub Sub test2() Dim i As Long Dim lastRow As Long Dim ws As Worksheet Dim c As Range Dim dicS As Object Dim dicP As Object Application.ScreenUpdating = False '不要データ削除 Rows("1:3").Select Selection.Delete Shift:=xlUp Range("B:Q,S:W,Y:AF").Select Selection.Delete Shift:=xlToLeft Range("A1").Select 'シート名変更・挿入 ActiveSheet.Name = "CSV" Sheets.Add After:=ActiveSheet ActiveSheet.Name = "売利集計" '番号別集計 Set ws = Worksheets("売利集計") Set dicS = CreateObject("Scripting.Dictionary") Set dicP = CreateObject("Scripting.Dictionary") With Sheets("CSV") For Each c In .Range("A2", .Range("A" & .Rows.Count).End(xlUp)) dicS(c.Value) = dicS(c.Value) + Val(c.Offset(, 1).Value) dicP(c.Value) = dicP(c.Value) + Val(c.Offset(, 2).Value) Next With Worksheets("売利集計") .Columns("A:C").ClearContents .Range("A1").Resize(, 3).Value = Worksheets("CSV").Range("A1").Resize(, 3).Value .Range("A2").Resize(dicS.Count).Value = WorksheetFunction.Transpose(dicS.keys) .Range("B2").Resize(dicS.Count).Value = WorksheetFunction.Transpose(dicS.Items) .Range("C2").Resize(dicP.Count).Value = WorksheetFunction.Transpose(dicP.Items) End With End With Set dicS = Nothing Set dicP = Nothing MsgBox "売利集計完了しました。" End Sub

  • 自作したメソッド・・・引数はなるべく省略すべき?(VB2005)

    自作したメソッドに関して、引数はなるべく設定するべきでしょうか?それとも、引数は省略できるなら省略したほうがよいでしょうか? 下記(a)、(b)は例です。 a)引数はなるべく省略   ---------------------------------   Private Sub hoge()     Call foo()   End Sub   Private Sub foo()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     '処理   End Sub   --------------------------------- b)あえて引数を設定   ---------------------------------   Private Sub hoge()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga)   End Sub   Private Sub foo(ByVal hoga As integer)     '処理   End Sub   --------------------------------- 現在、(b)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • 以下のデータがあり、これをExcel VBAの連想配列として格納したい

    以下のデータがあり、これをExcel VBAの連想配列として格納したいと考えています。 MsgBoxでキーとアイテムを表示させると表示されるのですが、 最後に一例としてExistsで確認するとFalseが返ってきます。 これは配列に格納されていないのでしょうか。 また格納されていないとすると、どうすれば格納できるのでしょうか。 A 列   B列 35   apple 37   orange 40   banana 以下がコードです。 sub test() Dim i as integer Dim myDic as Object Dim keys as Variant Set myDic = CreateObject("Scripting.Dictionary") For i = 1 to 3 myDic.Add Cells(i, 1), Cells(i, 2) Next i keys = myDic.keys For Each keys In myDic MsgBox "キー名:" & keys & vbCr & "値:" & myDic.Item(keys) Next keys MsgBox myDic.Exists(35) End Sub

  • VBAの関数で引数渡しでエラー

    関数呼び出しでObject型を渡したいのですが「引数の型が一致していません」との エラーになってしまいます。 以下のプログラムをどのように修正すればよいのでしょうか? Sub Test() Dim obj As Object Set obj = CreateObject("Scripting.Dictionary")     :   Sample(obj) End Sub Function Sample(obj As Object) End Function

  • Excel VBA onTime関数のプロシージャ引数に、引数(変数)つきのプロシージャを呼び出す方法を教えてください。

    現在ExcelVBAで一定時間ごとにメッセージを出すツールを作成しています。 その際にonTime関数を使っていますが、その引数のひとつである呼び出すプロシージャに「引数(変数)つきのプロシージャ」を設定しようとしています。 サイトを探してみたところ、引数にシングルクオーテーションで囲むなど書いてあったのですが、変数を引数としたプロシージャを設定すると、「プロシージャが見つかりません」のエラーがでます。 どなたかお力を貸してくれませんでしょうか。 ちなみに僕のコードは以下の通りです。(簡略化) ------フォーム Private Sub cmbOk_Click() Call メッセージ実行(txtTime.Text, txtContent.Text) End Sub ------ThisWorkbook Private Sub メッセージ実行(ByVal time As String, ByVal content As String) Dim starttime As Double MsgBox time & "毎に" & vbCr & content & vbCr & "を表示します。", vbInformation Unload frmSet starttime = Now + CDbl(TimeValue(time)) Application.OnTime starttime, "'expressContent" & time & content & "'" End Sub ------標準モジュール Dim starttime2 As Double Sub expressContent(ByVal time2 As String, ByVal content2 As String) MsgBox "content2", vbInformation starttime2 = Now + CDbl(TimeValue(time2)) Application.OnTime starttime2, "'expressContent" & time & content & "'" End Sub よろしくお願い致します。

  • VBAのdictionaryでAddの使い方

    VBAでつぎのコードを実行すると、a,A1.1の後、a,A2.2と表示します。 dicには、a,A2.2の設定をしていないのになぜこうなるのでしょうか? どなたか教えてください。 Sub sample() Dim dic As Object Dim subDic As Object Set dic = CreateObject("Scripting.Dictionary") Set subDic = CreateObject("Scripting.Dictionary") subDic.Add "A1", 1 dic.Add "a", subDic subDic.Add "A2", 2 '結果表示 Dim key1 As Variant Dim key2 As Variant For Each key1 In dic.keys For Each key2 In dic(key1).keys MsgBox key1 & "," & key2 & ". " & dic(key1)(key2) Next Next End Sub