VBAでは複数データを格納できるデータ型として、配列とコレクションがある。 それぞれ一長一短あり、どちらが優れているというものではないのだが、どちらかといえばデータの追加・削除が簡単に行えるコレクションのほうが使い勝手は良いかもしれない。 さて、今回は配列とコレクションのデータ構造に焦点を当ててそれぞれの違いを説明する。 配列のデータ構造 例えばInteger型の配列を次のように作成する。 Dim Arr(3) As Integer Arr(0) = 10 Arr(1) = 20 Arr(2) = 30 Arr(3) = 40 すると、メモリ上には単に直列にデータが並ぶ。VBAのIntegerは2バイトなので、ちょうど2バイトずつ隙間なく配置される。 もし次のようにLong型で宣言したら、 Dim Arr(3) As Long Arr(0) = 100 Arr(1) = 200 Arr(2
ExcelのVBAでプログラムを組む際に、大量のデータを処理するのに使うのが配列系の処理である。ただ、プログラムの組み方によっては処理時間に大きく差が出てくるようだ。データ量が少なければよいが、多くなってくると、処理時間が延びてしまい、使い勝手も悪くなる。そこでベストな配列の使い方を考慮してみる。 VBAでは主に配列として使えるのが、静的配列、動的配列、コレクションである。3択になるわけだがどれを選ぶのがよいだろうか? 試しに単純に変数を宣言して、適当なデータ(10,000,000個)を配列に書き込む時間を測定してみた。できるだけ高速で処理時間を短縮できるものを選択したい。 静的配列 Dim Dimtest(10000000) As String Do DoEvents Dimtest(i) = "テスト" & i If i = 10000000 Then Exit Do End If i
I want to implement Lisp's mapcar in Ruby. Wishful syntax: mul = -> (*args) { args.reduce(:*) } mapcar(mul, [1,2,3], [4,5], [6]) would yield [24, nil, nil]. Here is the solution I could think of: arrs[0].zip(arrs[1], arrs[2]) => [[1, 4, 6], [2, 5, nil], [3, nil, nil]] Then I could: [[1, 4, 6], [2, 5, nil], [3, nil, nil]].map do |e| e.reduce(&mul) unless e.include?(nil) end => [24, nil, nil] But I'
sort -> Array[permalink][rdoc][edit] sort! -> self sort {|a, b| ... } -> Array sort! {|a, b| ... } -> self 配列の内容をソートします。要素同士の比較は <=> 演算子を使って行います。sort はソートされた配列を生成して返します。 sort! は self を破壊的にソートし、self を返します。 ブロックとともに呼び出された時には、要素同士の比較をブロックを用いて行います。ブロックに2つの要素を引数として与えて評価し、その結果で比較します。ブロックは <=> 演算子と同様に整数を返すことが期待されています。つまり、ブロックは第1引数が大きいなら正の整数、両者が等しいなら0、そして第1引数の方が小さいなら負の整数を返さなければいけません。両者を比較できない時は nil を返します。
select -> Enumerator[permalink][rdoc][edit] filter -> Enumerator select {|item| ... } -> [object] filter {|item| ... } -> [object] 各要素に対してブロックを評価した値が真であった要素を全て含む配列を返します。真になる要素がひとつもなかった場合は空の配列を返します。 ブロックを省略した場合は Enumerator を返します。 例 [1,2,3,4,5].select # => #<Enumerator: [1, 2, 3, 4, 5]:select> [1,2,3,4,5].select { |num| num.even? } # => [2, 4] [SEE_ALSO] Enumerable#select [SEE_ALSO] Array#select!
配列の要素としてある特定の値が含まれているかどうか、チェックしたい場合にどうしたらよいか説明します。 例えば "カレー", "ラーメン", "ハンバーグ" という三つの文字列の要素を値として持っている配列があった時に、 その中に "ホットドッグ" があるかどうかチェックする場合です。この場合は存在しないので false を返すことを考えます。 "ラーメン" があるかどうか、といえば、"ラーメン" は要素に含まれるので true を返す、というような場合です。 配列の操作のための java.util.Arrays クラス さて 「要素の中に特定の値を含むかどうか」 というチェックといえば、コレクションの contains メソッドがあります。 contains メソッドはまさに今ここで望んでいる動作をします。 しかしながら、あいにく配列では contains メソッドがありません。 では、ど
●質問の主旨 (1)以下のコードのプロシージャを実行すると 12行目の変数myArrが選択され、「配列に割り当てられません」と エラーメッセージが返されます。これはなぜでしょうか? (2)(1)の原因は5行目の変数myArrの宣言について問題があるよう 気がしますが、どうすればいいのか分かりません? 以上2点について、1つだけでもご助言いただければ幸いです。 ご教示よろしく願いします。 ●質問の補足 下記のコードは「各支社の成績」(画像の下部)を 「業務成績通知書」(画像上部)に成績欄に差し込んで 各支社ごとのワークシートを印刷するためのコードです。 画像上部のワークシート名→差込印刷TARGET 画像下部のワークシート名→data ●コード Option Explicit Sub オートシェイプ1_Click() Dim myTar As Worksheet 'ワークシート差込印刷(ター
VBAには配列の長さを取得するLengthといったメソッドが存在しない。 そもそも配列にメソッドが存在するのかどうかも怪しい。 配列の長さを直接求める関数も存在しないため、以下の関数を利用する。 LBound 配列の最小インデックスを取得 UBound 配列の最大インデックスを取得 Sub PrintArray() Dim spl() As String spl = Split("a,b,c", ",") ' ["a","b","c"]という配列を生成 Debug.Print UBound(spl) - LBound(spl) + 1 ' 配列の長さを取得したい場合 Dim i As Integer For i = LBound(spl) To UBound(spl) ' 配列の各要素を順に処理したい場合 Debug.Print spl(i) Next End Sub
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く