[[20150402221815]] 『System.collections.Arraylistの型について』(スズメ) ページの最後に飛ぶ

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

 

『System.collections.Arraylistの型について』(スズメ)

このあいだword vbaからデータの昇順の仕方をβさんから教えてもらいました。その時はありがとうございました。

最近はSortedlistではなく、より簡単なArraylistを使っていますが、msgboxでubound(オブジェクト名)をやると、型が一致しませんというエラーが出てしまいます。他のサイトを見ても情報がなかったので質問しました。

データ数の上限を表示させる方法はないのでしょうか?よろしくお願いします。コードは以下の通りです(今回は最終的に降順にしたいので、リバースを実行しています)。

Sub aaa()
Dim z
Dim Path As String
Dim u as string
Set z = CreateObject("System.Collections.ArrayList")
Path = "C:\Users\Documents\abc\"
u = Dir(Path & "*.pdf")
Do While u <> ""

        z.Add u
        u = Dir()
Loop
z.Sort
z.Reverse
MsgBox Ubound(z)
MsgBox z(0)
Set z = Nothing
End Sub

< 使用 Excel:Excel2007、使用 OS:Windows7 >


 Ubound(なんたら) このなんたらは【配列】でなければいけません。
 ArrayList自体は、配列に似ているところもありますが、配列ではありません。

 寄せられる回答のコードを吸収して自身の幅を広げていくことは大変いいことだと思いますが
 その場合、そのコードをよく読んでください。

 スズメさんが、どのスレのことをおっしゃっているのかはわかりませんが、そのコードの中には
 ArrayListから抜き出して処理しているところがあったはずです。(Do/LoopではなくFor/Nextですが)
 そのループの中で、ArrayListに格納されているデータの上限値を使っているはずです。

 そこをみれば、一目瞭然ですよ。

 また、新しいものを吸収する際には、きちんと、その内容を把握しておいたほうがいいですね。
 たとえば以下。ページの左にプロパティやメソッドがありますのでクリックして、それぞれの説明を
 見ておかれたらよろしいかと。

https://msdn.microsoft.com/ja-jp/library/System.Collections.ArrayList(v=vs.80).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

 ただし、ArrayListやSortedList、VBAで使うことができるメソッドやプロパティは制限されています。
 おぉ、これは便利だということでコードに取り入れても実行時エラーになるものもあります。
 まぁ、そうやって試行錯誤するのも、いいトレーニングになるとは思います。

 追記です。

 疑問に思うことは、「学校」のようなサイトに質問を投げかけるということも有用な解決方法ですが
 System.Collections.ArrayList で検索すれば、わかりやすいサイトもでてきます。

 たとえば、

http://homepage1.nifty.com/rucio/main/dotnet/ClassLibrary/L001_System.Collections.ArrayList.htm

 先に紹介した MS の公式ページより具体例が豊富に記載されています。
 このページの具体例の中に、スズメさんが求めているものがありますので捜してみて下さい。

(β) 2015/04/03(金) 06:34


要素の数は、Countプロパティで返すオブジェクトが多いですね。IEオブジェクトはLengthが数だったりして、ちょっと変わってますが。
Web検索で答えを見つけられるまで、あと一歩です。頑張って下さい。
(???) 2015/04/03(金) 09:23

なるほど。配列ではないのですね。なのに、z(1),z(2)・・・があるって変ですよね。

カウンドで上限をしゅとくすればいいのですか。お教えいただき、ありがとうございました。
(スズメ) 2015/04/03(金) 10:00


 >なのに、z(1),z(2)・・・があるって変ですよね。

 ちっとも変じゃないですよ。

 MsgBox Activesheet.Cells(10).Address

 このコードを実行するとどうなりますかね。

 で、Ubound(activeSheet.Cells) なんてやるとどうなりますかね?

 で、配列じゃないのに Cells(10) とかけるのはおかしい?

 あるいは、MsgBox Worksheets(2).Name

 でも、UBound(worksheets) は?

 VBAの世界には、まだまだ (スズメ)さんの知らない部分がたくさんあると思います。
 なので、「あぁ、そうか、勉強、勉強」という姿勢が大事じゃないですか?

 「変ですね」なんていうこと自体が【変ですね】

(β) 2015/04/03(金) 11:48


Cells(10)って書けるんですか?家に着いたら早速試してみます。
(スズメ) 2015/04/03(金) 14:31

やっとわかりました。cellsとか、worksheetsは変数じゃないのであてはまらないことはわかっておりましたが、arraylistのオブジェクトは変数と思い込んでしまいました。arraylistはオブジェクトかバリアント型だからUboundがあてはまらないということですね。βさんどうもありがとうございました。
(スズメ) 2015/04/03(金) 16:38

間違えました。オブジェクトだからUboundが使えないということです。
(スズメ) 2015/04/03(金) 16:45

 >オブジェクトだからUboundが使えないということです。

 違います。配列じゃないから使えないのです。

 >Cells(10)って書けるんですか?
 >cellsとか、worksheetsは変数じゃないのであてはまらないことはわかっておりましたが

 わかっていたの?「書けるんですか?」なのに。
 スズメさんらしいといえばらしいけど。

(β) 2015/04/03(金) 17:00


Cells(10)という書きかたが知らなかっただけで、Cellsが配列でないのはわかっております。

配列ではないからUboundが使えないというのは、オブジェクト型の配列には使えるということなのでしょうか?そんな配列はみたことがありませんが。
(スズメ) 2015/04/03(金) 17:22


 >配列ではないからUboundが使えないというのは、オブジェクト型の配列には使えるということなのでしょうか?そんな配列はみたことがありませんが。

 なんだか、理屈がおかしいねぇ。もし、(スズメ)さんがオブジェクト型の配列には使えない。
 使える配列なんて見たことがないというなら、なぜ、 Ubound(ArrayList名) というオブジェクト型配列(?)を相手にしたコードを書いたのかな?

 いずれにしても、そんなことは一言も言っていませんが?

 UBound(String型の変数) なんて、だめですよね。UBound(Long型変数) もだめですよね。
 オブジェクトだからだめとか、いいとかではなくVBAでいうところの「配列」じゃないからだめなんです。

 ここでいう配列(いわゆる Ubound といったものが使える配列)とは、VBAでいうところの配列。
 一次元であったり二次元であったり、三次元であったり、それは様々ですが、そういったものに対する
 「固有名詞」的なものです。

 もちろん一般名詞的に、というか概念として「配列」という言葉を使うことがありますね。
 典型的なものはシートのセルです。縦横にマトリックスになっているようなものを、「概念」としての「配列」と表現することはあります。

 これら「概念」として表現する「配列」の中の1つに、VBAでいうところの、Uboundなんかで値が取得できる「配列」があるわけです。

 たとえば、Dictionaryオブジェクトのキーやデータは「概念としての一次元配列」です。(0から始まります)
 ですから、それを取り出すことで以下のようなことができます。

 (注:Keys や Items はプロパティではなく、メソッドです。そのメソッドを使ってVBAでいうところの「配列」として取り出したものを参照しているのであって
 直接参照できるわけではないですよ)

 Sub Sample1()
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")

    dic("スズメ1") = "えらい人"
    dic("スズメ2") = "素敵な人"
    dic("スズメ3") = "賢い人"

    MsgBox LBound(dic.Keys)
    MsgBox UBound(dic.items)

 End Sub

 同じことがArrayList でも。
 ArrayListの中身も、「概念」としての配列です。それを ToArray というメソッドで、VBAでいうところの一次元配列に取り出すことができます。
 取り出したものは、いわゆる「配列」ですから Ubound が使えます。(こちらも 0 から始まります)

 Sub Sample2()
    Dim al As Object
    Set al = CreateObject("System.Collections.ArrayList")

    al.Add "えらい人"
    al.Add "素敵な人"
    al.Add "賢い人"

    MsgBox UBound(al.toarray)

 End Sub

(β) 2015/04/03(金) 17:57


 もう1つ。

 そもそも、(スズメ)さんが

 配列じゃないのに(UBound というものが使えないのに) ○○○(i) とかけるのはおかしい。

 こうつぶやいたわけですよね。

 でも、VBAで相手にする様々なもの(コレクションと呼ばれるものを代表にいろいろ)には

 ○○○(i) や ○○○(i,j) と指定できるものが、やまほどあります。
 で、(いわゆる)配列でも 配列(i) や 配列(i,j) という指定ができるということです。
 「配列」の専売特許じゃないですよ ということを指摘したんですよ。

(β) 2015/04/03(金) 18:19


なるほど、人間にとっては配列だけど、vbaにとっては配列ではないのですね。やっと納得しました。どうもありがとうございました。
(スズメ) 2015/04/03(金) 20:21

コメント返信:

[ 一覧(最新更新順) ]


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