2016-12-08 8 views
0

私は辞書を初期化しようとしています。私は3、4、10などが必要であるかどうかはわかりません。だから私は、次のことを試してみました:未知数の変数を初期化しようとしています

dim wb1 as workbook 
set wb1 = ThisWorkbook 
dim strdict as new scripting.dictionary 
    For c = 1 To 65536  'for all rows 
    If strdict.Exists(wb1.Sheets(1).Cells(1, 4)) Then 
    'if that string has already been logged ie this is not the first pass of the current string, log it 
     strdict(wb1.Sheets(1).Cells(1, 4)) = strdict(wb1.Sheets(1).Cells(1, 4)) + 1 
    Else 
     strdict.Add wb1.Sheets(1).Cells(1, 4), 1     
     'if that string is not present, add it to the dictionary 
     dim left(wb1.Sheets(1).cells(1,4), 3) & "log" as Scripting.dictionary 
    End If 
    Next c 

私は

dim left(wb1.Sheets(1).cells(1,4), 3) & "log" as Scripting.dictionary 

が機能しなかったことを驚きましたが、私はと思っています何を達成する方法があると言うことはできません?それともvbaができないものですか?

+0

辞書の辞書に基づいて更新? –

+0

私はそれを考えましたが、まだそれらの名前を付ける必要はありませんか?彼らは名前を共有することはできませんが、別の名前を付ける方法はわかりません。セルデータは明らかな選択肢でしたが、それを使用するのは好きではないようです。 –

+1

とにかく一意の変数名が必要です。別のアプローチは、異なるセルに対して異なるキーを有する単一の辞書を使用することである。タグ付きキーを取得するには、セルアドレスをキーと結合します。別の注記では、「For c = 1 to 65536」は問題があるようです。あなたは本当に65000行のデータを持っていますか? –

答えて

2

投稿したコードに基づいて複数の辞書が必要ではありません。 Col Dからはっきりとした値とカウントを取得したいと思うようですか?

EDIT:はあなたの説明

dim wb1 as workbook 
dim dictCount as new scripting.dictionary 
dim dictSub as new scripting.dictionary 
dim k, kSub 

set wb1 = ThisWorkbook 

For c = 1 To 65536 

    k = wb1.Sheets(1).Cells(c, 4) 

    'seen this key before? 
    If Not dictCount.Exists(k) Then   
     dictCount.Add k, 0 
     dictSub.Add k, New Scripting.Dictionary 
    End If 

    dictCount(k) = dictCount(k) + 1 'increment count 

    'track sub strings 
    kSub = Left(k, 3) 
    If dictSub(k).Exists(kSub) Then 
     'increment the count 
     dictSub(k)(kSub)=dictSub(k)(kSub)+1 
    Else 
     dictSub(k).Add kSub, 0 
    End If     


Next c 
+0

上記のとおりですが、よりクリーンなスレッドでは簡単です。記録される各文字列には、サブ文字列が添付されて記録され、カウントされる必要があります。私は1つの辞書でそれを行うことはできないと思う。文字列を数える1つの辞書、部分文字列を追跡する1つの辞書が必要です(私は思っています)。 –

+0

単一のキーは、異なるキーとなるため、異なる部分文字列を持つことはできません。 –

+0

それは私が考えたものです。あなたが編集後に投稿したものは...まあ、私が持っていたよりもはるかにエレガントでした。私はそれを理解しようとしていたが、以前は 'dictSub(k)(ksub) 'は見ていないのだろうと思っていた。それはちょうどdictSubの中のサブ辞書を指していますか?だから、dictSubにはkにキーが付いた辞書があり、それにはksubと呼ばれるキー入力がありますか?私はそれを正しく読んでいるのですか? –

関連する問題