質問: v end if こんな感じになるのではないかと。
回答: > 『vb的なコード』とはどの部分を指しているのでしょう? これについてはわかりません > dictionaryが面白くてそっちのやり方だけに拘ったのが失敗なのかな。 > dictionary自体不要な物と時代は流れたのでしょうか。 そんなこと、無いと思いますよ 遅い vlookup より使い道あると思いますけど・・・ クロス集計もやり易くなったりしますね・・・ ただ、dictionary の使い方も色々あって 1) 情報を dictionary にため込む 2) 位置だけを覚えさせる 等々 提示されていたのは 1) の方法ですね 2) の方法にしてみると 対象データを読み込んだ変数内で詰め直すことを・・・ どこに詰め直したかを dictionary に覚えておくだけにしてみると 例えば public sub samp1() dim dic as object dim va as variant dim i as long, k as long, n as long set dic = createobject("scripting.dictionary") with range("a2", cells(rows.count, "a").end(xlup)) va = .resize(, 3).value end with n = 0 for i = 1 to ubound(va) k = dic(va(i, 1)) if (k = 0) then n = n + 1 dic(va(i, 1)) = n va(n, 1) = va(i, 1) va(n, 2) = va(i, 2) va(n, 3) = 1 else va(k, 2) = va(k, 2) + va(i, 2) va(k, 3) = va(k, 3) + 1 end if next if (n > 0) then range("f2").resize(n, 3).value = va end if set dic = nothing end sub この方法にしてみると、 データの入手・書き出し、各1回で高速化が見込めたり・・・ なお、array(r.range("b1"), 1) ここで注意すべきは、配列添え字と配列の中身 option base 1 があっても無くても動くように記述しておくとか、 r.range("b1") → r.range("b1").value と、「値」にしておくとか ちなみに、1) の方法で書き出し回数をそれなりに減らしてみると 以下の様に記述できたり・・・ public sub samp2() dim dic as object dim va as variant, v as variant, vt(1 to 2) as variant dim i as long set dic = createobject("scripting.dictionary") with range("a2", cells(rows.count, "a").end(xlup)) va = .resize(, 2).value end with for i = 1 to ubound(va) v = dic(va(i, 1)) if (isarray(v)) then v(1) = v(1) + va(i, 2) v(2) = v(2) + 1 else v = vt v(1) = va(i, 2) v(2) = 1 end if dic(va(i, 1)) = v next i = dic.count if (i > 0) then with range("f2").resize(i) .value = worksheetfunction.transpose(dic.keys) with .columns(2).resize(, 2) .value = worksheetfunction.transpose( _ worksheetfunction.transpose(dic.items)) end with end with end if set dic = nothing end sub ※ バージョンによっては transpose で扱える配列の大きさに制限があったり・・・