回答編集履歴

2

修正

2016/07/28 11:35

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -414,8 +414,6 @@
414
414
 
415
415
 
416
416
 
417
- 'If Abs(Result) >= (Abs(DayValBk) - 1) And Abs(Result) <= (Abs(DayValBk) + 1) Then
418
-
419
417
  If Result >= (DayValBk - 1) And Result <= (DayValBk + 1) Then
420
418
 
421
419
  '前日との振れ幅が±1以内なら、ループを抜ける

1

回答を受けて追記

2016/07/28 11:35

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -271,3 +271,253 @@
271
271
 
272
272
 
273
273
  わかりにくい説明で長くなってしまいましたが、参考になれば幸いです。
274
+
275
+
276
+
277
+ 追記
278
+
279
+ ---
280
+
281
+ 仕様の曖昧だった点に回答をいただきましたので、サンプルソースを修正してみました。
282
+
283
+ ```
284
+
285
+ Private Sub start()
286
+
287
+
288
+
289
+ Dim valZ As Double
290
+
291
+ valZ = 4.158
292
+
293
+
294
+
295
+ Call test(valZ) 'Z値について乱数生成
296
+
297
+
298
+
299
+ End Sub
300
+
301
+
302
+
303
+
304
+
305
+ Private Sub test(Base As Double)
306
+
307
+ 'Dim Base As Double '初回の基準値
308
+
309
+
310
+
311
+ Dim RndVal As Double '乱数
312
+
313
+ Dim Haba As Integer '振れ幅
314
+
315
+ Dim Fugo As Integer '符号(乱数)
316
+
317
+
318
+
319
+ Dim Result As Double '今回の変位
320
+
321
+ 'Dim ResultBk As Double '前回の変位
322
+
323
+
324
+
325
+ Dim DayCnt As Integer '日数ループ用
326
+
327
+ Dim Kaisu As Integer '回数ループ用
328
+
329
+
330
+
331
+ Dim DayMax As Double '当日の最大値
332
+
333
+ Dim DayMin As Double '当日の最小値
334
+
335
+
336
+
337
+ Dim DayVal As Double '計測データ(絶対値の最大値)
338
+
339
+ Dim DayValBk As Double '前日の計測データ(絶対値の最大値)
340
+
341
+
342
+
343
+ 'シートクリア
344
+
345
+ ActiveSheet.Range("A:Z").Clear
346
+
347
+
348
+
349
+ '初期値設定
350
+
351
+ 'Base = 1.5 '基準値(仮に1.5に設定)
352
+
353
+ Haba = 2 '振れ幅=2
354
+
355
+
356
+
357
+ DayValBk = 0
358
+
359
+ ResultBk = 0
360
+
361
+ Dim i As Integer
362
+
363
+
364
+
365
+ Cells(1, 1) = "計測値"
366
+
367
+ Cells(30, 1) = "変位"
368
+
369
+
370
+
371
+ Cells(26, 1) = "最大値"
372
+
373
+ Cells(27, 1) = "最小値"
374
+
375
+ Cells(28, 1) = "1日計測値"
376
+
377
+
378
+
379
+ '日数ループ
380
+
381
+ For DayCnt = 1 To 10
382
+
383
+ Cells(1, DayCnt + 1) = DayCnt & "日目"
384
+
385
+
386
+
387
+ '回数ループ
388
+
389
+ For Kaisu = 1 To 23
390
+
391
+ i = 0
392
+
393
+ Do
394
+
395
+ i = i + 1
396
+
397
+ '値生成(条件を満たす値が生成できるまで繰り返す)
398
+
399
+ 'RndVal = -2 + Rnd() * 4
400
+
401
+ 'Fugo = 1
402
+
403
+ RndVal = Rnd() * Haba '2未満の値を作成
404
+
405
+ Fugo = 1 - Int(Rnd() * 2) * 2 '符号(1 or -1)を生成
406
+
407
+
408
+
409
+ '生成値= 前回値 ± 乱数
410
+
411
+ 'Result = ResultBk + (Fugo * RndVal)
412
+
413
+ Result = (Fugo * RndVal)
414
+
415
+
416
+
417
+ 'If Abs(Result) >= (Abs(DayValBk) - 1) And Abs(Result) <= (Abs(DayValBk) + 1) Then
418
+
419
+ If Result >= (DayValBk - 1) And Result <= (DayValBk + 1) Then
420
+
421
+ '前日との振れ幅が±1以内なら、ループを抜ける
422
+
423
+ Exit Do
424
+
425
+ End If
426
+
427
+ If i > 100 Then
428
+
429
+ MsgBox "無限?"
430
+
431
+ i = 0
432
+
433
+ End If
434
+
435
+ Loop
436
+
437
+
438
+
439
+ '1回目の場合は最大値・最小値・計測値を設定
440
+
441
+ If Kaisu = 1 Then
442
+
443
+ DayMax = Result
444
+
445
+ DayMin = Result
446
+
447
+ DayVal = Result
448
+
449
+ End If
450
+
451
+
452
+
453
+ '結果をセルに出力
454
+
455
+ 'Cells(Kaisu, DayCnt) = Result
456
+
457
+ 'Cells(Kaisu + 30, DayCnt) = RndVal * Fugo
458
+
459
+ Cells(Kaisu + 1, DayCnt + 1) = Base + Result '測定値
460
+
461
+ Cells(Kaisu + 30, DayCnt + 1) = Result '変位
462
+
463
+ If DayCnt = 1 Then
464
+
465
+ Cells(Kaisu + 1, 1) = Kaisu & "回目"
466
+
467
+ Cells(Kaisu + 30, 1) = Kaisu & "回目"
468
+
469
+ End If
470
+
471
+
472
+
473
+ '最大値/最小値の更新(使ってないけど一応)
474
+
475
+ If Result > DayMax Then
476
+
477
+ DayMax = Result
478
+
479
+ End If
480
+
481
+ If Result < DayMin Then
482
+
483
+ DayMin = Result
484
+
485
+ End If
486
+
487
+ '計測データの更新
488
+
489
+ If Abs(Result) > Abs(DayVal) Then
490
+
491
+ DayVal = Result
492
+
493
+ End If
494
+
495
+
496
+
497
+ 'ResultBk = Result
498
+
499
+
500
+
501
+ Next
502
+
503
+
504
+
505
+ '最大値/最小値/計測データをセルに出力
506
+
507
+ Cells(26, DayCnt + 1) = DayMax
508
+
509
+ Cells(27, DayCnt + 1) = DayMin
510
+
511
+ Cells(28, DayCnt + 1) = DayVal
512
+
513
+
514
+
515
+ DayValBk = DayVal
516
+
517
+ Next
518
+
519
+
520
+
521
+ End Sub
522
+
523
+ ```