質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

5回答

1230閲覧

データ型をLong、Byteと使い分けることでメモリの軽減、または処理速度向上に影響しますか?

zigutabi

総合スコア57

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/03/19 01:10

現在、会社のデータをマクロで処理する業務を行っております。
そのデータの中には行数が数万件を超えて、Long型ではないと対応しきれないものもあります。
一方で、256個以上ある列は経験則上、ほぼ非現実的ではあります。

そこで、配列を定義するために最大値を取得する必要がありますが、
とりあえずLong型にするのではなく、ある程度数がわかるならByte型やInt型に宣言するのは、
メモリ使用量を減らしたり、処理速度向上につながりますか?

VBA

1Dim maxRow As Long 2Dim maxCol As Byte 3 4~値を動的に取得~ 5 6Dim array() as variant 7Redim array(maxRow, maxCol)

あまり、メモリ等を意識する立場にはなかったので、気になったところです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ここらへんのページからMicrosoftへのリンク先が参考になるでしょう。
https://tonari-it.com/excel-vba-coding-guide-line/#toc11

要約すると、Integer型はLong型に変換して処理しているので、Long型を使う方が若干速くなるかもってことですが、Byte型の場合は詳細はわかりませんね。

いずれにしても数値を扱うのであればLong型でよいでしょう。
今の時代のPCであればメモリ容量を気にする必要はないと思います。
そもそも気にしないといけないような巨大なExcelファイルは処理できないような。。。

ExcelVBAにおいてはメモリ容量を気にする必要は実質ありませんが、気にする意識を持つことはいいことだと思います。

投稿2020/03/19 01:25

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zigutabi

2020/03/19 01:31

むしろ可読性が下がりそうですね。 以前、Googleマップを扱ったアプリをRuby-MySQLで作った時に、DBに設定したデータ型でひどい目に遭った記憶がありました。世界座標の値で数百メートル単位の誤差で、海を指してしまうものです。 しかし、Excelでは、不要そうですね。 コーディング規約を参考に改良します。
guest

0

多少影響あると思いますが、基本的にはそもそものロジックの方が大事なので
気にするレベルじゃないと思います。

データ型の概要

投稿2020/03/19 01:25

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

メモリといっても、関数内で宣言される変数はスタック上で取られるので一時的なものです。
long型を使用するのが最も無難です。
【ExcelVBA】Integer型とLong型の使い分けは?処理速度が速いのは?

投稿2020/03/19 01:24

編集2020/03/19 01:25
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

そこで、配列を定義するために最大値を取得する必要がありますが、

最大値を取得するのは、絶対の話ではないですね。

ExcelVBA

1Sub test() 2 Dim Rng As Range 3 Dim vrtValues As Variant 4 Dim i As Long, j As Long 5 6 Set Rng = ActiveSheet.UsedRange 7 vrtValues = Rng.Value 8 9 For i = 1 To UBound(vrtValues, 1) 10 For j = 1 To UBound(vrtValues, 2) 11 vrtValues(i, j) = vrtValues(i, j) & "a" 12 Next 13 Next 14 15 Rng.Value = vrtValues 16End Sub

6万行x300列で試したら
セルへの書き込みのところ
Rng.Value = vrtValues
でメモリ不足のエラーになりました。
まぁ、何回かに分けて作業すればいいんでしょうけど。。。。

というか、他人の意見を聞くよりも
自分で実験して体感した方がいいかと思います。
その方がより身に付くかと。
その上で、もっとより良い方法があるのかを質問して、
色々な問題へのアプローチの仕方(=知識)を身に付けてみてはいかがでしょうか?
Set Rng = ActiveSheet.UsedRange.Resize(25000)
こちらの環境では、300列x25000行くらいならなんとかメモリー不足にならないかも?

何をしたいかわかりませんが、高速化が主目的なら、
エクセルの機能で出来ることをわざわざVBAでループ処理したりしたら、
ほぼほぼ遅くなります。

ExcelVBA

1Sub test2() 2 Dim r As Range 3 Dim v 4 Dim i As Long 5 Dim t 6 7 t = Timer 8 9 Set r = ActiveSheet.Range("A:A") 10 v = r 11 12 For i = 1 To UBound(v, 1) 13 v(i, 1) = i 14 Next 15 16 r = v 17 18 MsgBox Timer - t & "秒" 19End Sub 20 21Sub test3() 22 Dim t 23 24 t = Timer 25 26 With ActiveSheet.Range("A:A") 27 .Item(1) = 1 28 .DataSeries 29 End With 30 31 MsgBox Timer - t & "秒" 32End Sub 33

その辺は臨機応変にバランスよくトライしてみてください。
処理速度は、マシンパワーやバージョン等環境にも左右されます。
「こういう時はこうやる」的な暗記だけだと、ちょっと辛いです。
こちらの環境では、
Test2は約2秒
Text3は約0.4秒
でした。

変数の型の違いのメモリの使用量はエクセルがすんなり動くなら気にしなくてもいいと思います。
ただし、エクセルが使えるメモリの量は決まっているので、
ハード的に増やしてもメモリ不足は解消できません。
※最近のバージョンはまた仕様が変わっているかもです。
興味があるならご自分で調べてみてください。(こちらは興味がないので^^;)
検索が上手になるのもスキルのうちです。

投稿2020/03/20 08:16

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

配列の大きさは「データ型のサイズ」×「要素数」で決まるので、必要最低限のデータ型で定義することで確かにメモリ節約できますが、かつてのMS-DOS時代とは比較にならない程実装メモリが搭載されていることが通常なので、あまり気にする必要はないと考えます。

処理速度についても、プロセスサイズがべら棒に肥大してページフォルトが頻繁に発生する事態となれば影響ありですが、結局はコードの書き方次第です。

  • 配列を(極力)使用しないで済むコードにする(とか)
  • 冗長な処理・無駄なループを書かないようにする(とか)

こうしたことに気を配ったほうが良いです。

投稿2020/03/19 01:34

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zigutabi

2020/03/19 01:37

別のブックからデータを取得する時、シートを丸々コピーするよりも配列で一度に取得した方が効率が良いのかと思いましたが、配列だと効率よくないのですか?
DreamTheater

2020/03/19 01:44

単純に考えると、直接代入より非効率だと思いますよ。 配列からコピー先への代入と直接代入が等価だとして、コピー元から配列への代入が別途必要ですし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問