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

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

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

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

Q&A

解決済

2回答

1618閲覧

VBAの高速化について

sobue

総合スコア329

VBA

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

0グッド

0クリップ

投稿2017/04/01 05:20

VBA

1 2#If VBA7 Then 3Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) 4#Else 5Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) 6#End If 7'桁数 8Dim digits As Integer 9 10'カウント変数 11Dim i As Integer 12 13'計算回数 14Dim count As Integer 15 16'計算方法 17Dim clacTechnique As String 18 19'表示時間 20Dim dispTime As Integer 21 22'答え 23Dim ans As Integer 24 25Private Sub clacButton_Click() 26digits = Range("D28").Value * 10 27count = Range("D29").Value 28clacTechnique = Range("D30").Value 29dispTime = Range("D31").Value * 1000 30 31Select Case clacTechnique 32 33 Case "+" 34 35 Call たし算 36 37 38 Case "-" 39 40 Call ひき算 41 42 Case "×" 43 44 Call かけ算 45 46 Case "÷" 47 48 Call わり算 49 50 Case "ランダム" 51 52End Select 53 54End Sub 55 56 57Sub たし算() 58 59 For i = 1 To count 60 61 Range("B7").Value = Int(Rnd * digits) 62 63 ans = Range("B7").Value + ans 64 65 Sleep dispTime 66 67 Call 一瞬消す 68 69 Next i 70 71 Sheets("答え").Range("A1").Value = ans 72 73 Range("B7").Value = "終了" 74 75End Sub 76 77Sub ひき算() 78 79Dim initnum As Integer 80 81initnum = Int(Rnd * digits * 10) + Int(Rnd * 10) 82 83Range("B7").Value = initnum 84 85Sleep dispTime 86 87Call 一瞬消す 88 89 For i = 1 To count - 1 90 91 Range("B7").Value = Int(Rnd * digits) 92 93 If (i = 1) Then 94 95 ans = initnum - Range("B7").Value 96 97 Else 98 99 ans = ans - Range("B7").Value 100 101 End If 102 103 104 Sleep dispTime 105 106 Call 一瞬消す 107 108 Next i 109 110 Sheets("答え").Range("A1").Value = ans 111 112 Range("B7").Value = "終了" 113 114End Sub 115 116Sub かけ算() 117 118Dim initnum As Integer 119 120ans = 1 121 122Sleep dispTime 123 124Call 一瞬消す 125 For i = 1 To count 126 127 Range("B7").Value = Int(Rnd * digits) 128 129 ans = ans * Range("B7").Value 130 131 Sleep dispTime 132 133 Call 一瞬消す 134 135 Next i 136 137 Sheets("答え").Range("A1").Value = ans 138 139 Range("B7").Value = "終了" 140 141End Sub 142 143Sub わり算() 144 145Dim initnum As Integer 146 147initnum = Int(Rnd * digits * 10) + Int(Rnd * 10) 148 149Range("B7").Value = initnum 150 151Sleep dispTime 152 153Call 一瞬消す 154 155 For i = 1 To count - 1 156 157 Range("B7").Value = Int(Rnd * digits) 158 159 If (Range("B7").Value = 0) Then 160 161 Do While (Range("B7").Value = 0) 162 163 Range("B7").Value = Int(Rnd * digits) 164 165 Loop 166 167 End If 168 169 170 If (i = 1) Then 171 172 ans = initnum / Range("B7").Value 173 174 Else 175 176 ans = ans / Range("B7").Value 177 178 End If 179 180 181 Sleep dispTime 182 183 Call 一瞬消す 184 185 Next i 186 187 Sheets("答え").Range("A1").Value = ans 188 189 Range("B7").Value = "終了" 190 191End Sub 192 193Sub 一瞬消す() 194 195Range("B7").Value = "" 196 197 Sleep 10 198 199End Sub 200

Excel2010でフラッシュ暗算を作成したのですが、計算回数が10回以上行くと表示が追い付かずいきなり終了の文字が出てきてしまいます。

きちんと表示されるようにはどのようにしたらよいでしょうか?

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

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

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

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

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

guest

回答2

0

自己解決

設定している消す時間が短すぎて変わったように見えないのが原因でした。お手数おかけしました。

投稿2017/04/01 09:43

sobue

総合スコア329

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

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

0

やらずに書きますが、Sleep 10 の前後に DoEvents を入れてみたらどうでしょうか?

投稿2017/04/01 05:28

Zuishin

総合スコア28656

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

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

sobue

2017/04/01 08:38

入れてみましたが、ダメでした。
Zuishin

2017/04/01 08:53

各 Sleep dispTime の前に入れてもダメですか? 高速化という問題ではなくて、スレッドがほとんど眠っているので、起きているわずかな時間にウィンドウメッセージを処理しきれていないのかなと思いました。 DoEvents は溜まっている仕事を全部ここでやっちゃえという命令です。 これでダメならタイマーを使うよう全面書き換えしなければいけないことになると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問