[[20180613103514]] 『「オートメーションエラーの対処について』(T18) ページの最後に飛ぶ

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

 

『「オートメーションエラーの対処について』(T18)

投稿
[[20171229121046]] 『オートメーションエラーについて』(ナナ) 
について...

お世話になります。

新規パソコン(PC)に移行したマクロで「オートメーションエラー」が出ました。
初めてのことで自分なりに調べましたが対処できず、ここに辿り着きました。

現象としては、この質問者さんと同じ「Set xx =...ArrayList")」の部分での発生です。
回答者さんの「ArrayListは環境によって使用できない・・」についてお尋ねします。

・参照設定としては他にDictionaryとSortedListを使うマクロがありますが、これらは環境には依存しないと
考えてよろしいでしょうか?
(Dictionaryの方は今のところ問題なく動いていますが、SortedListの方は諸事情で未だ確認できていません)

・新規PCを確認すると、FrameworkとFramework64の2つのフォルダがあり、前者には複数のバージョンの
フォルダが、後者には4.0のフォルダしかありません。
また、どちらにもバージョン3.5はありません。
他のサイトでバージョン4.xではなく3.5が必要、との記事を見て、3.5をインストールすればいいと思いましたが、Framework,Framework64どちらのフォルダにインストールすればいいのでしょうか?
(あるいは両方でしょうか?)
インストール画面に従えば勝手に適切な方にインストールされるのでしょうか?
過去にインストール作業で痛い目にあっており、具体的に助言いただけると助かります。

よろしくお願いします。

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


 下記だと4.Xバージョンでおこなっているようだが。
 あと、環境によっては参照設定が必要とある。

https://vbabeginner.net/vba%E3%81%A7-net-framework%E3%81%AEarraylist%E3%82%92%E4%BD%BF%E3%81%86/

(ねむねむ) 2018/06/13(水) 11:18


ねむねむさん、 早々にありがとうございます。

う〜ん、私が訪問したサイトとは異なる記事内容に困りました。

そもそもFrameworkや参照設定の理解も乏しく、どちらが正しいのか
判断がつきません。(涙)

もう少し時間かけて調べてみます…
(T18) 2018/06/13(水) 14:13


元のコードの変数名をみると、大元は私が教えたものかな? 以下を見ると、ArrayListは.NET Framework1.1以降で良くて、WINDOWS10なら標準でインストールされている、という認識です。
https://msdn.microsoft.com/ja-jp/library/system.collections.arraylist(v=vs.110).aspx

とりあえず、試してみて欲しいことなぞ。 まず、「参照設定」に「Common Language Runtime Library」というのがあれば、これをチェックしてください。そして、変数宣言を以下のように変えてみてください。(レイトバインドがうまくいかないようなら、アーリーバインドに変えてしまう)

    Dim AR As Object
    Set AR = CreateObject("System.Collections.ArrayList")
    ↓
    Dim AR As New mscorlib.ArrayList
(???) 2018/06/13(水) 14:57

 >・参照設定としては他にDictionaryとSortedListを使うマクロがありますが、
 >これらは環境には依存しないと考えてよろしいでしょうか?
 >(Dictionaryの方は今のところ問題なく動いていますが、
 >SortedListの方は諸事情で未だ確認できていません)
多分、いろいろご自分でも調べられてるようですが、
https://msdn.microsoft.com/ja-jp/library/system.collections(v=vs.110).aspx
SortedList と ArrayList は同じライブラリの中にある(ファイル名でいうとmscorlib.dll )よう
だから、どっちかがだめならもう片方もだめかも?

Dictionaryは、Scrrun.dll ってファイルにあるのかな?
だから影響はないかも。というか標準でエクセルについてくるはず。

SortedList と ArrayList は、
何かのついでにはダウンロードされているはずだけど、
エクセルとは直接関係ないので、ダウンロードされてたらラッキー的な扱い?
事前バインディングはなぜかできないみたいだし、
万年初心者の僕なんかは、よく知らないので、他のプログラムと連携してなにかをするのは、
手を出すのは怖いかも。

(まっつわん) 2018/06/13(水) 16:35


 自己削除
(seiya) 2018/06/13(水) 16:57

???様
Win10でも問題ないハズ、ということですね。

確かに件のマクロは自宅の別のWin10パソコンで問題なく動きました。
となると、PCハードの問題でしょうか?
また、書かれている参照設定はWin10には必ずあるものでしょうか?
※問題の新規PCを使える環境にありませんので今使用中のWin7PCを確認したら、
一覧になかったもので…

まっつわん様
ご紹介サイトの「クラス」と「構造体」の文字で既に怖気づいてしまいました。
自分には荷が重そうです…

seiya様
「v2.0.50727 」はフォルダ名でしょうか?
であれば、確か、Framework64ではなくFrameworkフォルダの中にあったように思います。
帰宅して確認してみます・・・
(T18) 2018/06/13(水) 17:08


 念のため確認。
 Excelそのものは32ビット版、64ビット版どちらなのだろうか?
 ファイル-ヘルプのMicrosoft Excelのバージョン情報で確認できる。
 (通常のインストールであれば32ビット版だとは思うが)
(ねむねむ) 2018/06/13(水) 17:15

オートメーションエラーが起こる「新規PC」と起こらない「別PC」についての確認結果です。
(今や旧PCは、システムすら起動できなくなっていましたので確認不可)

・OS;どちらも「Win10 64bit」です
・エクセル;新規PC「2010 32bit」、別PC「2016 32bit」
・「Framework」フォルダ内にある「v」が付くフォルダ名
−新規PC;v1.0.3705, v1.1.4322, v2.0.50727, v4.0.30319
−別PC;v1.0.3705, v1.1.4322, v2.0.50727, v3.0, v3.5, v4.0.30319
・「Framework64」フォルダ内にある「v」が付くフォルダ名
−新規PC;v4.0.30319
−別PC;v2.0.50727, v3.0, v3.5, v4.0.30319
・???さん記述の参照設定は、どちらも一覧にありませんでした
(よく似たCommonで始まる単語はありましたが)

両者の違いである「v3.0, v3.5」が関係しているのでしょうか?
互換性の観点から、上位バージョンの「v4.x」があればそれ以前はカバーできる、
というのは通用しないのでしょうか?

(T18) 2018/06/14(木) 00:08


 >mscorlib.tlb
 >これが無いとダメです。
 >これに参照設定すると

了解です。確認しました。

mscorlib.dll
こっちの方を一生懸命参照設定しようとして叱られてました^^;(思い込みはこわいですね^^;)
( ..)φメモメモ

T18さん>
たぶんバージョンがどうのよりも、
参照する対象ファイルがあればいいと思うので、
mscorlib.tlb
mscorlib.dll
があるか確認したらいいと思います。
そのうえで、
参照設定の一覧に、
Common Language Runtime Library
が無ければ、さらに参照ボタンから、↓ファイルを探し選択したらよさそうです。

************************************************************************************

  C -> Windows -> Microsoft.Net -> FrameWork -> v2.0.50727 -> mscorlib.tlb
                        ~~~~~~~~~~~
                                                    ↑ここは最新のバージョンを選ぶ?

************************************************************************************

要はそこに書いてあるプログラムを呼び出して使ってるイメージだと。>ArrayList

(まっつわん) 2018/06/14(木) 10:47


まっつわんさん
 >たぶんバージョンがどうのよりも、参照する対象ファイルがあればいい・・

今、実機確認できる環境にありませんが、使用中のwin7/2007PCで検索すると
複数のファイルがヒットしました。
この中から最新の「Framework」のバージョンを選べばいいわけですね。

この時、「Framework」フォルダ内か「Framework64」フォルダ内かは
不問でいいのでしょうか?
(T18) 2018/06/14(木) 15:15


 自己削除
(seiya) 2018/06/14(木) 16:17

seiyaさん、 ありがとうございます。

もう一点事前確認をさせてください・・

上記の参照設定ができたとして、アーリーバインドは「Dim AR As New mscorlib.ArrayList」、
「Dim AR As New ArrayList」どちらでもOK?
(T18) 2018/06/14(木) 16:26


 自己削除
(seiya) 2018/06/14(木) 16:40

ありがとうございます。

参照設定(Framework64フォルダ内にありました)はできたのですが、コード変更のところで
見覚えのないエラーが発生し、“時間切れ”となってしまいました。

2年ほど前の、おそらく本校から拝借したコードを十分に咀嚼せず使用してますので、
原因特定まで時間かかりそうです。(自業自得です、はい;涙)

解決に至らなかった場合は、よろしくお願いします…
(T18) 2018/06/15(金) 09:12


参照設定後のコード修正でお手上げです。
問題の箇所のコードを抜粋しますので、ご教授願います。

概説)
・全体のマクロは、転記されたデータを計算等の処理をさせて20数列にわたり出力させています
・抜粋したマクロは、この内の「AI」列の処理に関する部分です
※処理;AK列の「同組」内で、AY列の数値の3番目に大きい値を「rai」に格納

自力で修正できないのは、dicDがDictionaryとArrayListを参照しているところを
咀嚼できていないからだと思っています。
よろしくお願いします。

 ...
 Set rai = Range(Cells(2, "AI"), Cells(maxb, "AI"))
 ...
 Dim id As Variant
 ...(ここから一塊です)
 Dim dicA As Object
    Dim dicD As Object
    Dim c As Range
    Dim vai As Variant
    Dim mx As Long
    Dim num As Variant
    Dim ww As Variant

    Set dicA = CreateObject("Scripting.Dictionary")
    Set dicD = CreateObject("Scripting.Dictionary")

    mx = Range("AY" & Rows.Count).End(xlUp).Row
    ReDim vai(2 To mx, 1 To 1)

    For i = 2 To mx
        id = Range("AK" & i).Value
        num = Range("AY" & i).Value
        If id <> "" Then
            If IsNumeric(num) Then
                If Not dicD.Exists(id) Then Set dicD(id) = CreateObject("System.Collections.ArrayList")
                dicD(id).Add num
            End If
        End If
    Next

    For i = 2 To mx
        id = Range("AK" & i).Value
        If dicA.Exists(id) Then
            vai(i, 1) = dicA(id)
        Else
            If dicD.Exists(id) Then
                dicD(id).Sort
                dicD(id).Reverse
                ww = dicD(id).toarray
                num = ww(WorksheetFunction.Min(UBound(ww), 2))
                vai(i, 1) = num
                dicA(id) = num
            End If
        End If
    Next
    rai.Value = vai

(T18) 2018/06/15(金) 13:34


元は、[[20160830164232]] ですかね? βさん作でしたか。(自分で全部考えたのでないならば、引用元を明らかにすべき)
で、Dictionaryの1要素にArrayListを割り当ててる…。 これ、ビット数ばらばらなせいでエラーになっていたりしませんか?

とりあえず、以下のコードは動きますか?

 Sub test()
    With CreateObject("System.Collections.ArrayList")
        .Add 12
        .Add 2
        .Add 1
        .Add 3
        .Sort
        MsgBox Join(.toarray, vbLf)
    End With
 End Sub
(???) 2018/06/15(金) 14:10

 自己削除
(seiya) 2018/06/15(金) 14:12

 自己削除 
(seiya) 2018/06/15(金) 14:44

???さん
引用元の件、失礼しました。 以後気をつけます。
(当時のことがおぼろげで、探しあぐねていました)

不安を抱えているみたいですが、旧PC時代にこのコードでトラブった記憶はありません。
testコードは実機で試して報告するようにします。
(今使用のwin7/2007でも件のコードは正常に動き、testコードも問題ありませんでした)

seiyaさん

 >1) wwは一次元配列なので , 2)はおかしい。
→すみません、ちょっとわかりません・・
 >2) Minでは無くLarge関数
→降順に並べたwwの3番目に大きい数値の要素なので、minでいいかと思うのですが・・
(結果も合っています)
Dictionaryへの置換は次の段階で、と思っていましたが、先を読んでいただいて
ありがとうございます(^^)。 実機で試させていただきます…

(T18) 2018/06/15(金) 15:28


 自己削除
(seiya) 2018/06/15(金) 16:31

testコードが動くということは、ArrayListが使える環境は整っていた、という事ですね。 皆、ArrayListが使えないのは何故?、と考えて、いろいろアドバイスしていたと思うのですが、全て無駄だった、ということです。 肝心なのは、Dictionaryの中にArrayListを入れていた、という部分。 動かなくなったのは、OSを64bit版に変えたからでは?

元のコードが、なんで難しい事をしているのかというと、元の条件で3番目の値、というのがあり、これを実現するためにソートしたかったのでしょう。 Dictionary だとソートできないので、ArrayListを併用して実現したのですね。

新しい環境でこれが使えないならば、オブジェクトの入れ子構造なんて使わない、全く別なコードを考えた方が良いように思います。 2年間の経験を活かして、元のコードに囚われずに、心機一転作り直しましょう。
(???) 2018/06/15(金) 18:29


???さん

実機(新規PC)では、testコードは「アプリケーションエラー」でした。
(win7/2007PCが誤解を与えてしまいました、すみません)

ということは、コードの修正で解決できそうですが、既述しましたように、
修正方法がわかりません。

作り直しは“宿題”として、再度アドバイスいただけないでしょうか?

(T18) 2018/06/16(土) 09:00


修正方法が分からないとか、コードを貰うだけで満足して勉強を疎かにしてる証拠です。
身の丈に合ったコードから理解しながら、ステップアップする気は無い。
と言う事ですか?

そもそも、こんなややこしい処理がどうしても必要なんですか?
ak列 昇順、ay列 降順、で並べ変えたら
match関数でak列を検索して、+2行のay列の値が目的の結果では無いんですか?

(sy) 2018/06/16(土) 09:44


予め並べ替えしてれば、こんな数式を一括代入で出来そうですけど。
 =if(ak1=ak2,ai1,index(ay:ay,match(ak2,ak1:ak6000,0)+2))

6000行程度ならこれで問題無さそうですけど、
これでは使えないくらい遅いですか?

(sy) 2018/06/16(土) 10:00


indexやmatchすら要らないですね。

 =if(ak1=ak2,ai1,if(ak2<>ak4,"",if(ay4="","",ay4)))

(sy) 2018/06/16(土) 10:40


 >修正方法が分からないとか、コードを貰うだけで満足して勉強を疎かにしてる証拠・・

う〜ん、重いですね、これは…
※これから先は本件とは直接は関係ありませんし少々長くなるので、気に障る方はスルーか管理人の方は削除いただいて構いません。
 以下、現時点の私の考えです。

少なくとも「勉強を疎かに」については反論はできません。(涙)
ただ、「コードを貰うだけで満足して」については・・・

おそらく、ここを訪れる方はエクセルの知識・技能については、山に例えると麓から頂上近くの方までいろいろだと思っています。
(もちろん、本校のご教授陣や私が達人と崇める方はこの範疇外の方々です)
また、ここを訪れる動機もそれこそ千差万別でしょう。
敢えて大別するとして、以下でしょうか。
1.取り急ぎ、学校や仕事あるいは趣味で目の前の事を処理したい(解決さえできればそれでいい)
2.学校や仕事あるいは趣味で、エクセルを活用したい
3.エクセルが大好きで、いろいろ吸収したい(ある意味、趣味のレベル?)

本校が受け入れてくれるのは上記のどれでしょうか?

もちろん、上記とは別に掲載のマナーの問題もあるかとは思います。
本件では確かにマナー違反(引用の件です)については反省しています。

ですが、1.を排除されると正直つらいです。
本件の私の動機は2.ですが、とりようによっては(あるいは文章の不味さで)1.と判断されても
しかたない、というケースはいくらでもあると思うからです。
(本音の部分では、1.をキッカケにエクセルのすごさを知るのもあり、と思っています)

本件は、今まで動いていたマクロがPC変えたら動かなくなった、何でだろう・・というものです。
今まで使用していたマクロは今のPCではこういう理由で動かないよ、ここをこう弄ったらいいよ、というのを求めたものです。
いや一から作り直さないと、といわれれば宿題とするつもりです。

アドバイスをいただき、参照設定すればいいということなので、あとはアーリーバインド・・ただ、ここの手段がわからない。
「後一歩」と思っているのですが、“もっと勉強しろよ”(私はそう解釈しました)となると、どうしていいものか・・・という思いです。

(T18) 2018/06/16(土) 23:41


 これにレス返すならちょっと長文になるので申し訳ありません。

 私はT18さんが、1〜3のどれであってもそれが悪いとは言ってませんよ。

 コードを貰って満足してると言うのは、単にT18さんの現状がそう見えるので、そのまま述べただけです。

 それと今回の質問に関して言えば、
 >“もっと勉強しろよ”(私はそう解釈しました)
 と言う事ではなく、 
 >修正方法がわかりません。 
 >作り直しは“宿題”として、再度アドバイスいただけないでしょうか? 
 との発言を見て、私のレスで出来ると思いますけど、並べ替えと言う基本的な事を実行するだけで、
 IF関数3つだけで出来るような簡単な事に、ArrayListのような理解の追い付いていない外部オブジェクトの
 VBAの範疇を完全に逸脱しているようなものに拘ってるように思いましたので、
 失礼な事を申し上げて大変申し訳ありませんが、
 問題そのものは解決するかも知れないけど、理解はしないだろうなぁと思いました。

 なので、
 >身の丈に合ったコードから理解しながら、ステップアップする気は無い。 
 >と言う事ですか?
 とお聞きしました。

 私のT18さんの印象は、ループやEXCELの機能、数式などの基本的な事の学習がおろそかになっていて、
 (複雑な数式の組み立てではなく、私の上レスのようなIF文や、LOOKUP系やMATCH、INDEXなどの検索関数や、
 SUMIFS、COUNTIFSIFSなどの集計関数などをいくつか組み合わせて出来る程度の簡単な数式の事です)
 完全に応用分野の回答を貰って満足してるような感じが見受けられます。
 (過去レスをざっと見しただけなので誤解があればすいません)
 まぁそんな回答をする回答者の方にも問題はあると思いますが。

 他の回答者さんに反論されても面倒なので補足すると、今回のように簡単に出来る方法をまず模索して、
 速度面などで問題があれば、再質問の流れが良いと思いますと言う事です。
 いきなりAPIとかArrayListなどの外部オブジェクトなどの回答だと、なぜ???と言う印象です。

 以前指定範囲の最終行取得の質問の時にも言いましたけど、もっと基本を学ぶ方が先ではないでしょうか。

 今現在業務で必要なのでと言う理由は同情の余地はありますが、訳の分からないコードを仕事で使うなんて
 かなり無責任な仕事の進め方と私は思います。
 私ならは自身が理解できないコードなどは絶対に実務で使用しません。
 効率が落ちたとしても、自分でメンテナンス出来るコードしか使いません。
 その分自宅で十分勉強して、必要なら修正コードも自宅で作って(自宅作成は良い事かは微妙ですが)、
 少しづつ改良を重ねて使用しています。

 私はよくネットで調べるけど質問はしません。
 完全に使えなくても、とにかくサンプルコードを書いて実行してみて、
 自分の望む結果に不足分を、更に検索を繰り返してと言うスタイルですので。

 質問をすれば教えてくれますけど、自分で調べて考えて実行してエラーで悩まないと、
 応用の利かない知識になってしまい、 且つ100%分かってなくても分かった気になるので、
 以降の学習がおろそかになってしまい、習得速度が遅くなるからです。
 (もしくは質問事項に関しては成長0もあり得ます)

 後私もArrayListは使えません。
 6月に新規購入した、win10、Officeもプレインストール済モデルです。
 OS Win10 64bit ビルド17134.112、Offise365EXCEL2016 32bit ビルド16.0.9330.2073
 Frameworkの対応バージョンがインストールされていても、必ず使えるとは限らないみたいですね。

 ただはEXCELを使用している限り、数式やEXCELの機能を活用したコードに比べて、
 ArrayListなどにメリットを1つも感じないので、使えるようにしたいとも思わないので、
 原因を調べる気も起きないので、どうしても使いたい場合はお力になれずにすいません。

(sy) 2018/06/17(日) 02:23


  >アドバイスをいただき、参照設定すればいいということなので、
  >あとはアーリーバインド・・ただ、ここの手段がわからない。
んとニュアンス的には、
事前に参照を手動で行えるようになる。

→必要なアプリケーションのファイル名が解っている。
そして、視覚的に見て設定できて使える。

→ほぼほぼ、自分で何をしているかが理解できている。

という風になって欲しいということだと思います。

つまり、自分が何をしようとしているかが理解できていれば、
Set AR = CreateObject("System.Collections.ArrayList")
といきなり外部のアプリケーションのオブジェクトを、何かの呪文のように盲目的に呼び出して、
エラーが出て、なぜだなぜだと騒ぐ必要はなくなるだろうというニュアンスに、僕は捉えます。
事前にせよ事後にせよ、参照しようとしているアプリが無ければエラーなのですから。
事前に参照できるなら、事後でも参照できますよね?ファイルはあるんだから。

 >上記の参照設定ができたとして、
 >アーリーバインドは「Dim AR As New mscorlib.ArrayList」、
 >「Dim AR As New ArrayList」どちらでもOK?
Sub test()

    Dim al As arr
ここまで入力したらメンバー一覧にArrayListが見た目の2行目に出てきます。
なのでそれを選択したらいいだけです。
もちろん、
    Dim al As msc
ここまで入力してCtrlキー+Spaceキーを押すと、
    Dim al As mscorlib
となると思います。ただし、続けてピリオドを打っても、
特にメンバーが絞り込まれるわけでも無さそうなので
mscorlib.ArrayList
と書くメリットはあまりないかも知れませんが、未来の自分に敢えて
mscorlibというファイルを参照しているよとメッセージを送るつもりなら、
そう書くのもありだと思います。
たまに、
dim c as Excel.Range
と、書く人が居ますよね?
想像ですが、やはりエクセルの中に定義されているオブジェクトだぞという意思表示と、
インテリセンス機能を使ってキーボードを叩く量を減らしたかったり、
タイプミスを減らそうという意図だと思います。

で、Newと書くのはその後です。
Sub test()

    Dim al As ArrayList

    Set al = New ArrayList

    al.
End Sub

理由はネットで調べてみてください。
しかし、Ctrl+Spaceでメンバーが出ないから、
個人的には使えないですねー><
(英語が苦手でメソッドやプロパティのスペルが覚えられないので><)

 >あとはアーリーバインド・・ただ、ここの手段がわからない。
こちらでは、小理屈は抜きにして、mscorlib.tlbというファイルを探して、
盲目的に参照設定しただけでArrayListというクラスが使えるようになったので、
それ以上もそれ以下もないように思います。。
もちろん、エクセルを64bit版にしたら、参照するファイル名が変わる気がします。
ですが、もともと.NET用のクラスなんだから、
情報収集はそっちメインでするのが筋なきがしますし、
動作確認も自己責任で行うべきだと思います。

 >いや一から作り直さないと、といわれれば宿題とするつもりです。
いまが、作り直す時かも知れませんよ?
新しいi7機がただの邪魔な箱になってしまうよりはましかなー?
ArrayListで検索すると、
「使えないと思っていたけど実は使える」という文言をいくつか見かけます。
ということは、「やってみたらたまたま使えた」という事だろうと思います。
つまり環境が揃わなければ使えないということです。
もちろんエクセルのバージョンアップで動かなくなるマクロもありますが、
外部のソフトを使うということは、そういうリスクがさらに大きいということも、
理解しておく必要があると思います。

話しが前後しますが、

 >本校が受け入れてくれるのは上記のどれでしょうか?
ぼくは、ここの管理人でもなんでもないので判断はできませんが、

〜〜〜<初めての方へからの抜粋>〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
(q) このサイト(掲示板)について
ここは『エクセルの学校』が運営している『Excel質問ボード』という掲示板です
これはちょっと変わった掲示板で、だれでも書き込めます
Excelについての質問や答えなどを書き込んでください
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
エクセルについてならなんでも聞けばいいのでは?と、思いますが、
ArrayListがエクセルの範疇かはちょっと微妙では?とも思います。
(参照設定の話は出ているので、それ以上の話はということです。)

まぁ、思いついたら聞いてみればいいのではないですか?
解決に至る回答が得られるかは別の話だし、
見ている人が回答したくなる質問かどうかもわからないけど。

(まっつわん) 2018/06/17(日) 12:37


 >咀嚼できていない

 と嘆いているのに、誰も解説していないような・・

 この部分ですよね・・・確かに分かりにくい。
  ↓
 >If IsNumeric(num) Then
 >    If Not dicD.Exists(id) Then Set dicD(id) = CreateObject("System.Collections.ArrayList")
 >    dicD(id).Add num
 >End If

 以下、私の解釈(精査はしておりません)

 識別IDが有効で、固有データが数値なら処理対象となる。<前段階>

 そして、その識別IDが dicD に登録されていないなら、
 IDをキーにして新規登録し、そのItemを 新規のArrayListオブジェクト とする。

 それが済んだら、ArrayListオブジェクトにnumを登録する。

 最後の部分はここですよ。dicDにnumを登録していると勘違いしていないですか?
       ↓
 > dicD(id).Add num
  ~~~~↑~~~ ~~~↑~~
     (1)   (2)

 (1) IDのItemを取得している → 取得したItemはArrayListオブジェクトである。
 (2) 上記(1)で取得したArrayListオブジェクトにNumをaddする。

   この後、再格納は必要ない様です。オブジェクトだからですかねぇ。
    配列だと再格納が必要だった。

 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 ArrayListが使えないなら、その代わりをするコードに代えればいい。
 以下、ArrayListの代わりに、配列(Top4)を使う案を考えてみました。

 (ここにあったコードは無意味化により、自己削除します。 6/18 15:19)

 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 >1.取り急ぎ、学校や仕事あるいは趣味で目の前の事を処理したい(解決さえできればそれでいい) 
 >2.学校や仕事あるいは趣味で、エクセルを活用したい 
 >3.エクセルが大好きで、いろいろ吸収したい(ある意味、趣味のレベル?) 
 >本校が受け入れてくれるのは上記のどれでしょうか?

 本音ベースでは、1が多いんじゃないですか。当然です。
 エクセルは仕事の極く一部であり、それを使って本業に時間を費やすのが筋ですから。

 全部、受け入れますよ。

 管理人さんに確認していませんけど、そう言う考えを持っている人だと思っています。
 心が広い人なんです。マルチポストだって許容するんです。

 管理人さんの意向とは別に、回答者の個人的な意向もあります。
 むしろ、現場ではこれが前面に出ることが多い。

 でも、個人的な意向なので、聞き入れなきゃならない様なもんじゃないです。

 まぁ、「説教したがり型」「突き放し型」「勉強させたがり型」の回答者に当たったら(※)、
 適当にあしらっていれば、別の意向を持った回答者があとから出てきますよ。
 回答者だって千差万別の動機でレスを入れているんですから。

 (※)特に前2型は、中身薄っぺらなパワハラ型が多い(本人は気づいていないから始末に悪い)。
   最後尾のは、ありがた迷惑と感じる人もいれば(大のおとなですから「勉強しろ」も無いもんです)、
   本当にありがたく思う質問者もいます(この人は成長します。少ないだろうなぁとは推測しますけど)。

   因みに、私は親でもなければ、上司でもないので、他人の成長には関心ないです。
   本人の問題だと思うので。

(半平太) 2018/06/17(日) 13:19


syさん、まっつわんさん、半平太さん
“与太話”に真摯にコメントいただき、先ずは感謝いたします。

いろいろ思うところ、試してみたいことはあるのですが、週半ばまではPCの前におれる環境になく、
失礼します。

 >コードを貰って満足してると言うのは、単にT18さんの現状がそう見えるので、そのまま述べただけ・・
 >問題そのものは解決するかも知れないけど、理解はしないだろうなぁと思いました
 >完全に応用分野の回答を貰って満足してるような感じが見受けられます
 >今回のように簡単に出来る方法をまず模索して、速度面などで問題があれば、再質問の流れが良いと思います
 >もっと基本を学ぶ方が先
 >質問をすれば教えてくれますけど、自分で調べて考えて実行してエラーで悩まないと、応用の利かない
 >知識になってしまい、 且つ100%分かってなくても分かった気になるので、以降の学習がおろそかに・・

⇒ひとえに“不徳のいたすところ”としか今はいいようがありません…

 >で、Newと書くのはその後です

⇒ここのところで「定義エラー」が出て進めません、参照設定はできていると思うのですが・・??

先の山の例えでいうならば、私自身はようやく2,3合目辺りかなと思っています。
(自惚れるなっ、という突っ込みは「なし」でお願いします^^)

この辺りの者は、頂上付近がどうなっているのか、わからないんですね。
「わからないことがわからない」
で、「ArrayList」ですが、どうやらエクセルの標準仕様ではなさそうですね。(それすらわからない)
なんかとんでもないものに触れてしまった?(笑)

“身の丈を知る”のは大事ですが、“火傷してでも”という思いもあり・・(うまく言えません)

本件は、「解」が欲しいだけではないのだけはわかって欲しいです。
多少不便はあるにせよ、他のPCでは問題なく動くので・・・

“ただ知りたい”(なら、勉強しろよ、ですかねやはり^^)

 >因みに、私は親でもなければ、上司でもないので、他人の成長には関心ないです。本人の問題・・

⇒こういうの、嫌いじゃないですね、まるで心を見られているようで^^

因みに、みなさんに提示いただいたコードは未だ確認できていません。
冒頭の理由に加え、“一から”のコード見直しは宿題と思っていますので。
(先に回答みたらズルですよね)

ただ、ヘルプの時はよろ・・これがダメなんですよね・・^^
(T18) 2018/06/17(日) 23:16


 >(要件) 
 >・AK列、AY列は入力データです →AK列;識別ID、 AY列;固有データ(数値) 
 >・AI列(作業列)に以下を出力 
 > 1)AK列の同じ識別ID内のAY列の「大きい順から3番目」の数値を出力する 
 > 2)下記の場合には「""」を出力 
 >  イ.AK列が8桁の識別ID以外の時 
 >  ロ.AY列が数値以外の時 
 >  ハ.今回の要件の想定外の場合 
 > 3)「大きい順から3番目」の定義 
 >  イ.同値を含む(10,10,10,7,7,5 とあった場合、10が該当) 
 >  ロ.3番目がない場合は2番目が該当、2番目なければ1番目が該当 

 こう言う要件だったんですね。
 ちょっと見落としてて、コードが動かないから、初めの数式で判断してました。
 これではIF文だけでは出来ないですね。
 大変申し訳ありませんでした。

 今回はとにかく元コードを動かしたいと言う事みたいなので、
 此方に関しては有効なアドバイスが出来ないので申し訳ありませんが、
 現時点で要件を全て満たせる代替え案も出てないので、
 一応要件を全て満たす代替え案を提示しておきます。

 Sub test1()
    Dim t As Double

    t = Timer

'--------1

    Range("AZ2").Value = 1
    Range("AZ2").AutoFill Destination:=Range("AZ2:AZ" & Range("AK" & Rows.Count).End(xlUp).Row), Type:=xlFillSeries
'--------2
    Range("A:AZ").Sort Key1:=Range("AK2"), Order1:=xlAscending, Header:=xlYes
'--------3
    With Range("AI2:AI" & Range("AK" & Rows.Count).End(xlUp).Row)
        .Formula = "=IF(AK1=AK2,AI1,IF(LEN(AK2)<>8,0,IFERROR(LARGE(AY2:INDEX(AY:AY,MATCH(AK2,AK:AK)),MIN(3,COUNT(AY2:INDEX(AY:AY,MATCH(AK2,AK:AK))))),0)))"
        .Value = .Value
        .Replace What:=0, Replacement:="", LookAt:=xlWhole
    End With
'--------4
    Range("A:AZ").Sort Key1:=Range("AZ2"), Order1:=xlAscending, Header:=xlYes
    Range("AZ:AZ").ClearContents

    Debug.Print Timer - t

 End Sub

 数式部分は少し複雑になってしまいましたが、そんなに難しい組み立てでは無いので理解は早いと思います。

 元スレでのデータ抜粋では同じコードは一塊になっているみたいなので、AK列を予め昇順でソート出来るなら、 
 '--------3の数式セットの部分だけで良いので、test2なら速さ的にも最速です。
 代替0.1秒未満くらい、まぁ半平太さんのコードも私のセレロンマシーンでも0.25秒くらいなので、
 i7マシーンとかなら差は出ないかも?

 test1でも1.5秒くらいなので(2回ソートしてるので、2回目の戻す必要が無ければ半分です)
 i7マシーンなら1秒未満になりそうなので、問題は無いと思います。

 Sub test2()
    Dim t As Double

    t = Timer

    With Range("AI2:AI" & Range("AK" & Rows.Count).End(xlUp).Row)
        .Formula = "=IF(AK1=AK2,AI1,IF(LEN(AK2)<>8,0,IFERROR(LARGE(AY2:INDEX(AY:AY,MATCH(AK2,AK:AK)),MIN(3,COUNT(AY2:INDEX(AY:AY,MATCH(AK2,AK:AK))))),0)))"
        .Value = .Value
        .Replace What:=0, Replacement:="", LookAt:=xlWhole
    End With

    Debug.Print Timer - t

 End Sub

(sy) 2018/06/18(月) 00:35


 あれ?

 咀嚼できていないので「自力で修正できない」と言うのは、
 「Newをどこに入れるか分からない」ってだけの意味だったんですかぁ?

  それなら単に「Newの使い方」の問題ですよね?
 「咀嚼」してなくても出来ることだと思うんですけど・・

 > Set dicD(id) = CreateObject("System.Collections.ArrayList")
                    ↓
   Set dicD(id) = New ArrayList

 syさんへ

 もともとβさんのコードでして、ArrayListが関係する部分を別案にしたものです。

 速度的には、こう云うのは逐次アクセスなのでマイナスと思ったんですけど、"咀嚼"(?)が絡んでいたので手を入れておりません。
        ↓   
 >id = Range("AK" & i).Value
 >num = Range("AY" & i).Value

 T18さんの話のトーンからすると、私のも“一から”のコードに分類されるようなので、削除しようかと思っています。

(半平太) 2018/06/18(月) 08:06


βさんのは動かないので分からないんですけど、
半平太さんのは凄く速いなぁと思いました。
seiyaさんの方がβさんコードに近いから(2秒ちょい)
arraylistが遅いのかな?

はい、要件を満たすかどうかは、半平太さんもseiyaさんも
βさんのコードのarraylist部分しか弄って無いので、
元コードもak列が8桁以外の時でも集計してしまうんだろうなと思いました。

まぁでも今まで問題起きてないなら対した事は無いのかなぁとも思いましたけど。

今回のT18さんの目的とは違うけど、T18さんが目障りじゃなければ、
色々な方法例はあれば誰かの為になるかも知れないので
残して置いても良いかなと思うんですけどどうでしょう?
特に半平太さんやseiyaさんの記述は凄く学べる事が多いので。

もちろんT18さんが邪魔と感じるなら私も削除します。

(sy) 2018/06/18(月) 12:48


 自己削除。
(seiya) 2018/06/18(月) 14:44

 2018/06/17(日) 13:19 に書いたコードは無意味化により、自己削除します。

(半平太) 2018/06/18(月) 15:22


 >>で、Newと書くのはその後です
 >⇒ここのところで「定義エラー」が出て進めません、参照設定はできていると思うのですが・・??

参照設定が出来ている「はず」なのに、
アプリケーションまたはオブジェクトの定義エラー
となるなら、
存在しないシートを参照してるのと同じで、
存在しないオブジェクト(=プログラム)または使えないオブジェクトを参照してるという事では?

多分OSは64bitで、
Excelは32bitなのかな?
よくわかんないなら、触らない方が無難そうですね。

.NetのFrameworkはWindowsのおまけで付いてきますが、
同じマイクロソフトとはいえ、開発チームは全く別なので、
特にVBAで使えるように気を付けてもらえるわけではないでしょう。
(そもそも一部しか使えないようですね?)

知識として知っておきたいという気持ちはわからないでもないですが、
これ以上の情報は出てこないような気がしますし、
他の方の書き込みを読んでも、
おまけ程度のarraylistを探求する意味はほぼないだろうと感じます。

そんなことより、代替のコードがすんなり書けるようになる(速いとか遅いを別にして)
ことの方が重要な気がします。
(手でやるよりは速くて間違うことがないのなら、プログラムを組む意味があると思うので、
一足飛びに高速化ばかりを追求するのは(そのように見える)なにか違う気がします。)
質問から5日目ですかね。
最初から、だめなら代替案をと向かっていたら、そろそろ、代替のアプリが完成するころでは
ないでしょうか。。。

(まっつわん) 2018/06/18(月) 16:19


http://www.moug.net/faq/viewtopic.php?t=77200

呼び出してるものも、
エラーメッセージも違うようですが、
こちらも苦労されてますね。

https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_excel-mso_other-mso_archive/createobjectについて/048295a4-0f87-4654-98b7-bbd1aad1398f?messageId=1f526351-399d-4068-9675-7fa840fc78ba

こちらはXPの64bitの話のようですが、
参考になるでしょうか?

ちょっと調べてたら引っかかったので。。。

(まっつわん) 2018/06/19(火) 13:47


半平太さんご提示の「New」のコードでもオートメーションエラーになってしまいます。
多くの方にコメントいただきましたように、これ以上はArrayListに拘るのはやめて、
コード修正に挑戦したいと思います。

よって、ご提示いただいたコードやコメントは多いに参考にさせていただくつもりですので、
勝手なお願いかもしれませんが、削除しないでいただけると助かります。
修正に関する部分でご教授いただきたい時は、新規アップさせていただきます。
(もちろん、参考リンクは忘れないようにします)

−お詫び−
コメントへの応答ができず、申訳ありませんでした。
ようやくPCを使えるようになりましたが、公私にわたりテンパッておりましてコード修正もいつになるか・・・

この度は私の対応の拙さで半平太さんのコードが削除されましたことは、ご訪問された方に対しても
申訳なく思っています。
私自身、他の質問者さんへの回答をみてエクセルを独習してきたので、非常に残念な結果を招いてしまった、
と悔やんでも悔やみ切れない思いです。

私は知らない分野についてはマルチにかつ素早く事を処理できないタチで、今回もせっかくのご提示コードを、
ArrayListが解決するまでは“置いておこう”と思ったのは事実ですし、現在の状況もそうです。
この辺りは時間の制約もあり難しいところではありますが、気をつけたいと思います。
(因みに、即応とはならずとも、ご提示されたコードを一度も試さないことはないです)

これからもよろしくお願いします…
(T18) 2018/06/25(月) 13:03


案の定?自力ではムリでしたので、syさんコードを確認させていただきました。
現コードと同じ結果で処理も速かったです。(手元のwin7マシンで)

関数式が思い浮かばず四苦八苦しておりましたが、後半の「..,MIN(3,COUNT(...」をみて
“なるほどなぁ”と感じ入りました。
また、作業列の追加とクリア、2回のソート、関数式がある割には?現コードより
処理が速いのにも驚きました。
やはりループの有無の差と「ArrayList」でしょうか?
先入観ってダメですね・・・勉強になりました。
補足)
・AK列は別のコードで8桁になるようにしてあります
・このAI列コードの「前」に別列のソート(キー2つ)を行って処理するコードがあり、
このコードの「後」にもそのソート結果に基づく処理コードがあるため、ソートを戻す
コードはそのままにしておくつもりです
※現マクロは20個を超える処理コードの集合なので、今すぐに手を入れるのは億劫なもので…

いろいろといたらない点が多々ありましたが、以後気をつけますのでこれからもよろしくお願いします。
(T18) 2018/06/27(水) 12:59


syさんのコードが私の想定以上に処理が速かったので、オイシイところを借用して「ArrayList」を外してみました。

syさんコードには敵いませんが、手元のwin7マシンでも0.1秒未満の差なので気にするレベルではもちろんないです。
これで、現コードの約半分以下の処理時間になりました。
ループより「ArrayList」の影響が大きかったということでしょうか?
いい勉強になりました、ありがとうございます。
また、ここをこうすれば・・という箇所あればご指摘いただけると助かります。

 ...
 ...
    mx = Range("AY" & Rows.Count).End(xlUp).Row
    ReDim vai(2 To mx, 1 To 1)
 '--------1
    Range("BK2").Value = 1
    Range("BK2").AutoFill Destination:=Range("BK2:BK" & Range("AK" & Rows.Count).End(xlUp).Row), Type:=xlFillSeries
 '--------2
    Range("A:BK").Sort _
        key1:=Range("AK2"), Order1:=xlAscending, Header:=xlYes
 '--------
    i = 2
    While i <= mx
        id = Range("AK" & i).Value
        If id <> "" Then
                If Not dicA.Exists(id) Then
                    With WorksheetFunction
                        kz = .CountIf(rak, id)
                        mk = .Count(Range(Cells(i, "AY"), Cells(i + kz - 1, "AY")))
                        If mk >= 3 Then
                            num = .Large(Range(Cells(i, "AY"), Cells(i + kz - 1, "AY")), 3)
                        Else
                            num = .Large(Range(Cells(i, "AY"), Cells(i + kz - 1, "AY")), mk)
                        End If
                    End With
                    dicA.Add id, num
                    i = i + kz
                End If
        End If
    Wend
'--------4
    Range("A:BK").Sort key1:=Range("BK2"), Order1:=xlAscending, Header:=xlYes
    Range("BK:BK").ClearContents
'--------
    For i = 2 To mx
        id = Range("AK" & i).Value
        If dicA.Exists(id) Then
            vai(i, 1) = dicA(id)
        End If
    Next i
    rai.Value = vai
 Debug.Print Timer - tt

(T18) 2018/06/28(木) 11:56


 >また、ここをこうすれば・・という箇所あればご指摘いただけると助かります。 

 回答では無いですけど、部分的にここを教えてと言う内容の質問ではなく、
 コードを見て気付いたアイデアなどが欲しいと言うなら、
 中途半端に端折ったコードなんて、意味のないコードを提示するのではなく、
 コピペするだけで完全動作するコードを提示するべきではないでしょうか。
 少なくとも質問する側の最低限のマナーと思いますよ。

 提示されていない部分がどうなってるかも分からないのに、アドバイスも無いでしょう。

(sy) 2018/06/28(木) 12:34


失礼しました・・・

 Sub QA()

 Dim tt As Double
 tt = Timer

    Dim rai As Range, rak As Range
    Set rai = Range(Cells(2, "AI"), Cells(9999, "AI"))
    Set rak = Range(Cells(2, "AK"), Cells(9999, "AK"))

    Dim al As Object
    Dim dicA As Object
    Dim vai As Variant
    Dim mx As Long
    Dim num As Variant
    Dim kz As Long      'add
    Dim mk As Long      'add

    Set dicA = CreateObject("Scripting.Dictionary")

    mx = Range("AY" & Rows.Count).End(xlUp).Row
    ReDim vai(2 To mx, 1 To 1)

 '--------1
    Range("BK2").Value = 1
    Range("BK2").AutoFill Destination:=Range("BK2:BK" & Range("AK" & Rows.Count).End(xlUp).Row), Type:=xlFillSeries
 '--------2
    Range("A:BK").Sort _
        key1:=Range("AK2"), Order1:=xlAscending, Header:=xlYes
 '--------
    i = 2
    While i <= mx
        id = Range("AK" & i).Value

        If id <> "" Then
            If Not dicA.Exists(id) Then

                With WorksheetFunction
                    kz = .CountIf(rak, id)
                    mk = .Count(Range(Cells(i, "AY"), Cells(i + kz - 1, "AY")))
                    If mk >= 3 Then
                        num = .Large(Range(Cells(i, "AY"), Cells(i + kz - 1, "AY")), 3)
                    Else
                        num = .Large(Range(Cells(i, "AY"), Cells(i + kz - 1, "AY")), mk)
                    End If
                End With

                dicA.Add id, num

                i = i + kz
            End If
        End If
    Wend

 '--------4
    Range("A:BK").Sort key1:=Range("BK2"), Order1:=xlAscending, Header:=xlYes
    Range("BK:BK").ClearContents
 '---------
    For i = 2 To mx
        id = Range("AK" & i).Value
        If dicA.Exists(id) Then
            vai(i, 1) = dicA(id)
        End If
    Next i

    rai.Value = vai

 Debug.Print Timer - tt

 End Sub
(T18) 2018/06/28(木) 13:24

 まず気になった事。

 宣言されていない変数「i」と「id」がありますね。 
 モジュールの先頭に Option Explicit は記述されていますか?
 初歩中の初歩的な事ですけど、過去に一度も指摘されてませんでしたっけ?
 変数の宣言しておかないと、訳の分からないエラーに悩まされる可能性があります。
 VBEのツール→オプションに「変数の宣言を強制する」と言うチェックがあるので、
 チェックしておく事を強くお勧めします。

 今のコードは無限ループの危険性があります。
 AK列が空白のセルがあるとの事なので、AY列よりも最終行が少なくなるケースがありますが、
 この場合、mxがAY列の最終行で取得している為、If id <> "" Thenで空白の処理が無いので、
 While i <= mxで、永遠にiが増えなくなるので無限ループになります。

 ただ単純にmxをAK列の最終行でとれば解決する問題では無さそうですね。

 Dictionaryの使い方も、Dictionaryのメリット(重複削除や高速なキー検索)を完全に殺している為、
 単に遅くて回りくどいだけの記述になってますし、それに予めソートするならDictionaryは邪魔なだけです。

 以下も必要ありますか?
 >Set rai = Range(Cells(2, "AI"), Cells(9999, "AI"))
 >Set rak = Range(Cells(2, "AK"), Cells(9999, "AK"))

 後AY列が文字の時に空白にならない場合がありますし、AK列のコードが1つの時に
 AY列が文字や空欄だった場合などはエラーで止まりますよ。

 他にも、AK列が空白の場合もエラーになりますし、AY列が文字の時に空白にならないケースがあります。
 (AY列の不具合は私のコードでもありました。すいません。)

 出来ればご自身で作ったコードなので、そのまま修正案を提示したいですけど、
 基本的な事が全然なので、正直私からのアドバイスはDictionaryなど全く使わなくても実用上問題ないので、
 そう言うのはもう少しレベルが上がってからでも遅くは無いと思いますとしか。。。

 予めソートするのが前提なら、ソートをAK昇順、AY降順にして、
 上から順番に見て、一つ上と違うコードの行を記憶。
 ループで下に見て行って、AKが同じ時にAYが数値の場合カウントして3番目になれば転記。
 3番目前にAKが変われば、その時の数値を転記。
 1つ上と同じコードなら上の数値を転記。
 単純に上記の流れで出来るので、これならループとIF文かSELECT文などで出来るし、
 その方が意味のないDictionaryへのデータ格納や、COUNTIFの多用が無い分、
 現在ご提示のコードより早くなると思いますよ。

(sy) 2018/06/28(木) 18:40


 やろうとしているのは表の中から2列に注目して
各グループの大きい方から3番目を抽出するってことですか?

なら、大きい表じゃなくて
も少し簡単な表で練習してから向かったらいかがでしょう?
どうせ扱うのは2列分なら、別にコピペしてから加工抽出してみては?

    aaa                 
  ┌──┬─┬─┬──┐
  │aaa │b │c │d   │
  ├──┼─┼─┼──┤
  │   4│ 1│ 1│   2│
  ├──┼─┼─┼──┤
  │   5│ 3│ 1│   3│
  ├──┼─┼─┼──┤
  │   6│ 1│ 1│   4│
  ├──┼─┼─┼──┤
  │   7│ 2│ 1│   5│
  ├──┼─┼─┼──┤
  │   8│ 3│ 1│   2│
  ├──┼─┼─┼──┤
  │   9│ 1│ 1│ 3.8│
  ├──┼─┼─┼──┤
  │  10│ 3│ 1│   4│
  ├──┼─┼─┼──┤
  │  11│ 1│ 1│ 4.2│
  ├──┼─┼─┼──┤
  │  12│ 2│ 1│ 4.4│
  └──┴─┴─┴──┘

Sub test()

    Dim i As Long
    Dim n As Long
    Dim c As Range
    Range("B:B").Copy Range("G:G")
    Range("D:D").Copy Range("H:H")

    With Range("G2").CurrentRegion
        .Sort key1:=.Cells(1), Header:=xlYes
        .Subtotal GroupBy:=1, Function:=xlSum, TotalList:=2
    End With

    With Range("G2").CurrentRegion.Columns(2)
    'With c
        .Formula = Application.ConvertFormula(.Formula, xlA1, xlA1, xlAbsolute)
        .SpecialCells(xlCellTypeFormulas).Copy
        .Offset(, 1).Resize(1, 1).PasteSpecial xlPasteFormulas
    End With

    Range("I:I").SpecialCells(xlCellTypeFormulas).Replace "SUBTOTAL(9,", "SUM("
    Range("I:I").SpecialCells(xlCellTypeFormulas).Replace ")", ",3)"
    Range("I:I").SpecialCells(xlCellTypeFormulas).Replace "SUM", "LARGE"

    For i = 2 To 1 Step -1
        On Error Resume Next
        Range("I:I").SpecialCells(xlCellTypeFormulas, xlErrors).Replace i + 1 & ")", i & ")"
        n = Err.Number
        On Error GoTo 0
        If n > 0 Then Exit For
    Next

    With Range("G2").CurrentRegion.Resize(, 2)
        .Columns(3).Value = .Columns(3).Value
        .RemoveSubtotal
        .EntireColumn.Delete
    End With
End Sub

同じシート上にしましたが、行の挿入削除が出てくるので、
作業用の別シートで処理した方が無難でしょう。
まずはこういうアプローチもあるよと。
速度はやってみてから考えましょう。(たぶんそんな遅くはないと思うけど。。。)

(まっつわん) 2018/06/28(木) 20:53


syさん、まっつわんさん
ありがとうございます。

投稿して外出した後に、せっかくソートしたのに2回ループやわざわざDictionaryを使う必要ないよな、
と思いコードを削除しようかと思いました。
しかし結果的にそれ以外にも至らないところの指摘やヒントをいただけてよかったと思います。

syさんの前のコードや今回のまっつわんさんコードに出てくる「Formula」、今まで使用したことがなく
未だ十分に理解できてないので、先ずはそこからですね。
(まっつわんさんコード、未だ読解できていません)

ここからの不明点は、別アップで質問させていただきます。

これからもよろしくお願いします。
(T18) 2018/06/28(木) 22:27


コメント返信:

[ 一覧(最新更新順) ]


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