アプリ版:「スタンプのみでお礼する」機能のリリースについて

Vba Textboxの文字列の結合を速くする方法を教えて下さい。

質問者からの補足コメント

  • .textプロパティで大量の文字を連結する時とても処理が遅いので、String builderみたいな機能欲しいなと思ってます

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/05/10 07:53
  • JoinやMidを使っても遅いままでした。

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/05/15 18:32
  • sbはstringbuilderクラスのhttp://dev-clips.com/clip/vba/stringbuilder-for- … を使ってます。TextはTextboxです。btn10は”00”ボタンです。

    「Vba Textboxの文字列の結合を速」の補足画像3
    No.6の回答に寄せられた補足コメントです。 補足日時:2022/05/15 19:22
  • 自分が何を遅いと感じていたのか、分かりました。ボタンをクリックするとテキストボックスに数字が入力されるのですが、ボタンを連打した時の反応が遅かったのです。具体的には、”00”ボタンを5回連打したのに、”00”が3回しか入力されなかった感じです。おそらくボタンに問題がある気がします。

      補足日時:2022/05/15 20:42

A 回答 (6件)

>JoinやMidを使っても遅いままでした。


私が、推奨したのは、以下の関数を使用する方法のつもりでした。
こちらで、簡単なサンプルで確認しても100倍以上速くなっています。
具体的なコードを提示していただければ、何か良い対策が見つかるかもしれません。
文字の結合の箇所(&による演算)で遅くなっているなら、かなり早くなるはずです。テキストボックスが多数あって、文字列の結合以前の話で、
テキストボックスから文字を取り出すところで遅くなっているなら、私が推奨した方法は役に立たないかもしれません。

-------------------------------------------
Option Explicit

Private sBuf As String
Private iBuf As Long

Private Sub Class_Initialize()
  sBuf = String$(32768, vbNullChar)
  iBuf = 0
End Sub

Public Sub Append(ByRef sValue As String)
  If iBuf + Len(sValue) > Len(sBuf) Then
    sBuf = sBuf & String$(CLng(Len(sBuf) * 2) + Len(sValue), vbNullChar)
  End If
  Mid(sBuf, iBuf + 1) = sValue
  iBuf = iBuf + Len(sValue)
End Sub

Public Function ToString() As String
  ToString = Left$(sBuf, iBuf)
End Function
この回答への補足あり
    • good
    • 0

こんにちは



VBAとのことですが、実際にどのような環境でどのような処理をなさっているのか不明ですけれど・・・

TextBoxへのアクセスにも時間がかかると思われます。
とは言え、ボックスが個々に存在する場合は、まとめて読み込む方法はなさそうですので、この部分は仕方がないのかも知れませんが・・

>大量の文字を連結する時~
「大量」がどの程度の量なのか不明ですが、仮に全部を連結してゆくと文字数がやたら長くなりそうなので、ひとまず5000程度までとしてみました。
サンプルとして、簡単にエクセルのシート上にテキストボックスを置いて、以下の条件でテストしてみました。
・繰り返し数5000
・テキストボックスの文字数は5文字。
(実際には、2つのボックスを交互に利用)

◇ループで変数に読み込むだけの場合
  約47msec
◇ループ内で毎回「&」演算子で追加連結する場合
  約50~64msec(かなりのバラツキあり)
◇配列に読んで、まとめて連結する場合(Join)
  約47msec

文字列操作には文字列の長さや空きメモリの量も関係しますしバラツキもあるので、一概には言えませんが、個別に連結処理を行ったとしても、読み込み処理の方に遥かに時間がかかっているように見受けられます。
一方で、No3様がご提示の方法(Join)であれば、連結にはさほど時間はかからないと思われます。

とは言え、5000件のボックスを連結してもご質問にあるほどの時間にはならないので、「遅い」という印象ではないようにも思えます。
実際には、何のApplicationで、どのくらいの量のものをどのような処理をして、どのように時間がかかっているのかがまったくわかりませんので、これ以上は何とも言えませんけれど、ご参考にでもなればと・・・
    • good
    • 3

No.1&2です。



>.textプロパティで大量の文字を連結する時とても処理が遅いので

これってTextBoxコントロールが大量にありなのかな?
それともマルチライン設定で順次追加(改行?)してくって事?
もし後者ならListBoxとかの方が良いのかもと感じますけど、詳細が不明なので。
    • good
    • 0

こちらのサイトが参考になるかと思います。


https://excel-ubara.com/excelvba4/EXCEL271.html
「遅い文字列結合を最速処理する方法について」

いくつかの方法が提示されていますが、
「・StringBuilderのような機能を作成する」
が参考になるかと。
この回答への補足あり
    • good
    • 1

No.1です。



似たような物なら以前ですと

[VBA]ArrayListの使い方を知れば動的配列も解決!
https://y-moride.com/vba/arraylist-how-to-use.html

が使えましたが最近のOSですと個体差によるのか
『.Net Framework 3.5 を有効にする手順』が上手くいかない人もいるようです。

なら素直にVisualBasic(.Net Framework)とかに移行ってのも一案ではありますが。。。
そうすればListクラスが使えますのでより便利ではあります。
    • good
    • 0

どのようにやってて遅いと思われるのか、その要因を書き出してみては如何ですか?

この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています