• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelVBA Rangeの扱いについて)

ExcelVBA Rangeの扱いについて

このQ&Aのポイント
  • ExcelVBAのRangeでセルを1次元の列として扱う方法について教えてください。
  • Web上で見た情報によると、セルは1次元配列の羅列を内部的に一定数で折り返して2次元にしているようですが、VBAでも同様のことが可能でしょうか?
  • クラスを使用せずに、他のセルへの入れ替えをせずに1次元の列としてセルを扱う方法を教えてください。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 質問者さんの最近のご質問全般にいえることですが、 セル、とか、Range、とか、配列、とか、いった時に オブジェクト(コレクション)のことをいっているのか 非オブジェクトの値(.Valueプロパティ)配列のことをいっているのか どっちとも取れる書き方をするのが癖になってらっしゃるようで、 また、そういった曖昧さがご自身に対して問題点の把握を難しくしているような印象があります。 Filter関数は専ら文字列値の配列を扱うもの、という点は理解されているとすれば、 値配列、ということは察することが出来ますが、 もう少しExplicitに言葉を使い分ける癖をつけた方が ご自身のVBA習熟をより充実したものにする意味でよろしいかと考えます。 今回の課題について。 Sourceが二次元の配列だというのはわかります。 重複を削除するような処理らしいこともなんとなく伝わります。 最終的なReturnは、スカラー?|一次元配列?|二次元配列?、出力先は? そういった実践のイメージがないと何とも答えにくいと思います。 一般論として、Filter関数というのは用途が非常に限られているものです。 私自身の各所での回答履歴を合わせても使用例は1、2回、 それも、珍しくFilter関数を有効に使える設問だったから、 敢えて意図的に(Filter関数を使うことのデメリットを説明しながら)使っている程度のものです。 VBAに関する質問回答にFilter関数を一度も使ったことがない人が圧倒的大多数でしょうから、 自ずと一般的な認知度も低いものだと思います。 きっぱり。二次元配列、といった時点で、Filter関数は使えないと考えてください。 本当は使えるのに皆が気が付いていない有効活用法があるとか、 探ってみるのは悪くない(寧ろポジティブ)ですけれど、 私の経験した(過去に探った)限りでは、 普通にループして条件分岐だけで書き上げたものに比べても 処理が遅すぎて(数倍から十数倍)使い物にならないということが多かったです。 総合的にFilter関数の今日的な存在理由は 「VBAでは配列を処理して配列を返す関数はありますか」という問に「はい」と返事が出来る為だけ という言い方でも、それほど間違った評価ではないと思います。 なるべくループ処理を避けて処理したい という最近の話の流れ、だったと思って読んでいますが、 簡潔にしたい、とか、コーディングを省力化したい、とか、スマートに|クールに書きたい、とか、 そういう理由でお考えならば なるべく無駄なループ処理を避けて処理したい というように発想を換えてみては如何でしょう? そういう観点で今現在のご自身に見合った最適化を意識しつつ実際に書いてみて、 具体的な設問と実際に動く具体的なコードの提示とともに 「これってもっと簡単に書けませんでしたか?」的に質問をリードしていくようにできれば、 結果がどうあれ明確な目標を持って建設的に進めていけるように思います。 ◆直接的な回答として > 「セルは1次元配列の羅列を内部的に一定数で折り返して2次元にしている」 ちょっとよく解りませんけど、 複数セル範囲の.Valueを変数に格納すると二次元配列になりますが、 元はジャグ配列のように階層化された二段階配列だ、とかいう話なら耳にしたことがありますが 私にはよく解りません。すみません。 > セルは1次元配列の羅列を内部的に一定数で折り返して2次元に ... <したい、ということなら ループすれば可能です。ループしないで実現する方法はありません。 > そこで > Sub test() >   Sheets("Sheet1").Cells(Rows.Count, 1).Select >   Selection.Offset(1, 0).Select > End Sub > と、してみたのですが > やはり当然というべきか すみません、意図を理解できませんでした。 > セルを1次元の列として > VBAで扱う事は可能なのでしょうか? > 但し他への入れ替え無しに… です。 > (※注:クラスも無しですよ) 汗 二次元の配列を一次元に変換するということでしたら、 基本的にはループして入れ替えるしかありません。 元となる二次元配列が、単行または単列の場合に限っては、 VBAならではのハイブリッドな方法として Application.Transpose(ワークシート関数)を使う例が 多数紹介されていますし、簡単です。 ただ、どうやっても普通にループしながらコンバートする方法が もっとも軽くて速いです。 ◆アドバイスとして VBAに用意されていない関数はUDFにするなりクラス化するなりして PERSONAL.XLB(.XLBS)やアドインなどに残しておけばよいでしょう。 (それを嫌う理由がよくわからないのです) 実際にUDFを書くことを長く続けていると、気が付くことがあります。 汎用的に書こうとすれば、引数が増えすぎて煩雑になってしまい、 結局はカスタムなニーズに合わせて妥協することがとても多いのです。 汎用性を意識しすぎても、または逆に単機能すぎても、 どちらも使いづらくて結局使わなくなる、 といってバランスのとれた落としどころが見つからない、とか。 それは勿論私の技量の拙さにも関わるのでしょうが、 あったらいいな、と思う関数が用意されていない理由は、 何となくわかってきたような気もするのです。 まぁVBAに用意された拡張性については、不満を持つ人も少ないようですし。 例えば、今回Filter関数に期待している機能というのは、 Scripting.Dictionary が提供してくれるように思います。 重複を削除したり、二次元的に扱いながら一次元配列を簡単に返すこともできますし、 Itemを配列にすることもオブジェクトをセットすることもできますから、 ジャグ配列やオブジェクト配列として扱うのも容易です。 Filter関数の情報は少ないですけれど、 Scripting.Dictionary は定番中の定番として多数紹介されています。 後は、「必要は●●の母」的な意味でも、やっぱり具体的なニーズに照らしてみないと 閃くものがないです。 #んー、なんか、だらしないレスになってしまって自分でも不満ですが、 これぐらいで。

Nouble
質問者

お礼

いつもお世話になってます。 ありがとうございます。 お気付きの通り、 バリアント型やオブジェクト型の 更に、高次配列に対し 条件に従い、その各々のメンバー(?)毎に 取捨し選択してくれる関数として 期待したのですが、 やはり甘いのですね。 もう1つ期待したのは、 1コードとして用意されたものでの実行は コンパイルと、最適化されている可能性があることです。 しかし「ループの方が早い」とのこと、 これも期待薄な訳ですね。 私は、 エクセルの関数使用歴が割りと長く、 元はタクジ式(ノイマン型?)の出ではあるのですが、 今では、 多くのデータを一括処理する 関数形プログラミングへの 趣向の方が高くなっています。 また、別の話として、 経験がそうさせているのか、 「固定観念を受け入れない」 と、言う点において意固地で頑固です。 欠点でもあり、魅力でもあると思っています。 まあ、おおよそ、 固定概念通りの答えなら、 既に解は皆さんに知られているはず 「人の前にたち塞がる」はずもなく、 そういったことから、 恐らく自ずと 固定概念外に解をを探す癖付けが、 私の中にできたものと、 今、書いてて思いました。 もう一つ、 表に見えることは 見せかけの可能性があり、 そこから真実の挙動は読めないことが 多くあるように感じています。 こういったことも、 私をこういった風に 在らし続けるのかもしれません。 今回のことも、 「インターフェイスの都合上、」 などといった事柄により、 本来は内部的に1次元配列のものを 見せかけの2次元配列としている。 私の見たサイトが正しいと仮定するなら、 こういう可能性が、示唆できるものと思えるのです。 しかしこれは 「確認しなければただの思い」なだけです。 よね? まだまだ知り得ないことの方が多いこともあり、 また検索も、 全ての可能性を、示しきらないこともあり、 特にエクセルは、 裏メニューの宝庫でもあるので、 裏側を特に期待して、 ご質問をさせて頂きました。 と、なぜこんなことを書くか と、いう真意ですが それは、紛れもなく ただひとつ、 「貴方に見限られたくない、されど私も意味があってこう(言わばファジー)ある。」 (※ファジイー:曖昧なデータを、確立された手順、関数で処理し、答えに導くこと) と、いうジレンマが故です。 はぐれものが故、他の方にない個性と不利益を抱え、 だからこそ、革新的な解決を出し、価値を提供できる。 しかし、 それに付き合え!! 等とは、滅相もなく、勿論申しませんが、 出来れば、 甘えさせて頂ければ、 お付き合いを頂ければ、助かります。 ところで、 LISPと、いう言語があったとか、 私はよく知らないのですが 曖昧さ処理の可能性を 凄く感じていました。 この期待をVBAにも 求めているのかもしれません。 ね。 さてさて、 私のようなものは、 森全体と、 その個別要素としての局所的林と、 木々と、枝葉、この全てを見て、 それでいて その全てのどれにも固執せず、 類似性と、独自性、拒絶性(?)から、 傾向、流れを読むものなのです。 こう無いと無価値な物なのです。 ご容赦頂ければ、幸いです。

Nouble
質問者

補足

連想配列、ジャグ配列、 共に今日初めて知りました。 まだまた知らないこと、多いですね。 面白い!! 連想記憶… ジャンプテーブルとデータ実態配列の組み合わせですね、恐らく。 私でも、昔作れましたから、 クラス化は、さほど難しくなかったでしょうね。 でも既にある 隠しクラスプログラムっぽいですね。 もっとじゃんじゃんクラスつくって MSが配信してくれると良いですね。 てか、 作ったクラス公開用保管庫あればいいのに… へ?、あるって? ところで、 ジャグ配列と動的構造体と、クラス運用の違いが解らないのですが、 別スレットですよね。 あ~… 高次元用のFilter欲しいな… 多次元用なら、なお欲しいな… まあ、 渡されたオブジェクト配列の 各配列メンバへのへのポインターを 紐付けしておいた上で、 指定されたキーを取りだし、ソートして これを複製して、 複製した片方の、配列要素を1つずらして、 これらでXORして、 これと元のソート結果とをANDすれば、 出ると言えば出るのですけどね、 Filter使えればこんな手間要らないのに… この後は後生と言うものですかね…

関連するQ&A