連想配列3-Microsoft Scripting Runtimeのへの参照設定

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

DictionaryオブジェクトはOffice標準設定では使えません。
Microsoft Scripting Runtimeのへの参照設定が必要です。
参照設定のやり方を説明しています。

この教材についての過去の質問・感想

11110 : 小川慶一の回答 (2019-02-10 08:01:42)

牧野千秋さん:

> 1つめ
> 名前だから文字列で""でくくっておかなければならないのですね

「参照するクラスの名称を文字列型で指定する」ということです。

> 2つめ

こららも参考になるかと。

○10秒でできる!エクセルデータの「重複の削除」
https://online.pc5bai.com/Movie/index/72/1280


> 小川先生
> 1つめ
> 名前だから文字列で""でくくっておかなければならないのですね
>
> 2つめ
> おお、できました!
> 実は重複しないリストを作るため、別シートにピボットテーブルを作ってリフレッシュしていました(←けっこうおもしろい発想でしょう?)。
> ありがとうございました。


11107 : 牧野千秋さんのコメント (2019-02-10 05:30:03)

小川先生
1つめ
名前だから文字列で""でくくっておかなければならないのですね

2つめ
おお、できました!
実は重複しないリストを作るため、別シートにピボットテーブルを作ってリフレッシュしていました(←けっこうおもしろい発想でしょう?)。
ありがとうございました。


11106 : 小川慶一の回答 (2019-02-09 23:46:49)

牧野千秋さん:

以下のとおりにすればとりあえずご希望に近いものにはなるかと思います。

dic.Item(KEY) = dic.Item(KEY) + 1 はコメントアウト。

Sheets("出力").Range("B1").Offset(i).Value = VKEYS(i)
は、右辺を以下のとおりに修正。

dic.Item(VKEYS(i))


> ファイルつけるの忘れていました。
> やりたいことは、「基礎データ」シートのA列とB列を連想配列に重複せずに格納したいというものです。


11105 : 小川慶一の回答 (2019-02-09 23:36:10)

牧野千秋さん:

「1つめ」について:

> 当然小文字で入力しても大文字にならない

ダブルクオートでくくった範囲は文字列だからです。

> このとき、"Scripting.Dictionary"に""がつくのはなぜ?

CreateObject 関数は、引数に、「Class As String」ということで、参照するクラスの名称を文字列型で指定するという仕様だからです。

ref: msdn「CreateObject 関数」
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/createobject-function?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev11.query%3FappId%3DDev11IDEF1%26l%3Dja-JP%26k%3Dk(vblr6.chm1010851)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue%26f%3D255%26MSPPError%3D-2147217396

「2つめ」については、追って回答しますね。


11096 : 牧野千秋さんのコメント (2019-02-09 23:08:11)

ファイルつけるの忘れていました。
やりたいことは、「基礎データ」シートのA列とB列を連想配列に重複せずに格納したいというものです。


11095 : 牧野千秋さんのコメント (2019-02-09 23:05:58)

1つめ
Dim LIST As Scripting.Dictionary
Set LIST = CreateObject("Scripting.Dictionary")

このとき、"Scripting.Dictionary"に""がつくのはなぜ?
当然小文字で入力しても大文字にならない

2つめ
テキスト通りに書いたのですが
dic.Item(KEY) = dic.Item(KEY) + 1
で型が一致しません、と出ます。
ここは「すでにキーにあるから、配列を1段下げるよ」という意味ではないのでしょうか。

Sub ディクショナリ()
    Dim dic As Scripting.Dictionary
    Set dic = CreateObject("Scripting.Dictionary")
    
    Dim MR As Long
    Dim i As Long
    Dim KEY As String
    Dim NAM As String
    
    MR = Sheets("基礎データ").Range("A" & Rows.Count).Row
        For i = 2 To MR
            KEY = Sheets("基礎データ").Range("A" & i).Value
            NAM = Sheets("基礎データ").Range("B" & i).Value
            
            If dic.Exists(KEY) Then
                dic.Item(KEY) = dic.Item(KEY) + 1
            Else
                dic.Add (KEY), (NAM)
            End If
        Next
    
    Dim VKEYS As Variant
    VKEYS = dic.Keys
        For i = LBound(VKEYS) To UBound(VKEYS)
            Sheets("出力").Range("A1").Offset(i).Value = VKEYS(i)
            Sheets("出力").Range("B1").Offset(i).Value = VKEYS(i)
        Next
    
End Sub


8997 : 受講生さんのコメント (2017-10-05 01:28:14)

小川慶一先生:

採点有難うございます。
配列、特に連想配列は最初とっつきにくかったですが、慣れると、形通りにコードを書けてくるので、クセになりますね!



> 受講生 さん:
>
> 添削を返送します。
> よく書けていると思いますよ!かなり上達されしましたね☆
>
> > 発展編1のファイル"Enshu21200.xls"の伝票作成の問題で、模範解答でなく、連想配列を使って、コードを書いてみました。動きましたが、採点をしていただければ、嬉しいです。
>


8991 : 小川慶一の回答 (2017-10-04 18:26:51)

受講生 さん:

添削を返送します。
よく書けていると思いますよ!かなり上達されしましたね☆

> 発展編1のファイル"Enshu21200.xls"の伝票作成の問題で、模範解答でなく、連想配列を使って、コードを書いてみました。動きましたが、採点をしていただければ、嬉しいです。


8984 : 受講生さんのコメント (2017-10-02 23:16:04)

発展編1のファイル"Enshu21200.xls"の伝票作成の問題で、模範解答でなく、連想配列を使って、コードを書いてみました。動きましたが、採点をしていただければ、嬉しいです。

Option Explicit
Sub CreateDenpyo()
    DeleteSheets
    CreateDenpyoExe
End Sub

Sub DeleteSheets()
    Dim ws As Worksheet
    Application.DisplayAlerts = False
    For Each ws In Worksheets
        If Left(ws.Name, 4) <> "main" Then
            ws.Delete
        End If
    Next
    Application.DisplayAlerts = True
End Sub

Sub CreateDenpyoExe()
'連想配列を使って、伝票作成のコードを書きました。
    
    Dim dic As New Scripting.Dictionary 'index=取引先名称、Item=転記先シートでの行数とする連想配列。
    Dim c As Long                       'Worksheets("main")の行数カウンター
    Dim cMx As Long                     'Worksheets("main")の最終行数
    Dim dt As Long                      'Worksheets("main")C列の日付
    Dim st As String                    'Worksheets("main")B列の取引先名称
    Dim w As Worksheet                  'Worksheets("main")のニックネーム
    
    Set w = Worksheets("main")
    cMx = w.Range("a65536").End(xlUp).Row
    
    For c = 2 To cMx
        st = w.Range("B" & c).Value
        If dic.Exists(st) = True Then
            dic.Item(st) = dic.Item(st) + 1
        Else
            dic.Add st, 16
            CreateSheets st
        End If
        
        InputData st, c, dic.Item(st)
    Next
    
    Dim vkey As Variant
    vkey = dic.Keys
    For c = LBound(vkey) To UBound(vkey)
        If Left(vkey(c), 4) <> "main" Then
            Keisen vkey(c), dic.Item(vkey(c))
        End If
    Next
    w.Select
    Range("a1").Select
End Sub

Sub CreateSheets(st As String)
    Worksheets("main1").Copy after:=Worksheets(Worksheets.Count)
    ActiveSheet.Name = st
End Sub

Sub InputData(st As String, cFm As Long, cTo As Long)
    Dim dt As Date
    Dim wTo As Worksheet
    Dim wFm As Worksheet
    Dim cKingaku
    Set wTo = Worksheets(st)
    Set wFm = Worksheets("main")
    
    dt = wFm.Range("c" & cFm).Value
    wTo.Range("b" & cTo).Value = Right(Year(dt), 2)
    wTo.Range("c" & cTo).Value = Month(dt)
    wTo.Range("d" & cTo).Value = Day(dt)
    wTo.Range("e" & cTo).Value = wFm.Range("d" & cFm).Value
    wTo.Range("f" & cTo).Value = wFm.Range("e" & cFm).Value
    wTo.Range("h" & cTo).Value = wFm.Range("f" & cFm).Value
    
    cKingaku = wFm.Range("g" & cFm).Value
    If cKingaku >= 0 Then
        wTo.Range("i" & cTo).Value = cKingaku
    Else
        wTo.Range("j" & cTo).Value = cKingaku
    End If
    
    If cTo = 16 Then
        wTo.Range("k" & cTo).Value = cKingaku
    Else
        wTo.Range("k" & cTo).Value = wTo.Range("k" & cTo - 1).Value + cKingaku
    End If

End Sub

Sub Keisen(st As Variant, c As Long)
'
' 罫線を引く
    Worksheets(st).Select
    With Range("B16:K" & c + 1)
        .Borders(xlDiagonalDown).LineStyle = xlNone
        .Borders(xlDiagonalUp).LineStyle = xlNone
        With .Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
        With .Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
        End With
    End With
    
End Sub


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 式と戻り値1-データ型のおさらい
    【動画1】 式と戻り値1-データ型のおさらい 未習得
  2. 【動画2】 式と戻り値2-「式」と「戻り値」
    【動画2】 式と戻り値2-「式」と「戻り値」 未習得
  3. 【動画3】 式と戻り値3-「式」と「戻り値のデータ型」
    【動画3】  式と戻り値3-「式」と「戻り値のデータ型」 未習得
  4. 【動画4】 式と戻り値4-「式」とは(その1)
    【動画4】 式と戻り値4-「式」とは(その1) 未習得
  5. 【動画5】 式と戻り値5-「式」とは(その2)
    【動画5】 式と戻り値5-「式」とは(その2) 未習得
  6. 【動画6】 式と戻り値6-戻り値を返す式、戻り値を返さない式
    【動画6】  式と戻り値6-戻り値を返す式、戻り値を返さない式 未習得
  7. 【動画7】 コレクションとインデックス
    【動画7】  コレクションとインデックス 未習得
  8. 【動画8】 配列
    【動画8】 配列 未習得
  9. 【動画9】 静的配列
    【動画9】 静的配列 未習得
  10. 【動画10】 動的配列1-動的配列の基本
    【動画10】 動的配列1-動的配列の基本 未習得
  11. 【動画11】 動的配列2-Preserveキーワード
    【動画11】 動的配列2-Preserveキーワード 未習得
  12. 【動画12】 動的配列3-演習
    【動画12】 動的配列3-演習 未習得
  13. 【動画13】 多次元配列の基本
    【動画13】 多次元配列の基本 未習得
  14. 【動画14】 多次元動的配列
    【動画14】 多次元動的配列 未習得
  15. 【動画15】 多次元配列のサイズを調べる
    【動画15】 多次元配列のサイズを調べる 未習得
  16. 【動画16】 配列操作の便利関数、オプション、その他
    【動画16】  配列操作の便利関数、オプション、その他 未習得
  17. 【動画17】 連想配列1-Dictionaryオブジェクトの仕様
    【動画17】 連想配列1-Dictionaryオブジェクトの仕様 未習得
  18. 【動画18】 連想配列2-Dictionaryオブジェクトの使用例
    【動画18】 連想配列2-Dictionaryオブジェクトの使用例 未習得
  19. 【動画19】 連想配列3-Microsoft Scripting Runtimeのへの参照設定
    【動画19】 連想配列3-Microsoft Scripting Runtimeのへの参照設定 未習得
  20. 【動画20】 「名前付き引数」と「名前なし引数」
    【動画20】 「名前付き引数」と「名前なし引数」 未習得
  21. 【動画21】 省略可能な引数とその初期値
    【動画21】 省略可能な引数とその初期値 未習得
  22. 【動画22】 引数のデータ型
    【動画22】 引数のデータ型 未習得
  23. 【動画23】 Functionプロシージャ
    【動画23】 Functionプロシージャ 未習得
  24. 【動画24】 引数がひとつまたは複数のFunctionプロシージャ
    【動画24】 引数がひとつまたは複数のFunctionプロシージャ 未習得
  25. 【動画25】 Functionプロシージャ演習中
    【動画25】 Functionプロシージャ演習中 未習得
  26. 【動画26】 引数として配列を受け取るFunctionプロシージャ
    【動画26】 引数として配列を受け取るFunctionプロシージャ 未習得
  27. 【動画27】 引数を受け取らないSubプロシージャと引数つきSubプロシージャ
    【動画27】 引数を受け取らないSubプロシージャと引数つきSubプロシージャ 未習得
  28. 【動画28】 Subプロシージャの基本構造
    【動画28】 Subプロシージャの基本構造 未習得
  29. 【動画29】 モジュールレベル変数との使い分け
    【動画29】 モジュールレベル変数との使い分け 未習得
  30. 【動画30】 補講1-ディクショナリーオブジェクトのさらなる活用
    【動画30】 補講1-ディクショナリーオブジェクトのさらなる活用 未習得
  31. 【動画31】 補講2-ディクショナリーオブジェクトの .Count プロパティ
    【動画31】 補講2-ディクショナリーオブジェクトの .Count プロパティ 未習得
  32. 【動画32】 補講3-連想配列によるオブジェクトへの参照設定 - 新しいキーに設定する場合
    【動画32】 補講3-連想配列によるオブジェクトへの参照設定 - 新しいキーに設定する場合 未習得
  33. 【動画33】 補講4-連想配列によるオブジェクトへの参照設定 - 既存の値を上書きする場合
    【動画33】 補講4-連想配列によるオブジェクトへの参照設定 - 既存の値を上書きする場合 未習得
  34. 【動画34】 補講5-複数セルの集合を作るための便利なメソッド2つ
    【動画34】 補講5-複数セルの集合を作るための便利なメソッド2つ 未習得
  35. 【動画35】 補講6-連想配列演習-取引先ごとに取引金額の合計を算出する
    【動画35】 補講6-連想配列演習-取引先ごとに取引金額の合計を算出する 未習得
  36. 【動画36】 補講7-ウォッチ式の活用
    【動画36】 補講7-ウォッチ式の活用 未習得
  37. 【動画37】 補講8-ウォッチ式で配列の状態を確認する
    【動画37】 補講8-ウォッチ式で配列の状態を確認する 未習得
  38. 【動画38】 補講9-たった1行のコードでセルのデータを配列に投入する
    【動画38】 補講9-たった1行のコードでセルのデータを配列に投入する 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ