[[20190605100813]] 『Dictionaryの値に入れた配列の値を上書き』(ポルポラ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Dictionaryの値に入れた配列の値を上書き』(ポルポラ)

Dictionaryの値に配列が入っています。
その配列の値を上書きしたいのですが、何度やっても上書きされません。
どのようにすればよいでしょうか?

Sub 練習()
Dim P As Object
Dim moji(3) As String
Dim K As Variant
Dim num As Integer
Dim i As Integer
Dim m As String

Set P = CreateObject("Scripting.Dictionary")
moji(0) = "僕"
moji(1) = "俺"
moji(2) = "私"

P.Add "A", moji
P.Add "B", moji
P.Add "C", moji

num = 10

m = P.Item("A")(0)
P("A")(0) = m & "だよ"

For Each K In P

    For i = 0 To 2
        Sheets("色々試すためのシート").Range("A" & num) = K & ":" & P.Item(K)(i)
        num = num + 1
    Next

Next
End Sub

[なって欲しい結果]
A:僕だよ
A:俺
A:私
B:僕
B:俺
B:私
C:僕
C:俺
C:私

[実行結果]
A:僕
A:俺
A:私
B:僕
B:俺
B:私
C:僕
C:俺
C:私

< 使用 Excel:Office365、使用 OS:Windows10 >


 >Dim m As String 
  ↓
   Dim m() As String ’まぁ、Variant型にしてしまえば、配列にしないでいいので簡便だけど。

 >' m = P.Item("A")(0)   ’←  P("A")の配列を取り出して、その第1ファクタを取得しただけ。
 >' P("A")(0) = m & "だよ" ’   P("A")の配列を取り出して、その第1ファクタを変更しただけ。P("A")に書き戻されていない。
               
     ↓
     m = P.Item("A")     ’ P("A")の配列を取得する
     m(0) = m(0) & "だよ"  ’その配列の第1ファクタを変更する
     P.Item("A") = m     ’変更された配列全体を、P("A")に書き戻す。

(半平太) 2019/06/05(水) 10:57


 >その配列の値を上書きしたいのですが、何度やっても上書きされません。
 これは所謂Dictionary等の連想配列の特融の性質です。

 配列の要素が定数である時、一度配列そのものを変数にして、編集後の配列を戻すか、別の配列を入れなおす作業が必要になります。
 しかし、要素がオブジェクトの時はそのまま編集できます。

 dic("Beatles")=Array("Liverpool",CreateObject("Scripting.Dictionary"))
 dic("Beatles")(1)("John") = "Lennon"
 はOKですが、
 dic("Beatles")(0) = "Paul"
 はNGです。
(seiya) 2019/06/05(水) 11:20

ありがとうございました!無事に解決できました!
(ポルポラ) 2019/06/05(水) 13:04

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.