タグ

Collectionとvbaに関するkiyo_hikoのブックマーク (12)

  • Converting VBA Collection to Array

    kiyo_hiko
    kiyo_hiko 2024/02/07
    ありがたい…。
  • VBA 配列とコレクションの違いをメモリ上のデータ構造から理解する - t-hom’s diary

    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

    VBA 配列とコレクションの違いをメモリ上のデータ構造から理解する - t-hom’s diary
    kiyo_hiko
    kiyo_hiko 2019/05/09
    コレクションが連結リストな話
  • エクセルVBA 配列の速度比較

    ExcelVBAでプログラムを組む際に、大量のデータを処理するのに使うのが配列系の処理である。ただ、プログラムの組み方によっては処理時間に大きく差が出てくるようだ。データ量が少なければよいが、多くなってくると、処理時間が延びてしまい、使い勝手も悪くなる。そこでベストな配列の使い方を考慮してみる。 VBAでは主に配列として使えるのが、静的配列、動的配列、コレクションである。3択になるわけだがどれを選ぶのがよいだろうか? 試しに単純に変数を宣言して、適当なデータ(10,000,000個)を配列に書き込む時間を測定してみた。できるだけ高速で処理時間を短縮できるものを選択したい。 静的配列 Dim Dimtest(10000000) As String Do DoEvents Dimtest(i) = "テスト" & i If i = 10000000 Then Exit Do End If i

    エクセルVBA 配列の速度比較
    kiyo_hiko
    kiyo_hiko 2019/05/09
    意外にもコレクションが優秀であるという結果読んでビックリ
  • VBScriptのディクショナリの参照の罠 - Qiita

    VBScriptには辞書型のオブジェクト Scripting.Dictionary があります。 が、このオブジェクトにはちょっとした罠が潜んでいます。 それは「存在しないキーに対して値を取得しようとするとキーを作成してしまう」というものです。 項目を変更するときに引数 key で指定したキーが見つからない場合、newitem で指定した項目と関連付けられた、引数 key で指定した新しいキーが作成されます。また、既存の項目を取得するときに引数 key で指定したキーが見つからない場合は、空の項目と関連付けられた、引数 key で指定した新しいキーが作成されます。 以下、実際に試したコードです。 Option Explicit Dim objDict, sKey Set objDict = CreateObject("Scripting.Dictionary") ' "hoge" キーを追

    VBScriptのディクショナリの参照の罠 - Qiita
    kiyo_hiko
    kiyo_hiko 2019/04/24
    これはひどい仕様だ。説明がないと気づかない
  • 45787-0 | コレクションオブジェクトにユーザ定義型の追加 - VB初心者友の会 - Q&A掲示板過去ログ

    #45787-0コレクションオブジェクトにユーザ定義型の追加目黒2001-08-10(金) 10:22 #45790-0RE#45787:コレクションオブジェクトにユーザ定義型の追加匿名457902001-08-10(金) 10:46 #45791-0RE#45787:コレクションオブジェクトにユーザ定義型の追加Μπενσι2001-08-10(金) 10:55 #45792-0RE#45790:コレクションオブジェクトにユーザ定義型の追加目黒2001-08-10(金) 10:59 #45793-0RE#45787:コレクションオブジェクトにユーザ定義型の追加Μπενσι2001-08-10(金) 11:05 #45794-0RE#45793:コレクションオブジェクトにユーザ定義型の追加目黒2001-08-10(金) 11:24 こんにちは、早速ですが、今、コレクションオブジェクトにユーザ

    kiyo_hiko
    kiyo_hiko 2013/09/09
    わかっちゃいるけどVBAダルすぎる
  • VBAでCollectionのループ方法をFor Eachに書き換えるだけで100倍高速になった

    今、ExcelVBAでちょっとしたものを作ってるのですが、コーディング中に急にパフォーマンスが悪くなるという現象が発生したので、原因を調べてみたらCollectionの各要素を処理する場面が問題のようだった。CollectionをFor Eachで周すようにしただけで、さっきの遅さが嘘のように解決してしまった。 当にFor i = … のループを For Eachに書き換えただけで速くなるのか確信持てなかったし、他の原因も重なった結果かも、という疑惑も拭いきれない状態だったので、ExcelXPでベンチマークを取ってみました。 主要部分 下のLoop_for_indexとLoop_for_eachを比較しました。 'For i = ...版。 各要素を添字指定でアクセスする Public Sub Loop_for_index() Dim dummy As Long Dim i As Lo

  • VBAでpushやpopができる配列クラスを実装しました

    kiyo_hiko
    kiyo_hiko 2013/05/26
    なるほど そういえば自分でArrayListとかHashMap的なものを作ればいいのか
  • Excel2007VBA配列変数の宣言について

    ●質問の主旨 (1)以下のコードのプロシージャを実行すると 12行目の変数myArrが選択され、「配列に割り当てられません」と エラーメッセージが返されます。これはなぜでしょうか? (2)(1)の原因は5行目の変数myArrの宣言について問題があるよう 気がしますが、どうすればいいのか分かりません? 以上2点について、1つだけでもご助言いただければ幸いです。 ご教示よろしく願いします。 ●質問の補足 下記のコードは「各支社の成績」(画像の下部)を 「業務成績通知書」(画像上部)に成績欄に差し込んで 各支社ごとのワークシートを印刷するためのコードです。 画像上部のワークシート名→差込印刷TARGET 画像下部のワークシート名→data ●コード Option Explicit Sub オートシェイプ1_Click() Dim myTar As Worksheet 'ワークシート差込印刷(ター

    Excel2007VBA配列変数の宣言について
    kiyo_hiko
    kiyo_hiko 2013/05/26
    例えばVBAで「Dim ns(5) As String : ns = Array(1, 2, 3, 4, 5)」とやると「配列には割り当てられません」てエラー。理由はArray関数が配列を作るけど配列じゃなくてVariant型で戻すから、ns As Variantと宣言する。何のための型付けなのか…
  • VBA で map とか fold: いげ太のブログ

    '* Core 標準モジュール *' Option Explicit Private xList As List Private xProgram As Program Property Get List() As List Set List = xList End Property Property Get Program() As Program Set Program = xProgram End Property Function Box(ByVal v As Variant) As Box Set Box = New Box Box.Value = v End Function Sub Init() Set xList = New List Set xProgram = New Program End Sub '* List クラス モジュール *' Option Explici

  • 何でも配列に collectionオブジェクト

    VBにもJavaのVectorのような便利なものがある collectionの使い方は難しくありません オブジェクトの生成と破棄を確実に行えばいいのです 【collectionへの登録】 クラスモジュール(構造体)宣言 <clsdat> Public name As String Public value As Long Dim wkdata As clsdat Dim col As Collection 'collectionオブジェクト宣言 Set col = New Collection 'collectionオブジェクト生成 Set wkdata = New clsdat wkdata.name = "机" wkdata.value = 30000 col.Add wkdata 'collectionへの構造体登録 Set wkdata = New clsdat wkdata.na

    kiyo_hiko
    kiyo_hiko 2013/05/11
    Add, Count, Item, Removeのみ。試しにitemを-1とか負のインデックスでやると範囲外エラー。最終要素getするわけじゃなかった // あと文字列をkeyにする場合こんな感じkeyが後みたい → Dim xs As New Collection\nxs.Add("able", "a")\nMsgBox xs("a")
  • Access Tips #514 配列を使ったスタックのプロシージャ例 | T'sWare

    kiyo_hiko
    kiyo_hiko 2012/08/24
    VBAのコレクションだとかコンテナーにあたるデータ構造がいまいち意味不明なので、この辺を参考にさせて頂きましてよ。
  • Excel VBAで配列の長さを取得 - phithonのブログ

    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

    Excel VBAで配列の長さを取得 - phithonのブログ
  • 1