• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCELVBA Variantとobject)

EXCELVBA Variantとobject

このQ&Aのポイント
  • Variant型とobject型についての質問です。
  • Variant型にSetでの代入が駄目なのはなぜでしょうか。
  • object型とVariant型の意味について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • SI299792
  • ベストアンサー率47% (777/1625)
回答No.1

Variant はオブジェクトを含めて何でも入ります。 Set を付けるかどうかで意味が変わります。 オブジェクトを入れたい場合Set を付けます。 例えば A = Cells(1, "A") A にはCellの値が入ります。 この後、A1の値を変えても、A は変化しません。 Set A = Cells(1, "A") A にはCellの情報が入ります。 この後、A1の値を変えたら、A は変化します。また A.Value = 5 を実行すれば、A1に5 が入ります。(A = 5 にすれば、A は5 になってしまう) Set A = 5 のように、Set を使って値を入れることはできません。 Testを実行すると演算式1 は =(Sheet1!$C$1:$GR$1=Sheet2!$A$1:$A$100)+0 になります。何をしたいのかわかりません。シート上にこの式を書いてもエラーになります。 ひょっとして、 =SUMPRODUCT(Sheet1!$C$1:$GR$1=Sheet2!$A$1:$A$100) ですか? でも、これも違うような気がするので(縦と横を比較するのは変、数が合わないのもおかしい)、何をしたいのか、具体的に書いてください。 判らない原因は、かっこの多重だと思います。エラーの原因がどこだかわからなくなります。かっこの多重は避けるべきです。途中経過を変数に代入したほうがいいです。

Nouble
質問者

お礼

有り難うございます 〉Set を使って値を入れることはできません。 拝見していて はた!! と、気付きました Evaluateは、Variantながら そう言えば 其の、中身は オブジェクト、では なかったです すーぅっ と 腑に、落ちました 重ねて、申します 有難うございます。 〉Testを実行すると演算式1 は 〉=(Sheet1!$C$1:$GR$1=Sheet2!$A$1:$A$100)+0 (中略) 〉シート上にこの式を書いてもエラーになります。 あぁ、此は 失礼しました Excelの、癖でして セル上は #VALUE!の、エラー表示 ですが エラーの意味は さしずめ 1つの、セルに 多数の、値を 与えた、ため です 此の、まま だと 式エディットの、領域の 表示文字数制限に、引っかかる ので 此の、式の 領域を 少し、狭くして =(Sheet1!$C$1:$AX$1=Sheet2!$A$1:$A$50)+0 と、し 此を シート上の 式エディットの、領域で 選択し PF9を 押して、頂ければ 配列数式の、演算結果が 確認できる かと、思います ですので此の場合の #VALUE!の、エラーは 配列数式を、扱っている 其の、警告 程度に 捉えて、頂いて 構いません さて、 やっている事は 総当たり表、的に 全件検査を 配列数式で 行わせて、います application.… の、行は 何件、 適合が、あるか の、算出に なりますし 先の、式を 少し、変形して =(1-(Sheet1!$C$1:$GR$1=Sheet2!$A$1:$A$100))*10^8+COLUMN({3,4,5,…200}) と、し 更に、此を 昇順に、並べ替えて 2つ、用意し 片方を 1つず、らして 双方を、比較すると … と、言っても 僕が、逆に 言われる、立場 と、しても きっと、此のまま では 伝わらない、ので 例を、挙げると  1 3 5 1 2 3 此の 不一致の、比較を させます すると  1 3 5 1× ○ ○ 2○ ○ ○ 3○ × ○ と、成ります 此を、行優先で 一列に、並べ直すと ×,○,○;○,○,○;○,×,○ と、成ります cellの、並びに なぞられると 取り出し、順は A1,B1,C1;A2,B2,C2;A3,B3,C3 です Excelでは ○を1、×を0、 と、 見なして、くれます ので 此の、データに 0を、足して SAMPRODUCTで 集計すると 2が、返されます また、別 と、して 先程の ×,○,○;○,○,○;○,×,○ に 10^8を、掛け 1,2,3を、足すと 1,10^8,10^8;10^8,10^8,10^8;10^8,2,10^8 昇順に 並べ、直すと 1,2,10^8,10^8,10^8,10^8,10^8,10^8,10^8 と、成ります SAMPRODUCTの、結果より 適合個数が、2個と 分かります、ので 2個だけ、取り出すと 1,2と 行毎の、一致適合値位置が 分かります 実際には まだ処理が、足りず 求まらない の、ですが 処理を、重ねて いくと 純然たる 紛う事、無き 適合検査値の、ある 行位置が、取得できる と、成るのです まぁ、 ややこしい話し ですが 此の、やり方の Excel、配列数式での 実現は 確か 私が、開発した ものです 此のコーディングの 本来の、全行は 終盤まで 形には、なっており 今 休憩を、挟みつつ トレースと、デバッグを、 行って、いますが 此の 総当たり、不一致比較表に 行No.を 与えるら作業 さえ 上手く、行けば 割と、直ぐに 終わりそう、です 後程 補足に、でも 掲載します ね

Nouble
質問者

補足

こちら 消し忘れて、いました、 失礼、しました コーディングは まだ、先か 長そう、… です。

その他の回答 (2)

  • SI299792
  • ベストアンサー率47% (777/1625)
回答No.3

合格件数 = Evaluate("SumProduct((Sheet1!A1:Z65536=Sheet2!A1:Z65536)*1)") でできました。速度も、ループよりかなり早いです。

Nouble
質問者

お礼

有り難うございます

  • SI299792
  • ベストアンサー率47% (777/1625)
回答No.2

お礼コメントを読みましたが、まだ、何をしたいのかわかりません。 A1,B1,C1;A2,B2,C2;A3,B3,C3 の順に処理をしたいと書いてあったので、参考までに、Sheet1とSheet2の[A1:C3] の比較をし、不一致の数を求めるプログラムを載せます。 ' Sub Macro1() '   Dim IRange As Range   Dim Conut As Long   Dim Flag As Boolean '   For Each IRange In [A1:C3]     Flag = IRange <> Sheets("Sheet2").Range(IRange.Address)     Count = Count - Flag   Next IRange   Debug.Print Count End Sub  もし、これ以上の協力が必要なら、Sheet1、Sheet2がどのような表になっていて、どのような結果が欲しいのか書いてください。  又、どうしてもループを使いたくないなら、自分で頑張ってください。私はわかりません。文章を読んでいる限り、自分でやる気満々のようなので、

Nouble
質問者

お礼

有難うございます。 〉どうしてもループを使いたくない はい、できれば しかし 全く ループや、分岐を、 使わず、作れる とは 思って、いませんが 他方で、 大雑把で、 全く、不適切な 試験結果を、基に 話すと 単純な、Evaluate(… 一回が 空の、For,NEXTを 数回、回す のと 同じ、位の 速度 の、ようですし 例えば 二億種の、一致検査 とも、なると 判定や、変数値入れ替え、 等を、含ませた 単純な、ループで 検査させた、時には 少なくとも 一瞬、とは 成らない、もの と、思います が、 Evaluateでは ウオッチ式ベース、ながら 瞬く間も、ない 一瞬で、済みます ですので、 可能性を、感じてます また、分岐は、 パイプライン処理を、壊し 速度低下を、招きます 私は 速度重視 では、無いものの 無視も、できない と、思っています Excelは インターフェース上 面や、立体に、 配置されて、みえる セル間の 演算を 主とする 表計算で、ある と、いう根底 より 行列演算に、対する おおいな、優位性が 見て、取れますが 一般の、方々に 私の、推し進める 行列演算と 其れを、支える 暗号化複合技術と、論理演算、 な、よる 解、取得法が 広く、認知されれば インタプリタ的、速度限界 から Excel、本来の ネイティブ速度ヘ 足を、踏み入れられる、 VBAの、速度向上に 貢献できる、 と、思っています ですので、 もう、少しは 頑張りたい と、思っている次第 です また お力を、求める とも、思いますが 宜しく お願い、致します。

関連するQ&A

専門家に質問してみよう