1

スプレッドシートと VBA 関数の間で配列を何度もやり取りしました。最近、Excel 365 に "アップグレード" しましたが、動作しません。例えば:

Public Function test(x As Range)
  Dim y()
  ReDim y(3)
  y(1) = 1
  y(2) = 2
  y(3) = 3
  test = y
End Function

次に、3 つのセル (たとえば、b1:b3) を強調表示し、一番上のセルに「=test(a1:a2)」と入力して Shift-Enter を押します。これにより、テスト関数から y() を受け取るはずの配列数式で範囲が埋められます。

ただし、関数を参照するセルはすべてゼロです。デバッグ行を挿入すると、関数が意図したとおりに実行されていることがわかります。配列をスプレッドシートに渡していないだけです。

どうしたの?他の誰かがこの経験をしたことがありますか?


@RDHS、@tim-williams、@garys-student - 的確な回答ありがとうございます。そして Gary の学生 - 信じられないほど迅速な対応に感謝します。私はみんなに投票したいのですが、私は初心者なのでできません。

しかし...完全を期すために-あなたの答えは(より理論的なタイプの)別の質問を提起します:私は1次元配列を範囲列に直接、またはその逆に強制できるはずです。

明らかに、範囲の形状をチェックしてそれに応じて変換するのは簡単です (まあ、方法を示したので簡単です!) しかし、それはとてもずさんです:

単に test = y と書く代わりに、上記の例を使用して

私は書く必要があります:

if x.rows.count=1 then test = y
else test = worksheetfunction.transpose(y) end if

私はあなたのことを知りませんが、ドア # 1 (test=y) を取ります。他の方法はすっごくずさんです。

しかし、MS は私たちに手を差し伸べています。Excel では、組み込みのスプレッドシート配列関数 (index、match など) を使用するときに、これらの体操を強制することはありません... Index(C1:C10,3) および index(a3:k3, 3) どちらも、各 ARRAY の 3 番目の ITEM である C3 の値を返します。Index は、どれが 3 番目の項目であるかを判断するのに十分なほどスマートです。確かにワークシートでできるなら、VBAでもできるはず??

私のお気に入りのコンプ。科学。コンピューター サイエンス分野の創始者の 1 人である教授は、「プログラミング言語は、そのプログラムが関係のないことに注意を払う必要がある場合、低レベルです」とよく言いました。

彼は実際に多くの洞察に満ちた観察を行い、ARPANET を介して配布し、世界初のブロガーの 1 人になりました (Google Alan Perlis)。20 年間、すべてのプログラマーは自分の VT100 の上に Perlisism のリストをテープで貼り付けていました。

  • 「コンピューティングでは、明白なものを有用なものに変えることは、「フラストレーション」という言葉の生きた定義です」;

  • 「ある人の定数は別の人の変数です」;

  • 「愚か者は複雑さを無視する。プラグマティストはそれに苦しむ。それを回避できる人もいる。天才は複雑さを取り除く。」

「クリーンな」コードを作成したいという欲求は、最初のコンピューターで最初のコーダーにまでさかのぼるからです。そして、私は彼がとても好きでした。

4

1 に答える 1