• ベストアンサー

配列内データにsmallを使う

以下の箇所で、「WorksheetFunction Smallでプロパティが取得できません。」 (実行時エラー1004)となります。 Range("A1") = Application.WorksheetFunction.Small(hause, 7) hauseは Dim hause(15) as variant で定義し、数字が15個入っています。 原因を教えてください。 配列のsmallの例が見つからず、分からないでいます。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

文字列では、もちろんsmall関数で計算する事はできません。 文字列でそういう計算ができる関数等もありません。 まぁプログラミングに慣れた人なら、バブルソートとかちょこちょこっと実装してしまってやっつけるのもありでしょうが、そこまでしなくても例えばセルに一回データを書き出してエクセルに並べ替えさせてしまい、所定の位置のデータを拾ってくるなんて方法もあります。 ただし。 >私のエラーが起きていた中身ですが、英字を混んでいました。 >1234abcdの如くにです。 こういった「文字列の並べ替え」では、よほど条件が整ってない限り大概、大小の判定を失敗します。 上手くいかない例: sub macro2()  dim a(15) as variant  dim i  for i = 0 to 15   a(i) = i & "abc"  next i    with range("Z1:Z16")   .value = application.transpose(a)   .sort key1:=range("Z1"), order1:=xlascending, header:=xlno   range("A1") = range("Z7").value   ’.clearcontents  end with end sub 上手くいく例: sub macro3()  dim a(15) as variant  dim i  for i = 0 to 15   a(i) = format(i, "000") & "abc"  next i    with range("AA1:AA16")   .value = application.transpose(a)   .sort key1:=range("AA1"), order1:=xlascending, header:=xlno   range("A1") = range("AA7").value   ’.clearcontents  end with end sub 改めてあなたの「実際のデータ」をしっかり調べ、「どれが欲しい」のか、どうしてその順になるのか、キチンと整理してからそれをマクロに焼きなおすように考えてみて下さい。よくわからないときは、これ以降は確かに別のご相談内容と思いますので、何をしたいのか事実を添えて新しいご相談として投稿してみて下さい。

nagahaha
質問者

お礼

何回も有り難うございます。 >文字列では、もちろんsmall関数で計算する事はできません。 >文字列でそういう計算ができる関数等もありません。  了解です。 >まぁプログラミングに慣れた人なら、バブルソートとかちょこちょこっと実装してしまって >やっつけるのもありでしょうが、そこまでしなくても例えばセルに一回データを書き出して >エクセルに並べ替えさせてしまい、所定の位置のデータを拾ってくるなんて方法もあります。  まさに、ご指摘の方法とは違いますが、別のやり方で解決していました。  そして、smallを見つけたので使ってみようと思いやってみた。  ということです。  現在のやり方なら、英数字混在でも可能です。  現状維持としておきます。  少なくとも、「ローカルウインドー」を知ったことが成果です。  お世話になりました。

その他の回答 (2)

回答No.3

こんにちは。 変数の、hauseというものは、何の略か分かりませんが、Option Explicit をつけたらいかがですか? 基礎的な書き方を身につけたほうがよいですね。カウンター変数や特別の変数以外は、大文字・小文字を混ぜるなどします。定数は、大文字だけです。今回は、単に綴りが違っているだけの話だと思います。 '// Option Explicit Sub Macro1()  Dim Hause(15) As Double  Dim i As Long  For i = 0 To 15   Hause(i) = i  Next i  Range("A1").Value = Application.WorksheetFunction.Small(Hause, 7) 'houseではない。 End Sub '//

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

>WorksheetFunction Smallでプロパティが取得できません 症状としては、変数hauseに数字を代入できていない(7個に足りない)ときの状況に合致します。 作成例: Sub macro1()  Dim hause(15) As Variant  Dim i  For i = 0 To 15   hause(i) = i  Next i  Range("A1") = Application.WorksheetFunction.Small(hause, 7) End Sub 必ず一度このマクロを実際にあなたのエクセルで作動させて、結果を確認してください。 そのうえで、あなたの動かないマクロをステップ実行させながら、とりあえずローカルウィンドウなどでhauseの中身にキチンと「数字が15個入ってる」かどうか、しっかり目で見て確かめてみてください。

nagahaha
質問者

お礼

早速、かつ、何時も有り難うございます。 お教えの例をやってみました。 綺麗に終了し、6が表示されました。 今回、「ローカルウインドー」なるテクニックを知りました。 今後使わせていただきます。 こんなことを知っていればこれまでに苦労しなかったと思える場面がかなりあったと 悔やんでいます。 本題ですが、 どうもsmallは数字しかダメみたいです。 私のエラーが起きていた中身ですが、英字を混んでいました。 1234abcdの如くにです。 variantという定義がエラーにならなかったので、okと思っていました。 私のexcelでも全てを数字にしたらノーマルに終了しました。 ということで、 今回の直接原因は分かった気がしますが、 英字も含めて昇順を決める命令/関数は存在するのでしょうか。 改めての質問はここを閉め、別にした方が宜しいのでしょうか。 とにかく有り難うございました。

関連するQ&A