Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


633 / 13645 ツリー ←次へ | 前へ→

【79338】ランダムな数字の入力方法 アエロリット 17/7/31(月) 20:59 質問[未読]
【79339】Re:ランダムな数字の入力方法 γ 17/7/31(月) 23:04 発言[未読]
【79340】Re:ランダムな数字の入力方法 アエロリット 17/7/31(月) 23:29 発言[未読]
【79341】Re:ランダムな数字の入力方法 γ 17/8/1(火) 6:16 回答[未読]
【79343】Re:ランダムな数字の入力方法 アエロリット 17/8/1(火) 22:33 お礼[未読]

【79338】ランダムな数字の入力方法
質問  アエロリット  - 17/7/31(月) 20:59 -

引用なし
パスワード
   目的:推移図に入力してある、値が異常の場合、正常値に修正。

現状、下記に記入してある項目1〜2まではしましたが、値が異常の場合、正常値に修正の仕方がわかりません。
知恵をお借りできませんでしょうか。
よろしくお願いいたします。

処理内容:
1.アクティブシートに入力してあるA3の文字を取得
2.listシートに記入してある文字列から検索して、ワークブック(推移図)を開く。
3.ワークブック(推移図)を開く。
4.セルF32〜AI32(31日まである場合はAJ32、それ以降の列は空欄)まで日付が入力されています。
5.セルF33〜AI33(31日まである場合はAJ33、それ以降の列は空欄)までデータ(数字)が入っています。
6.基準線が3つ有ります。(基準線は、1.+基準線(AY11に入力してある)、2.-基準線(AY15に入力してある)、3.センターライン(+基準線と-基準線の間、(AY13に入力してある)) 
7.+基準線を超えたら、+基準線とセンターラインの間にランダムな値に修正したい。
※可能なら、+基準線に寄ってるランダムな数字orセンターラインに寄ってるランダムな数字を選択できると有りがたい。
8.同様に-基準線を超えたら、-基準線とセンターラインの間にランダムな値に修正したい。
※可能なら、-基準線に寄ってるランダムな数字orセンターラインに寄ってるランダムな数字を選択できると有りがたい。
9.データ修正が終了したら、次のシートを同様に修正する
※データは、シートによって小数点5ケタまで使用しています。


Option Explicit
Sub error_correction()
Dim Target As String
Dim FilenameIn As Range
Dim FilenameOut As Range
Dim PathnameIn As String
Dim PathnameOut As String
Dim plus As Double
Dim minus As Long
Dim Cl As Long
Dim cal As Long


Cl = Cells(51, 13).Value


Target = Cells(3, 1).Value

Worksheets("list").Select
PathnameOut = Cells(13, 3).Value
Set FilenameIn = Range(Cells(3, 2), Cells(12, 2)).Find(Target, LookAt:=xlPart)
Set FilenameOut = FilenameIn.Offset(0, 1)
If FilenameIn.Offset(0, 2).Value <> "5F" Then
  PathnameIn = Cells(13, 2).Value
  PathnameOut = Cells(13, 3).Value
  Else
    PathnameIn = Cells(14, 2).Value
    PathnameOut = Cells(14, 3).Value
End If
Workbooks.Open Filename:=PathnameOut & "\" & FilenameOut & ".xls"
plus = Cells(33, 14)

'下記以降の処理がわかりません。
Do
If plus >= Cells(11, 51).Value Then
  Cells(33, 14).Value = plus - (Cells(11, 51) - Cells(13, 51))
  If Cells(33, 14) >= Cells(11, 51) Then
   Cells
  End If
  
End If
Loop

Set FilenameIn = Nothing
Set FilenameOut = Nothing

End Sub

【79339】Re:ランダムな数字の入力方法
発言  γ  - 17/7/31(月) 23:04 -

引用なし
パスワード
   説明不足です。
+基準線とか、-基準線とかが何かが不明です。

    AY AZ ・・・・
11
12
13
のような形式で、具体例を示してください。

・現在のシート内容、
・得たい結果のシート内容
をそれぞれ、上の形式で説明してください。
そうすれば、コメントが付くと思います。

【79340】Re:ランダムな数字の入力方法
発言  アエロリット  - 17/7/31(月) 23:29 -

引用なし
パスワード
   補足
1. 基準線には数値が入力されています。
(値はシートによって異なります)
+基準線の値:800.55555
センターラインの値:775.55555
-基準線の値:750.55555

2.現在のシート内容
日付: 7/1 7/2 7/3 7/4 7/5
データ:810 775 815 740 750

3.得たい結果は、異常値は7/1、7/3、7/4になります。
+基準線を越えた日付は7/1、7/3になります。
この場合は、+基準線とセンターラインの間の値(ランダム値)に修正したい。
-基準線を越えた日付は7/4になります。
この場合は、-基準線とセンターラインの間の値(ランダム値)に修正したい。
修正後
7/1 7/2 7/3 7/4 7/5
780 775 790 760 750

このような形でご理解頂けますでしょうか。

【79341】Re:ランダムな数字の入力方法
回答  γ  - 17/8/1(火) 6:16 -

引用なし
パスワード
   参考にして下さい。
端数処理やシートへのあてはめは、
そちらで対応してください。

Option Explicit

Dim higher As Double
Dim center As Double
Dim lower  As Double

Function getRand(x As Double, y As Double) As Double
  getRand = x + (y - x) * Rnd()
End Function

' 範囲内ならそのまま、範囲外なら補正してランダム値を返す
' opt=0: センターまでの間のランダム値
' opt=1: 上下限値寄りのランダム値
' opt=0: センター寄りのランダム値
Function getRandExt(x As Double, opt As Long) As Double
  If x > higher Then
    Select Case opt
    Case 0: getRandExt = getRand(center, higher)
    Case 1: getRandExt = getRand((center + higher) / 2, higher)
    Case 2: getRandExt = getRand(center, (center + higher) / 2)
    End Select
  ElseIf x < lower Then
    Select Case opt
    Case 0: getRandExt = getRand(lower, center)
    Case 1: getRandExt = getRand(lower, (lower + center) / 2)
    Case 2: getRandExt = getRand((lower + center) / 2, center)
    End Select
  Else
    getRandExt = x
  End If
End Function

Sub test()
  Dim ary(1 To 5) As Double
  Dim k As Long
  
  higher = 800.55555
  center = 775.55555
  lower = 750.55555

  ary(1) = 810: ary(2) = 775: ary(3) = 815: ary(4) = 740: ary(5) = 750
  
  For k = 1 To 5
    Debug.Print getRandExt(ary(k), 0)
  Next

  Debug.Print "----慎重に戻す---------------"
  For k = 1 To 5
    Debug.Print getRandExt(ary(k), 1)
  Next

  Debug.Print "----大胆に戻す---------------"
  For k = 1 To 5
    Debug.Print getRandExt(ary(k), 2)
  Next
End Sub

【79343】Re:ランダムな数字の入力方法
お礼  アエロリット  - 17/8/1(火) 22:33 -

引用なし
パスワード
   ご対応ありがとうございます。
大変参考になり、勉強になりました。
まずは、シートに当て込んで動作確認してみたいと思います。

633 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free